<?php
namespace App\Controller\Website\Site\Product;
use App\Controller\Website\ThemeRenderController;
use App\Entity\Generic\User;
use App\Entity\Website\Order\Order;
use App\Entity\Website\Order\OrderItem;
use App\Entity\Website\Order\OrderItemAttribute;
use App\Entity\Website\Order\OrderStatus;
use App\Entity\Website\Product\Product;
use App\Entity\Website\Product\ProductAttributeValue;
use App\Entity\Website\Product\ProductPrice;
use App\Entity\Website\Product\ProductReview;
use App\Form\Website\Site\AddToCartType;
use App\Form\Website\Site\ProductReviewType;
use App\Repository\Website\Product\ProductAttributeRepository;
use App\Repository\Website\Product\ProductAttributeValueRepository;
use App\Repository\Website\Product\ProductPriceRepository;
use App\Repository\Website\Product\ProductRepository;
use App\Repository\Website\Product\ProductReviewRepository;
use App\Repository\Website\Product\ProductTagRepository;
use App\Service\Website\Product\ProductService;
use App\Service\WebsiteManager;
use App\ViewModel\Website\Product\ProductViewModel;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
class ProductController extends ThemeRenderController
{
public EntityManagerInterface $entityManager;
public ProductService $productService;
public WebsiteManager $shopManager;
public ?Request $request;
public function __construct(RequestStack $requestStack, EntityManagerInterface $entityManager, ProductService $productCategoryService, WebsiteManager $shopManager)
{
// parent::__construct($requestStack, $entityManager);
$this->entityManager = $entityManager;
$this->productService = $productCategoryService;
$this->shopManager = $shopManager;
$this->request = $requestStack->getCurrentRequest();
}
public function getFilters(): array
{
return [
[
'name' => 's',
'type' => 'text',
'label' => 'جستجو',
'class' => '',
'value' => $this->request->get('s')
],
];
}
#[Route('/products', name: 'app_shop_site_products')]
public function products(Request $request)
{
/**
* @var User $user
*/
$user = $this->getUser();
$info = new ProductViewModel($request);
$data = $this->productService->getListOnSiteMegaSearch($info, $this->shopManager->getShop());
return $this->renderUserTemplate('products.html.twig', [
'paginator' => $data,
'currentPage' => 'app_shop_site_products',
'parameters' => $info,
'filters' => $this->getFilters(),
]);
}
#[Route('/product/{urlSlug}', name: 'app_shop_site_product')]
public function index(Request $request,
ProductPriceRepository $productPriceRepository,
EntityManagerInterface $entityManager, Product $product, ProductRepository $productRepository, ProductReviewRepository $productReviewRepository, ProductTagRepository $productTagRepository)
{
$comment = new ProductReview();
$comment->setProduct($product);
$comment->setAuthor($this->getUser());
$commentingForm = $this->createForm(ProductReviewType::class, $comment);
$commentingForm->handleRequest($request);
if ($commentingForm->isSubmitted() && $commentingForm->isValid()) {
// TODO
parent::getEntityManager()->persist($comment);
parent::getEntityManager()->flush();
$this->addFlash('success', 'comment submitted');
return $this->redirectToRoute('app_shop_site_product', ['urlSlug' => $product->getUrlSlug()]);
}
$customer = $this->getUser();
$cartStatus = $entityManager->getRepository(OrderStatus::class)->findOneBy(['code' => 'cart']);
$order = $entityManager->getRepository(Order::class)->findOneBy([
'customer' => $customer,
'status' => $cartStatus,
'active' => 1,
'deletedAt' => null,
]);
if (!$order) {
$order = new Order();
$order->setCustomer($customer);
$order->setStatus($cartStatus);
$order->setShippingCost(0);
$order->setTaxAmount(0);
$order->setTotalPrice(0);
$order->setTrackingCode(uniqid('TRK-'));
$order->setWebsite($product->getWebsite());
}
$productPriceObject = $this->getDoctrine()->getRepository(ProductPrice::class)->findOneBy(['product' => $product], ['price' => 'ASC']);
$form = $this->createForm(AddToCartType::class, null, [
'product' => $product,
'productPriceObject' => $productPriceObject
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$this->getUser()) {
$this->addFlash('error', 'برای ثبت سفارش لطفا ابتدا وارد حساب کاربری خود شوید');
return $this->redirectToRoute('customer_panel_login');
}
$item = (new OrderItem())
->setProduct($product)
->setQuantity($form->get('quantity')->getData())
->setPrice($product->getDisplayPrice())
->setMainOrder($order);
if ($form->get('product_price_id')->getData()) {
$item->setProductPrice($productPriceRepository->find($form->get('product_price_id')->getData()));
}
foreach ($product->getProductAttributes() as $attribute) {
if ($attribute->isActive()){
$valueId = $form->get($attribute->getId())->getData();
$value = $entityManager->getRepository(ProductAttributeValue::class)->findOneBy(['value' => $valueId]);
$attr = (new OrderItemAttribute())
->setAttributeName($attribute->getName())
->setAttributeValue($value->getValue())
->setOrderItem($item);
$item->addOrderItemAttribute($attr);
$entityManager->persist($attr);
}
}
$order->addOrderItem($item);
$entityManager->persist($order);
$entityManager->flush();
$this->addFlash('success', 'محصول به سبد خرید اضافه شد');
return $this->redirectToRoute('app_shop_site_cart');
}
return $this->renderUserTemplate('product-single.html.twig', [
'product' => $product,
'relatedProducts' => $productRepository->getRelatedProducts($productTagRepository->getProductTags($product), $product),
'reviewForm' => $commentingForm->createView(),
'comments' => $productReviewRepository->findBy(['product' => $product, 'approved' => 1], ['createdAt' => 'DESC']),
'addToCart' => $form->createView()
]);
}
#[Route('/product/{urlSlug}/price', name: 'app_shop_site_product_price')]
public function app_shop_site_product_price(Request $request, Product $product, ProductPriceRepository $productPriceRepository, ProductAttributeRepository $productAttributeRepository, ProductAttributeValueRepository $productAttributeValueRepository)
{
$values = [];
if ($request->query->get('add_to_cart')) {
foreach ($request->query->get('add_to_cart') as $attributeId => $attributeValue) {
$attributeObj = $productAttributeRepository->findOneBy(['id' => $attributeId, 'active' => 1]);
$attributeValueObj = $productAttributeValueRepository->findOneBy(['value' => $attributeValue, 'active' => 1
,'attribute' => $attributeObj
]);
$values[] = $attributeValueObj->getId();
}
} else {
foreach ($request->query->all() as $attributeId => $attributeValue) {
$attributeObj = $productAttributeRepository->findOneBy(['id' => $attributeId, 'active' => 1]);
$attributeValueObj = $productAttributeValueRepository->findOneBy(['value' => $attributeValue, 'active' => 1
,'attribute' => $attributeObj
]);
$values[] = $attributeValueObj->getId();
}
}
$priceObject = $productPriceRepository->findPriceBySelectedValues($product, $values);
if ($priceObject) {
if ($priceObject->getInStock() > 0) {
return $this->json(['res' => true,
'text' => number_format($priceObject->getPrice()) . ' تومان',
'sell' => true,
'productPriceId' => $priceObject->getId()
]);
} else {
return $this->json(['res' => false, 'text' => 'ناموجود', 'sell' => false]);
}
}
return $this->json(['res' => false, 'text' => 'ناموجود', 'sell' => false]);
}
}