Как изменить типы столбцов catalog_product_flat

8

Веб-сайт, которым я управляю, требует, чтобы цены имели 5 десятичных знаков. Я пошел дальше и изменил как минимум дюжину файлов / таблиц, чтобы добиться этого. Но (потому что всегда есть но), кажется, есть проблема с catalog_product_flat_X.

Позвольте мне объяснить: для цен на фронте большую часть времени это сводится к коллу Mage_Catalog_Model_Product->getPrice(), который, как я понимаю, будет искать цену в плоских столах (если у вас включены плоские столы). Проблема в переиндексации данных.

Если у моего плоского стола есть цена в формате DECIMAL(12,5), то нажатие на ссылку «Reindex» в строке «Reindex flat data» приведет ALTERк отображению плоского стола и возврату к нему DECIMAL(12,4).

После поиска довольно продолжительного времени я пришел к функции, в
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
которой вызывается prepareFlatTable($storeId). Затем эта функция вызывает convertOldColumnDefinition($column)каждый столбец плоской таблицы (в данном случае).

Наконец, когда вы смотрите на эту функцию,
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
она, кажется, конвертирует все decimalи numericтак:

case 'decimal':
case 'numeric':
        $length = $proposedLength;
        $type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
        break;  

в котором $proposedLengthрезультат этого:

$definition = trim($column['type']);
if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
    throw Mage::exception(
        'Mage_Core',
        Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
    );
}

$proposedLength = (isset($matches[3]) && strlen($matches[3])) ? $matches[3] : null;  

Я не совсем понимаю, что здесь происходит, я бы добавил туда что-то жестко закодированное, но я не хочу мешать нормальному процессу всех индексаторов.

Может ли кто-нибудь просветить меня по этому вопросу и предложить мне решение?

Жюльен Лачал
источник
не могли бы вы опубликовать решение? Что вы изменили в app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpфайле? У меня та же проблема, и я не могу найти решение
zekia
@zekia Честно говоря, я не могу вспомнить извините.
Жюльен Лахаль

Ответы:

0

Позвольте мне объяснить вам код, который преобразует определение столбца:

    $definition = trim($column['type']);
    if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
        throw Mage::exception(
            'Mage_Core',
            Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
        );
    }

Таким образом, в основном preg_matchметод даст вам массив в $matchesпеременной на основе определения столбца (хранится в $definition).

Пример определения столбцов обычно выглядит так:

  • ИНТ
  • VARCHAR (100)
  • десятичное (12,4)

Эти определения столбцов, соответственно, дадут вам следующий результат в $matchesмассиве:

  • array('int','int')
  • array('varchar(100)','varchar','(100)','100')
  • array('decimal(12,4)','decimal','(12,4)','12,4')

Тогда у вас есть $proposedLengthпеременная:

$ предложилLength = (isset ($ соответствует [3]) && strlen ($ соответствует [3]))? $ match [3]: null;

По сути, он равен 4-й записи в $matchesмассиве, если она установлена.

Так что в вашем случае значение $proposeLengthдолжно быть 12,5.

Мое предложение:

Добавьте следующий код сразу после $proposedLengthобъявления переменной:

Mage::log($column);
Mage::log($matches);
Mage::log($proposedLength);

Попробуйте еще раз и проверьте свой var/log/system.logфайл, чтобы убедиться, что код ведет себя так, как должен.

Рафаэль в цифровом пианизме
источник
@fschmengler отредактировал заголовок моего вопроса, который теперь вводит в заблуждение, поскольку он не соответствует тому, что я хотел задать в своем вопросе. Я закончил жестким кодированием значения в app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Жюльен Лачал
@JulienLachal, не стесняйтесь опубликовать свое решение и пометить ваш вопрос как ответ
Рафаэль на Digital Pianism
Нет, это не решение, это взлом, поэтому я не буду публиковать его. Я думаю, что я приму ваши детали, что должно произойти.
Жюльен Лахаль