<?php
namespace Twigel\SportB2B\Subscriber;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class FilterSubscriber implements EventSubscriberInterface
{
private EntityRepositoryInterface $advancedPricesRepository;
private RequestStack $requestStack;
public function __construct(
EntityRepositoryInterface $advancedPricesRepository,
RequestStack $requestStack
)
{
$this->advancedPricesRepository = $advancedPricesRepository;
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents(): array
{
return [
ProductEvents::PRODUCT_LOADED_EVENT => 'getAdvancedPrices',
ProductEvents::PRODUCT_LISTING_CRITERIA => 'onLoad',
];
}
public function onLoad(ProductListingCriteriaEvent $event)
{
$event->getCriteria()->addAssociations(['tags']);
}
public function getAdvancedPrices(EntityLoadedEvent $event)
{
$request = $this->requestStack->getCurrentRequest()->attributes->get('sw-sales-channel-context');
if ($request !== null) {
$ifLogged = $request->getCustomer();
if ($ifLogged !== null) {
$context = $event->getContext();
$groupId = $ifLogged->getGroupId();
$products = $event->getEntities();
foreach ($products as $product) {
$productId = $product->get('id');
$criteria = new Criteria();
$criteria->addFilter
(
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('groupId', $groupId),
new EqualsFilter('productId', $productId),
]
)
);
$searchResult = $this->advancedPricesRepository->search($criteria, $context)->first();
if (!empty($searchResult)) {
$grossPrice = $searchResult->get('gross');
$result['productId'] = $productId;
$result['price'] = $grossPrice;
$product->addArrayExtension('advancedPricing', $result);
}
}
}
}
}
}