Кэш блоков и плоские таблицы (Список продуктов блока каталога Mage)
Мы используем Magento Enterprise и используем плоские таблицы и автоматическую переиндексацию.
У меня есть блок, который расширяет список Mage_Catalog_Block_Product_List. Кэш блоков включен, и кэш блоков помечен всеми содержащимися в нем продуктами. Когда я сохраняю любой из продуктов, которые находятся в блоке в администраторе, кэш блоков удаляется. Все это работает правильно.
Проблема возникает, когда я включаю плоские таблицы. Когда продукт изменяется в серверная часть кэша блоков удалена, но таблицы продукта плоские еще не обновлены. Новый кэш блоков создается со старыми данными. Должно быть, я что-то упускаю, потому что это не сработало бы для тех, кто использует плоские столы. И это все "ядро" Magento.
Как мне подойти к решению этой проблемы? Я там событие увольняю, что я должен наблюдать?
Мы будем очень признательны за любое предложение.
**************** РЕДАКТИРОВАТЬ ***************
Позвольте мне попробовать чтобы уточнить:
- Продукт имеет название "Мой классный продукт"
- EAV, плоские таблицы и кэш HTML блоков содержат "Мой классный продукт"
- Измените название на "Мой классный продукт с новым названием"
- Кэш HTML блока удаляется
- EAV содержит "Мой классный продукт с новым названием", но в плоской таблице все еще содержится "Мой классный продукт" (переиндексация не произошла)
- Клиент посещает веб-сайт, и новый блок HTML-кэша создается из данных плоских таблиц, которые все еще содержат "Мой классный продукт"
- EAV содержит "Мой классный продукт с новым названием", плоские таблицы и кэш HTML блоков по-прежнему содержат "Мой классный продукт"
- Выполняется переиндексация
- Таблицы EAV и flat содержат "Мой классный продукт с новым именем", но кэш HTML блока все еще содержит "Мой классный продукт"
Время между точками 1 и 7 составляет менее секунды.
**************** РЕДАКТИРОВАТЬ ***************
2 answers
После внесения любых изменений на уровне продукта вам необходимо выполнить повторную индексацию, а затем очистить кэш.
В итоге я реализовал наблюдателя для "catalog_product_flat_partial_reindex". Наблюдатель получает список идентификаторов продуктов, которые индексатор просто завершает повторную индексацию. Я загружаю коллекцию из этих идентификаторов и вызываю cleanModelCache() для всех продуктов.
$productIds = $observer->getEvent()->getProductIds();
if(is_array($productIds)){
$productCollection = Mage::getModel("catalog/product")->getCollection()
->addFieldToFilter("entity_id", array("in"=>$productIds));
foreach ($productCollection as $product){
$product->cleanModelCache();
}
}
Это означает, что все блоки, помеченные продуктом в коллекции, будут удалены из кэша после обновления данных в плоских таблицах.