我需要从愿望清单中删除所有禁用的产品,为此,我在Magento_Wishlist/templates/item/list.phtml
中这样写产品状态检查:
if($product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED):
------------
endif;
我还添加了一个插件来更新标题部分中的愿望清单,如下所示:
/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>
供应商/客户/插件/愿望清单插件
<?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;
}
}
但是,当我在愿望清单中添加三项并禁用其中的一种产品时,愿望清单计数器无法正确更新,因此仍为三。有人请帮我解决这个问题吗?
答案 0 :(得分:0)
添加此内容取决于您,在页脚中调用它的最佳位置(它会触发该客户的心愿单计数在每个页面上更新)。
没有简单的方法来使插件(后端)中的数据无效,因此对于您正在执行的操作,因为您不知道何时在前端禁用产品,因此我们可以假设刷新每个页面上的愿望清单数据加载是最好的选择...
例如(在页脚中添加,更改为您的要求):
require([
....
'Magento_Customer/js/customer-data'
], function (...,customerData) {
"use strict";
...
var sections = ['wishlist'];
customerData.invalidate(sections);
customerData.reload(sections, true);
...
});