Правила каталога Не применяются при сохранении продукта


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

Когда я смотрю в модуль 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)?

Author: Roscius, 2013-10-16

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

 2
Author: Roscius, 2013-11-28 22:28:50