<?php
namespace App\Controller\Front;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityManager;
use App\Entity\Product;
use App\Entity\Category;
class ProductController extends FrontController
{
/**
* @Route("/{_locale}/p/{id}/{url}", name="product", requirements={"id"="\d+","url"=".*", "_locale":"fr|en"}, options={"utf8": true})
*/
public function product(Request $request, $id,$url)
{
$product = $this->em->getRepository(Product::class)->find($id);
if(empty($product)){
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
$redirection = $this->em->getRepository('App:Redirection')->getByProduct($product);
if($redirection){
$redirectUrl = $this->redirectionMgr->getRedirectUrl($redirection);
if($this->getUser()) {
$request->getSession()->getFlashBag()->add('notice',"Ce produit fait l'object d'une redirection vers <a href=\"".$redirectUrl."\">".$redirectUrl."</a>.");
}else{
return $this->redirect($redirectUrl, 301);
}
}
// un ancien produit parent est remplacé par sa première déclinaison
$target = $product->hasChildren() ? $product->getChildren()[0] : $product;
// une seule URL par fiche : les déclinaisons pointent directement vers la fiche modèle
// (quel que soit le slug demandé), l'ancre ignorée par les moteurs présélectionne la déclinaison
$productModel = $target->getTopProductModel();
if($productModel) {
$productModel->translate($request->getLocale());
return $this->redirect($this->generateUrl('product_model', ['id'=>$productModel->getId(), 'url'=>$productModel->getUrl()]).'#p='.$target->getId(), 301);
}
if($target !== $product || $product->getUrl()!=$url) {
return $this->redirectToRoute('product', ['url'=>$target->getUrl(),'id'=>$target->getId()], 301);
}
$this->seenProductMgr->addToSeenProducts($id);
return $this->renderProduct($product, $request->getLocale());
}
/**
* @Route("/{_locale}/pm/m-{id}/{url}", name="product_model", requirements={"id"="\d+","url"=".*", "_locale":"fr|en"}, options={"utf8": true})
*/
public function productModel(Request $request, $id,$url)
{
$productModel = $this->em->getRepository(\App\Entity\ProductModel::class)->find($id);
if(empty($productModel)){
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
// la fiche est toujours celle du modèle racine
if($productModel->hasParent()) {
$productModel = $productModel->getParent();
while($productModel->hasParent()) {
$productModel = $productModel->getParent();
}
$productModel->translate($request->getLocale());
return $this->redirectToRoute('product_model', ['id'=>$productModel->getId(), 'url'=>$productModel->getUrl()], 301);
}
$productModel->translate($request->getLocale());
if($productModel->getUrl()!=$url) {
return $this->redirectToRoute('product_model', ['id'=>$productModel->getId(), 'url'=>$productModel->getUrl()], 301);
}
$product = $productModel->getDefaultProduct();
if(empty($product)){
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
}
$this->seenProductMgr->addToSeenProducts($product->getId());
return $this->renderProductModel($productModel, $product, $request->getLocale());
}
protected function renderProduct(Product $product, $locale) {
$defaultCategory = $this->productMgr->getDefaultCategory($product);
$path = [];
$inCategory = [];
if($defaultCategory){
$path = $this->em->getRepository(Category::class)->getPath($defaultCategory);
$inCategory = $this->categoryMgr->getProducts($defaultCategory, [], null, 1, 10, $locale);
}
$associates = $this->em->getRepository('App:ProductAssociated')->getAssociatedProduct($product);
$priceGrids = [];
$discountsList = [];
$priceGrids[$product->getId()] = $this->priceMgr->getPriceGrid($product);
$discountsList[$product->getId()] = $this->priceMgr->getBestDiscountByProduct($product);
$productDescription = $product->getProductDescription($locale);
$tags = $productDescription->getTags();
if(empty($tags) && $defaultCategory){
$tags = $this->categoryMgr->getPathTags($defaultCategory, $locale);
}
return $this->render('front/catalog/product/view.html.twig',[
'product'=>$product,
'associates'=>$associates,
'inCategory'=>$inCategory,
'path'=>$path,
'priceGrids'=>$priceGrids,
'discountsList'=>$discountsList,
'discounts'=>[],
'pathTags'=>$tags,
'productDescription'=>$productDescription,
'customer'=>$this->customerMgr->getCustomer(),
'cart' => $this->cartMgr->getCart(),
'priceGroup' => $this->customerMgr->getPriceContext(),
'hasWelcomeDiscount'=>$this->priceMgr->hasWelcomeDiscount() && !$this->priceMgr->isLockedPrice($product)
]);
}
protected function renderProductModel(\App\Entity\ProductModel $productModel, Product $product, $locale) {
$defaultCategory = $this->productMgr->getDefaultCategory($product);
$path = [];
$inCategory = [];
if($defaultCategory){
$path = $this->em->getRepository(Category::class)->getPath($defaultCategory);
$inCategory = $this->categoryMgr->getProducts($defaultCategory, [], null, 1, 10, $locale);
}
$productModelDescription = $productModel->getProductModelDescription($locale);
$productDescription = $product->getProductDescription($locale);
$tags = $productDescription->getTags();
if(empty($tags) && $defaultCategory){
$tags = $this->categoryMgr->getPathTags($defaultCategory, $locale);
}
$products = $productModel->getAllProducts();
$defaultProduct = $productModel->getDefaultProduct();
$priceGrids = [];
$discountsList = [];
foreach($productModel->getAllProducts() as $child){
$priceGrids[$child->getId()] = $this->priceMgr->getPriceGrid($child);
$discountsList[$child->getId()] = $this->priceMgr->getBestDiscountByProduct($child);
}
return $this->render('front/catalog/model/view.html.twig',[
'attributes'=>$this->attributeMgr->getAttributesByProductModel($productModel),
'defaultProduct'=>$defaultProduct,
'product'=>$product,
'products'=>$products,
'assets'=>$productModel->getAssets(),
'productModel'=>$productModel,
'associates'=>$this->em->getRepository('App:ProductAssociated')->getAssociatedProduct($product),
'inCategory'=>$inCategory,
'path'=>$path,
'pathTags'=>$tags,
'discountsList'=>[],
'discounts'=>[],
'productDescription'=>$productDescription,
'productModelDescription'=>$productModelDescription,
'customer'=>$this->customerMgr->getCustomer(),
'cart' => $this->cartMgr->getCart(),
'priceGroup' => $this->customerMgr->getPriceContext(),
'priceGrids'=>$priceGrids,
'hasWelcomeDiscount'=>$this->priceMgr->hasWelcomeDiscount() && !$this->priceMgr->isLockedPrice($product)
]);
}
}