2016-07-29 7 views
1

イベントを聞くオブザーバーが<event name="controller_action_predispatch">です。キャッシュが有効になっているときにCookie(Observer)が設定されていませんMagento 2.0.7

すべてのリクエストでオブザーバの実行メソッドが正しく実行されていますが、キャッシュが有効になっている場合はCookieが正しく設定されていません。 (System -> Cache Management -> Page Cache)

キャッシュを無効にすると、Cookieは期待どおりに設定されますが、商品リストページからカートにアイテムを追加するときは、右上のミニカートは空のままです。ミニカート内のアイテムを実際に見てチェックアウトできる唯一の方法は、最初にランダムな商品概要ページに移動してからカートに追加することです。何か案は?オブザーバー内部クッキーの設定

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

Observerクラス:

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

私はほぼ正確にあなたが何をしているかのようである拡張機能を構築しました。下記のコードをご覧ください。これはあなたのために働くはずです。

オブザーバークラス:

<?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; 
    } 
} 
関連する問題