<?php declare(strict_types=1);
namespace Xioni\Xconfig\Storefront\Page\Product\Subscriber;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Context;
class ProductPageSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $productRepository;
public function __construct(EntityRepositoryInterface $productRepository)
{
$this->productRepository = $productRepository;
}
public static function getSubscribedEvents()
{
return [
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductPageLoaded(ProductPageLoadedEvent $event): void
{
$page = $event->getPage();
$product = $page->getProduct();
$product_number = $product->getProductNumber();
$x_product = $this->getConfigurationProduct($product_number);
$x_product = json_decode($x_product, true);
$xconfig = false;
if($x_product['data']) {
$x_variants_accessories = $this->getVariantsAccessoriesByProductId($x_product['data']['base']['id']);
$x_variants_accessories = json_decode($x_variants_accessories, true);
$xconfig = true;
$accessory_products = array();
if (isset($x_product['data']['product_accessories'])) {
foreach($x_product['data']['product_accessories'] as $index => $item) {
$item = $item['product'];
$criteria = new Criteria();
// var_dump($item);
// $criteria->addPostFilter(new EqualsFilter('productNumber', $item['base']['product_number']));
// $newContext = Context::createDefaultContext();
// $accessory_products[] = $this->productRepository->search($criteria, $newContext)->getElements();
}
}
if (isset($x_variants_accessories['data'])) {
foreach($x_variants_accessories['data'] as $index => $item) {
$criteria = new Criteria();
// var_dump($item);
// $criteria->addPostFilter(new EqualsFilter('productNumber', $item['base']['product_number']))->addAssociation('cover');
// $newContext = Context::createDefaultContext();
// $accessory_products[] = $this->productRepository->search($criteria, $newContext)->getElements();
}
}
$accessory_products = array_filter($accessory_products);
$page->addExtension('xconfig', new ArrayEntity(['product' => $x_product]));
$page->addExtension('xconfig_accessories', new ArrayEntity(['accessories' => $accessory_products]));
}
$page->addExtension('is_xconfig', new ArrayEntity(['has_configuration' => $xconfig]));
}
public function getConfigurationProduct($product_number)
{
$url = 'http://151.252.50.234:8086/api/cim/products/getbyproductnumber/'.$product_number;
$product = file_get_contents($url);
return $product;
}
public function getVariantsAccessoriesByProductId($id)
{
$url = 'http://151.252.50.234:8086/api/cim/matrix/getaccessoriesbyproduct/'.$id;
$variants = file_get_contents($url);
return $variants;
}
public function getProduct($id)
{
$url = 'http://151.252.50.234:8086/api/pim/article/get/'.$id;
$product = file_get_contents($url);
return $product;
}
}