custom/plugins/VioB2BLogin/src/Storefront/Subscriber/AddressSubscriber.php line 126

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace VioB2BLogin\Storefront\Subscriber;
  4. use Exception;
  5. use NetInventors\NetiNextAddressTools\Events\CustomerAddressCriteriaEvent;
  6. use Shopware\Core\Checkout\Customer\Aggregate\CustomerAddress\CustomerAddressEntity;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  10. use Shopware\Core\PlatformRequest;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Shopware\Storefront\Page\Address\Listing\AddressListingCriteriaEvent;
  13. use Shopware\Storefront\Page\Address\Listing\AddressListingPageLoadedEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use VioB2BLogin\Core\Services\EmployeeService;
  19. use VioB2BLogin\Entity\Employee\EmployeeEntity;
  20. use VioB2BLogin\Entity\EmployeeAddress\EmployeeAddressEntity;
  21. class AddressSubscriber implements EventSubscriberInterface
  22. {
  23.     private EmployeeService $employeeService;
  24.     public function __construct(EmployeeService $employeeService)
  25.     {
  26.         $this->employeeService $employeeService;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         return [
  31.             AddressListingCriteriaEvent::class => 'onAddressCriteria',
  32.             CustomerAddressCriteriaEvent::class => 'onCustomerAddressCriteria',
  33.             AddressListingPageLoadedEvent::class => 'onPageLoaded',
  34.             KernelEvents::RESPONSE => 'onKernelResponse'
  35.         ];
  36.     }
  37.     public function onAddressCriteria(AddressListingCriteriaEvent $event): void
  38.     {
  39.         try {
  40.             $this->modifyCriteria($event->getCriteria(), $event->getSalesChannelContext());
  41.         } catch (Exception $ex) {
  42.         }
  43.     }
  44.     public function onCustomerAddressCriteria(CustomerAddressCriteriaEvent $event): void
  45.     {
  46.         try {
  47.             // check if the criteria has an NotFilter for the default shipping address id or the default billing address id
  48.             $filters $event->getCriteria()->getFilters();
  49.             $defaultShippingAddressId $event->getSalesChannelContext()->getCustomer()->getDefaultShippingAddressId();
  50.             $defaultBillingAddressId $event->getSalesChannelContext()->getCustomer()->getDefaultBillingAddressId();
  51.             $onlyAsShippingAddress false;
  52.             $onlyAsBillingAddress false;
  53.             foreach ($filters as $filter) {
  54.                 if ($filter instanceof NotFilter) {
  55.                     $queries $filter->getQueries();
  56.                     foreach ($queries as $query) {
  57.                         if ($query instanceof EqualsFilter ) {
  58.                             $value $query->getValue();
  59.                             if ($value === $defaultShippingAddressId ) {
  60.                                 $onlyAsShippingAddress true;
  61.                             }
  62.                             if ($value === $defaultBillingAddressId ) {
  63.                                 $onlyAsBillingAddress true;
  64.                             }
  65.                         }
  66.                     }
  67.                 }
  68.             }
  69.             $this->modifyCriteria($event->getCriteria(), $event->getSalesChannelContext(), $onlyAsShippingAddress$onlyAsBillingAddress);
  70.         } catch (Exception $ex) {
  71.         }
  72.     }
  73.     public function onKernelResponse(ResponseEvent $event)
  74.     {
  75.         if ($event->getRequest()->get('_route') !== 'frontend.neti_next_address_tools.get_addresses') {
  76.             return;
  77.         }
  78.         $response $event->getResponse();
  79.         if ( ! $response instanceof JsonResponse) {
  80.             return;
  81.         }
  82.         $data $response->getContent();
  83.         /** @noinspection PhpComposerExtensionStubsInspection */
  84.         $data json_decode($datatrue);
  85.         if ( ! is_array($data) || ! isset($data['data']) || ! isset($data['data']['rows'])) {
  86.             return;
  87.         }
  88.         try {
  89.             /** @var SalesChannelContext $salesChannelContext */
  90.             $salesChannelContext $event->getRequest()->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  91.             $customer $salesChannelContext->getCustomer();
  92.             $employee $this->employeeService->getEmployeeByContext($salesChannelContext);
  93.             if ($employee instanceof EmployeeEntity && $employee->getAddresses() && $employee->getAddresses()->count() > 0) {
  94.                 /** @var array $address */
  95.                 foreach ($data['data']['rows'] as &$address) {
  96.                     $employeeAddress $employee->getAddresses()->get($address['id']);
  97.                     if ($employeeAddress instanceof CustomerAddressEntity) {
  98.                         $relation $employeeAddress->getExtensionOfType('relationData'EmployeeAddressEntity::class);
  99.                         if ($relation instanceof EmployeeAddressEntity) {
  100.                             $address['relationData'] = $relation->getVars();
  101.                         }
  102.                         $address['isDefaultBilling'] = $customer->getDefaultBillingAddressId() === $address['id'];
  103.                         $address['isDefaultShipping'] = $customer->getDefaultShippingAddressId() === $address['id'];
  104.                     }
  105.                     else {
  106.                         unset($address);
  107.                     }
  108.                 }
  109.             }
  110.         } catch (Exception $ex) {
  111.         }
  112.         $response->setData($data);
  113.     }
  114.     public function onPageLoaded(AddressListingPageLoadedEvent $event): void
  115.     {
  116.         try {
  117.             $employee $this->employeeService->getEmployeeByContext($event->getSalesChannelContext());
  118.             if ($employee instanceof EmployeeEntity && $employee->getAddresses() && $employee->getAddresses()->count() > 0) {
  119.                 foreach ($event->getPage()->getAddresses() as $address) {
  120.                     $employeeAddress $employee->getAddresses()->get($address->getId());
  121.                     if ($employeeAddress instanceof CustomerAddressEntity) {
  122.                         $relation $employeeAddress->getExtensionOfType('relationData'EmployeeAddressEntity::class);
  123.                         if ($relation instanceof EmployeeAddressEntity) {
  124.                             $address->addExtension('relationData'$relation);
  125.                         }
  126.                     }
  127.                 }
  128.             }
  129.         } catch (Exception $ex) {
  130.         }
  131.     }
  132.     private function modifyCriteria(
  133.         Criteria $criteria,
  134.         SalesChannelContext $context,
  135.         bool $onlyAsShippingAddess false,
  136.         bool $onlyAsBillingAddess false
  137.     ): void
  138.     {
  139.         $employee $this->employeeService->getEmployeeByContext($context);
  140.         if ($employee instanceof EmployeeEntity && $employee->getAddresses() && $employee->getAddresses()->count() > 0) {
  141.             $ids $employee->getAddresses()->getIds();
  142.             if( $onlyAsShippingAddess ){
  143.                 $ids $employee->getAddresses()->filter(function (CustomerAddressEntity $address) {
  144.                     /** @var EmployeeAddressEntity $relation */
  145.                     $relation $address->getExtensionOfType('relationData'EmployeeAddressEntity::class);
  146.                     return $relation->isAsShippingAddress();
  147.                 })->getIds();
  148.             }
  149.             if ($onlyAsBillingAddess){
  150.                 $ids $employee->getAddresses()->filter(function (CustomerAddressEntity $address) {
  151.                     /** @var EmployeeAddressEntity $relation */
  152.                     $relation $address->getExtensionOfType('relationData'EmployeeAddressEntity::class);
  153.                     return $relation->isAsBillingAddress();
  154.                 })->getIds();
  155.             }
  156.             $criteria->setIds($ids);
  157.         }
  158.     }
  159. }