src/Controller/shop/ProductController.php line 704
<?php
namespace App\Controller\shop;
use App\Classes\AppConfig;
use App\Classes\Data\OrderPaymentData;
use App\Classes\Data\OrderStatusData;
use App\Classes\Data\StatusData;
use App\Entity\Category;
use App\Entity\Code;
use App\Entity\Comment;
use App\Entity\Order;
use App\Entity\OrderProduct;
use App\Entity\Product;
use App\Entity\User;
use App\Entity\Visit;
use App\Form\OrderFormCustomerType;
use DateTimeImmutable;
use App\Service\MailService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Snappy\Pdf;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\Packages;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
#[Route('products')]
class ProductController extends AbstractController {
private $knpSnappyPdf;
public function __construct(private readonly ManagerRegistry $em, private readonly UrlGeneratorInterface $router, Pdf $knpSnappyPdf) {
$this->knpSnappyPdf = $knpSnappyPdf;
}
#[Route('/cart', name: 'app_cart')]
public function cartList(SessionInterface $session): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$args = [];
if ($session->has('basket')) {
$productsBasket = $session->get('basket');
$productDatas = [];
$korisnik = $this->getUser();
$ukupanPdv = 0;
$totalPdv = 0;
$ukupnoProizvoda = 0;
//test
$dostava = 0;
foreach ($productsBasket as $product) {
$productData = $this->em->getRepository(Product::class)->find(intval($product['pid']));
$porez = $productData->getVat();
$popust = $productData->isDiscount();
$pdv = ($productData->getPricePDV() * ($porez / 100)) * $product['qty'];
$ukupnaCenaDinKrajnja = $productData->getPricePDV() * $product['qty'];
$ukupanPdv = $ukupanPdv + $pdv;
$totalPdv = $totalPdv + $ukupnaCenaDinKrajnja;
$ukupnoProizvoda = $ukupnoProizvoda + $product['qty'];
$productDatas[] = [
'pid' => $product['pid'],
'qty' => $product['qty'],
'product' => $productData,
'cenaKomad' => $productData->getPricePDV(),
// 'ukupnaCenaDin' => $ukupnaCenaDin,
// 'ukupnaCenaDinOsnovna' => $ukupnaCenaDinOsnovna,
// 'ukupnaCenaDinPopust' => $ukupnaCenaDinPopust,
'ukupnaCenaDinKrajnja' => $ukupnaCenaDinKrajnja,
'porez' => $porez,
'popust' => $popust,
];
}
$args['basket'] = $productDatas;
$args['ukupanPorez'] = $ukupanPdv;
$args['ukupnoPdv'] = $totalPdv;
$args['ukupnoProizvoda'] = $ukupnoProizvoda;
$args['dostava'] = $dostava;
if ($session->has('basketCheckout')) {
$session->remove('basketCheckout');
}
$session->set('basketCheckout', $productDatas);
if ($session->has('basketUkupnoPorez')) {
$session->remove('basketUkupnoPorez');
}
$session->set('basketUkupnoPorez', $ukupanPdv);
if ($session->has('basketUkupnoPdv')) {
$session->remove('basketUkupnoPdv');
}
$session->set('basketUkupnoPdv', $totalPdv);
if ($session->has('ukupnoProizvoda')) {
$session->remove('ukupnoProizvoda');
}
$session->set('ukupnoProizvoda', $ukupnoProizvoda);
if ($session->has('dostava')) {
$session->remove('dostava');
}
$session->set('dostava', $dostava);
return $this->render('front/product/korpa.html.twig', $args);
}
return $this->render('front/product/korpa.html.twig', $args);
}
#[Route('/cart-code', name: 'app_cart_code')]
public function basketCode(Request $request): JsonResponse {
$code = $request->query->get('code');
$promoCode = $this->em->getRepository(Code::class)->findOneBy(['title' => $code, 'isSuspended' => false]);
if ($promoCode) {
return new JsonResponse(['success' => true, 'discount' => $promoCode->getValue(), 'name' => $promoCode->getTitle()]);
} else {
return new JsonResponse(['success' => false, 'message' => 'Kod je neispravan ili je istekao.']);
}
}
#[Route('/cart-add', name: 'app_cart_add')]
public function basketAdd(Request $request, SessionInterface $session): RedirectResponse|JsonResponse {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$proizvod = $session->get('basket', []);
$pid = $request->get('pid');
$qty = (int)$request->get('quantity', 1);
foreach ($proizvod as $product) {
if ($product['pid'] == $pid) {
return new JsonResponse(['status' => 'error', 'message' => 'Proizvod već postoji u korpi!']);
}
}
$proizvod[] = ['pid' => $pid, 'qty' => $qty];
$session->set('basket', $proizvod);
// Calculate total items in the basket
$totalItems = array_reduce($proizvod, function ($carry, $item) {
return $carry + $item['qty'];
}, 0);
return new JsonResponse(['status' => 'success', 'message' => 'Proizvod je uspešno dodat!', 'totalItems' => $totalItems]);
}
#[Route('/cart-count', name: 'app_cart_count')]
public function showCart(SessionInterface $session): JsonResponse {
$proizvod = $session->get('basket', []);
$totalItems = array_sum(array_column($proizvod, 'qty'));
return new JsonResponse(['totalItems' => $totalItems]);
}
#[Route('/cart-delete/{id}', name: 'app_cart_delete')]
public function basketDelete(int $id, SessionInterface $session): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
if ($session->has('basket')) {
$proizvod = $session->get('basket');
foreach ($proizvod as $i => $product) {
if ($product['pid'] == $id) {
array_splice($proizvod, $i, 1);
$session->set('basket', $proizvod);
return $this->redirectToRoute('app_cart');
}
}
}
return $this->redirectToRoute('app_cart');
}
#[Route('/cart-recalculate', name: 'app_cart_recalculate')]
public function basketPreracun( Request $request, SessionInterface $session): RedirectResponse|bool {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
if ($session->has('basket')) {
$data = $request->request->all();
$session->remove('basket');
$proizvod = [];
foreach ($data as $pid => $qty) {
if (substr($pid, 0, 5) == 'pQty_') {
$pid = substr($pid, 5);
if ($qty != 0) {
$proizvod[] = ['pid' => $pid, 'qty' => $qty];
}
} else {
break;
}
}
$session->set('basket', $proizvod);
return $this->redirectToRoute('app_cart');
}
return false;
}
#[Route('/kasa', name: 'app_cart_kasa')]
public function checkout(Request $request, SessionInterface $session, MailService $mailService): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
if (!$session->has('ukupnoProizvoda')) {
return $this->redirect($this->generateUrl('app_shop_home'));
}
// $okUrl = $this->generateUrl('app_shop_home', [], UrlGeneratorInterface::ABSOLUTE_URL);
//
// // Generisanje URL-a za neuspešan odgovor sa dodatnim parametrima
// $failUrl = $this->generateUrl('app_kontakt', ['OrderId' => 489], UrlGeneratorInterface::ABSOLUTE_URL);
//
$args = [];
$order = new Order();
$korisnik = $this->getUser();
if (!is_null($korisnik)) {
$order->setCreatedBy($korisnik);
$order->setMember($korisnik);
$order->setIme($korisnik->getIme());
$order->setPrezime($korisnik->getPrezime());
$order->setAdresa($korisnik->getAdresa());
$order->setGrad($korisnik->getGrad());
$order->setTelefon1($korisnik->getTelefon1());
$order->setEmail($korisnik->getEmail());
}
//test
$args['dostava'] = 0;
// $args['procenatPoreza'] = 20;
//
// $args['basket'] = $session->get('basketCheckout');
// $args['ukupnaCena'] = $session->get('basketUkupno');
// $args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv') + $args['dostava'];
// $args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
$args['basket'] = $session->get('basketCheckout');
$args['ukupnoPorez'] = $session->get('basketUkupnoPorez');
$args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');
$args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
$order->setPriceTotalPDV($args['ukupnaCenaPdv'] + $args['dostava']);
$order->setPriceTotal($args['ukupnaCenaPdv']);
$form = $this->createForm(OrderFormCustomerType::class, $order, ['action' => $this->generateUrl('app_cart_kasa'), 'method' => 'post']);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
foreach ($session->get('basketCheckout') as $product) {
$orderProduct = new OrderProduct();
$dbProduct = $this->em->getRepository(Product::class)->find($product['pid']);
$orderProduct->setProduct($dbProduct);
$orderProduct->setTitle($dbProduct->getTitle());
$orderProduct->setKolicina($product['qty']);
$orderProduct->setPricePDV($product['cenaKomad']);
$orderProduct->setPriceTotalPDV($product['ukupnaCenaDinKrajnja']);
$orderProduct->setSku($dbProduct->getSku());
$order->addProduct($orderProduct);
}
$order->setPriceTotalWithoutDelivery($order->getPriceTotalPDV() - $order->getPriceDelivery());
$order->setStatus(OrderStatusData::PENDING);
if (!is_null($request->request->get('diler'))) {
$order->setIsDiler(true);
$order->setStatus(OrderStatusData::PROFAKTURA);
}
$this->em->getRepository(Order::class)->generateOrderKey($order);
$order = $this->em->getRepository(Order::class)->save($order, $this->getUser());
if ($session->has('basketCheckout')) {
$session->remove('basketCheckout');
}
if ($session->has('basketUkupnoPorez')) {
$session->remove('basketUkupnoPorez');
}
if ($session->has('basketUkupnoPdv')) {
$session->remove('basketUkupnoPdv');
}
if ($session->has('basket')) {
$session->remove('basket');
}
if ($session->has('dostava')) {
$session->remove('dostava');
}
if ($session->has('ukupnoProizvoda')) {
$session->remove('ukupnoProizvoda');
}
if ($order->getPlacanje() == OrderPaymentData::ONLINE) {
$orgOid = $order->getOrderKey();
$orgAmount = number_format($order->getPriceTotalPDV() , 2, '.', '');
$orgOkUrl = "https://pcboomboom.rs/products/order-success";
$orgFailUrl = "https://pcboomboom.rs/products/order-fail";
$orgShopUrl = "https://pcboomboom.rs";
$orgRnd = microtime();
$clientId = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::CLIENT_ID));
$oid = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgOid));
$amount = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgAmount));
$shopUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgShopUrl));
$okUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgOkUrl));
$failUrl = str_replace("|", "\\|", str_replace("\\", "\\\\", $orgFailUrl));
$transactionType = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::AUTH_TYPE));
$installment = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::INSTALLMENT_NO));
$rnd = str_replace(["|", "\\", ".", " "], ["\\|", "\\\\", "", ""], $orgRnd);
$currency = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::STORE_CURRENCY));
$storeKey = str_replace("|", "\\|", str_replace("\\", "\\\\", AppConfig::STORE_KEY));
$plainText = $clientId . "|" . $oid . "|" . $amount . "|" . $okUrl . "|" . $failUrl . "|" . $transactionType . "|" . $installment . "|" . $rnd . "||||" . $currency . "|" . $storeKey;
$hashValue = hash('sha512', $plainText);
$hash = base64_encode (pack('H*',$hashValue));
$args['clientId'] = $clientId; // Vaš Merchant ID
$args['oid'] = $oid; // Jedinstveni ID porudžbine
$args['amount'] = $amount; // Iznos plaćanja
$args['okUrl'] = $okUrl;
$args['failUrl'] = $failUrl;
$args['tranType'] = $transactionType;
$args['instalment'] = $installment;
$args['rnd'] = $rnd; // Generišite nasumičan string
$args['currency'] = $currency; // Valuta
$args['storeKey'] = $storeKey;
$args['hash'] = $hash;
$args['storetype'] = AppConfig::STORE_TYPE;
$args['hashAlgorithm'] = AppConfig::ALGORITHM;
$args['lang'] = AppConfig::LANGUAGE;
$args['shopUrl'] = $orgShopUrl;
return $this->render('front/product/payment.html.twig', $args);
}
$mailService->order($order);
$args['order'] = $order;
if ($order->isDiler()) {
return $this->render('front/product/success_offer.html.twig', $args);
}
return $this->render('front/product/success.html.twig', $args);
}
}
$args['form'] = $form->createView();
return $this->render('front/product/kasa.html.twig', $args);
}
#[Route('/add-comment/{id}', name: 'app_comment_add')]
// #[Entity('comment', expr: 'repository.findForForm(id)')]
// #[Security("is_granted('USER_EDIT', usr)", message: 'Nemas pristup', statusCode: 403)]
public function formComment(Request $request, Product $product): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
if ($request->isMethod('POST')) {
$lastComment = $this->em->getRepository(Comment::class)->getOneByUser($request->request->get('member'));
if (!is_null($lastComment)) {
$now = new DateTimeImmutable();
$commentTime = $lastComment['created'];
$interval = $now->diff($commentTime);
if ($interval->h == 0 && $interval->i < 30) {
return new JsonResponse(['status' => 'error', 'message' => 'Poslednji komentar je ostavljen pre manje od pola sata. Molimo sačekajte pola sata pre nego što ostavite novi komentar.']);
}
}
$komentar = new Comment();
$komentar->setProduct($product);
$komentar->setCreatedBy($this->em->getRepository(User::class)->find($request->request->get('member')));
$komentar->setComment($request->request->get('comment'));
$komentar->setOcena($request->request->get('rating'));
$komentar->setStatus(0);
$this->em->getRepository(Comment::class)->save($komentar);
return new JsonResponse(['status' => 'success', 'message' => 'Komentar je uspešno dodat. Biće objavljen nakon verifikacije administratora.']);
}
return new JsonResponse(['status' => 'error', 'message' => 'Došlo je do greške.']);
}
#[Route('/favorite-add', name: 'app_favorite_add')]
public function favoriteAdd(Request $request): RedirectResponse|JsonResponse {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$pid = $request->get('product_id');
$product = $this->em->getRepository(Product::class)->find((int)$pid);
$user = $this->getUser();
$favoriti = $user->getFavorite();
if ($favoriti->contains($product)) {
// Proizvod je u kolekciji omiljenih
return new JsonResponse(['status' => 'error', 'message' => 'Proizvod već postoji u Vašoj listi želja.']);
} else {
$user->addFavorite($product);
$user = $this->em->getRepository(User::class)->save($user);
$count = $user->getFavorite()->count();
return new JsonResponse(['status' => 'success', 'totalFavorites' => $count, 'message' => 'Proizvod je uspešno dodat u Vašu listu favorita.']);
}
}
#[Route('/favorite-remove/{id}', name: 'app_favorite_remove')]
public function favoriteRemove(Product $product, Request $request): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$user = $this->getUser();
$user->removeFavorite($product);
$user = $this->em->getRepository(User::class)->save($user);
return $this->redirectToRoute('app_profile_view');
}
#[Route('/favorite-count', name: 'app_favorite_count')]
public function showFavorite(): JsonResponse {
$count = $this->getUser()->getFavorite()->count();
return new JsonResponse(['totalFavorites' => $count]);
}
#[Route('/order-success', name: 'app_order_success')]
public function success(Request $request, MailService $mailService): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$args = [];
$oid = $request->request->get('oid');
$order = $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);
// $order = $this->em->getRepository(Order::class)->find(37);
if (!is_null($request->request->get('TransId'))) {
$transId = $request->request->get('TransId');
$order->setTransId($transId);
}
if (!is_null($request->request->get('AuthCode'))) {
$authCode = $request->request->get('AuthCode');
$order->setAuthCode($authCode);
}
if (!is_null($request->request->get('ProcReturnCode'))) {
$prCode = $request->request->get('ProcReturnCode');
$order->setPrCode($prCode);
}
if (!is_null($request->request->get('clientIp'))) {
$clientIp = $request->request->get('clientIp');
$order->setClientIp($clientIp);
}
if (!is_null($request->request->get('instalment'))) {
$installment = $request->request->get('instalment');
$order->setInstallment($installment);
}
if (!is_null($request->request->get('Response'))) {
$responseTrans = $request->request->get('Response');
$order->setResponse($responseTrans);
}
if (!is_null($request->request->get('EXTRA_TRXDATE'))) {
$transDate = $request->request->get('EXTRA_TRXDATE');
$order->setTransDate($transDate);
}
if (!is_null($request->request->get('mdStatus'))) {
$mdStatus = $request->request->get('mdStatus');
$order->setMdStatus($mdStatus);
}
$order = $this->em->getRepository(Order::class)->savePayment($order);
$mailService->order($order);
$args['order'] = $order;
return $this->render('front/product/success.html.twig', $args);
}
#[Route('/order-fail', name: 'app_order_fail')]
public function fail(Request $request, MailService $mailService): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$args = [];
$oid = $request->request->get('oid');
$order = $this->em->getRepository(Order::class)->findOneBy(['orderKey' => $oid]);
if (!is_null($request->request->get('TransId'))) {
$transId = $request->request->get('TransId');
$order->setTransId($transId);
}
if (!is_null($request->request->get('AuthCode'))) {
$authCode = $request->request->get('AuthCode');
$order->setAuthCode($authCode);
}
if (!is_null($request->request->get('ProcReturnCode'))) {
$prCode = $request->request->get('ProcReturnCode');
$order->setPrCode($prCode);
}
if (!is_null($request->request->get('clientIp'))) {
$clientIp = $request->request->get('clientIp');
$order->setClientIp($clientIp);
}
if (!is_null($request->request->get('instalment'))) {
$installment = $request->request->get('instalment');
$order->setInstallment($installment);
}
if (!is_null($request->request->get('Response'))) {
$responseTrans = $request->request->get('Response');
$order->setResponse($responseTrans);
}
if (!is_null($request->request->get('EXTRA_TRXDATE'))) {
$transDate = $request->request->get('EXTRA_TRXDATE');
$order->setTransDate($transDate);
}
if (!is_null($request->request->get('mdStatus'))) {
$mdStatus = $request->request->get('mdStatus');
$order->setMdStatus($mdStatus);
}
$order = $this->em->getRepository(Order::class)->savePayment($order);
$mailService->orderFail($order);
$args['order'] = $order;
return $this->render('front/product/fail.html.twig', $args);
}
#[Route('/export-pdf-product/{id}', name: 'app_product_pdf')]
// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
public function pdfProduct(Product $product, Request $request,) : Response {
$args['product'] = $product;
$args['category'] = $product->getCategory();
$html = $this->renderView('front/product/pdf.html.twig', $args);
$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="order_' . $product->getSku() . '.pdf"',
]);
}
#[Route('/export-pdf/{id}', name: 'app_offer_pdf')]
// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
public function pdf(Order $order, Request $request) : Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
$args['order'] = $order;
$products = $order->getProduct();
$kolicina = 0;
foreach ($products as $prod) {
$kolicina = $kolicina + $prod->getKolicina();
}
$args['noProducts'] = $kolicina;
$args['statusi'] = OrderStatusData::STATUS;
$html = $this->renderView('order/pdf.html.twig', $args);
$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="order_' . $order->getOrderKey() . '.pdf"',
]);
}
#[Route('/export-pdf-korpa/', name: 'app_offer_pdf_korpa')]
// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
public function pdfKorpa(SessionInterface $session, Request $request): Response {
$args['type'] = $request->query->get('type');
$args['basket'] = $session->get('basketCheckout');
$args['ukupnoPorez'] = $session->get('basketUkupnoPorez');
$args['ukupnaCenaPdv'] = $session->get('basketUkupnoPdv');
$args['ukupnoProizvoda'] = $session->get('ukupnoProizvoda');
$html = $this->renderView('order/korpa_pdf.html.twig', $args);
$pdfContent = $this->knpSnappyPdf->getOutputFromHtml($html);
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="offer_' . date('Y-m-d_H-i-s') . '.pdf"',
]);
}
#[Route('/get-users-ajax-search-products', name: 'app_ajax_search')]
public function getProducts(Request $request, EntityManagerInterface $em, Packages $assetsManager,RouterInterface $router): JsonResponse {
$term = $request->query->get('q', '');
$products = $em->getRepository(Product::class)->searchByTerm($term);
$results = [];
foreach ($products as $product) {
$results[] = [
'id' => $product['id'],
'text' => $product['title'],
'pricePDV' => $product['pricePDV'],
'link' => $router->generate('app_shop_product_view', ['id' => $product['id']]),
'slika' => $assetsManager->getUrl($product['thumbnail100'])
];
}
return new JsonResponse(['results' => $results]);
}
#[Route('/products-category-random/{id}', name: 'app_products_category_random')]
public function productsCategory(Category $category): Response {
$args = [];
$args['randomProducts'] = $this->em->getRepository(Product::class)->searchByCategory($category);
return $this->render('front/include/products_category.html.twig', $args);
}
#[Route('/view/{id}', name: 'app_shop_product_view')]
// #[Security("is_granted('USER_VIEW', usr)", message: 'Nemas pristup', statusCode: 403)]
public function view(Product $product, SessionInterface $session): Response {
if ($this->isGranted('ROLE_USER')) {
if (!$this->isGranted('ROLE_EMPLOYEE')) {
return $this->redirect($this->generateUrl('app_home'));
}
}
if ($product->getPricePDV() == 0 || $product->isSuspended()) {
return $this->redirect($this->generateUrl('app_shop_home'));
}
$args['product'] = $product;
$args['category'] = $product->getCategory();
$args['productComments'] = $this->em->getRepository(Comment::class)->findBy(['product' => $product, 'status' => StatusData::PRIHVACEN]);
$args['noActiveComments'] = $this->em->getRepository(Comment::class)->count(['product' => $product, 'status' => StatusData::PRIHVACEN]);
$args['stars'] = $this->em->getRepository(Comment::class)->getStars($product->getId());
$visit = $product->getVisits()->first();
$visit->setVisit($visit->getVisit() + 1);
$visit = $this->em->getRepository(Visit::class)->save($visit);
$args['visits'] = $visit->getVisit();
return $this->render('front/product/view.html.twig', $args);
}
}