src/CoreBundle/Controller/Traits/BaseController.php line 69

Open in your IDE?
  1. <?php
  2. namespace Core\Controller\Traits;
  3. use App\Entity\PageGeneral;
  4. use Core\Entity\Configuration;
  5. use Core\Entity\CookieConfiguration;
  6. use Core\Entity\Design;
  7. use Core\Entity\DesignThemeType;
  8. use Core\Entity\HistoryMessageType;
  9. use Core\Entity\Image;
  10. use Core\Entity\Language;
  11. use Core\Entity\Page;
  12. use Core\Entity\Redirection;
  13. use Core\Entity\RedirectionType;
  14. use Core\Entity\Text;
  15. use Core\Service\History\HistoryMessage;
  16. use Core\Service\Session\Session;
  17. use ReflectionClass;
  18. use Shopping\Entity\Product;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  23. use Symfony\Component\Validator\Constraints\DateTime;
  24. use User\Entity\AuthorizationGroup;
  25. use User\Entity\AuthorizationType;
  26. use User\Entity\User;
  27. use User\Entity\UserGroup;
  28. use User\Service\UserManager;
  29. trait BaseController
  30. {
  31.     /**
  32.      * @var array - Tableau de variables utilisé pours les templates
  33.      */
  34.     protected $vars = [];
  35.     /**
  36.      * @var Session - Gère l'enregistrement en Session (Session - Database - File) des données
  37.      */
  38.     protected $session;
  39.     /**
  40.      * @var User - Utilisation courant
  41.      */
  42.     protected $user;
  43.     /**
  44.      * @var array UserAuthorization - Authorization de l'utilisateur courant
  45.      */
  46.     protected $user_authorizations;
  47.     /**
  48.      * Constructeur
  49.      */
  50.     public function __construct(Session $session)
  51.     {
  52.         $this->session $session;
  53.     }
  54.     /**
  55.      * Initialisation du controller
  56.      */
  57.     public function initializeController(Request $request)
  58.     {
  59.         // Désactivation des logs de Doctrine
  60.         if ($_ENV['APP_LOG_DOCTRINE'] == 0) {
  61.             $this->getDoctrine()->getEntityManager()->getConnection()->getConfiguration()->setSQLLogger(null);
  62.         }
  63.         // Configuration générale de l'application
  64.         $this->vars['configuration'] = $this->getDoctrine()->getRepository(Configuration::class)->find(1);
  65.         // Attributions des différentes langues de l'application
  66.         $request $this->setLanguages($request);
  67.         // Initialisation de la configuration utilisateur
  68.         $this->setUserSettings($request);
  69.         // Définitions du controller à utiliser
  70.         $this->vars['controller'] = $this->findRoute($request);
  71.         return $request;
  72.     }
  73.     /**
  74.      * Initialisation des variables de controller
  75.      */
  76.     public function initializeVariableController(Request $request)
  77.     {
  78.         $this->vars $request->attributes->get('vars');
  79.     }
  80.     public function resetPageController(Request $request)
  81.     {
  82.         if ($request->attributes->get('vars') != null)
  83.             $this->vars['pages'] = $request->attributes->get('vars')['pages'];
  84.     }
  85.     /**
  86.      * Initialisation des paramètres de langues
  87.      */
  88.     public function setLanguages(Request $request)
  89.     {
  90.         $use_language 'fr'// Langue à utiliser par défault
  91.         $locale 'fr'// locale à utiliser per défault
  92.         // On récupère les différentes langues actives
  93.         $this->vars['languages']['list'] = $this->getDoctrine()->getRepository(Language::class)->findBy([
  94.             'is_enabled' => 1
  95.         ]);
  96.         // Définition des URLs
  97.         $this->vars['uri']['host'] = $host $request->headers->get('host');
  98.         $this->vars['uri']['protocol'] = 'http://';
  99.         if ($_ENV['APP_SSL'] == 1) {
  100.             $this->vars['uri']['protocol'] = 'https://';
  101.         }
  102.         $this->vars['uri']['relative'] = $uri $request->attributes->get('controller');
  103.         $this->vars['uri']['full'] = $this->vars['uri']['protocol'] . $host $request->getRequestUri();
  104.         // Gestion des paramètres
  105.         $parameters explode('?'$request->getRequestUri());
  106.         $parametersArray = [];
  107.         if (count($parameters) > 1) {
  108.             $results explode('&'$parameters[1]);
  109.             foreach ($results as $result) {
  110.                 $object explode('='$result);
  111.                 if (count($object) > 1) {
  112.                     $parametersArray[$object[0]] = trim(urldecode($object[1]));
  113.                 }
  114.             }
  115.         }
  116.         $this->vars['uri']['parameters'] = $parametersArray;
  117.         // Définition de la langue via le navigateur || langue par default
  118.         if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  119.             $use_language substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02);
  120.         }
  121.         // Surcharge - Langue via la session
  122.         if ($this->session->has('_locale')) {
  123.             $use_language $this->session->get('_locale');
  124.         }
  125.         // Surcharge - Langue via l'URL
  126.         if (preg_match('#^/[a-z]{2}/#''/' $uri$matches) || preg_match('#^/[a-z]{2}$#''/' $uri$matches)) {
  127.             $use_language trim($matches[0], '/');
  128.         }
  129.         // Langues disponibles via le code ISO
  130.         foreach ($this->vars['languages']['list'] as $language) {
  131.             if ($language->getIsoCode() == $use_language) {
  132.                 $locale $use_language;
  133.                 break;
  134.             }
  135.         }
  136.         // Sauvegarde des variables de langues
  137.         $this->session->set('_locale'$locale); // Sauvegarde en session
  138.         $request->setLocale($locale); // Sauvegarde en request
  139.         $this->vars['languages']['locale'] = $request->getLocale();  // Sauvegarde en variable
  140.         return $request;
  141.     }
  142.     /**
  143.      * Gestion de la configuration utilisateur
  144.      */
  145.     public function setUserSettings(Request $request)
  146.     {
  147.         // Manager d'utilisateur
  148.         $entity = new UserManager($this->getDoctrine());
  149.         // Création d'un utilisateur guest
  150.         $this->user = new User();
  151.         // Récupération de l'utilisateur en session
  152.         $session_content $this->session->get('user');
  153.         // Session en mémoire
  154.         if ($session_content != null) {
  155.             // Format du contenu
  156.             $this->user->unserialize($session_content);
  157.             // Vérification en base de donnée de l'existance de l'utilisateur
  158.             $this->user $this->getDoctrine()->getRepository(User::class)->findByUser($this->user);
  159.         }
  160.         // Sinon création d'un visiteur si echec de récupération de l'utilisateur
  161.         if ($session_content == null || $this->user == null || !$entity->checkUser($this->user)) {
  162.             $this->user $entity->createUser();
  163.         }
  164.         // Autorisations de l'utilisateurs par groupe
  165.         foreach ($this->user->getUserGroups()->toArray() as $group) {
  166.             // On récupère les authorizations du groupe
  167.             $authorizations $this->getDoctrine()->getRepository(AuthorizationGroup::class)->findBy([
  168.                 'team' => $group->getId()
  169.             ]);
  170.             // Attribution des authorisations par clés
  171.             foreach ($authorizations as $authorization) {
  172.                 $this->user_authorizations[$authorization->getAuthorization()->getDevKey()][] = $authorization;
  173.             }
  174.             if ($this->checkAuthorization($request, [
  175.                 'authorization' => 'administration',
  176.                 'type' => 0
  177.             ])) {
  178.                 $this->vars['account']['admin'] = true;
  179.             }
  180.         }
  181.         // Définitions de la variable utilisateur
  182.         $this->vars['account']['user'] = $this->user;
  183.     }
  184.     /**
  185.      * Vérification de l'autorisation de connexion à l'application
  186.      */
  187.     public function checkAuthorization(Request $request$params null)
  188.     {
  189.         // Connexion autorisé par compte
  190.         if ($params != null && array_key_exists('authorization'$params) && array_key_exists('type'$params)) {
  191.             // Abscence de la clé d'authorization des authorizations
  192.             if (!is_array($this->user_authorizations) || !array_key_exists($params['authorization'], $this->user_authorizations)) {
  193.                 // TODO Supprimer cette condition pour accroite la sécurité lors de la création de groupe
  194.                 // Vérification absente - Accès authorisé
  195.                 return false;
  196.             }
  197.             // On récupère la clé d'authorization à vérifier
  198.             $groups $this->user_authorizations[$params['authorization']];
  199.             // Vérification des authorization pour cette clé
  200.             foreach ($groups as $group) {
  201.                 if (($params['type'] == AuthorizationType::VIEW && $group->getEnableView()) ||
  202.                     ($params['type'] == AuthorizationType::EDIT && $group->getEnableEdit()) ||
  203.                     ($params['type'] == AuthorizationType::NEW && $group->getEnableAdd()) ||
  204.                     ($params['type'] == AuthorizationType::FORM && ($group->getEnableAdd() || $group->getEnableEdit())) ||
  205.                     ($params['type'] == AuthorizationType::REMOVE && $group->getEnableDelete())) {
  206.                     // Vérification réussie - Accès authorisé
  207.                     return true;
  208.                 }
  209.             }
  210.         }
  211.         // Accès refusé
  212.         return false;
  213.     }
  214.     /**
  215.      * Redirige vers le controller adéquate
  216.      */
  217.     public function findRoute(Request $request)
  218.     {
  219.         $this->vars['redirection']['isRedirection'] = false;
  220.         // Redirection s'il y a un '/' en fin d'URL et ce n'est pas la page d'accueil
  221.         if (strlen($this->vars['uri']['relative']) > && substr($this->vars['uri']['relative'], -1) == '/') {
  222.             $this->vars['redirection']['url'] = $this->vars['uri']['protocol'] . $this->vars['uri']['host'] . '/' $this->vars['languages']['locale'] . '/' rtrim($this->vars['uri']['relative'], '/');
  223.             $this->vars['redirection']['status'] = 301;
  224.             $this->vars['redirection']['isRedirection'] = true;
  225.             return false;
  226.         }
  227.         // Redirection s'il y a pas de  '/' en fin d'URL et c'est la page d'accueil avec une langue
  228.         if (count($this->vars['languages']['list']) > && strlen($this->vars['uri']['relative']) == 2) {
  229.             $this->vars['redirection']['url'] = $this->vars['uri']['protocol'] . $this->vars['uri']['host'] . '/' $this->vars['languages']['locale'] . '/';
  230.             $this->vars['redirection']['status'] = 301;
  231.             $this->vars['redirection']['isRedirection'] = true;
  232.             return false;
  233.         }
  234.         // URL de redirection depuis l'administration
  235.         $redirection $this->findRedirection();
  236.         if ($redirection['find']) {
  237.             $this->vars['redirection']['url'] = $redirection['uri'];
  238.             $this->vars['redirection']['status'] = $redirection['code'];
  239.             $this->vars['redirection']['isRedirection'] = true;
  240.             return false;
  241.         }
  242.         // Redirection s'il manque la langue dans l'URL et que plusieurs langues sont disponibles
  243.         if (count($this->vars['languages']['list']) > 1) {
  244.             if (!preg_match('#^/[a-z]{2}/#''/' $this->vars['uri']['relative'], $matches) && !preg_match('#^/[a-z]{2}$#''/' $this->vars['uri']['relative'], $matches)) {
  245.                 $this->vars['redirection']['url'] = $this->vars['uri']['protocol'] . $this->vars['uri']['host'] . '/' $this->vars['languages']['locale'] . '/' $this->vars['uri']['relative'];
  246.                 $this->vars['redirection']['status'] = 301;
  247.                 $this->vars['redirection']['isRedirection'] = true;
  248.                 return false;
  249.             }
  250.         }
  251.         // Récupération de la liste des pages
  252.         $object $this->setPages();
  253.         // Attribution de l'URL spécifique à chaque page avec la langue utilisée
  254.         $router = [];
  255.         foreach ($object['pages'] as $key => $page) {
  256.             if ($page['page'] != null) {
  257.                 $element = [
  258.                     'core_page' => $page['core_page'],
  259.                     'page' => $page['page'],
  260.                     'controller_uri' => $page['page']->translate($this->vars['languages']['locale'])->getUri(),
  261.                     'controller_module' => $object['pages_list'][$key]->getControllerModule(),
  262.                     'controller_entity' => $object['pages_list'][$key]->getControllerEntity(),
  263.                     'controller_action' => $object['pages_list'][$key]->getControllerPage(),
  264.                     'controller' => $object['pages_list'][$key]->getController(),
  265.                 ];
  266.                 $element['controller_namespace'] = $element['controller_module'] . '\Controller\\' $element['controller'];
  267.                 if ($element['controller_namespace'] == 'PageDefault') {
  268.                     $element['controller_namespace'] = 'App\Controller\\' $element['controller'];
  269.                 }
  270.                 $router[] = $element;
  271.             } else {
  272.                 throw new \Exception('La configuration de la page ' $object['pages_list'][$key]->getControllerEntity() . ' n\'a pas été générée');
  273.             }
  274.         }
  275. // dump('allo');
  276. // dump($router);
  277. // die;
  278.         // Parcours des différentes routes pour trouver une correspondance
  279.         foreach ($router as $key => $route) {
  280.             // Retourne la chaine sans les parametres '?parameter=value
  281.             $controller_uri strstr($route['controller_uri'], '?'true);
  282.             if (!$controller_uri) {
  283.                 $controller_uri $route['controller_uri'];
  284.             }
  285.             // Sauvegarde du controller à utiliser si la route match avec la langue
  286.             if (preg_match('#^\/[a-z]{2}' $controller_uri '$#''/' $this->vars['uri']['relative'])) {
  287.                 $this->vars['pages']['active'] = $route['page']; // Mémorisation de la page active
  288.                 return $route;
  289.             }
  290.             // Sauvegarde du controller à utiliser si la route match sans la langue
  291.             if (preg_match('#^' $controller_uri '$#''/' $this->vars['uri']['relative'])) {
  292.                 $this->vars['pages']['active'] = $route['page']; // Mémorisation de la page active
  293.                 return $route;
  294.             }
  295.         }
  296.         // Recherche d'une URL personnalisée
  297.         return null;
  298.     }
  299.     /**
  300.      * Recherche d'une URL de redirection depuis la table "Redirection"
  301.      */
  302.     private function findRedirection()
  303.     {
  304.         $redirection_find false;
  305.         $redirection_code = -1;
  306.         $redirection_uri '';
  307.         // Recherche d'une correspondance dans le tableau des redirections
  308.         $this->vars['uri']['redirection'] = $redirection $this->getDoctrine()->getRepository(Redirection::class)->findOneBy([
  309.             'uri_from' => '/' $this->vars['uri']['relative']
  310.         ]);
  311.         if ($redirection != null) {
  312.             // Redirection détectée
  313.             $redirection_find true;
  314.             // URL de redirection
  315.             $redirection_uri $this->vars['redirection']->getUriTo();
  316.             // Attribution du type de redirection
  317.             switch ($redirection->getType()) {
  318.                 case RedirectionType::TEMPORARY_REDIRECT:
  319.                     $redirection_code 302;
  320.                     break;
  321.                 case RedirectionType::PERMANENT_REDIRECT:
  322.                     $redirection_code 301;
  323.                     break;
  324.                 case RedirectionType::NO_REDIRECTION:
  325.                 default:
  326.                     $redirection_code 404;
  327.                     $redirection_uri $this->vars['pages']['error404']->translate($this->vars['locale']);
  328.                     break;
  329.             }
  330.         }
  331.         return [
  332.             'find' => $redirection_find,
  333.             'code' => $redirection_code,
  334.             'uri' => $redirection_uri
  335.         ];
  336.     }
  337.     /**
  338.      * Attribution de la liste des pages disponibles
  339.      */
  340.     public function setPages()
  341.     {
  342.         // On récupère la liste des pages actives accessibles
  343.         $pages_list $this->getDoctrine()->getRepository(Page::class)->findBy([
  344.             'is_enabled' => 1
  345.         ]);
  346.         // On récupère la configuration spécifique de chaque page
  347.         $pages = [];
  348.         foreach ($pages_list as $page) {
  349.             $class $page->getControllerModule() . '\Entity\\' $page->getControllerEntity();
  350.             if ($page->getControllerEntity() == 'PageDefault') {
  351.                 $class 'App\Entity\\' $page->getControllerEntity();
  352.             }
  353.             $pages[] = [
  354.                 'core_page' => $page,
  355.                 'page' => $this->getDoctrine()->getRepository($class)->find($page->getControllerId())
  356.             ];
  357.         }
  358.         // Passage des pages à la vue
  359.         foreach ($pages as $key => $page) {
  360.             $this->vars['pages']['list'][$pages_list[$key]->getControllerPage()] = $page['page'];
  361.             $this->vars['pages']['core'][$pages_list[$key]->getControllerPage()] = $page['core_page'];
  362.         }
  363.         return [
  364.             'pages_list' => $pages_list// Liste de toutes les pages actives 'Core/Pages'
  365.             'pages' => $pages // Liste de toutes les pages actives 'App/PageHome, App/PageContact, ..'
  366.         ];
  367.     }
  368.     /**
  369.      * Gestion de la configuration de la page active
  370.      */
  371.     public function setPageSettings(Request $request$page_name)
  372.     {
  373.         $page $this->vars['pages']['active'];
  374.         $general $this->vars['pages']['list']['general'];
  375.         // Liste des URL par langue
  376.         $uris = [];
  377.         foreach ($this->vars['languages']['list'] as $language) {
  378.             $uris array_merge($uris, [
  379.                 $language->getIsoCode() => '/' $language->getIsoCode() . $page->translate($language->getIsoCode())->getUri()
  380.             ]);
  381.         }
  382.         $this->vars['uri']['alternate'] = $uris;
  383.         // Paramètre spécifique à la page
  384.         $seo_title $page->getSeoTitle();
  385.         $seo_description $page->getSeoDescription();
  386.         $seo_keywords $page->getSeoKeywords();
  387.         $sn_title $page->getSnTitle();
  388.         $sn_description $page->getSnDescription();
  389.         $sn_image_twitter $page->getTwitter();
  390.         $sn_image_social_networks $page->getFacebook();
  391.         // Recoupement avec les paramètres par defaut de l'application
  392.         if ($seo_title == null$seo_title $general->getSeoTitle();
  393.         if ($seo_description == null$seo_description $general->getSeoDescription();
  394.         if ($seo_keywords == null$seo_keywords $general->getSeoKeywords();
  395.         if ($sn_title == null$sn_title $general->getSnTitle();
  396.         if ($sn_description == null$sn_description $general->getSnDescription();
  397.         if ($sn_image_twitter == null$sn_image_twitter $general->getTwitter();
  398.         if ($sn_image_social_networks == null$sn_image_social_networks $general->getFacebook();
  399.         // Restitution des paramètres à la vue
  400.         $this->vars['seo']['title'] = $seo_title;
  401.         $this->vars['seo']['description'] = $seo_description;
  402.         $this->vars['seo']['keywords'] = $seo_keywords;
  403.         $this->vars['sn']['title'] = $sn_title;
  404.         $this->vars['sn']['description'] = $sn_description;
  405.         $this->vars['sn']['image_twitter'] = $sn_image_twitter;
  406.         $this->vars['sn']['image_social_networks'] = $sn_image_social_networks;
  407.         $this->vars['website']['domain'] = $this->vars['configuration']->getDomain();
  408.         $this->vars['website']['name'] = $this->vars['configuration']->getSitename();
  409.     }
  410.     /**
  411.      *  Retourne le template adequate
  412.      */
  413.     public function generateTemplate($path$vars = [], $json false)
  414.     {
  415.         // Ajoute l'extension si elle n'existe pas
  416.         if (!strpos($path'.html.twig')) {
  417.             $path $path '.html.twig';
  418.         }
  419.         if (!$json) {
  420.             // On récupère le chemin complet du potentielle template
  421.             $file $this->getParameter('file_templates') . str_replace('@'''$path);
  422.             // Si le fichier de redéfinition n'existe pas "list" / "form" / "view" utilise le fichier par default (Ex: entity_list.html.twig)
  423.             if (!file_exists($file)) {
  424.                 $theme '@core/admin';
  425.                 if (preg_match("#(.)+_list.html.twig#"$path)) {
  426.                     $path $theme '/entity_list.html.twig';
  427.                 } else if (preg_match("#(.)+_form.html.twig#"$path)) {
  428.                     $path $theme '/entity_form.html.twig';
  429.                 } else if (preg_match("#(.)+_view.html.twig#"$path)) {
  430.                     $path $theme '/entity_view.html.twig';
  431.                 }
  432.             }
  433.             // Retourne le template généré
  434.             return $this->render($patharray_merge($this->vars$vars));
  435.         } else {
  436.             // Retourne le template pouvant être rendu en json
  437.             return $this->renderView($patharray_merge($this->vars$vars));
  438.         }
  439.     }
  440.     /**
  441.      * Page d'exception - Erreur 404 - Ressource introuvable
  442.      */
  443.     public function redirectNotFoundException($request)
  444.     {
  445.         // Définition de la page active
  446.         $this->vars['pages']['active'] = $this->vars['pages']['list']['page_default_5fc8fb6f41b02'];
  447.         // Configuration de la page
  448.         $this->setPageSettings($request'page_default_5fc8fb6f41b02');
  449.         $template $this->vars['pages']['core']['page_default_5fc8fb6f41b02']->getTemplate();
  450.         $response $this->generateTemplate('@' $template->getModule() . '/' $template->getName());
  451.         $response->setStatusCode(Response::HTTP_NOT_FOUND);
  452.         return $response;
  453.     }
  454.     /**
  455.      * Page d'exception - Erreur 403 - Accès refusé
  456.      */
  457.     public function redirectConnexionRequiredException($request)
  458.     {
  459.         // Définition de la page active
  460.         $this->vars['pages']['active'] = $this->vars['pages']['list']['page_default_5fc8fcc13ab1b'];
  461.         // Configuration de la page
  462.         $this->setPageSettings($request'page_default_5fc8fcc13ab1b');
  463.         $template $this->vars['pages']['core']['page_default_5fc8fcc13ab1b']->getTemplate();
  464.         $response $this->generateTemplate('@' $template->getModule() . '/' $template->getName());
  465.         $response->setStatusCode(Response::HTTP_FORBIDDEN);
  466.         return $response;
  467.     }
  468.     /**
  469.      * Page d'exception - Erreur quelconque
  470.      */
  471.     public function redirectUnknownException($request)
  472.     {
  473.         // Définition de la page active
  474.         $this->vars['pages']['active'] = $this->vars['pages']['list']['page_default_5fc8fda129a38'];
  475.         // Configuration de la page
  476.         $this->setPageSettings($request'page_default_5fc8fda129a38');
  477.         $template $this->vars['pages']['core']['page_default_5fc8fda129a38']->getTemplate();
  478.         $response $this->generateTemplate('@' $template->getModule() . '/' $template->getName());
  479.         $response->setStatusCode(Response::HTTP_NOT_FOUND);
  480.         return $response;
  481.     }
  482.     /**
  483.      * Permet de recupérer des morceaux de l'URL de la $request
  484.      */
  485.     public function getCurrentPageSlug($request$position 1)
  486.     {
  487.         // Récupération du slug
  488.         $slug trim($request->getRequestUri(), '/');
  489.         if (preg_match('#^(.){2}/(.)+$#'$slug$matches)) {
  490.             $slug substr($slug3);
  491.         }
  492.         $slug explode('/'$slug)[$position];
  493.         $result strstr($slug'?'true);
  494.         if ($result != false) {
  495.             $slug $result;
  496.         }
  497.         return $slug;
  498.     }
  499.     /**
  500.      * Retourne null ou un object de la $class ayant pour URL le $slug
  501.      */
  502.     public function getEntityBySlug($slug$class)
  503.     {
  504.         preg_match('/^([0-9]+)-(.)+/'$slug$matchesPREG_OFFSET_CAPTURE);
  505.         if (count($matches) < 1) {
  506.             return null;
  507.         }
  508.         $object $this->getDoctrine()->getRepository($class)->find($matches[1][0]);
  509.         if ($object == null) {
  510.             return null;
  511.         }
  512.         if ($object->getSlug() != '/' $slug) {
  513.             return null;
  514.         }
  515.         return $object;
  516.     }
  517.     public function getEntitiesRandom($class$limit 8)
  518.     {
  519.         $items $this->getDoctrine()->getRepository($class)
  520.             ->findEntityActive();
  521.         shuffle($items);
  522.         $results = [];
  523.         for ($i 0$i $limit$i++) {
  524.             if(array_key_exists($i$items)) {
  525.                 $results[] = $this->getDoctrine()->getRepository($class)
  526.                     ->find($items[$i]['id']);
  527.             }
  528.         }
  529.         if ($class == Product::class) {
  530.             $list = [];
  531.             foreach ($results as $object) {
  532.                 $item = new \Shopping\Service\Product\Product($this->getDoctrine(), $this->vars['account']['user']);
  533.                 $item->createProduct($object->getId());
  534.                 $list[] = $item;
  535.             }
  536.             $results $list;
  537.         }
  538.         return $results;
  539.     }
  540.     public function getEntitiesPerPagination($class$pagination 1$filters = [], $productPaginationNumber 50$useProductService true$constraintes = [])
  541.     {
  542.         $results = [];
  543.         // Recherche des produits de la catégorie trouvée
  544.         $results['pagination']['product_per_page'] = $productPaginationNumber;
  545.         $results['pagination']['current_page'] = $pagination;
  546.         $reflection = new $class();
  547.         $reflects = (new ReflectionClass($reflection))->getProperties();
  548.         $properties = [];
  549.         foreach ($reflects as $item){
  550.             $properties[] = (string)$item->getName();
  551.         }
  552.         $results['list'] = $this->getDoctrine()->getRepository($class)
  553.             ->findEntityPerPagination($pagination$productPaginationNumber$filters$constraintes$properties);
  554.         $results['count'] = $this->getDoctrine()->getRepository($class)
  555.             ->countEntityPerPagination($constraintes$properties);
  556.         $results['pagination']['count'] = ceil($results['count'] / $productPaginationNumber);
  557.         $start $pagination $productPaginationNumber $productPaginationNumber;
  558.         if ($start <= 0) {
  559.             $start 0;
  560.         }
  561.         $end $start $productPaginationNumber;
  562.         if ($end $results['count']) {
  563.             $end $results['count'];
  564.         }
  565.         $results['pagination']['start'] = $start 1;
  566.         $results['pagination']['end'] = $end;
  567.         $results['pagination']['total'] = $results['count'];
  568.         if ($class == Product::class && $useProductService) {
  569.             $list = [];
  570.             foreach ($results['list'] as $object) {
  571.                 $item = new \Shopping\Service\Product\Product($this->getDoctrine(), $this->vars['account']['user']);
  572.                 $item->createProduct($object->getId());
  573.                 $list[] = $item;
  574.             }
  575.             $results['list'] = $list;
  576.         }
  577.         return $results;
  578.     }
  579.     public function getProductsListPagination($categories_list$pagination$filters$products_per_pagination$contraintes)
  580.     {
  581.         $results = [];
  582.         $products $this->getDoctrine()->getRepository(Product::class)->findProductsChildrenPerPagination($filters, [
  583.             'is_enabled' => true,
  584.             'categories' => $categories_list,
  585.         ]);
  586.         foreach ($products as $product) {
  587.             if (!in_array($product->getParent()->getId(), $results)) {
  588.                 $results[] = $product->getParent()->getId();
  589.             }
  590.         }
  591.         $products $this->getDoctrine()->getRepository(Product::class)->findProductsParentPerPagination($filters, [
  592.             'is_enabled' => true,
  593.             'categories' => $categories_list,
  594.         ]);
  595.         foreach ($products as $product) {
  596.             if (!in_array($product->getId(), $results)) {
  597.                 $results[] = $product->getId();
  598.             }
  599.         }
  600.         $start $pagination $products_per_pagination $products_per_pagination;
  601.         $end $pagination $products_per_pagination;
  602.         $product_per_page $products_per_pagination;
  603.         $current_page $pagination;
  604.         if (count($results) > 0) {
  605.             $count ceil(count($results) / $products_per_pagination);
  606.         } else {
  607.             $count 1;
  608.         }
  609.         if ($end $count $products_per_pagination) {
  610.             $end $count;
  611.         }
  612.         $list = [];
  613.         foreach ($results as $key => $object) {
  614.             if ($start <= $key && $key $end) {
  615.                 $product $this->getDoctrine()->getRepository(Product::class)->find($object);
  616.                 $item = new \Shopping\Service\Product\Product($this->getDoctrine(), $this->vars['account']['user']);
  617.                 $item->createProduct($product->getId());
  618.                 $list[] = $item;
  619.             }
  620.         }
  621.         $results['list'] = $list;
  622.         $results['pagination']['current_page'] = $current_page;
  623.         $results['pagination']['product_per_page'] = $product_per_page;
  624.         $results['pagination']['start'] = $start;
  625.         $results['pagination']['end'] = $end;
  626.         $results['pagination']['count'] = $count;
  627.         $results['pagination']['total'] = count($results);
  628.         $this->vars['products'] = $results;
  629.         return $results;
  630.     }
  631. }