src/Controller/CatalogController.php line 76

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Form\CatalogAddressInformationFormType;
  4. use App\Repository\CatalogOrderRepository;
  5. use Factory\OrderManagementBundle\Repository\Customer\AddressRepository;
  6. use Factory\SupportBundle\Repository\FormRepository;
  7. use Knp\Component\Pager\PaginatorInterface;
  8. use Pimcore\Model\DataObject\Catalog;
  9. use Pimcore\Model\DataObject\Catalog\Listing as CatalogListing;
  10. use Pimcore\Model\DataObject\Fieldcollection;
  11. use App\Classes\Controller\AbstractFrontController as AbstractFrontController;
  12. use App\Classes\DataMapper\Catalog\CatalogListingDataMapper;
  13. use App\Classes\DataMapper\Customer\Address\AddressDataMapper;
  14. use App\Repository\CustomerRepository;
  15. use App\Service\Contract\RecaptchaValidationServiceInterface;
  16. use App\Traits\ControllerSidebarLinks;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Zend\Paginator\Paginator;
  22. class CatalogController extends AbstractFrontController
  23. {
  24.     use ControllerSidebarLinks;
  25.     const SHOW_PER_PAGE 6;
  26.     public function __construct(
  27.         private FormRepository $formRepository,
  28.         private CustomerRepository $customerRepository,
  29.         private AddressRepository  $addressRepository,
  30.         private CatalogOrderRepository $catalogOrderRepository,
  31.         private RecaptchaValidationServiceInterface $recaptchaValidationService,
  32.         private PaginatorInterface $paginator
  33.     ) {}
  34.     #[Template()]
  35.     public function indexAction(Request $request)
  36.     {
  37.         $currentDocument $request->get('contentDocument');
  38.         $oldFlashes $request->getSession()->getBag('flashes')->get('_oldFormData');
  39.         $this->view->lastCatalog '';
  40.         if ($oldFlashes) {
  41.             $lastCatalog unserialize($oldFlashes[0]);
  42.             $this->addFlash('_oldFormData'serialize($lastCatalog));
  43.             $this->view->lastCatalog array_key_exists('catalog'$lastCatalog) ? $lastCatalog['catalog'] : '';
  44.         }
  45.         $elements array_values(array_filter(explode('/'$currentDocument->getPath())));
  46.         $division $elements[0] ?? 'neuroscience';
  47.         $this->view->sidebar $this->getSidebarLinks($currentDocument);
  48.         $user $this->getUser();
  49.         $addresses = [];
  50.         $currentAddresses = [];
  51.         $defaultShippingAddress null;
  52.         if ($user) {
  53.             $addresses $user->getAddresses() ?? new Fieldcollection();
  54.             $addresses AddressDataMapper::list(array_merge($addresses->getItems(), $currentAddresses))->all($request);
  55.             $defaultShippingAddress $user->getDefaultShippingAddress();
  56.         }
  57.         $formAction $this->generateUrl('catalog_email_send', [
  58.             'division' => $division
  59.         ]);
  60.         $shippingForm $this->formRepository->createForm(
  61.             CatalogAddressInformationFormType::class,
  62.             null,
  63.             ['action' => $formAction]
  64.         );
  65.         $listing = new CatalogListing;
  66.         $listing->addConditionParam('o_path LIKE ?'"/Catalogs/{$division}/%");
  67.         $paginator $this->paginator->paginate(
  68.             $listing,
  69.             $request->get('page'1),
  70.             self::SHOW_PER_PAGE
  71.         );
  72.         $this->view->paginator $paginator;
  73.         $this->view->paginationVariables $paginator->getPaginationData();
  74.         $articles CatalogListingDataMapper::list($paginator->getItems())->all($request);
  75.         $modalForms = [];
  76.         foreach ($articles as $article) {
  77.             $modalForms[$article['id']] = $shippingForm->createView();
  78.         }
  79.         $this->view->articles $articles;
  80.         $this->view->modalForms $modalForms;
  81.         $this->view->defaultShippingAddress $defaultShippingAddress;
  82.         $this->view->addresses $addresses;
  83.         $this->view->isUser = !$user;
  84.     }
  85.     /**
  86.      * @Route("{division}/resources/catalog/send", name="catalog_email_send", methods={"POST"})
  87.      *
  88.      * @param Request $request
  89.      * @return RedirectResponse|void
  90.      */
  91.     public function send(Request $request)
  92.     {
  93.         $customer $this->getUser();
  94.         $form $this->createForm(
  95.             CatalogAddressInformationFormType::class
  96.         );
  97.         $form->handleRequest($request);
  98.         $data $form->getData();
  99.         $address $data;
  100.         if ($form->isSubmitted()) {
  101.             if ($customer) {
  102.                 $addressId $request->get('address');
  103.                 $addToAddressBook $data['addToAddressBook'];
  104.                 if (empty($addressId) && $addToAddressBook) {
  105.                     if ($form->isValid()) {
  106.                         $customerAddress $this->customerRepository->createAddress($address);
  107.                         $this->customerRepository->addCustomerAddress($customerAddress$customer);
  108.                     }
  109.                 } else {
  110.                     $address $this->addressRepository->findOrFail($customer->getAddresses(), $addressId);
  111.                     $address array_combine(
  112.                         array_map('lcfirst'array_keys($address->toArray())),
  113.                         array_values($address->toArray())
  114.                     );
  115.                     $address['email'] = $customer->getEmail();
  116.                 }
  117.             }
  118.             if (!$form->isValid() && (!$customer || ($customer && empty($request->get('address'))))) {
  119.                 $payload array_merge(
  120.                     $request->query->all(),
  121.                     $request->request->all()
  122.                 );
  123.                 $this->addFlash('_oldFormData'serialize($payload));
  124.                 return $this->redirectBack($request);
  125.             }
  126.             $catalogOrder $address;
  127.             $catalogOrder['catalog'] = Catalog::getById($data['catalog']);
  128.             $catalogOrder['quantity'] = $data['quantity'];
  129.             if (!$this->recaptchaValidationService->isValid($data)) {
  130.                 $payload array_merge(
  131.                     $request->query->all(),
  132.                     $request->request->all()
  133.                 );
  134.                 $this->addFlash('_oldFormData'serialize($payload));
  135.                 $this->addFlash('error''stoelting.recaptcha-failed.error');
  136.                 return $this->redirectBack($request);
  137.             }
  138.             $catalogOrder $this->catalogOrderRepository->create($catalogOrder);
  139.             $this->catalogOrderRepository->sendCatalogOrderEmail($catalogOrder$request);
  140.             $this->addFlash('success'$this->trans('catalog.address.message.sent'));
  141.         }
  142.         return $this->redirectBack($request);
  143.     }
  144. }