2016-07-29 8 views
1

У меня есть наблюдатель, который слушает <event name="controller_action_predispatch"> событий.Cookies (Observer) не установлены, когда включен кеш Magento 2.0.7

Метод выполнения наблюдателя корректно работает на каждом запросе, но Cookies установлены неправильно, когда включено кеширование, более конкретный полный кэш страницы. (System -> Cache Management -> Page Cache).

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

Настройка Cookies внутри наблюдателя:

$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie'); 

Класс, наблюдатель:

class MyObserver implements ObserverInterface { 

protected $messageManager; 
protected $cart; 
protected $scopeConfig; 
protected $logger; 

public function __construct(
    \Magento\Framework\Message\ManagerInterface $messageManager, 
    \Magento\Checkout\Model\Cart $cart, 
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, 
    \Psr\Log\LoggerInterface $logger 
) { 

    $this->messageManager = $messageManager; 
    $this->cart = $cart; 
    $this->scopeConfig = $scopeConfig; 
    $this->logger = $logger; 
} 

public function execute(\Magento\Framework\Event\Observer $observer) 
{ 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
    $cookieManager = $objectManager->get('Magento\Framework\Stdlib\CookieManagerInterface'); 
    $customer = $objectManager->create('Magento\Customer\Model\Customer'); 
    $product = $objectManager->create('Magento\Catalog\Model\Product'); 
    $cart = $objectManager->get('Magento\Checkout\Model\Cart'); 
    $customerSession = $objectManager->get('Magento\Customer\Model\Session'); 

    // COOKIE 
    $cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie'); 
    $this->logger->info('COOKIE IS ==> ' . $cookieManager->getCookie('Custom_Cookie')); 

    ... 

} 

ответ

1

Я только что построил расширение, почти так же, как то, что вы делаете. См. Код, который я использовал ниже. Это должно сработать для вас.

Observer Класс:

<?php 

namespace Company\Module\Observer; 

class AffiliateTracking implements \Magento\Framework\Event\ObserverInterface 
{ 
    /** 
    * @var \Magento\Framework\Registry 
    */ 
    protected $_registry; 

    /** 
    * @var \Magento\Framework\App\Request\Http 
    */ 
    protected $_request; 

    /** 
    * @var 
    */ 
    protected $_cookieManager; 

    /** 
    * @var CookieMetadataFactory 
    */ 
    protected $_cookieMetadataFactory; 

    protected $_sessionManager; 

    /** 
    * The affiliate cookie name 
    */ 
    const COOKIE_NAME = "nh_affiliate_id"; 



    public function __construct(
     \Magento\Framework\Registry $registry, 
     \Magento\Framework\App\Request\Http $request, 
     \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager, 
     \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory, 
     \Magento\Framework\Session\SessionManagerInterface $sessionManager) 
    { 
     $this->_registry = $registry; 
     $this->_request = $request; 
     $this->_cookieManger = $cookieManager; 
     $this->_cookieMetadataFactory = $cookieMetadataFactory; 
     $this->_sessionManager = $sessionManager; 
    } 

    /** 
    * @param \Magento\Framework\Event\Observer $observer 
    * @return $this 
    */ 
    public function execute(\Magento\Framework\Event\Observer $observer) 
    { 
     $affiliateId = $this->_request->getParam("SSAID", false); 

     if ($affiliateId) 
     { 
      $publicCookieMetadata = $this->_cookieMetadataFactory->createPublicCookieMetadata() 
       ->setDuration(2592000) 
       ->setPath($this->sessionManager->getCookiePath()) 
       ->setDomain($this->sessionManager->getCookieDomain()) 
       ->setHttpOnly(false); 

      $this->_cookieManager->setPublicCookie(self::COOKIE_NAME, 
       $affiliateId, 
       $publicCookieMetadata 
      ); 
     } 

     return $this; 
    } 
}