src/Controller/OrderController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Order;
  4. use App\Entity\OrderDetails;
  5. use App\Form\OrderType;
  6. use App\Model\Cart;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. class OrderController extends AbstractController
  14. {
  15.     /**
  16.      * Récupération du panier, choix de l'adresse et du transporteur
  17.      *
  18.      * @param SessionInterface $session
  19.      * @param Cart $cart
  20.      * @return Response
  21.      */
  22.     #[Route('/commande'name'order')]
  23.     public function index(SessionInterface $sessionCart $cart): Response
  24.     {
  25.         $user $this->getUser();
  26.         $cartProducts $cart->getDetails();
  27.         // Redirection si panier vide
  28.         if (empty($cartProducts['products'])) {   
  29.             return $this->redirectToRoute('product');
  30.         }
  31.         
  32.         //Redirection si utilisateur n'a pas encore d'adresse
  33.         if (!$user->getAddresses()->getValues()) {      //getValues() Récupère directement les valeurs d'une collection d'objet
  34.             $session->set('order'1);
  35.             return $this->redirectToRoute('account_address_new');
  36.         }
  37.         $form $this->createForm(OrderType::class, null, [
  38.             'user' => $user     //Permet de passer l'utilisateur courant dans le tableau d'options du OrderType
  39.         ]); 
  40.         return $this->renderForm('order/index.html.twig', [
  41.             'form' => $form,
  42.             'cart' => $cartProducts,
  43.             'totalPrice' =>$cartProducts['totals']['price']
  44.         ]);
  45.     }
  46.     /**
  47.      * Enregistrement des données "en dur" de la commande contenant adresse, transporteur et produits
  48.      * Les relations ne sont pas directement utilisées pour la persistance des données dans les entités Order et OrderDetails
  49.      * pour éviter des incohérences dans le cas ou des modifications seraient faites sur les autres entités par la suite
  50.      *
  51.      * @param Cart $cart
  52.      * @param Request $request
  53.      * @return Response
  54.      */
  55.     #[Route('/commande/recap'name'order_add'methods'POST')]
  56.     public function summary(Cart $cartRequest $requestEntityManagerInterface $em): Response
  57.     {
  58.          //Récupération du panier en session
  59.         $cartProducts $cart->getDetails();   
  60.         //Vérification qu'un formulaire a bien été envoyé précédemment
  61.         $form $this->createForm(OrderType::class, null, [
  62.             'user' => $this->getUser()     
  63.         ]); 
  64.         $form->handleRequest($request);
  65.         if ($form->isSubmitted() && $form->isValid()) {
  66.             $address $form->get('addresses')->getData();
  67.             $delivery_string $address->getFirstname() . ' ' $address->getLastname();
  68.             $delivery_string .= '<br>' $address->getPhone();
  69.             $delivery_string .= '<br>' $address->getCompany() ?? '';
  70.             $delivery_string .= '<br>' $address->getAddress();
  71.             $delivery_string .= '<br>' $address->getPostal();
  72.             $delivery_string .= '<br>' $address->getCity();
  73.             $delivery_string .= '<br>' $address->getCountry();
  74.             $cartProducts $cart->getDetails();
  75.             //Création de la commande avec les infos formulaire
  76.             $order = new Order;
  77.             $date = new \DateTime;
  78.             $order
  79.                 ->setUser($this->getUser())
  80.                 ->setCreatedAt($date)
  81.                 ->setCarrierName($form->get('carriers')->getData()->getName())
  82.                 ->setCarrierPrice($form->get('carriers')->getData()->getPrice())
  83.                 ->setDelivery($delivery_string)
  84.                 ->setState(0)
  85.                 ->setReference($date->format('YmdHis') . '-' uniqid())
  86.             ;
  87.             $em->persist($order);
  88.             //Création des lignes de détails pour chacun des produits de la commande
  89.             foreach ($cartProducts['products'] as $item) {
  90.                 $orderDetails = new OrderDetails();
  91.                 $orderDetails
  92.                     ->setBindedOrder($order)
  93.                     ->setProduct($item['product']->getName())
  94.                     ->setQuantity($item['quantity'])
  95.                     ->setPrice($item['product']->getPrice())
  96.                     ->setTotal($item['product']->getPrice() * $item['quantity'])
  97.                 ;
  98.                 $em->persist($orderDetails);
  99.             }
  100.             $em->flush();
  101.             // Affichage récap
  102.             return $this->renderForm('order/add.html.twig', [
  103.                 'cart' => $cartProducts,
  104.                 'totalPrice' =>$cartProducts['totals']['price'],
  105.                 'order' => $order
  106.             ]);
  107.         }
  108.         //Si pas de formulaire, page non accessible, et donc redirection vers le panier
  109.         return $this->redirectToRoute('cart');
  110.     }
  111. }