Кэш блоков и плоские таблицы (Список продуктов блока каталога Mage)


Мы используем Magento Enterprise и используем плоские таблицы и автоматическую переиндексацию.

У меня есть блок, который расширяет список Mage_Catalog_Block_Product_List. Кэш блоков включен, и кэш блоков помечен всеми содержащимися в нем продуктами. Когда я сохраняю любой из продуктов, которые находятся в блоке в администраторе, кэш блоков удаляется. Все это работает правильно.

Проблема возникает, когда я включаю плоские таблицы. Когда продукт изменяется в серверная часть кэша блоков удалена, но таблицы продукта плоские еще не обновлены. Новый кэш блоков создается со старыми данными. Должно быть, я что-то упускаю, потому что это не сработало бы для тех, кто использует плоские столы. И это все "ядро" Magento.

Как мне подойти к решению этой проблемы? Я там событие увольняю, что я должен наблюдать?

Мы будем очень признательны за любое предложение.

**************** РЕДАКТИРОВАТЬ ***************

Позвольте мне попробовать чтобы уточнить:

  1. Продукт имеет название "Мой классный продукт"
  2. EAV, плоские таблицы и кэш HTML блоков содержат "Мой классный продукт"
  3. Измените название на "Мой классный продукт с новым названием"
  4. Кэш HTML блока удаляется
  5. EAV содержит "Мой классный продукт с новым названием", но в плоской таблице все еще содержится "Мой классный продукт" (переиндексация не произошла)
  6. Клиент посещает веб-сайт, и новый блок HTML-кэша создается из данных плоских таблиц, которые все еще содержат "Мой классный продукт"
  7. EAV содержит "Мой классный продукт с новым названием", плоские таблицы и кэш HTML блоков по-прежнему содержат "Мой классный продукт"
  8. Выполняется переиндексация
  9. Таблицы EAV и flat содержат "Мой классный продукт с новым именем", но кэш HTML блока все еще содержит "Мой классный продукт"

Время между точками 1 и 7 составляет менее секунды.

**************** РЕДАКТИРОВАТЬ ***************

Author: TheBlaze, 2016-11-02

2 answers

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

 0
Author: Rajeev K Tomy, 2016-11-02 16:13:20

В итоге я реализовал наблюдателя для "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();
        }
    }

Это означает, что все блоки, помеченные продуктом в коллекции, будут удалены из кэша после обновления данных в плоских таблицах.

 0
Author: TheBlaze, 2016-11-14 14:49:23