<?php
namespace TwigelHardTheme\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Entity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use function Amp\Promise\first;
class ProductPageLoadedSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private EntityRepositoryInterface $productRepository;
public function __construct($productRepository)
{
$this->productRepository = $productRepository;
}
public static function getSubscribedEvents()
{
return [
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductPageLoaded(ProductPageLoadedEvent $event)
{
$pageURL = $_SERVER['APP_URL'] . $_SERVER['REQUEST_URI'];
$productCustomField = $event->getPage()->getProduct()->getCustomFields();
$productId = $event->getPage()->getProduct()->getId();
$event->getPage()->assign(['pageURL' => $pageURL]);
if (!array_key_exists('twigel_product_link_productsLinks', $productCustomField)) {
return;
}
$productCustomField = $productCustomField['twigel_product_link_productsLinks'];
$products = [];
foreach ($productCustomField as $key => $value) {
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $value));
$criteria->addAssociations(['cover', 'categories', 'seoUrls']);
$product = $this->productRepository->search($criteria, $event->getContext())->first();
if ($product) {
$customFields = $productCustomField;
unset($customFields[$key]);
$customFields[] = $productId;
$newCustomFields['twigel_product_link_productsLinks'] = array_values($customFields);
$this->productRepository->update([
[
'id' => $value,
'customFields' => $newCustomFields
]
], $event->getContext());
$products[$product->getId()] = $product;
}
}
$event->getPage()->assign(['productLink' => $products]);
}
}