有人能给予一个建议,禁用/包括Shopware 6属性选项的标准?
我可以使用这个过滤来访问属性名称(尽管在这种情况下过滤器的工作有点不正确,因为我们需要禁用选项,而不是属性):
new PrefixFilter('product.properties.name', 'OptionName1')
但是,在这种情况下,我如何访问选项名称以禁用其中的一些选项?这里的订阅者我有:
namespace CustomFilterBasedOnSelectedOptions\Subscriber;
use ..
class Subscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
ProductListingCriteriaEvent::class => [
['onListingCriteria', -200],
],
];
}
public function onListingCriteria(ProductListingCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation('properties');
$event->getCriteria()->addAssociation('properties.group');
$criteria = $event->getCriteria();
$filters = $criteria->getExtension('filters');
if (!$filters instanceof FilterCollection) {
return;
}
$propertyFilter = $filters->get('properties');
if (!$propertyFilter instanceof Filter || !\is_array($propertyFilter->getValues())) {
return;
}
$currentPropertyOptions = $propertyFilter->getValues();
$criteria = $event->getCriteria();
if (in_array('c0d02d1738fd4293a489695787e06b5c', $currentPropertyOptions)) {
$criteria->addFilter(
new NotFilter(
NotFilter::CONNECTION_OR,
[
new PrefixFilter('product.properties.name', 'OptionName1'), //can get, but we need disable some options
new PrefixFilter('product.options.name', 'OptionName2') // can't get
]
)
);
}
}
}
此外,我们将设置此选项可用于管理员后端设置。所以我认为,这最终应该使用ID来完成?有人能给予一个提示,在哪里移动到设置这是可调的通过后端?我的意思是分配一个属性的某些选项,使其仅适用于另一个属性的某些选定选项。
P.S.不,这不适用于标准功能,如变体。
1条答案
按热度按时间ar7v8xwq1#
首先,
product.options.name
应该是本例中正确的访问器。我想你的过滤器可能有误解。您正在使用
NotFilter::CONNECTION_OR
作为NotFilter
的操作符。这意味着其中任何一个条件都不需要满足。因此,如果product.properties.name
不匹配,则product.options.name
是否匹配无关紧要。我认为对于您的用例,您可能希望使用NotFilter::CONNECTION_AND
,因此两个表达式都不需要为真。为了通过管理使其可配置,存在各种不同的方法。您可能希望引入一个custom entity,它与一个选项有一对一的关联,与要排除的多个其他选项有多对多的关联。在管理中创建一个custom module,您可以在其中管理自定义实体,并使用其各自的排除项设置该选项。然后,在列表条件侦听器中,可以通过过滤器中包含的选项获取自定义实体,并从获取的结果中动态设置排除项。