<?php namespace Lc\ShopBundle\Controller\Frontend ; use Doctrine\ORM\EntityManagerInterface; use Lc\ShopBundle\Context\MerchantUtilsInterface; use Lc\ShopBundle\Context\OrderUtilsInterface; use Lc\ShopBundle\Context\ProductFamilyInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Security; class FavoriteController extends BaseController { protected $productFamilyRepository ; public function __construct(EntityManagerInterface $em, Security $security, MerchantUtilsInterface $merchantUtils) { parent::__construct($em, $security, $merchantUtils); $this->productFamilyRepository = $this->em->getRepository($this->em->getClassMetaData(ProductFamilyInterface::class)->getName()) ; } public function toggle(Request $request) { $user = $this->_getUser() ; $productFamily = $this->_getProductFamily($request) ; if($user->getFavoriteProductFamilies()->contains($productFamily)) { $user->removeFavoriteProductFamily($productFamily) ; $isFavorite = false ; $message = 'Le produit a bien été supprimé de vos favoris' ; } else { $user->addFavoriteProductFamily($productFamily) ; $isFavorite = true ; $message = 'Le produit a bien été ajouté à vos favoris' ; } $this->_saveUser($user) ; return new JsonResponse([ 'return' => 'success', 'is_favorite' => $isFavorite, 'message' => $message ]) ; } public function add(Request $request) { $user = $this->_getUser() ; $productFamily = $this->_getProductFamily($request) ; $user->addFavoriteProductFamily($productFamily) ; $this->_saveUser($user) ; return new JsonResponse([ 'return' => 'success', 'message' => 'Le produit a bien été ajouté à vos favoris' ]) ; } public function delete(Request $request) { $user = $this->_getUser() ; $productFamily = $this->_getProductFamily($request) ; $user->removeFavoriteProductFamily($productFamily) ; $this->_saveUser($user) ; return new JsonResponse([ 'return' => 'success', 'message' => 'Le produit a bien été supprimé de vos favoris' ]) ; } private function _getUser() { $user = $this->security->getUser() ; if(!$user) { throw new \ErrorException('Vous devez être connecté pour gérer vos favoris') ; } return $user ; } private function _saveUser($user) { $this->em->persist($user); $this->em->flush() ; } private function _getProductFamily($request) { $idProductFamily = $request->request->get('idProductFamily') ; $productFamily = $this->productFamilyRepository->find($idProductFamily) ; if($productFamily) { return $productFamily ; } else { throw new \ErrorException('Ce produit est introuvable') ; } } }