<?php
namespace Twigel\SportBadges\Subscriber;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Storefront\Page\GenericPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PageLoaded implements EventSubscriberInterface
{
public $categoryRepository;
public $badgesRepository;
public $productRepository;
public function __construct($categoryRepository, $badgesRepository, $productRepository)
{
$this->categoryRepository = $categoryRepository;
$this->badgesRepository = $badgesRepository;
$this->productRepository = $productRepository;
}
public static function getSubscribedEvents()
{
return [
// GenericPageLoadedEvent::class => "pageLoaded",
ProductEvents::PRODUCT_LOADED_EVENT => "pageLoadedProducts" // TODO changed event to PRODUCT_LOADED
];
}
public function pageLoaded(GenericPageLoadedEvent $event)
{
if ($event->getPage()->getHeader()) {
$categoryId = $event->getPage()->getHeader()->getNavigation()->getActive()->getId();
$criteria = new Criteria([$categoryId]);
$criteria->addAssociations(['products']);
$categoryProducts = $this->categoryRepository->search($criteria, $event->getContext())->first()->getProducts();
$productsBadgesArray = [];
foreach ($categoryProducts as $product) {
if ($product->getCustomFields() && array_key_exists('twigelBadges', $product->getCustomFields()) && !empty($product->getCustomFields()['twigelBadges'])) {
$productBadges = $product->getCustomFields()['twigelBadges'];
$criteria = new Criteria($productBadges);
$badges = $this->badgesRepository->search($criteria, $event->getContext())->getElements();
$productsBadgesArray[$product->getId()] = $badges;
}
}
$event->getPage()->assign(['productBadges'=>$productsBadgesArray]);
}
}
public function pageLoadedProducts(EntityLoadedEvent $event)
{
$products = $event->getEntities();
foreach ($products as $product) {
if ($product->getCustomFields() && array_key_exists('twigelBadges', $product->getCustomFields()) && !empty($product->getCustomFields()['twigelBadges'])) {
$productBadges = $product->getCustomFields()['twigelBadges'];
$criteria = new Criteria($productBadges);
$badges = $this->badgesRepository->search($criteria, $event->getContext())->getElements();
$product->setExtensions(['badge' => $badges]);
}
}
}
}