Вот как выглядит класс Subscriber.php:
Код: Выделить всё
class Subscriber implements EventSubscriberInterface
{
private EntityRepository $optionRepository;
public function __construct(EntityRepository $optionRepository)
{
$this->optionRepository = $optionRepository;
}
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();
$event->getContext()->addExtension('currentPropertyOptionsCriteria', new ArrayEntity($currentPropertyOptions));
$criteria1 = new Criteria();
$criteria1->addAssociation('myTags');
$criteria1->setIds($currentPropertyOptions);
$tags = new TagCollection();
$options = $this->optionRepository->search($criteria1, $event->getContext())->getEntities();
/** @var PropertyGroupOptionEntity $option */
foreach ($options as $option) {
$extension = $option->getExtension('myTags');
if (!$extension instanceof TagCollection) {
continue;
}
$tags->merge($extension);
}
$tags = $option->getExtension('myTags');
$tagnames = $tags->map(fn (TagEntity $tag) => $tag->getName());
$event->getContext()->addExtension('myTagsNames1', new ArrayEntity($tagnames));
$prefixes = ['84a5f522d04f463a93a858b3c1bb8f7a','40f24f88c4c34196ad21ec5dcd094e6a', 'e892c99ffc5747848aea3aa5c8126201', '96e839a6e32a4301b238e90088f4a778', 'c5d7bcee60f7493bb6203965e15068e0', '9c493945d37b4ff1b527a874d8315519', 'f032b2d21c484196ad3a98d90379f6c0', 'a07ec367574a4c3d81b7fb6ceae66ffe'];
if (in_array('3f777000a2734deead391133cee3a6a9', $currentPropertyOptions)) {
$multiFilter = new MultiFilter(MultiFilter::CONNECTION_OR);
foreach ($tagnames as $tagname) { $multiFilter->addQuery(new PrefixFilter('product.properties.name', $tagname));}
foreach ($prefixes as $prefix) {
$multiFilter->addQuery(new EqualsFilter('product.properties.group.id', $prefix));
}
$criteria->addFilter($multiFilter);
}
..
if (in_array('a637fe94fe794a84b0ce7fc2a13e1485', $currentPropertyOptions)) {
$multiFilter = new MultiFilter(MultiFilter::CONNECTION_OR);
foreach ($tagnames as $tagname) { $multiFilter->addQuery(new PrefixFilter('product.properties.name', $tagname));}
foreach ($prefixes as $prefix) {
$multiFilter->addQuery(new EqualsFilter('product.properties.group.id', $prefix));
}
$criteria->addFilter($multiFilter);
}
}
}
Может кто-нибудь дать совет по отладке? Или, может быть, есть новый способ реализации такого рода пользовательской фильтрации в Shopware 6.5.7.0 или 6.6 (мы собираемся обновить его до последней версии)?
При попытке переустановить плагин , мы получаем эту ошибку:
Код: Выделить всё
Internal Server Error: Table "myfilter_property_group_option_tag" has to be prefixed with "custom_entity_ or ce_"
Я думаю, что мы можем пока пропустить обновление имен полей базы данных.
Я обнаружил, что фильтр останавливается. фильтрация свойств, начиная с версии Showpare 6.5.7.0.
Единственная проблема с обновлением, связанная с фильтром, которую я обнаружил, это вот эта, но пока не могу сделать ее полезной: https:/ /github.com/shopware/shopware/blob/v6.5.7.0/changelog/release-6-5-7-0/2023-11-03-fix-dynamic-product-listing-filter.md
Также я обнаружил, что кеш может вызывать проблему, и в этой версии есть обновление, позволяющее использовать этот кеш: https://github.com/shopware/shopware/bl ... og/release -6-5-7-0/2022-09-29-cms-navigation-http-cache.md
Но отключение через .env здесь не помогает: SHOPWARE_HTTP_CACHE_ENABLED="0"
Подробнее здесь: https://stackoverflow.com/questions/788 ... oesnt-work