UX4U
28. Oktober 2024 um 15:56
1
Wie kann man die Anzahl der Artikel, die unter einen Filter fallen, anzeigen lassen?
Wie bei Onlineshops üblich, sollte bei Filtern die Anzahl der Produkte mit einer bestimmten Eigenschaft in Klammern hinter der Eigenschaft stehen.
Per {{ dump() }} habe ich keine passende Variable gefunden.
Kavkus
28. Oktober 2024 um 16:21
2
Kann man über das ProductListingCriteriaEvent machen, muss man halt zählen, je Filter.
Hätte das mit einer foreach schleife gemacht($criteria->getFilters() as $filter)
Dann halt via Extension dem Filter die Anzahl durchgeben und die im Template halt anpassen und ausgeben.
UX4U
28. Oktober 2024 um 18:27
3
Danke. Kannst du mir bitte schreiben, wie man das genau macht?
Das Template anpassen und eine Variable ausgeben lassen, kann ich.
Kavkus
28. Oktober 2024 um 19:24
4
Also rein ausm bauch raus würde ich folgenden Subscriber schreiben:
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Storefront\Page\Product\ProductListingCriteriaEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
class ProductListingSubscriber implements EventSubscriberInterface
{
public function __construct(private EntityRepository $productRepository)
{ }
public static function getSubscribedEvents(): array
{
return [
ProductListingCriteriaEvent::class => 'addFilterCounts'
];
}
public function addFilterCounts(ProductListingCriteriaEvent $event): void
{
$criteria = $event->getCriteria();
$context = $event->getContext();
foreach ($criteria->getFilters() as $filter) {
$countCriteria = clone $criteria;
$result = $this->productRepository->search($countCriteria, $context);
$total = $result->getTotal();
$filter->setExtensions(['productCount' => $total]);
}
}
}
Ungetestet…
das ganze müsste dann im template mit {{FILTER.extensions.productCount}}
abgerufen werden können.
UX4U
29. Oktober 2024 um 10:55
5
Vielen Dank.
Wo kommt der Code für den Subscriber hin? Ich habe noch nie einen Subscriber gemacht.