2016-07-29 22 views
1

Ich habe einen Beobachter, der auf <event name="controller_action_predispatch"> Ereignisse hört.Cookies (Beobachter) nicht gesetzt, wenn Cache aktiviert Magento 2.0.7

Die Ausführungsmethode des Beobachters wird bei jeder Anforderung korrekt ausgeführt, aber Cookies sind nicht korrekt eingestellt, wenn das Caching aktiviert ist, spezifischerer Ganzseitencache. (System -> Cache Management -> Page Cache).

Jetzt, wenn ich den Cache deaktiviere, werden die Cookies wie erwartet gesetzt, aber der Miniwagen in der oberen rechten Ecke bleibt leer, wenn Artikel aus der Produktlistenseite zum Warenkorb hinzugefügt werden. Die einzige Möglichkeit, die Artikel im Minikarren zu sehen und auschecken zu können, besteht darin, zunächst auf eine zufällige Produktübersichtsseite zu gehen und sie dann von dort in den Warenkorb zu legen. Irgendwelche Ideen?

Cookies setzen im Inneren des Betrachters:

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

The Observer Klasse:

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')); 

    ... 

} 

Antwort

1

Ich baute nur eine Erweiterung, die wie fast genau das, was Sie tun. Bitte beachten Sie den Code, den ich unten verwendet habe. Dies sollte für Sie arbeiten.

Observer Klasse:

<?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; 
    } 
}