<?php declare(strict_types=1);
namespace Bss\CheckoutCustomField\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
class OrderLoadedSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
protected $customFieldRepository;
/**
* @var EntityRepositoryInterface
*/
protected $customFieldSetRepository;
/**
* @var EntityRepositoryInterface
*/
protected $customFieldSetRelationRepository;
/**
* @var SystemConfigService
*/
protected $systemConfig;
/**
* @param EntityRepositoryInterface $customFieldRepository
* @param EntityRepositoryInterface $customFieldSetRepository
* @param EntityRepositoryInterface $customFieldSetRelationRepository
* @param SystemConfigService $systemConfig
*/
public function __construct(
SystemConfigService $systemConfig,
EntityRepositoryInterface $customFieldRepository,
EntityRepositoryInterface $customFieldSetRepository,
EntityRepositoryInterface $customFieldSetRelationRepository
)
{
$this->systemConfig = $systemConfig;
$this->customFieldRepository = $customFieldRepository;
$this->customFieldSetRepository = $customFieldSetRepository;
$this->customFieldSetRelationRepository = $customFieldSetRelationRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
CheckoutConfirmPageLoadedEvent::class => 'onOrderLoaded'
];
}
/**
* @return void
*/
public function onOrderLoaded(CheckoutConfirmPageLoadedEvent $event): void
{
if ($this->systemConfig->get('BssCheckoutCustomField.config.active')) {
$request = $event->getRequest();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('entityName', 'checkout_page'));
$customFieldSets = $this->customFieldSetRelationRepository->search($criteria, $event->getContext())->getEntities();
$ids = array();
foreach ($customFieldSets as $key => $customFieldSet) {
$ids[] = $customFieldSet->getCustomFieldSetId();
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsAnyFilter('id', $ids));
$criteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING));
$customFieldSets2 = $this->customFieldSetRepository->search($criteria, $event->getContext())->getEntities();
$sets = [];
$customerGroupShow = null;
$currentCustomerGoup = $event->getSalesChannelContext()->getCurrentCustomerGroup()->getId();
foreach ($customFieldSets2->getElements() as $key => $cus) {
if(!isset($cus->getConfig()['bssCustomerGroup']) || empty($cus->getConfig()['bssCustomerGroup']) || in_array($currentCustomerGoup,$cus->getConfig()['bssCustomerGroup'])) {
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('customFieldSetId', $cus->getId()));
$customFields = $this->customFieldRepository->search($criteria, $event->getContext())->getEntities();
$elements = $customFields->getElements();
usort($elements, function($a, $b) {
return $a->getConfig()['customFieldPosition'] > $b->getConfig()['customFieldPosition'];
});
$sets[$key]['name'] = $cus->getName();
$sets[$key]['config'] = $cus->getConfig();
$sets[$key]['active'] = $cus->active;
$sets[$key]['customFields'] = $elements;
$customerGroupShow = true;
}
}
$request->request->set('showBssCustomField', $customerGroupShow ? count($customFieldSets) : 0);
$request->request->set('bssCustomField', $sets);
}
}
}