我有一个侦听<event name="controller_action_predispatch">
事件的观察器。
观察者的执行方法在每个请求上都正确运行,但在启用缓存(更具体地说是全页缓存)时,Cookie设置不正确。CCD_ 2。
现在,当我禁用缓存时,cookie会按预期设置,但当从产品列表页面向购物车添加项目时,右上角的迷你购物车会保持为空。真正看到迷你购物车中的商品并能够结账的唯一方法是,首先转到一个随机的产品概述页面,然后从那里将其添加到购物车中。有什么想法吗?
在观察者内部设置Cookie:
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
观察员类:
class MyObserver implements ObserverInterface {
protected $messageManager;
protected $cart;
protected $scopeConfig;
protected $logger;
public function __construct(
MagentoFrameworkMessageManagerInterface $messageManager,
MagentoCheckoutModelCart $cart,
MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
PsrLogLoggerInterface $logger
) {
$this->messageManager = $messageManager;
$this->cart = $cart;
$this->scopeConfig = $scopeConfig;
$this->logger = $logger;
}
public function execute(MagentoFrameworkEventObserver $observer)
{
$objectManager = MagentoFrameworkAppObjectManager::getInstance();
$cookieManager = $objectManager->get('MagentoFrameworkStdlibCookieManagerInterface');
$customer = $objectManager->create('MagentoCustomerModelCustomer');
$product = $objectManager->create('MagentoCatalogModelProduct');
$cart = $objectManager->get('MagentoCheckoutModelCart');
$customerSession = $objectManager->get('MagentoCustomerModelSession');
// COOKIE
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
$this->logger->info('COOKIE IS ==> ' . $cookieManager->getCookie('Custom_Cookie'));
...
}
我刚刚构建了一个扩展,它几乎与您正在做的完全一样。请参阅下面我使用的代码。这应该对你有用。
观察员类别:
<?php
namespace CompanyModuleObserver;
class AffiliateTracking implements MagentoFrameworkEventObserverInterface
{
/**
* @var MagentoFrameworkRegistry
*/
protected $_registry;
/**
* @var MagentoFrameworkAppRequestHttp
*/
protected $_request;
/**
* @var
*/
protected $_cookieManager;
/**
* @var CookieMetadataFactory
*/
protected $_cookieMetadataFactory;
protected $_sessionManager;
/**
* The affiliate cookie name
*/
const COOKIE_NAME = "nh_affiliate_id";
public function __construct(
MagentoFrameworkRegistry $registry,
MagentoFrameworkAppRequestHttp $request,
MagentoFrameworkStdlibCookieManagerInterface $cookieManager,
MagentoFrameworkStdlibCookieCookieMetadataFactory $cookieMetadataFactory,
MagentoFrameworkSessionSessionManagerInterface $sessionManager)
{
$this->_registry = $registry;
$this->_request = $request;
$this->_cookieManger = $cookieManager;
$this->_cookieMetadataFactory = $cookieMetadataFactory;
$this->_sessionManager = $sessionManager;
}
/**
* @param MagentoFrameworkEventObserver $observer
* @return $this
*/
public function execute(MagentoFrameworkEventObserver $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;
}
}
这是4年后的事了,但我遇到了同样的问题-
使用了controller_front_send_response_before
事件,并且运行良好。
您有拼写错误。
更改
$this->_cookieManger = $cookieManager;
至
$this->_cookieManager = $cookieManager;