Веб-сайт, которым я управляю, требует, чтобы цены имели 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
файле? У меня та же проблема, и я не могу найти решениеОтветы:
Позвольте мне объяснить вам код, который преобразует определение столбца:
Таким образом, в основном
preg_match
метод даст вам массив в$matches
переменной на основе определения столбца (хранится в$definition
).Пример определения столбцов обычно выглядит так:
Эти определения столбцов, соответственно, дадут вам следующий результат в
$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
объявления переменной:Попробуйте еще раз и проверьте свой
var/log/system.log
файл, чтобы убедиться, что код ведет себя так, как должен.источник
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.