<?php declare(strict_types=1);
namespace Wexo\Checkout\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
use Shopware\Core\System\CustomField\CustomFieldEntity;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\Checkout\WexoCheckout;
/**
* Class CheckoutSubscriber
* @package Wexo\Checkout\Subscriber
*/
class CheckoutSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
protected $customFieldSetRepository;
/**
* CheckoutSubscriber constructor.
* @param EntityRepositoryInterface $customFieldSetRepository
*/
public function __construct(EntityRepositoryInterface $customFieldSetRepository)
{
$this->customFieldSetRepository = $customFieldSetRepository;
}
/**
* @return string[]
*/
public static function getSubscribedEvents()
{
return [
CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmPage'
];
}
/**
* @param CheckoutConfirmPageLoadedEvent $event
*/
public function onCheckoutConfirmPage(CheckoutConfirmPageLoadedEvent $event)
{
$salesChannelId = $event->getSalesChannelContext()->getSalesChannel()->getId();
$salesChannelField = WexoCheckout::CHECKOUT_ADDITIONAL_FIELDS
. '_' . $salesChannelId;
// TODO: Make a class to handle checkout_additional_fields instead.
$context = $event->getContext();
foreach ([WexoCheckout::CHECKOUT_ADDITIONAL_FIELDS, $salesChannelField] as $field) {
$criteria = new Criteria();
$criteria->addFilter(
new EqualsFilter('name', $field)
);
$criteria->addAssociation('customFields');
/** @var CustomFieldSetEntity|null $checkoutAdditionalFields */
$checkoutAdditionalFields = $this->customFieldSetRepository->search($criteria, $context)->first();
if ($checkoutAdditionalFields) {
$customFields = $checkoutAdditionalFields->getCustomFields();
if ($customFields->count()) {
$customFields->sort(function ($a, $b) {
return $a->getConfig()['customFieldPosition'] - $b->getConfig()['customFieldPosition'];
});
$event->getPage()->addExtension(
$field,
$customFields
);
}
}
}
}
}