Перфорация жатки в магазине magento

10

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

Вот мой код.

    class AD_PageCache_Model_Container_Header extends Enterprise_PageCache_Model_Container_Abstract {

    protected function _getIdentifier() {
        return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
    }

    // public function getCacheKeyInfo() {
    //  $info = parent::getCacheKeyInfo();
    //  die('boo');
    //  $info['cart_count'] = Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();

    //  return $info;
    // }

    protected function _getCacheId() {
        //return 'CONTAINER_HEADER_' . md5($this->_placeholder->getAttribute('cache_id') . $this->_placeholder->getAttribute('cart_count') ) . '_' . $this->_getIdentifier();
        return 'CONTAINER_HEADER_' . md5( $this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier() );
    }

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

        $block = new $blockClass;
        $block->setTemplate($template);
        return $block->toHtml();
    }

}

Насколько я понимаю из того, что я читал из дырявых потоков в Magento, приложение Mage не инициализируется, когда кэш FPC обслуживает запрос, поэтому в принципе метод добавления атрибута-заполнителя не может работать, поскольку

Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();

не сработает, верно?

И хотя это так и должно быть, но, похоже, он совсем не работал, как будто я die()позвонил туда, но ничего не произошло.

Так чего мне не хватает? И как я могу получить количество элементов корзины, чтобы его можно было использовать для создания идентификатора кэша?

Прогресс: я нашел

Enterprise_PageCache_Model_Cookie::COOKIE_CART

но это меняется только один раз при обновлении корзины. После этого он остается прежним. Это странно, похоже на решение, но его поведение говорит об обратном.

Я не мог найти количество элементов корзины в сессии. Таким образом, единственный способ сделать это сейчас - сохранить количество корзины в сеансе при каждом обновлении, а затем использовать его в _getIdentifier().

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

Кроме того, я прочитал аннулирование Full Page Cache при изменении корзины (цитаты), но он обрабатывает с помощью

Enterprise_PageCache_Model_Cookie::COOKIE_CART

что не работает в моем случае, хотя я думаю, что проблема заключается в этом. Что, как? Я не уверена.

Также текущая версия EE, на которой мы работаем, даже не имеет папки Advanced Model/Container. я используюEE 1.10.1.1

Какие-либо предложения?

Нирав Шет
источник
Не уверен, но я думаю, что этот вопрос больше относится к переполнению стека, но не к этому сайту ...
Сергей Гук
2
Кажется, что здесь используется дырокол в нетрадиционном смысле. Можете ли вы объяснить, какую функцию вы пытаетесь реализовать, не используя жаргон?
Ральф Тис
1
Почему бы не добавить идентификатор корзины покупателя, чтобы _getIdentifierблок был уникальным для корзины покупателя или даже для количества товаров в корзине?
B00MER
@SergeiGuk Ну, это сильно связано с Magento
j0k
@RalphTice Я пытаюсь реализовать индикатор стоимости корзины в заголовке, который показывает пользователю, сколько товаров у них в корзине. Так как это значение отличается для каждого пользователя, я не хочу, чтобы оно кэшировалось.
Нирав Шет

Ответы:

3

Использование Enterprise_PageCache_Model_Cookie::COOKIE_CART- правильный путь, но вам может потребоваться внести некоторые изменения.

Enterprise_PageCache_Model_Observer::registerQuoteChangeвызывается при каждом сохранении цитаты (включая изменение номера элемента), а также вызывается в контексте, Mage::app()чтобы вы могли получить доступ ко всем данным сеанса. Перезапишите этот наблюдатель и добавьте больше данных, $this->_getCookie()->setObscureчтобы значение менялось в любое время.

Пол Григорута
источник
Какие-нибудь примеры, которыми вы могли бы поделиться, делая это?
Нирав Шет