Я реализовал перфорирование заголовка в 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
Какие-либо предложения?
источник
_getIdentifier
блок был уникальным для корзины покупателя или даже для количества товаров в корзине?Ответы:
Использование
Enterprise_PageCache_Model_Cookie::COOKIE_CART
- правильный путь, но вам может потребоваться внести некоторые изменения.Enterprise_PageCache_Model_Observer::registerQuoteChange
вызывается при каждом сохранении цитаты (включая изменение номера элемента), а также вызывается в контексте,Mage::app()
чтобы вы могли получить доступ ко всем данным сеанса. Перезапишите этот наблюдатель и добавьте больше данных,$this->_getCookie()->setObscure
чтобы значение менялось в любое время.источник