php 在条件中获取Shopware 6属性选项名称筛选器

rbpvctlc  于 2023-05-21  发布在  PHP
关注(0)|答案(1)|浏览(191)

有人能给予一个建议,禁用/包括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.不,这不适用于标准功能,如变体。

ar7v8xwq

ar7v8xwq1#

首先,product.options.name应该是本例中正确的访问器。
我想你的过滤器可能有误解。您正在使用NotFilter::CONNECTION_OR作为NotFilter的操作符。这意味着其中任何一个条件都不需要满足。因此,如果product.properties.name不匹配,则product.options.name是否匹配无关紧要。我认为对于您的用例,您可能希望使用NotFilter::CONNECTION_AND,因此两个表达式都不需要为真。

new NotFilter(
    NotFilter::CONNECTION_AND,
    [
        new PrefixFilter('product.properties.name', 'OptionName1'),
        new PrefixFilter('product.options.name', 'OptionName2'),
    ]
)

为了通过管理使其可配置,存在各种不同的方法。您可能希望引入一个custom entity,它与一个选项有一对一的关联,与要排除的多个其他选项有多对多的关联。在管理中创建一个custom module,您可以在其中管理自定义实体,并使用其各自的排除项设置该选项。然后,在列表条件侦听器中,可以通过过滤器中包含的选项获取自定义实体,并从获取的结果中动态设置排除项。

相关问题