src/Controller/Account/AccountController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Account;
  3. use App\Form\Type\CardType;
  4. use App\Form\Type\CustomerImageType;
  5. use CoreShop\Bundle\AddressBundle\Form\Type\AddressType;
  6. use CoreShop\Bundle\CustomerBundle\Form\Type\CustomerType;
  7. use CoreShop\Bundle\FrontendBundle\Controller\FrontendController;
  8. use CoreShop\Bundle\ResourceBundle\Event\ResourceControllerEvent;
  9. use CoreShop\Component\Address\Model\Address;
  10. use CoreShop\Component\Address\Model\AddressIdentifierInterface;
  11. use CoreShop\Component\Address\Model\AddressInterface;
  12. use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
  13. use CoreShop\Component\Core\Customer\Address\AddressAssignmentManagerInterface;
  14. use CoreShop\Component\Core\Customer\Allocator\CustomerAddressAllocatorInterface;
  15. use CoreShop\Component\Core\Model\CustomerInterface;
  16. use CoreShop\Component\Customer\Context\CustomerContextInterface;
  17. use CoreShop\Component\Order\Model\OrderInvoiceInterface;
  18. use CoreShop\Component\Order\Renderer\OrderDocumentRendererInterface;
  19. use CoreShop\Component\Order\Repository\OrderInvoiceRepositoryInterface;
  20. use CoreShop\Component\Pimcore\DataObject\VersionHelper;
  21. use Pimcore;
  22. use Pimcore\Model\Asset;
  23. use Pimcore\Model\Asset\Image;
  24. use Pimcore\Model\DataObject\CoreShopOrder;
  25. use Pimcore\Model\DataObject\Fieldcollection;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\Session\Session;
  29. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  30. class AccountController extends FrontendController
  31. {
  32.     public CustomerAddressAllocatorInterface $customerAddressAllocator;
  33.     public function __construct(
  34.         public CountryRepositoryInterface $countryRepository,
  35.         private string $websiteUrl,
  36.     ) {
  37.         $this->customerAddressAllocator   = Pimcore::getContainer()->get(CustomerAddressAllocatorInterface::class);
  38.     }
  39.     public function informationsAction(Request $request): Response
  40.     {
  41.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_SETTINGS');
  42.         $customer = $this->getCustomer();
  43.         if (!$customer instanceof CustomerInterface) {
  44.             return $this->redirectToRoute('account_login');
  45.         }
  46.         $form = $this->get('form.factory')->createNamed('coreshop', CustomerType::class, $customer, [
  47.             'customer' => $customer->getId(),
  48.             'allow_default_address' => true,
  49.         ]);
  50.         if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
  51.             $handledForm = $form->handleRequest($request);
  52.             if ($handledForm->isSubmitted() && $handledForm->isValid()) {
  53.                 $customer = $handledForm->getData();
  54.                 $customer->save();
  55.                 $this->fireEvent($request, $customer, sprintf('%s.%s.%s_post', 'coreshop', 'customer', 'update'));
  56.                 $this->addFlash('success', Pimcore::getContainer()->get('translator')->trans('coreshop.ui.customer.profile_successfully_updated'));
  57.                 return $this->redirectToRoute('account_informations');
  58.             }
  59.         }
  60.         $customerImage = $customer->getImage();
  61.         $customerImage = $customerImage ? $customerImage->getFrontendFullPath() : false;
  62.         return $this->render('account/informations.html.twig', [
  63.             'customer' => $customer,
  64.             'profilePage' => true,
  65.             'customerImage'=>$customerImage,
  66.             'form' => $form->createView(),
  67.         ]);
  68.     }
  69.     public function imageAction(Request $request): Response
  70.     {
  71.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_SETTINGS');
  72.         $customer = $this->getCustomer();
  73.         $form = $this->get('form.factory')->createNamed('coreshop', CustomerImageType::class, null);
  74.         if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
  75.             try {
  76.                 $image = $request->files->get('coreshop')['Image'];
  77.                 if(!$image || strpos($image->getMimeType(), 'image/') === false) {
  78.                     throw new \Exception('Please upload valid image.');
  79.                 } elseif($image->getSize() > 2097152) {
  80.                     throw new \Exception('Image size should be less than 2MB.');
  81.                 }
  82.                 $getImage = $customer->getImage();
  83.                 $fileName = "{$customer->getId()}_client_image.{$image->guessClientExtension()}";
  84.                 //$getImage = Image::getByPath("/ClientImage/{$fileName}");
  85.                 if(!$getImage) {
  86.                     $getImage = new Image();
  87.                     $getImage->setParent(Asset::getByPath('/ClientImage'));
  88.                     $getImage->setData(file_get_contents($image->getRealPath()));
  89.                     $getImage->setFilename($fileName);
  90.                     $getImage->save();
  91.                     $customer->setImage($getImage);
  92.                     $customer->save();
  93.                 } else {
  94.                     $getImage->setData(file_get_contents($image->getRealPath()));
  95.                     $versionCount = $getImage->getVersionCount();
  96.                     $getImage->setFilename("{$versionCount}_{$fileName}");
  97.                     $getImage->save();
  98.                 }
  99.                 $message = Pimcore::getContainer()->get('translator')->trans('coreshop.ui.customer.profile_successfully_updated');
  100.                 return $this->json(['data' =>['url'=>$getImage->getFrontendFullPath()], 'message'=>$message, 'success' => true]);
  101.             } catch(\Exception $e) {
  102.                 return $this->json(['data' =>[], 'message'=>$e->getMessage(), 'success' => false]);
  103.             }
  104.         }
  105.         return $this->render('account/informations/_image.html.twig', [
  106.             'customer' => $customer,
  107.             'form' => $form->createView(),
  108.             'display'=>$customer->getImage() ? 'none' : 'block',
  109.         ]);
  110.     }
  111.     public function addressesAction(): Response
  112.     {
  113.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ADDRESSES');
  114.         $customer = $this->getCustomer();
  115.         // if(!$this->customerAddressAllocator->allocateForCustomer($customer)) {
  116.         //     return $this->redirectToRoute('account_address_new');
  117.         // }
  118.         if (!$customer instanceof CustomerInterface) {
  119.             return $this->redirectToRoute('coreshop_index');
  120.         }
  121.         return $this->render('account/addresses_react.html.twig', [
  122.             'websiteUrl' => $this->websiteUrl,
  123.         ]);
  124.     }
  125.     public function makeDefaultAddressAction(Request $request): Response
  126.     {
  127.         $customer = $this->getCustomer();
  128.         if (!$customer instanceof CustomerInterface) {
  129.             return $this->redirectToRoute('/');
  130.         }
  131.         $addressId = $this->getParameterFromRequest($request, 'address');
  132.         $customer->setDefaultAddress(Address::getById($addressId));
  133.         $customer->save();
  134.         $this->addFlash('success', Pimcore::getContainer()->get('translator')->trans(sprintf('coreshop.ui.customer.address_successfully_update')));
  135.         return $this->redirectToRoute('account_address');
  136.     }
  137.     public function addressAction(Request $request): Response
  138.     {
  139.         $customer = $this->getCustomer();
  140.         if (!$customer instanceof CustomerInterface) {
  141.             return $this->redirectToRoute('/');
  142.         }
  143.         //$nameUser = $customer->getFirstname()." ".$customer->getLastname();
  144.         $addressId = $this->getParameterFromRequest($request, 'address');
  145.         $address = Pimcore::getContainer()->get('coreshop.repository.address')->find($addressId);
  146.         if ($address instanceof AddressInterface) {
  147.             $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ADDRESS_EDIT');
  148.         } else {
  149.             $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ADDRESS_ADD');
  150.         }
  151.         $addressAssignmentManager = Pimcore::getContainer()->get(AddressAssignmentManagerInterface::class);
  152.         $eventType = 'update';
  153.         if (!$address instanceof AddressInterface) {
  154.             $eventType = 'add';
  155.             /** @var AddressInterface $address */
  156.             $address = Pimcore::getContainer()->get('coreshop.factory.address')->createNew();
  157.             $country = $this->countryRepository->findByCode('FR');
  158.             $address->setCountry($country);
  159.             $address->setFirstname($customer->getFirstname());
  160.             $address->setLastname($customer->getLastname());
  161.             if ($request->query->has('address_identifier')) {
  162.                 $addressIdentifier = Pimcore::getContainer()->get('coreshop.repository.address_identifier')->findByName($request->query->get('address_identifier'));
  163.                 if ($addressIdentifier instanceof AddressIdentifierInterface) {
  164.                     //$address->setAddressIdentifier($addressIdentifier);
  165.                 }
  166.             }
  167.         }
  168.         if ($eventType === 'update' && $addressAssignmentManager->checkAddressAffiliationPermissionForCustomer($customer, $address) === false) {
  169.             return $this->redirectToRoute('account_address');
  170.         }
  171.         $addressFormOptions = [
  172.             'available_affiliations' => $addressAssignmentManager->getAddressAffiliationTypesForCustomer($customer),
  173.             'selected_affiliation' => $addressAssignmentManager->detectAddressAffiliationForCustomer($customer, $address),
  174.         ];
  175.         $form = $this->get('form.factory')->createNamed('coreshop', AddressType::class, $address, $addressFormOptions);
  176.         $form->handleRequest($request);
  177.         if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
  178.             $addressAffiliation = $form->has('addressAffiliation') ? $form->get('addressAffiliation')->getData() : null;
  179.             $addressAffiliation = null;
  180.             if ($form->isSubmitted()) {
  181.                 $address = $form->getData();
  182.                 // DEBUG FLORENT
  183.                 /*
  184.                 if($address->getCity() == "testes"){
  185.                     var_dump($address->getStreet());
  186.                     var_dump($address->getCity());
  187.                     var_dump($form->isValid());
  188.                     echo '<br/>';
  189.                     var_dump($_POST);
  190.                     $addressFormOptions = [
  191.                         'available_affiliations' => $addressAssignmentManager->getAddressAffiliationTypesForCustomer($customer),
  192.                         'selected_affiliation' => $addressAssignmentManager->detectAddressAffiliationForCustomer($customer, $address),
  193.                     ];
  194.                     if (!$form->isValid()) {
  195.                         $formErrors = $form->getErrors(true); // Récupération des erreurs du formulaire avec les noms de champs
  196.                         $erreurs = [];
  197.                         foreach ($formErrors as $error) {
  198.                             // Accéder Ã  l'origine de l'erreur pour obtenir le nom du champ associé
  199.                             $fieldName = $error->getOrigin()->getName();
  200.                             $errorMessage = $error->getMessage();
  201.                             // Stocker le message d'erreur avec le nom du champ associé
  202.                             $erreurs[] = [
  203.                                 'field' => $fieldName,
  204.                                 'message' => $errorMessage,
  205.                                 'data'=>$error->getOrigin()->getData(),
  206.                                 'cause'=>$error->getCause(),
  207.                             ];
  208.                         }
  209.                         // Affichage des erreurs avec les noms des champs
  210.                         dump($erreurs);
  211.                         //var_dump($addressFormOptions);
  212.                         //die();
  213.                     }
  214.                     //die();
  215.                 }
  216.                 */
  217.                 if(! $form->isValid()) {
  218.                     /*
  219.                     $session = $request->getSession();
  220.                     if ($session instanceof Session) {
  221.                         $session->getFlashBag()->clear();
  222.                         foreach ($form->getErrors(true) as $error) {
  223.                            $session->getFlashBag()->add('error', $error->getOrigin()->getName(). ': '.$error->getMessage());
  224.                            // var_dump($error->getOrigin()->getName(). ': '.$error->getMessage());
  225.                         }
  226.                     }*/
  227.                     return $this->render('account/address/address.html.twig', [
  228.                         'address' => $address,
  229.                         'customer' => $customer,
  230.                         'profilePage' => true,
  231.                         'form' => $form->createView(),
  232.                     ]);
  233.                 } else {
  234.                     $address = $form->getData();
  235.                     $address->setPublished(true);
  236.                     $address->setKey(uniqid());
  237.                     $address = $addressAssignmentManager->allocateAddressByAffiliation($customer, $address, $addressAffiliation);
  238.                     $this->fireEvent($request, $address, sprintf('%s.%s.%s_post', 'coreshop', 'address', $eventType));
  239.                     $this->addFlash('success', Pimcore::getContainer()->get('translator')->trans(sprintf('coreshop.ui.customer.address_successfully_%s', $eventType === 'add' ? 'added' : 'updated')));
  240.                     if($eventType == 'add') {
  241.                         $customer->setDefaultAddress($address);
  242.                         $customer->save();
  243.                         $customer->getDefaultAddress();
  244.                     }
  245.                     return $this->redirect(
  246.                         $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('account_address')),
  247.                     );
  248.                 }
  249.             }
  250.         }
  251.         return $this->render('account/address/address.html.twig', [
  252.             'address' => $address,
  253.             'customer' => $customer,
  254.             'profilePage' => true,
  255.             'form' => $form->createView(),
  256.         ]);
  257.     }
  258.     public function addressDeleteAction(Request $request): Response
  259.     {
  260.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ADDRESS_DELETE');
  261.         $customer = $this->getCustomer();
  262.         $addressAssignmentManager = Pimcore::getContainer()->get(AddressAssignmentManagerInterface::class);
  263.         if (!$customer instanceof CustomerInterface) {
  264.             return $this->redirectToRoute('/');
  265.         }
  266.         $address = Pimcore::getContainer()->get('coreshop.repository.address')->find(
  267.             $this->getParameterFromRequest($request, 'address'),
  268.         );
  269.         if (!$address instanceof AddressInterface) {
  270.             return $this->redirectToRoute('account_address');
  271.         }
  272.         if ($addressAssignmentManager->checkAddressAffiliationPermissionForCustomer($customer, $address) === false) {
  273.             return $this->redirectToRoute('account_address');
  274.         }
  275.         $this->fireEvent($request, $address, sprintf('%s.%s.%s_pre', 'coreshop', 'address', 'delete'));
  276.         $address->delete();
  277.         $this->addFlash('success', Pimcore::getContainer()->get('translator')->trans('coreshop.ui.customer.address_successfully_deleted'));
  278.         return $this->redirectToRoute('account_address');
  279.     }
  280.     public function renderAction(Request $request): Response
  281.     {
  282.         $invoiceId = $this->getParameterFromRequest($request, 'id');
  283.         $invoice = $this->getOrderInvoiceRepository()->find($invoiceId);
  284.         if ($invoice instanceof OrderInvoiceInterface) {
  285.             try {
  286.                 $responseData = $this->getOrderDocumentRenderer()->renderDocumentPdf($invoice);
  287.                 $header = [
  288.                     'Content-Type' => 'application/pdf',
  289.                     'Content-Disposition' => 'inline; filename="invoice-' . $invoice->getId() . '.pdf"',
  290.                 ];
  291.             } catch (\Exception $e) {
  292.                 $responseData = '<strong>' . $e->getMessage() . '</strong><br>trace: ' . $e->getTraceAsString();
  293.                 $header = ['Content-Type' => 'text/html'];
  294.             }
  295.             return new Response($responseData, 200, $header);
  296.         }
  297.         throw new NotFoundHttpException(sprintf('Invoice with Id %s not found', $invoiceId));
  298.     }
  299.     public function headerAction(Request $request): Response
  300.     {
  301.          return $this->render('account/_header.html.twig', [
  302.              'customer' => $this->getCustomer(),
  303.          ]);
  304.         //return $this->render('account/_headerwidget_react.html.twig', [
  305.         //    'websiteUrl' => $this->websiteUrl,
  306.         //]);
  307.     }
  308.     public function mediumPaymentAction(Request $request): Response
  309.     {
  310.         $customer = $this->getCustomer();
  311.         if (!$customer instanceof CustomerInterface) {
  312.             return $this->redirect('/');
  313.         }
  314.         return $this->render('account/medium_payment.html.twig', [
  315.             'customer' =>  $customer,
  316.             'profilePage' => true,
  317.         ]);
  318.     }
  319.     public function mediumPaymentRemoveAction(Request $request): Response
  320.     {
  321.         $customer = $this->getCustomer();
  322.         if (!$customer instanceof CustomerInterface) {
  323.             return $this->redirect('/');
  324.         }
  325.         $items =  $customer->getCardInformation();
  326.         $index = $this->getParameterFromRequest($request, 'index', null);
  327.         $items->remove($index);
  328.         $customer->setCardInformation($items);
  329.         $customer->save();
  330.         return $this->redirectToRoute('account_medium_payment');
  331.     }
  332.     public function mediumPaymentAddAction(Request $request): Response
  333.     {
  334.         $customer = $this->getCustomer();
  335.         if (!$customer instanceof CustomerInterface) {
  336.             return $this->redirect('/');
  337.         }
  338.         $card = new CardInfo();
  339.         $form = $this->get('form.factory')->createNamed('coreshop', CardType::class, $card);
  340.         if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
  341.             $data = $request->get('coreshop');
  342.             $card->setNameOnCard($data['NameOnCard']);
  343.             $card->setCardNumber($data['CardNumber']);
  344.             $card->setDate($data['Date']['month'].'/'.substr($data['Date']['year'], 2, 2));
  345.             $items =  $customer->getCardInformation();
  346.             if(!$items) {
  347.                 $items = new Fieldcollection();
  348.             }
  349.             $items->add($card);
  350.             $customer->setCardInformation($items);
  351.             $customer->save();
  352.             return $this->redirectToRoute('account_medium_payment');
  353.         }
  354.         return $this->render('account/payment/payment.html.twig', [
  355.             'customer' =>  $customer,
  356.             'profilePage' => true,
  357.             'form' =>  $form->createView()
  358.         ]);
  359.     }
  360.     public function ordersAction(Request $request): Response
  361.     {
  362.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ORDERS');
  363.         $customer = $this->getCustomer();
  364.         if (!$customer instanceof CustomerInterface) {
  365.             return $this->redirect('/');
  366.         }
  367.         $orderListing = CoreShopOrder::getByCustomer(['id'=>$customer->getId(), 'type'=>'object']);
  368.         $orderListing->setCondition("saleState = 'order'");
  369.         $orderListing->setCondition("orderState in ('confirmed', 'complete')");
  370.         $orders = $orderListing->load();
  371.         return $this->render('account/orders.html.twig', [
  372.             'customer' => $customer,
  373.             'profilePage' => true,
  374.             'orders' => $orders,
  375.         ]);
  376.     }
  377.     public function ordersTrackingAction(Request $request): Response
  378.     {
  379.         $this->denyAccessUnlessGranted('CORESHOP_CUSTOMER_PROFILE_ORDERS');
  380.         $orderId = $this->getParameterFromRequest($request, 'orderId', null);
  381.         $customer = $this->getCustomer();
  382.         if (!$customer instanceof CustomerInterface) {
  383.             return $this->redirect('/');
  384.         }
  385.         return $this->render('account/order_tracking.html.twig', [
  386.             'customer' => $customer,
  387.             'profilePage' => true,
  388.             'order' => CoreShopOrder::getById($orderId),
  389.         ]);
  390.     }
  391.     public function confirmNewsletterAction(Request $request): Response
  392.     {
  393.         $success = false;
  394.         $token = $this->getParameterFromRequest($request, 'token');
  395.         $newsletterUser = null;
  396.         if (!$token) {
  397.             return $this->redirectToRoute('coreshop_index');
  398.         }
  399.         /**
  400.          * @var CustomerInterface $customer
  401.          */
  402.         $customer = Pimcore::getContainer()->get('coreshop.repository.customer')->findByNewsletterToken($token);
  403.         if ($customer instanceof CustomerInterface) {
  404.             $customer->setNewsletterConfirmed(true);
  405.             $customer->setNewsletterToken(null);
  406.             VersionHelper::useVersioning(function () use ($customer) {
  407.                 $customer->save();
  408.             }, false);
  409.             $this->fireEvent($request, $customer, sprintf('%s.%s.%s_post', 'coreshop', 'customer', 'newsletter_confirm'));
  410.             $this->addFlash('success', Pimcore::getContainer()->get('translator')->trans('coreshop.ui.newsletter_confirmed'));
  411.             $success = true;
  412.         } else {
  413.             $this->addFlash('error', Pimcore::getContainer()->get('translator')->trans('coreshop.ui.newsletter_confirmation_error'));
  414.         }
  415.         return $this->render('account/confirm_newsletter.html.twig', [
  416.             'newsletterUser' => $newsletterUser,
  417.             'success' => $success,
  418.         ]);
  419.     }
  420.     public function listAction(Request $request): Response
  421.     {
  422.         return $this->render('account/list.html.twig');
  423.     }
  424.     public function noticeAction(Request $request): Response
  425.     {
  426.         return $this->render('account/notice.html.twig');
  427.     }
  428.     protected function getCustomer(): ?CustomerInterface
  429.     {
  430.         try {
  431.             /**
  432.              * @var CustomerInterface $customer
  433.              */
  434.             $customer = Pimcore::getContainer()->get(CustomerContextInterface::class)->getCustomer();
  435.             return $customer;
  436.         } catch (\Exception) {
  437.             // fail silently
  438.         }
  439.         return null;
  440.     }
  441.     protected function fireEvent(Request $request, mixed $object, string $eventName): void
  442.     {
  443.         //@todo: move this to a resource controller event
  444.         $event = new ResourceControllerEvent($object, ['request' => $request]);
  445.         Pimcore::getContainer()->get('event_dispatcher')->dispatch($event, $eventName);
  446.     }
  447.     private function getOrderInvoiceRepository(): OrderInvoiceRepositoryInterface
  448.     {
  449.         return pimcore::getContainer()->get('coreshop.repository.order_invoice');
  450.     }
  451.     private function getOrderDocumentRenderer(): OrderDocumentRendererInterface
  452.     {
  453.         return pimcore::getContainer()->get('coreshop.renderer.order.pdf');
  454.     }
  455. }