<?php declare(strict_types=1);
namespace Proc\ProcWegReg\Page;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\System\Salutation\SalesChannel\AbstractSalutationRoute;
use Shopware\Core\System\Country\SalesChannel\AbstractCountryRoute;
use Shopware\Core\System\Country\CountryCollection;
use Shopware\Core\System\Salutation\SalutationCollection;
use Shopware\Core\System\Salutation\SalutationEntity;
class CustomRegisterProcessPageLoader
{
private GenericPageLoaderInterface $genericPageLoader;
private EventDispatcherInterface $eventDispatcher;
private AbstractSalutationRoute $salutationRoute;
private AbstractCountryRoute $countryRoute;
public function __construct(
GenericPageLoaderInterface $genericPageLoader,
EventDispatcherInterface $eventDispatcher,
AbstractSalutationRoute $salutationRoute,
AbstractCountryRoute $countryRoute)
{
$this->genericPageLoader = $genericPageLoader;
$this->eventDispatcher = $eventDispatcher;
$this->salutationRoute = $salutationRoute;
$this->countryRoute = $countryRoute;
}
public function load(Request $request, SalesChannelContext $context): CustomRegisterProcessPage
{
$page = $this->genericPageLoader->load($request, $context);
$page = CustomRegisterProcessPage::createFrom($page);
$page->setCountries($this->getCountries($context));
$page->setSalutations($this->getSalutations($context));
$this->eventDispatcher->dispatch(
new CustomRegisterProcessPageLoadedEvent($page, $context, $request)
);
return $page;
}
private function getSalutations(SalesChannelContext $salesChannelContext): SalutationCollection
{
$salutations = $this->salutationRoute->load(new Request(), $salesChannelContext, new Criteria())->getSalutations();
$salutations->sort(function (SalutationEntity $a, SalutationEntity $b) {
return $b->getSalutationKey() <=> $a->getSalutationKey();
});
return $salutations;
}
private function getCountries(SalesChannelContext $salesChannelContext): CountryCollection
{
$criteria = (new Criteria())
->addFilter(new EqualsFilter('active', true))
->addAssociation('states');
$countries = $this->countryRoute->load(new Request(), $criteria, $salesChannelContext)->getCountries();
$countries->sortCountryAndStates();
return $countries;
}
}