src/Controller/Website/Site/Product/ProductController.php line 79

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Website\Site\Product;
  3. use App\Controller\Website\ThemeRenderController;
  4. use App\Entity\Generic\User;
  5. use App\Entity\Website\Order\Order;
  6. use App\Entity\Website\Order\OrderItem;
  7. use App\Entity\Website\Order\OrderItemAttribute;
  8. use App\Entity\Website\Order\OrderStatus;
  9. use App\Entity\Website\Product\Product;
  10. use App\Entity\Website\Product\ProductAttributeValue;
  11. use App\Entity\Website\Product\ProductPrice;
  12. use App\Entity\Website\Product\ProductReview;
  13. use App\Form\Website\Site\AddToCartType;
  14. use App\Form\Website\Site\ProductReviewType;
  15. use App\Repository\Website\Product\ProductAttributeRepository;
  16. use App\Repository\Website\Product\ProductAttributeValueRepository;
  17. use App\Repository\Website\Product\ProductPriceRepository;
  18. use App\Repository\Website\Product\ProductRepository;
  19. use App\Repository\Website\Product\ProductReviewRepository;
  20. use App\Repository\Website\Product\ProductTagRepository;
  21. use App\Service\Website\Product\ProductService;
  22. use App\Service\WebsiteManager;
  23. use App\ViewModel\Website\Product\ProductViewModel;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\RequestStack;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. class ProductController extends ThemeRenderController
  29. {
  30.     public EntityManagerInterface $entityManager;
  31.     public ProductService $productService;
  32.     public WebsiteManager $shopManager;
  33.     public ?Request $request;
  34.     public function __construct(RequestStack $requestStackEntityManagerInterface $entityManagerProductService $productCategoryServiceWebsiteManager $shopManager)
  35.     {
  36. //        parent::__construct($requestStack, $entityManager);
  37.         $this->entityManager $entityManager;
  38.         $this->productService $productCategoryService;
  39.         $this->shopManager $shopManager;
  40.         $this->request $requestStack->getCurrentRequest();
  41.     }
  42.     public function getFilters(): array
  43.     {
  44.         return [
  45.             [
  46.                 'name' => 's',
  47.                 'type' => 'text',
  48.                 'label' => 'جستجو',
  49.                 'class' => '',
  50.                 'value' => $this->request->get('s')
  51.             ],
  52.         ];
  53.     }
  54.     #[Route('/products'name'app_shop_site_products')]
  55.     public function products(Request $request)
  56.     {
  57.         /**
  58.          * @var User $user
  59.          */
  60.         $user $this->getUser();
  61.         $info = new ProductViewModel($request);
  62.         $data $this->productService->getListOnSiteMegaSearch($info$this->shopManager->getShop());
  63.         return $this->renderUserTemplate('products.html.twig', [
  64.             'paginator' => $data,
  65.             'currentPage' => 'app_shop_site_products',
  66.             'parameters' => $info,
  67.             'filters' => $this->getFilters(),
  68.         ]);
  69.     }
  70.     #[Route('/product/{urlSlug}'name'app_shop_site_product')]
  71.     public function index(Request                $request,
  72.                           ProductPriceRepository $productPriceRepository,
  73.                           EntityManagerInterface $entityManagerProduct $productProductRepository $productRepositoryProductReviewRepository $productReviewRepositoryProductTagRepository $productTagRepository)
  74.     {
  75.         $comment = new ProductReview();
  76.         $comment->setProduct($product);
  77.         $comment->setAuthor($this->getUser());
  78.         $commentingForm $this->createForm(ProductReviewType::class, $comment);
  79.         $commentingForm->handleRequest($request);
  80.         if ($commentingForm->isSubmitted() && $commentingForm->isValid()) {
  81. //            TODO
  82.             parent::getEntityManager()->persist($comment);
  83.             parent::getEntityManager()->flush();
  84.             $this->addFlash('success''comment submitted');
  85.             return $this->redirectToRoute('app_shop_site_product', ['urlSlug' => $product->getUrlSlug()]);
  86.         }
  87.         $customer $this->getUser();
  88.         $cartStatus $entityManager->getRepository(OrderStatus::class)->findOneBy(['code' => 'cart']);
  89.         $order $entityManager->getRepository(Order::class)->findOneBy([
  90.             'customer' => $customer,
  91.             'status' => $cartStatus,
  92.             'active' => 1,
  93.             'deletedAt' => null,
  94.         ]);
  95.         if (!$order) {
  96.             $order = new Order();
  97.             $order->setCustomer($customer);
  98.             $order->setStatus($cartStatus);
  99.             $order->setShippingCost(0);
  100.             $order->setTaxAmount(0);
  101.             $order->setTotalPrice(0);
  102.             $order->setTrackingCode(uniqid('TRK-'));
  103.             $order->setWebsite($product->getWebsite());
  104.         }
  105.         $productPriceObject $this->getDoctrine()->getRepository(ProductPrice::class)->findOneBy(['product' => $product], ['price' => 'ASC']);
  106.         $form $this->createForm(AddToCartType::class, null, [
  107.             'product' => $product,
  108.             'productPriceObject' => $productPriceObject
  109.         ]);
  110.         $form->handleRequest($request);
  111.         if ($form->isSubmitted() && $form->isValid()) {
  112.             if (!$this->getUser()) {
  113.                 $this->addFlash('error''برای ثبت سفارش لطفا ابتدا وارد حساب کاربری خود شوید');
  114.                 return $this->redirectToRoute('customer_panel_login');
  115.             }
  116.             $item = (new OrderItem())
  117.                 ->setProduct($product)
  118.                 ->setQuantity($form->get('quantity')->getData())
  119.                 ->setPrice($product->getDisplayPrice())
  120.                 ->setMainOrder($order);
  121.             if ($form->get('product_price_id')->getData()) {
  122.                 $item->setProductPrice($productPriceRepository->find($form->get('product_price_id')->getData()));
  123.             }
  124.             foreach ($product->getProductAttributes() as $attribute) {
  125.                 if ($attribute->isActive()){
  126.                     $valueId $form->get($attribute->getId())->getData();
  127.                     $value $entityManager->getRepository(ProductAttributeValue::class)->findOneBy(['value' => $valueId]);
  128.                     $attr = (new OrderItemAttribute())
  129.                         ->setAttributeName($attribute->getName())
  130.                         ->setAttributeValue($value->getValue())
  131.                         ->setOrderItem($item);
  132.                     $item->addOrderItemAttribute($attr);
  133.                     $entityManager->persist($attr);
  134.                 }
  135.             }
  136.             $order->addOrderItem($item);
  137.             $entityManager->persist($order);
  138.             $entityManager->flush();
  139.             $this->addFlash('success''محصول به سبد خرید اضافه شد');
  140.             return $this->redirectToRoute('app_shop_site_cart');
  141.         }
  142.         return $this->renderUserTemplate('product-single.html.twig', [
  143.             'product' => $product,
  144.             'relatedProducts' => $productRepository->getRelatedProducts($productTagRepository->getProductTags($product), $product),
  145.             'reviewForm' => $commentingForm->createView(),
  146.             'comments' => $productReviewRepository->findBy(['product' => $product'approved' => 1], ['createdAt' => 'DESC']),
  147.             'addToCart' => $form->createView()
  148.         ]);
  149.     }
  150.     #[Route('/product/{urlSlug}/price'name'app_shop_site_product_price')]
  151.     public function app_shop_site_product_price(Request $requestProduct $productProductPriceRepository $productPriceRepositoryProductAttributeRepository $productAttributeRepositoryProductAttributeValueRepository $productAttributeValueRepository)
  152.     {
  153.         $values = [];
  154.         if ($request->query->get('add_to_cart')) {
  155.             foreach ($request->query->get('add_to_cart') as $attributeId => $attributeValue) {
  156.                 $attributeObj $productAttributeRepository->findOneBy(['id' => $attributeId'active' => 1]);
  157.                 $attributeValueObj $productAttributeValueRepository->findOneBy(['value' => $attributeValue'active' => 1
  158.                 ,'attribute' => $attributeObj
  159.                 ]);
  160.                 $values[] = $attributeValueObj->getId();
  161.             }
  162.         } else {
  163.             foreach ($request->query->all() as $attributeId => $attributeValue) {
  164.                 $attributeObj $productAttributeRepository->findOneBy(['id' => $attributeId'active' => 1]);
  165.                 $attributeValueObj $productAttributeValueRepository->findOneBy(['value' => $attributeValue'active' => 1
  166.                 ,'attribute' => $attributeObj
  167.                 ]);
  168.                 $values[] = $attributeValueObj->getId();
  169.             }
  170.         }
  171.         $priceObject $productPriceRepository->findPriceBySelectedValues($product$values);
  172.         if ($priceObject) {
  173.             if ($priceObject->getInStock() > 0) {
  174.                 return $this->json(['res' => true,
  175.                     'text' => number_format($priceObject->getPrice()) . ' تومان',
  176.                     'sell' => true,
  177.                     'productPriceId' => $priceObject->getId()
  178.                 ]);
  179.             } else {
  180.                 return $this->json(['res' => false'text' => 'ناموجود''sell' => false]);
  181.             }
  182.         }
  183.         return $this->json(['res' => false'text' => 'ناموجود''sell' => false]);
  184.     }
  185. }