Правила каталога Не применяются при сохранении продукта
Я вижу, что возникает проблема, когда правила цен каталога не применяются, когда новый продукт включен и сохранен одновременно.
Когда я смотрю в модуль CatalogRule, я вижу, что в вызове события catalog_product_save_commit_after
есть наблюдатель Mage_CatalogRule_Model_Observer::applyAllRulesOnProduct()
Копаясь в наблюдателе, я вижу, что он зовет:
Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($product);
Углубляясь в этот метод, он вызывает Mage_CatalogRule_Model_Resource_Rule::applyToProduct
для каждого правила цены каталога. Этот метод либо удаляет данные из базы данных таблица catalog_rule_product_price
для продукта, если правило к нему не применяется, или вызывает Mage_CatalogRule_Model_Resource_Rule::insertRuleData($rule, $websiteIds, $productIds)
, если правило совпадает. Параметр $productIds представляет собой массив с идентификаторами продуктов для ключей и массивами идентификаторов веб-сайтов в качестве значений.
Именно в методе insertRuleData
все, кажется, ломается. В методе тело в основном представляет собой оператор if, который выполняет два разных пути в зависимости от того, включены ли плоские таблицы продуктов каталога. Если они не включены, существует инструкция foreach, которая использует массив идентификаторов продукта в том виде, в каком, по-видимому, он был задуман:
foreach ($productIds as $productId => $validationByWebsite)
Если плоские таблицы включены, массив $ProductID используется в инструкции select, которая кажется неверной:
$selectByStore->where('p.entity_id IN (?)', $productIds);
Вам нужно промотать немного кода, но p задается в:
Mage_Rule_Model_Resource_Abstract::getProductFlatSelect()
array('p' => $this->getTable('catalog/product'))
он же таблица бд catalog_product_entity
Таким образом, результирующий оператор select в основном является SELECT... ИЗ catalog_product_entity, ГДЕ entity_id в (...идентификаторы веб-сайта...), как идентификаторы веб-сайтов - это содержимое массива $productIds.
Этот оператор select вернет неправильные продукты, и таблица catalogrule_product
никогда не будет обновлена должным образом. Существует индексатор, который зависит от catalog_rule_product
для создания содержимого catalog_rule_product_price
Мне кажется, что это ошибка ядра? Я что-то упускаю?
Если это ошибка, как лучше всего ее исправить - переопределить модель ресурсов или отредактировать ядро (gasp)?
1 answers
Служба поддержки Magento подтвердила, что это основная ошибка. В Mage_CatalogRule_Model_Resource_rule::insertRuleData
примерно в строке 247 код:
if (count($productIds) > 0) {
$selectByStore->where('p.entity_id IN (?)', $productIds);
}
Следует заменить на
if (count($productIds) > 0) {
$selectByStore->where('p.entity_id IN (?)', array_keys($productIds));
}
Я бы предположил, что это будет исправлено в следующем выпуске minor point, который выйдет в конце ноября 2013 года (1.8.1 и 1.13.1).
Редактировать:
Это действительно было исправлено в версиях 1.8.1 и 1.13.1