src/Postroyka/AppBundle/Controller/AjaxController.php line 42

Open in your IDE?
  1. <?php
  2. namespace Postroyka\AppBundle\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Doctrine\Persistence\ManagerRegistry;
  5. use Postroyka\AppBundle\Form\ReviewForm;
  6. use Postroyka\AppBundle\Provider\CartProvider;
  7. use Postroyka\AppBundle\Provider\EcommerceProvider;
  8. use Postroyka\AppBundle\Service\OrderCalculator;
  9. use Postroyka\BaseAbstractController;
  10. use Postroyka\AppBundle\Service\CategoryGroupService;
  11. use Submarine\CartBundle\Entity\Cart;
  12. use Submarine\CartBundle\Entity\CartItem;
  13. use Submarine\FilesBundle\Provider\FilesProvider;
  14. use Submarine\OrdersBundle\Entity\OrderItem;
  15. use Submarine\OrdersBundle\Provider\OrderProvider;
  16. use Submarine\PagesBundle\Entity\Page;
  17. use Submarine\PagesBundle\Provider\PagesProvider;
  18. use Submarine\ReviewsBundle\Entity\Review;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. class AjaxController extends AbstractController
  22. {
  23.     const TAGS_MOBILE_INFORMATION = [
  24.         'payment',
  25.         'discount',
  26.         'page-7209',
  27.         'contacts',
  28.         'about',
  29.         'brands',
  30.         'articles',
  31.         'vacancy',
  32.         'charity',
  33.         'proposition',
  34.         'director',
  35.     ];
  36.     /**
  37.      * Получаем продукты для E-commerce
  38.      */
  39.     public function getProductsEcommerceAction(Request $request)
  40.     {
  41.         $productsData = [];
  42.         foreach ($request->request->get("products", []) as $id){
  43.             $product $this->getPagesProvider()->get($id);
  44.             $productsData[] = $this->getEcommerceProvider()->getEcommerceProduct($product);
  45.         }
  46.         return $this->json(["productsData" => $productsData]);
  47.     }
  48.     /**
  49.      * Получаем корзину для E-commerce
  50.      */
  51.     public function getCartEcommerceAction(Request $request)
  52.     {
  53.         /** @var CartProvider $cartProvider */
  54.         $cartProvider $this->get('postroyka_app.cart_provider');
  55.         $cart $cartProvider->getCart($this->getUser());
  56.         $productsData = [];
  57.         /** @var CartItem $item */
  58.         foreach ($cart->getItems() as $item){
  59.             $product $this->getPagesProvider()->get($item->getEntityId());
  60.             $productData $this->getEcommerceProvider()->getEcommerceProduct($product);
  61.             $productData["quantity"] = $item->getQuantity();
  62.             $productsData[] = $productData;
  63.         }
  64.         return $this->json([
  65.             "productsData" => $productsData
  66.         ]);
  67.     }
  68.     /**
  69.      * Получаем заказ для E-commerce
  70.      */
  71.     public function getOrderEcommerceAction(Request $request$id)
  72.     {
  73.         /** @var OrderProvider $orderProvider */
  74.         $orderProvider $this->get('postroyka_app.orders_provider');;
  75.         $order $orderProvider->get($id);
  76.         $orderData = [
  77.             "id" => $order->getId(),
  78.             "price" => $order->getPayPrice(),
  79.             "option" => $order->getEcommerceOptionString(),
  80.             "shipping" => $order->getDeliveryMethodPrice() > $order->getDeliveryMethodPrice() : "",
  81.             "products" => []
  82.         ];
  83.         /** @var OrderItem $item */
  84.         foreach ($order->getItems() as $item){
  85.             $product $this->getPagesProvider()->get($item->getEntityId());
  86.             $productData $this->getEcommerceProvider()->getEcommerceProduct($product);
  87.             $productData["quantity"] = $item->getQuantity();
  88.             $orderData["products"][] = $productData;
  89.         }
  90.         return $this->json([
  91.             "orderData" => $orderData
  92.         ]);
  93.     }
  94.     /**
  95.      * Получение мобильного меню
  96.      */
  97.     public function getMobileMenuAction(Request $request)
  98.     {
  99.         /** @var CategoryGroupService $categoryGroupService */
  100.         $categoryGroupService $this->get('postroyka_app.category_group_service');
  101.         $pageId $request->request->get("page_id");
  102.         $page $pageId $this->getDoctrine()->getRepository(Page::class)->find($pageId) : null;
  103.         if (false === ($leftMenu $this->cache()->fetch(self::LEFT_MENU))) {
  104.             $leftMenu $categoryGroupService->getCategoriesTreeWithProducts($this->getCatalogGroups(), 3);
  105.             // Кэшируем на час
  106.             $this->cache()->save(self::LEFT_MENU$leftMenu60 60);
  107.         }
  108.         $data = [
  109.             "left_menu" => $leftMenu,
  110.             "page" => $page,
  111.             'additional_catalogs' => $categoryGroupService->getAdditionalCatalogsByLabel(),
  112.         ];
  113.         return $this->render('Postroyka/AppBundle/Parts/mobile-menu.html.twig'$data);
  114.     }
  115.     /**
  116.      * Получение мобильной информации
  117.      */
  118.     public function getMobileInformationAction(
  119.         Request $request,
  120.         EntityManagerInterface $em,
  121.         CategoryGroupService $categoryGroupService,
  122.     )
  123.     {
  124.         $pageId $request->request->get("page_id");
  125.         $page $pageId $em->getRepository(Page::class)->find($pageId) : null;
  126.         $mobileInformationPages $this->cache()->fetch(self::MOBILE_INFORMATION);
  127. //        $mobileInformationPages = false;
  128.         if (false === $mobileInformationPages) {
  129.             $mobileInformationPages $categoryGroupService->getMobileInformationPages();
  130.             // Кэшируем на час
  131.             $this->cache()->save(self::MOBILE_INFORMATION$mobileInformationPages60 60);
  132.         }
  133.         return $this->render('Postroyka/AppBundle/Parts/mobile-information.html.twig', [
  134.             "page" => $page,
  135.             "mobileInformationPages" => $mobileInformationPages,
  136.         ]);
  137.     }
  138.     /**
  139.      * Получение модальных окон для страницы продукта
  140.      */
  141.     public function getProductPopupsAction(
  142.         Request $request,
  143.         ManagerRegistry $managerRegistry,
  144.         OrderCalculator $orderCalculator
  145.     )
  146.     {
  147.         $pageId $request->request->get("page_id");
  148.         $page $pageId $managerRegistry->getRepository(Page::class)->find($pageId) : null;
  149.         if(!$page){
  150.             return new Response("");
  151.         }
  152.         $zones = [];
  153.         $zonesNumber OrderCalculator::DELIVERY_ZONES_NUMBER OrderCalculator::START_NUMBER_ZONE 1;
  154.         for ($i OrderCalculator::START_NUMBER_ZONE$i <= $zonesNumber$i++) {
  155.             $zone $orderCalculator->getZonePrice(new Cart(), constant('Postroyka\AppBundle\Service\OrderCalculator::DELIVERY_ZONE_' $i));
  156.             $zones[] = $i ';' number_format($zone0','' ') . ' руб.';
  157.         }
  158.         return $this->render('Postroyka/AppBundle/Pages/blocks/_product_popups.html.twig', [
  159.             "page" => $page,
  160.             'map_zones' => implode('|'$zones),
  161.         ]);
  162.     }
  163.     /**
  164.      * Получение формы для Review
  165.      */
  166.     public function getReviewFormAction(Request $request)
  167.     {
  168.         $pageId $request->request->get("page_id");
  169.         $page $pageId $this->getDoctrine()->getRepository(Page::class)->find($pageId) : null;
  170.         $review = new Review($page);
  171.         $form $this->createForm(ReviewForm::class, $review);
  172.         return $this->render('Postroyka/AppBundle/Pages/blocks/_review_form.html.twig', [
  173.             "form" => $form->createView()
  174.         ]);
  175.     }
  176.     /** Получение модального окна для уценки */
  177.     public function showModalPageDefectedAction(
  178.         Request $request,
  179.         ManagerRegistry $managerRegistry,
  180.         FilesProvider $filesProvider,
  181.         ?int $pageId
  182.     )
  183.     {
  184.         $page $managerRegistry->getRepository(Page::class)->find($pageId);
  185.         if(!$page || !$page->hasActivePageDefected()){
  186.             return new Response("");
  187.         }
  188.         $page->setFilesProvider($filesProvider);
  189.         return $this->renderPage('Postroyka/AppBundle/Pages/blocks/_page_defected_popup.html.twig', [
  190.             "page" => $page,
  191.             "pageDefected" => $page->getPageDefected()
  192.         ]);
  193.     }
  194.     /** Получение модального окна для наличия товара */
  195.     public function showModalPageAvailabilityProductAction(
  196.         Request $request,
  197.         ManagerRegistry $managerRegistry,
  198.         FilesProvider $filesProvider,
  199.         ?int $pageId
  200.     )
  201.     {
  202.         $page $managerRegistry->getRepository(Page::class)->find($pageId);
  203.         if(!$page){
  204.             return new Response("");
  205.         }
  206.         $page->setFilesProvider($filesProvider);
  207.         return $this->renderPage('Postroyka/AppBundle/Pages/blocks/_popup_availability_product_page.html.twig', [
  208.             "page" => $page,
  209.         ]);
  210.     }
  211.     /** @return EcommerceProvider */
  212.     private function getEcommerceProvider()
  213.     {
  214.         return $this->get("postroyka_app.provider.ecommerce_provider");
  215.     }
  216.     /** @return PagesProvider */
  217.     private function getPagesProvider()
  218.     {
  219.         return $this->get("submarine.pages.pages_provider");
  220.     }
  221. }