从愿望清单中删除禁用的产品
Remove disabled product from wishlist
我需要从心愿单中删除所有禁用的产品,为此我在 Magento_Wishlist/templates/item/list.phtml
中写了一个产品状态检查,如下所示:
if($product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED):
------------
endif;
我还在 header 部分添加了一个插件来更新心愿单数量,如下所示:
/etc/di.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Wishlist\CustomerData\Wishlist">
<plugin name="vendor-customer-wishlist"
type="Vendor\Customer\Plugin\WishlistPlugin" sortOrder="1" />
</type>
</config>
Vendor/Customer/Plugin/WishlistPlugin
<?php
namespace Vendor\Customer\Plugin;
use Magento\Catalog\Model\Product\Attribute\Source\Status;
/**
* Class WishlistPlugin
* @package Vendor\Customer\Plugin
*/
class WishlistPlugin
{
/**
* @var \Magento\Wishlist\Helper\Data
*/
protected $wishlistHelper;
/**
* @param \Magento\Wishlist\Helper\Data $wishlistHelper
*/
public function __construct(
\Magento\Wishlist\Helper\Data $wishlistHelper
) {
$this->wishlistHelper = $wishlistHelper;
}
/**
* Plugin function after get section data
*
* @param \Magento\Wishlist\CustomerData\Wishlist $subject
* @param $result
* @return mixed
*/
public function afterGetSectionData(\Magento\Wishlist\CustomerData\Wishlist $subject, $result)
{
$disabledProductsCount = 0;
foreach ($this->wishlistHelper->getWishlistItemCollection() as $item) {
if($item->getProduct()->getStatus() == Status::STATUS_DISABLED) $disabledProductsCount++;
}
$counterNumber = $this->wishlistHelper->getItemCount();
if($disabledProductsCount) {
$counterNumber -= $disabledProductsCount;
}
$result['counter'] = $counterNumber;
return $result;
}
}
但是当我在心愿单中添加三项并禁用其中的一项产品时,心愿单计数器无法正确更新,它仍然是三个。我该如何解决?
这取决于您将其添加到何处,可能最好的调用位置是在页脚(它将触发该客户的愿望清单计数在每一页上更新)。
没有简单的方法可以使您的插件(后端)中的数据无效,所以对于您正在做的事情,因为您永远不知道您何时在前端禁用产品,所以我们可以假设刷新愿望清单数据每个页面加载都是最好的选择...
例如(在页脚中添加,更改为您的要求):
require([
....
'Magento_Customer/js/customer-data'
], function (...,customerData) {
"use strict";
...
var sections = ['wishlist'];
customerData.invalidate(sections);
customerData.reload(sections, true);
...
});
我需要从心愿单中删除所有禁用的产品,为此我在 Magento_Wishlist/templates/item/list.phtml
中写了一个产品状态检查,如下所示:
if($product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED):
------------
endif;
我还在 header 部分添加了一个插件来更新心愿单数量,如下所示:
/etc/di.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Wishlist\CustomerData\Wishlist">
<plugin name="vendor-customer-wishlist"
type="Vendor\Customer\Plugin\WishlistPlugin" sortOrder="1" />
</type>
</config>
Vendor/Customer/Plugin/WishlistPlugin
<?php
namespace Vendor\Customer\Plugin;
use Magento\Catalog\Model\Product\Attribute\Source\Status;
/**
* Class WishlistPlugin
* @package Vendor\Customer\Plugin
*/
class WishlistPlugin
{
/**
* @var \Magento\Wishlist\Helper\Data
*/
protected $wishlistHelper;
/**
* @param \Magento\Wishlist\Helper\Data $wishlistHelper
*/
public function __construct(
\Magento\Wishlist\Helper\Data $wishlistHelper
) {
$this->wishlistHelper = $wishlistHelper;
}
/**
* Plugin function after get section data
*
* @param \Magento\Wishlist\CustomerData\Wishlist $subject
* @param $result
* @return mixed
*/
public function afterGetSectionData(\Magento\Wishlist\CustomerData\Wishlist $subject, $result)
{
$disabledProductsCount = 0;
foreach ($this->wishlistHelper->getWishlistItemCollection() as $item) {
if($item->getProduct()->getStatus() == Status::STATUS_DISABLED) $disabledProductsCount++;
}
$counterNumber = $this->wishlistHelper->getItemCount();
if($disabledProductsCount) {
$counterNumber -= $disabledProductsCount;
}
$result['counter'] = $counterNumber;
return $result;
}
}
但是当我在心愿单中添加三项并禁用其中的一项产品时,心愿单计数器无法正确更新,它仍然是三个。我该如何解决?
这取决于您将其添加到何处,可能最好的调用位置是在页脚(它将触发该客户的愿望清单计数在每一页上更新)。
没有简单的方法可以使您的插件(后端)中的数据无效,所以对于您正在做的事情,因为您永远不知道您何时在前端禁用产品,所以我们可以假设刷新愿望清单数据每个页面加载都是最好的选择...
例如(在页脚中添加,更改为您的要求):
require([
....
'Magento_Customer/js/customer-data'
], function (...,customerData) {
"use strict";
...
var sections = ['wishlist'];
customerData.invalidate(sections);
customerData.reload(sections, true);
...
});