<?php
namespace App\Controller;
use App\DTO\AppDTO;
use App\Model\Cart as ModelCart;
use App\Model\Prod as ModelProd;
use App\Service\Auth\Auth as Auth;
use App\Service\Checkout\Checkout;
use App\Repository\DeliveryRepository;
use App\Model\Delivery as ModelDelivery;
use App\Model\Wishlist as ModelWishlist;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use App\Service\Paginator as ServicePaginator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestStack;
use App\RepositoryInterface\PageRepositoryInterface;
use App\RepositoryInterface\ProdRepositoryInterface;
use App\Service\Cart\Cart;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class CartController extends AbstractASController
{
public function __construct(
private DeliveryRepository $Deliveries,
private PageRepositoryInterface $Pages,
private ProdRepositoryInterface $Prods,
private ModelWishlist $Wishes,
private CacheInterface $Cache,
private AppDTO $app,
private Auth $Auth,
private ModelCart $Cart,
private Checkout $Checkout,
private ModelProd $ModelProd,
private Security $security,
private EntityManagerInterface $em)
{
}
#[Route(path: '/cart', name: 'cart_no_locale', defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/cart', name: 'cart', requirements: ['_locale' => '%app.langs%'])]
public function index(Request $request, \App\Service\Cart\Cart $Cart): Response
{
$start = (int) $request->get('start', 0);
$results = $this->getParameter('cart.results');
$wishlist = $this->Wishes->getOnePage($start, $results);
$deliveries = $this->Deliveries->getByRegion($this->Checkout->getRegion_fias_id());
$freedelivery = $this->Cart->isFreeDelivery((float) $this->app->sett->get('free_delivery_amount'));
$prod_limited_msg = $this->app->labels->get('cart-edit-1').':\n';
foreach ($this->Cart->getProdsLimited() as $k => $v)
{
$prod = $this->Prods->get($v);
$prod_limited_msg .= $prod->getArt().': '.$prod->getNum().' '.$this->app->labels->get('cart-edit-2').'\n';
}
$cart_items = $this->Cart->getCart();
foreach ($cart_items as $k => $v) {
$cart_items[$k]['prod'] = $this->Prods->get($v['id']);
}
$cart_new_prods = $this->em->createQuery("SELECT p FROM App\Entity\Prod p WHERE p.visible = 1 AND p.new = 1 AND (p.num > 0 or p.num2 > 0 or p.num3 > 0)")
->setMaxResults(6)
->getResult();
foreach ($cart_new_prods as $k => $prod) {
$cart_new_prods[$k]->prices = $this->ModelProd->getPrices($prod);
}
$cart_pop_prods = $this->em->createQuery("SELECT p FROM App\Entity\Prod p WHERE p.visible = 1 AND p.pop = 1 AND (p.num > 0 or p.num2 > 0 or p.num3 > 0)")
->setMaxResults(6)
->getResult();
foreach ($cart_pop_prods as $k => $prod) {
$cart_pop_prods[$k]->prices = $this->ModelProd->getPrices($prod);
}
return $this->render('cart/edit.html.twig', [
'cart' => $this->Cart,
'cart_items' => $cart_items,
'wishlist' => $wishlist,
'deliveries' => $deliveries,
'freedelivery' => $freedelivery,
'delivery_indicator_data' => $Cart->getDeliveryIndicatorData((float) $this->app->sett->get('free_delivery_amount')),
'prod_limited_msg' => $prod_limited_msg,
'checkout' => $this->Checkout,
'page' => $this->Pages->getByName('cart'),
'paginator' => new ServicePaginator('cart', count($wishlist), $results, $start),
'cart_pop_prods' => $cart_pop_prods,
'cart_new_prods' => $cart_new_prods,
]);
}
#[Route(path: '/cart/show', name: 'cart_show_no_locale', defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/cart/show', name: 'cart_show', requirements: ['_locale' => '%app.langs%'])]
public function show(Request $request): Response
{
$freedelivery = $this->Cart->isFreeDelivery((float) $this->app->sett->get('free_delivery_amount'));
$cart_items = $this->Cart->getCart();
foreach ($cart_items as $k => $v) {
$cart_items[$k]['prod'] = $this->Prods->get($v['id']);
}
return $this->render('cart/show.html.twig', [
'order' => null,
'cart' => $this->Cart,
'cart_items' => $cart_items,
'freedelivery' => $freedelivery,
'checkout' => $this->Checkout,
]);
}
#[Route(path: '/cart/list', name: 'cart_list_no_locale', defaults: ['_locale' => '%app.default_lang%'])]
#[Route(path: '/{_locale}/cart/list', name: 'cart_list', requirements: ['_locale' => '%app.langs%'])]
public function list(Request $request): Response
{
$cart_items = $this->Cart->getCart();
foreach ($cart_items as $k => $v) {
$cart_items[$k]['prod'] = $this->Prods->get($v['id']);
}
return $this->render('cart/list.html.twig', [
'cart' => $this->Cart,
'cart_items' => $cart_items,
]);
}
#[Route(path: '/cart/clear', name: 'cart_clear')]
public function clear(Request $request): Response
{
$this->Cart->deleteAll();
return new Response("ok");
}
}