<?php
/**
* Cart Controller
*
* @author Bertin van den Ham <b.vandenham@visualmedia.nl>
* @author Vincent van Waasbergen <v.vanwaasbergen@visualmedia.nl>
*/
namespace VisualMedia\OrderBundle\Controller;
use InvalidArgumentException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use VisualMedia\LisaBundle\Component\ManagerData;
use VisualMedia\LisaBundle\Controller\BaseController;
use VisualMedia\LisaBundle\Helper\EntityHelper;
use VisualMedia\OrderBundle\Entity\BaseOrderItem;
use VisualMedia\OrderBundle\Form\Type\CartType;
use VisualMedia\OrderBundle\Service\Cart;
/**
* Cart Controller
*/
class CartController extends BaseController
{
/**
* Index Action
*
* @param Request $request
*
* @return Response
*/
public function indexAction(Request $request): Response
{
$translator = $this->get('translator');
$cart = $this->get(Cart::class);
if (true === $clear = (bool)$request->query->get('clear')) {
$cart->clear();
return $this->redirectToRoute('cart');
}
$form = $this->createForm(CartType::class, $cart->getCart());
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $form->get('submit')->isClicked()) {
return $this->redirectToRoute('order_checkout');
}
$data = array(
'cart' => $cart,
'form' => $form->createView()
);
if ($request->isXmlHttpRequest()) {
return new JsonResponse(array(
'content' => $this->renderView('@VisualMediaOrder/Cart/cart.html.twig', $data),
'cart_amount' => $cart->getAmount(),
));
}
return $this->render('@VisualMediaOrder/Cart/index.html.twig', array_merge($data, array(
'title' => $translator->trans('cart.title', array(), 'frontend'),
)));
}
/**
* Add Action
*
* @param Request $request
* @param string $type
* @param int $id
*
* @return Response
*/
public function addAction(Request $request, string $type, int $id): Response
{
$cart = $this->get(Cart::class);
$translator = $this->get('translator');
if ($this->has($alias = sprintf('manager.%s', $type)) === false) {
throw new InvalidArgumentException($translator->trans('cart.alias_manager_not_found', array(
'%alias%' => $alias,
), 'exception'));
}
$manager = $this->get($alias);
if (null === $entity = $manager->getFirst(new ManagerData(array('id' => $id)))) {
throw $this->createNotFoundException($translator->trans($type . '.not_found', [], 'exception'));
}
$item = new BaseOrderItem();
$item->setEntity($entity);
$item->setReference(EntityHelper::entityToKey($entity));
$item->setReferenceData(array(
'type' => $type,
));
if (method_exists($entity, 'getCascadedPrice')) {
$item->setPrice($entity->getCascadedPrice());
}
else {
$item->setPrice($entity->getPrice());
}
$cart->add($item);
$cart->save();
return $this->redirectToRoute('cart');
}
/**
* Change Amount Action
*
* @param Request $request
*
* @return Response
*/
public function changeAmountAction(Request $request): Response
{
$cart = $this->get(Cart::class);
$hash = $request->request->get('hash');
$amount = $request->request->get('amount');
$cart->updateItemAmount($hash, $amount);
return $this->redirectToRoute('cart');
}
/**
* Remove Action
*
* @param Request $request
* @param string $hash
*
* @return Response
*/
public function removeAction(Request $request, string $hash)
{
$cart = $this->get(Cart::class);
$cart->removeItem($hash);
return $this->redirectToRoute('cart');
}
}