[caching] Как включить динамический блок на странице продукта при включенном кешировании полной страницы?


Answers

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

  1. Если ваш обратный прокси-сервер поддерживает его, вы можете использовать ESI (Edge Side Includes) и соответствующим образом пометить свой шаблон. ESI позволяет вставлять маркер в сгенерированный HTML-код, куда должен идти персонализированный контент, тогда ваш прокси-сервер будет запрашивать только персонализированный контент с соответствующего пути контроллера вашего приложения, когда это необходимо. Если вы используете Varnish , ESI доступен для использования. Расширение Lightspeed для Magento имеет функцию « Hole Punching», которая делает аналогичную вещь.
  2. Если ESI или Hole Punching недоступны для вас, тогда другая опция - разрешить кэширование главной страницы в кеше полной страницы и использовать немного javascript для создания отдельного запроса Ajax и получения необходимой информации.
Question

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

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

Он работает в первые несколько раз, когда я перехожу на страницы продукта, но затем неожиданно начинает отображать страницу с ошибкой Magento, в которой говорится: «На веб-сайте произошла ошибка при получении http://www.mycompany.com/productpage.html . вниз для обслуживания или настроен неправильно ».

Вот что я сделал до сих пор. Я создал приложение / код / ​​локальный / MyCompany / MyModule / PageCache / etc / config.xml для добавления MyCompany_PageCache_Model.

Затем я создал файл, который управляет кешированием в app / code / local / MyCompany / MyModule / PageCache / Model / Container / MyFile.php с этими функциями:

protected function _getCacheId()
{
    return 'CONSTANT_CACHE' . md5($this->_placeholder->getAttribute('cache_id'));
}

protected function _saveCache($data, $id, $tags = array(), $lifetime = null)
{
    return false;
}

protected function _renderBlock()
{
    $blockClass = $this->_placeholder->getAttribute('block');
    $template = $this->_placeholder->getAttribute('template');

    $block = new $blockClass;
    $block->setTemplate($template);
    $block->setLayout(Mage::app()->getLayout());
    return $block->toHtml();
}

Я также создал cache.xml под Каталогом / etc с моим заполнителем для CONSTANT_CACHE.

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




Нет необходимости:

  $info['current_product_id'] = Mage::registry('current_product')->getId();

Вы можете использовать этот метод:

$this->_getProductId()

реализовано в Enterprise_PageCache_Model_Container_Abstract




Links