<?php
namespace Acme\SudcmsBundle\Controller\Front;
use Acme\SudcmsBundle\Entity\EcoCustomersFavoritesProd;
use Acme\SudcmsBundle\Entity\Pages;
use Acme\SudcmsBundle\Entity\PagesBlocs;
use Acme\SudcmsBundle\Entity\Site;
use Acme\SudcmsBundle\Repository\EcoCategoriesRepository;
use Acme\SudcmsBundle\Repository\EcoCustomersFavoritesProdRepository;
use Acme\SudcmsBundle\Repository\EcoLabelsRepository;
use Acme\SudcmsBundle\Repository\EcoMarksRepository;
use Acme\SudcmsBundle\Repository\EcoProductsLabelsRepository;
use Acme\SudcmsBundle\Repository\EcoProductsReferencesRepository;
use Acme\SudcmsBundle\Repository\EcoProductsRepository;
use Acme\SudcmsBundle\Repository\PagesRepository;
use Acme\SudcmsBundle\Service\OtideaUtils;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
#[Route(path: '/boutique')]
class FrontShoppingController extends AbstractController
{
private $session;
private $entityManager;
private $security;
private $currentUserConnected;
private $isThereSlider = array();
private $isThereGalerie = array();
private $projectDirectory;
public function __construct(EntityManagerInterface $entityManager, Security $security, OtideaUtils $otideaUtils)
{
$this->session = new Session();
$this->entityManager = $entityManager;
$this->currentUserConnected = $otideaUtils->getUserConnected();
$this->security = $security;
$this->projectDirectory = $this->entityManager->getRepository(Site::class)->findOneBy(['id' => CURRENT_SITE_ID])->getProjectDirectory();
if (!IS_ECOMMERCE) {
header('Location: ' . WEBSITEROOT);
exit;
}
}
#[Route(path: '/produit/{product_name}/{prod_id}', name: 'front_shopping_fiche', defaults: ['product_name' => null,
'prod_id' => 0])]
public function fiche(Request $request, EcoProductsRepository $repoProd,
EcoProductsReferencesRepository $repoRef, EcoProductsLabelsRepository $repoProdLabels,
EcoLabelsRepository $repoLabels,
EcoCustomersFavoritesProdRepository $favProdRepository, OtideaUtils $otideaUtils,
$product_name = NULL, $prod_id = 0): Response
{
$product = $repoProd->find($prod_id);
//Récupération des labels du produit
$labels = $repoProdLabels->findBy(['product_id' => $prod_id]);
$productLabels = [];
foreach ($labels as $label) {
$productLabels[] = $repoLabels->findOneBy(['id' => $label->getLabelId()]);
}
//Récupération des produits favoris
if ($this->currentUserConnected != null) {
$favsProds = $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
} else {
$favsProds = null;
}
if ($product == null) {
throw $this->createNotFoundException();
}
//Désactive l'accès d'un produit hors ligne
if (!$product->getProdIsonline()) {
return $this->redirectToRoute('front_home');
//Produit archivé (redirection 301)
}
if ($this->session->has('displayPopup') && $this->session->get('displayPopup') == 'display-basket-confirmation') {
$otideaUtils->createPopup([
"title" => 'Ajout au panier',
"message" => 'Cet article a été ajouté à votre panier.',
"btn2" => null]
);
$this->session->remove('displayPopup');
}
//Produits associés
$combinations = $repoProd->findByProductsCombination($prod_id);
if ($combinations == NULL) {
$associateProducts = $repoProd->findByAssociate();
} else {
$associateProducts = $repoProd->findByAssociateCombination($prod_id);
}
$categ_id = $product->getCategoryId();
//Paramètres communs aux deux templates
$params = [
'product' => $repoProd->find($prod_id),
'blocks' => $this->getProductsBlocks($prod_id),
'productLabels' => $productLabels,
'favsProds' => $favsProds,
'isThereSlider' => $this->isThereSlider,
'isThereGalerie' => $this->isThereGalerie,
'associateProducts' => $associateProducts,
'catEnCours' => (int)$categ_id,
];
/* dump($repoProd->find($prod_id));
dump($associateProducts);*/
//Mode fiche une seule référence
// if ($product->getProdType() == 'single') {
// $params['reference'] = $repoRef->findOneBy(['product_id' => $prod_id]);
// return $this->render('front/front_shopping/product-' . $product->getProdType() . '.html.twig', $params);
// //Mode référence bundle
// } else
if ($product->getProdType() == 'bundle') {
$params['reference'] = $repoRef->findOneBy(['product_id' => $prod_id]);
$params['bundles'] = $repoProd->findByProductsBundle($prod_id);
return $this->render('@main-app/front/front_shopping/product-' . $product->getProdType() . '.html.twig',
$params);
//Mode référence multiple
} else {
$params['references'] = $repoRef->findBy(['product_id' => $prod_id],
['ref_sequence' => 'ASC']);
return $this->render('@main-app/front/front_shopping/product-multiple.html.twig', $params);
}
}
/**
* Ajout d'un produit en favoris
* @param Request $request
*/
#[Route(path: '/axAddProductFavorite', options: ['expose' => true])]
public function axAddProductFavorite(Request $request, EcoCustomersFavoritesProdRepository $favProdRepository)
{
$user = $this->security->getUser();
if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
//$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'),
'customerId' => $this->currentUserConnected->getId()]);
if ($oldFavProd == null) {
$favoriteProduct = new EcoCustomersFavoritesProd;
$favoriteProduct->setProductId($request->get('reference_id'));
//$favoriteProduct->setCustomerId($user->getUserIdentifier());
$favoriteProduct->setCustomerId($this->currentUserConnected->getId());
$this->entityManager->persist($favoriteProduct);
$this->entityManager->flush();
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* Suppression d'un produit des favoris
* @param Request $request
*/
#[Route(path: '/axRemoveProductFavorite', options: ['expose' => true])]
public function axRemoveProductFavorite(Request $request, EcoCustomersFavoritesProdRepository $favProdRepository)
{
$user = $this->security->getUser();
if ($request->isXmlHttpRequest() && $request->get('reference_id') == 'all') {
//$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
$oldFavsProds = $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
if ($oldFavsProds != null) {
foreach ($oldFavsProds as $oldFavProd) {
$this->entityManager->remove($oldFavProd);
}
$this->entityManager->flush();
}
return new JsonResponse([
'status' => true,
]);
} else if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
//$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'),
'customerId' => $this->currentUserConnected->getId()]);
if ($oldFavProd != null) {
$this->entityManager->remove($oldFavProd);
$this->entityManager->flush();
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/')]
#[Route(path: '/{categ_name}')]
#[Route(path: '/{categ_name}/{mark}/{categ_id}')]
#[Route(path: '/{categ_name}/{mark}/{categ_id}/{mark_id}', name: 'front_shopping_categorie', defaults: ['categ_name' => null,
'mark' => null,
'categ_id' => 0,
'mark_id' => null])]
public function index(Request $request, OtideaUtils $otideaUtils,
EcoCustomersFavoritesProdRepository $favProdRepository, EcoProductsRepository $repoProd,
EcoCategoriesRepository $repoCategs, EcoMarksRepository $repoMarks, PagesRepository $repo,
PaginatorInterface $paginator, $categ_name = null, $mark = null,
$categ_id = 0, $mark_id = null): Response
{
//Récupération des produits favoris
if ($this->currentUserConnected != null) {
$favsProds = $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
} else {
$favsProds = null;
}
//Désactive l'accès d'une catégorie hors ligne
if ($categ_id > 0) {
$category = $repoCategs->find($categ_id);
if (!$category->getCategIsonline()) {
return $this->redirectToRoute('front_home');
}
}
if ($this->session->has('displayPopup') && $this->session->get('displayPopup') == 'display-basket-confirmation') {
$otideaUtils->createPopup([
"title" => 'Ajout au panier',
"message" => 'Cet article a été ajouté à votre panier.',
"btn2" => null]
);
$this->session->remove('displayPopup');
}
// $categ_id = $request->get('category') ? $request->query->getInt('category') : $categ_id;
// $mark_id = $request->get('mark') ? $request->query->getInt('mark') : 0;
$filter = $request->get('filter') ? $request->query->getAlpha('filter') : 0;
if ($categ_name == "nouveaute") {
$productsResult = $repoProd->findNouveaute();
} else {
$productsResult = $repoProd->findByProductsByCategorie($categ_id, $mark_id, $filter, CURRENT_SITE_ID);
}
$products = $paginator->paginate(
$productsResult, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
8 // Nombre de résultats par page
);
$currentPage = $repo->findOneBy(['purlInterne' => 'boutique', 'psite' => CURRENT_SITE_ID]);
return $this->render('@main-app/front/front_shopping/index.html.twig', [
'products' => $products,
'favsProds' => $favsProds,
'catEnCours' => (int)$categ_id,
'markEnCours' => $mark_id,
"page" => $currentPage,
'filter' => $filter,
'categsList' => $repoCategs->findByEcoCategories(CURRENT_SITE_ID),
'marksList' => $repoMarks->findBy([], ['mark' => 'DESC']),
'category' => $repoCategs->find($categ_id),
'isThereSlider' => $this->isThereSlider,
'displayPromoOption' => $this->getProductsPriceType($productsResult, 'promo'),
'displaySoldeOption' => $this->getProductsPriceType($productsResult, 'solde'),
]);
}
private function getProductsPriceType($products, $type)
{
$i = 0;
if (is_array($products)) {
foreach ($products as $prod) {
if ($prod['prod_price_type'] == $type) {
$i++;
}
}
}
return $i > 0 ? true : false;
}
//'text','picture','text_picture','gallery','embed','html','document','sub_menu','text_slider'
private function getProductsBlocks($product_id)
{
$content = '';
$blocs = $this->entityManager->getRepository(PagesBlocs::class)->findByListeBlocsWithMediaProductFiche($product_id,
'product');
$blocs = $this->translateBlockFields($blocs);
if (is_array($blocs) && sizeof($blocs) > 0) {
foreach ($blocs as $bloc) {
// dd($bloc);
if ($bloc['bloc_type'] == 'texte_slider') {
$this->isThereSlider[] = $bloc['bloc_id'];
}
if ($bloc['bloc_type'] == 'galerie') {
$this->isThereGalerie[] = $bloc['bloc_id'];
}
$mediasBlocs = $this->entityManager->getRepository(Pages::class)->getAllMediasByBloc($blocs);
// $mediasBlocs = $this->translateBlockMediaField($mediasBlocs);
// dd($mediasBlocs);
$currentBlocMedias = [];
foreach ($mediasBlocs as $media) {
if ($bloc['bloc_id'] == $media["id_bloc"]) {
$currentBlocMedias[] = $media;
}
}
if ($bloc['bloc_type'] == 'texte_image' && empty($currentBlocMedias)) {
$bloc['bloc_type'] = 'texte';
}
if ($bloc['bloc_type'] == 'texte_slider' && empty($currentBlocMedias)) {
$bloc['bloc_type'] = 'texte';
}
$content .= $this->renderView("front/front_blocks/bloc-" . $bloc['bloc_type'] . ".html.twig",
[
'module' => 'pages',
'medias' => $currentBlocMedias,
'bloc' => $bloc,
"uniqId" => uniqid(),
]
);
}
}
return $content;
}
private function translateBlockMediaField($medias)
{
$translateField = [
'id' => 'media_id',
'block_id' => 'id_bloc',
'prod_media_file' => 'media_fichier',
'prod_media_link' => 'media_lien',
'prod_media_type' => 'media_type',
'prod_media_alt' => 'media_alt',
'prod_media_isblank' => 'media_is_blank',
'prod_media_display_alt' => 'media_alt_display',
'prod_media_sequence' => 'media_ordre',
];
if (is_array($medias) && sizeof($medias)) {
foreach ($medias as $keyMedia => $media) {
foreach ($media as $key => $m) {
if (isset($translateField[$key])) {
$medias[$keyMedia][$translateField[$key]] = $media[$key];
}
}
}
}
return $medias;
}
private function translateBlockFields($blocs)
{
$translateField = [
'id' => 'bloc_id',
'prod_block_type' => 'bloc_type',
'prod_block_text' => 'bloc_texte',
'prod_block_file' => 'bloc_htmlfile',
'prod_block_title' => 'bloc_titre',
'prod_block_subtitle' => 'bloc_sstitre',
'prod_block_text_picture' => 'bloc_type_texte_image',
'prod_block_alignment' => 'bloc_alignement',
'prod_block_embed' => 'bloc_embed',
'prod_block_margin_top' => 'bloc_margin_top',
'prod_block_margin_bottom' => 'bloc_margin_bottom',
'prod_block_multicolumn' => 'bloc_multi_column',
'prod_block_sequence' => 'bloc_ordre',
];
$translateBlockType = [
'text' => 'texte',
'picture' => 'image',
'text_picture' => 'texte_image',
'gallery' => 'galerie',
'embed' => 'embed',
'html' => 'html',
'document' => 'document',
'sub_menu' => 'sub_menu',
'text_slider' => 'text_slider',
];
if (is_array($blocs) && sizeof($blocs)) {
foreach ($blocs as $keyBloc => $blocElement) {
foreach ($blocElement as $key => $b) {
if (isset($translateField[$key])) {
if ($key == 'prod_block_type' && isset($translateBlockType[$blocElement[$key]])) {
$blocs[$keyBloc][$translateField[$key]] = $translateBlockType[$blocElement[$key]];
} elseif ($key == 'prod_block_alignment' && isset($blocElement[$key])) {
if ($blocElement[$key] == 'left') {
$blocs[$keyBloc][$translateField[$key]] = 'gauche';
} else {
$blocs[$keyBloc][$translateField[$key]] = 'droite';
}
} else {
$blocs[$keyBloc][$translateField[$key]] = $blocElement[$key];
}
}
}
}
}
return $blocs;
}
}