src/Controller/CritiquesController.php line 645

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\aside\asidesUrlPagination;
  4. use App\ClassTheatre\asides;
  5. use App\ClassTheatre\TheatreController;
  6. use App\Service\Abonnements\Abonnements;
  7. use App\Service\Date_time;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use TheatreCore\Entity\Aides;
  14. use TheatreCore\Entity\Classifications;
  15. use TheatreCore\Entity\Contents;
  16. use TheatreCore\Entity\Podcasts;
  17. use TheatreCore\Entity\Spectacles;
  18. use TheatreCore\Entity\SpectacleAide;
  19. use TheatreCore\Entity\Typesstructures;
  20. class CritiquesController extends TheatreController
  21. {
  22.     // id de la table
  23.     protected $idcontent null;
  24.     // nom de l'objet
  25.     protected $contents;
  26.     // paramètres
  27.     protected $params;
  28.     // infos sur la critique
  29.     public $data_object null;
  30.     // pagination
  31.     protected $paged_data = array();
  32.     //aside
  33.     protected $asides;
  34.     // {{{ _construct()
  35.     /** constructeur hérité
  36.      *
  37.      */
  38.     public function __construct(EntityManagerInterface $emTranslatorInterface $translatorTokenStorageInterface $tokenStorageAbonnements $abonnements)
  39.     {
  40.         $GLOBALS['rub_courante'] = 'critiques';
  41.         $this->em $em;
  42.         // hérite du constructeur parent
  43.         parent::__construct($translator$tokenStorage);
  44.         $this->serviceAbonnements $abonnements;
  45.     }
  46.     private function InitController($idcontent null$action null)
  47.     {
  48.         // id de l'objet
  49.         $this->idcontent $idcontent;
  50.         $this->context['action'] = $this->view->action $action;
  51.         // objet contents
  52.         $this->contents $this->em->getRepository(Contents::class);
  53.         $this->asides = new asides();
  54.     }
  55.     // {{{ finalizeAction()
  56.     /** Code exécuté après chaque action
  57.      *
  58.      *
  59.      * @access protected
  60.      * @return void
  61.      */
  62.     protected function finalizeAction()
  63.     {
  64.         $this->context['view']->nombre_total_critiques $this->contents->countContents(['idclassifications' => 101]);
  65.         $this->context['view']->meta_description 'Listes des critiques des prochainses mies-en-scènes de la création scénique dans les pays francophones et en langue française dans le monde. Le site propose l’actualité en régions, des contenus pédagogiques, des vidéos, des critiques...';
  66.         if(!empty($this->asides)){
  67.             $this->context['view']->aside $this->asides->view($this->context['view']);
  68.         }
  69.         $menu_contents = array(
  70.             'actualites' => array(
  71.                 'name' => 'actualités',
  72.                 'key_url' => 'actualites',
  73.             ),
  74.             'spectacles' => array(
  75.                 'name' => 'en scène',
  76.                 'key_url' => 'spectacles',
  77.             ),
  78.             'recommandations' => array(
  79.                 'name' => 'Recommandations',
  80.                 'key_url' => 'recommandations'
  81.             ),
  82.             'critique' => array(
  83.                 'name' => 'Dernières parutions',
  84.                 'key_url' => '',
  85.                 'key_url_2' => 'view',
  86.             ),
  87.             'audios' => array(
  88.                 'name' => 'audio',
  89.                 'key_url' => 'audios',
  90.             )
  91.         );
  92.         $asides_top = new asides();
  93.         if (!empty($this->context['view']->area_active) && $this->context['view']->area_active) {
  94.             $asides_top->load(['aside_top' => array(
  95.                 'php' => array(
  96.                     'method' => 'asidesUrlRegions',
  97.                 )
  98.             )
  99.             ]);
  100.         } else if (isset($this->context['view']->idtypestructure)) {
  101.             $asides_top->load(['aside_top' => array(
  102.                 'php' => array(
  103.                     'method' => 'asidesUrlListsMenuCDN'
  104.                 )
  105.             )
  106.             ]);
  107.         } else {
  108.             $asides_top->load(['aside_top' => array(
  109.                 'php' => array(
  110.                     'method' => 'asidesUrlLists',
  111.                     'url' => '/critiques/key_url',
  112.                     'urls' => $menu_contents,
  113.                     'params' => [
  114.                         'activate' => $this->context['action']
  115.                     ]
  116.                 ),
  117.             )]);
  118.         }
  119.         $this->context['view']->aside_top $asides_top->view($this->context['view']);
  120.     }
  121.     // }}}
  122.     // {{{ audiosactualites()
  123.     /** Actualité des critiques
  124.      *
  125.      * @Route("/critiques/actualites", name="critiques_actualites")
  126.      *
  127.      */
  128.     public function action_actualites()
  129.     {
  130.         $this->InitController(null'actualites');
  131.         //Les deux dernières critiques
  132.         $this->getListCritiques(array(), ['vignette_large_format' => true'perPage' => 2]);
  133.         $params_sql = array(
  134.             'params' => array(
  135.                 'limit' => [0,8],
  136.             ),
  137.             'special' => array(
  138.                 'prochains' => true,
  139.                 'idclassification' => 101,
  140.                 'publish_valid' => true,
  141.             ),
  142.             'dbg' => array('scenes','Les spectacles à l\'affiche avec une critique'),
  143.         );
  144.         $vignettes_spectacles = ['vignette' => array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop')];
  145.         $display_spectacles =  ['allauthors' => true];
  146.         $spectacles $this->em->getRepository(Spectacles::class);
  147.         //Les prochains spectacles à l'affiche
  148.         $spectacles_datas $spectacles->getListSpectacles$params_sql$vignettes_spectaclesfalse$display_spectacles );
  149.         foreach($spectacles_datas AS $k=>$v) {
  150.             $spectacles_datas[$k]['footer_critique'] = true;
  151.             $spectacles_datas[$k]['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$v['idspectacle'],'class_critique',array('publish_valid' => 1));
  152.             $spectacles_datas[$k]['url_clean_more'] = 'critiques/';
  153.         }
  154.         $this->context['view']->list_spectacles $spectacles_datas;
  155.         //Les prochains spectacles par émission
  156.         $params_sql['special']['podcasts']['emission'] = ['la-dispute''le-masque-et-la-plume'];
  157.         $display_spectacles['carrer_couleurs'] = true;
  158.         $list_spectacles_emissions $spectacles->getListSpectacles$params_sql$vignettes_spectaclesfalse$display_spectacles );
  159.         foreach($list_spectacles_emissions as $key=>$val) {
  160.             $list_spectacles_emissions[$key]['footer_contact'] = true;
  161.         }
  162.         $this->context['view']->list_spectacles_emissions $list_spectacles_emissions;
  163.         //Les derniers podcasts
  164.         $franceculture_params = array(
  165.             'limit' => array(03),
  166.             'special' => array(
  167.                 'emission' => ['la-dispute''le-masque-et-la-plume']
  168.             ),
  169.             'dbg' => array('derniers_franceculture''Les trois derniers podcasts france radio référencés'),
  170.         );
  171.         $display['display']['vignette'] = array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT']);
  172.         $this->context['view']->spectacles_prochains $this->em->getRepository(Spectacles::class)->getListSpectacles($params_sql$displaynull, array('allauthors' => true'carrer_couleurs' => true));
  173.         $podcasts $this->em->getRepository(Podcasts::class);
  174.         $api_derniers_franceculture $podcasts->getListPodcasts($franceculture_params);
  175.         foreach ($api_derniers_franceculture AS $k => $v) {
  176.             $currentDate $v['datePodcast']->format('Y-m-d');
  177.             if(empty($derniers_franceculture[$currentDate])) {
  178.                 $derniers_franceculture[$currentDate]['date'] = $podcasts->getFormeDate($v['datePodcast'], '%a %d %B %Y'true); //%a %d/%m/%Y
  179.             }
  180.             $derniers_franceculture[$currentDate]['datas'][] = $v;
  181.         }
  182.         $this->context['view']->podcasts_par_date $derniers_franceculture;
  183.         $this->asides->load('common_carte');
  184.         asides::setEntityManager($this->em);
  185.         asides::loadaside('Publicite')->addWithNational($this->asides); //$this->area
  186. //        $this->asides->load('videos_nb_vid');
  187.         $this->asides->load('common_facebook');
  188.         $this->asides->load('common_twitter');
  189.         $this->asides->load('common_participer_contacts');
  190.         $this->asides->load('common_culturebox');
  191.         // situation et titre meta
  192.         $this->view->title_page 'L\'Actualité des critiques';
  193.         $this->view->locate = array(
  194.             '/critiques/' => 'Espace critique',
  195.             => 'Actualités',
  196.         );
  197.         //On affiche la publicité google
  198.         $asides_publicite = new asides();
  199.         asides::setEntityManager($this->em);
  200.         asides::loadaside('Publicite')->addGoogle($asides_publicite$this->serviceAbonnements);
  201.         $this->context['view']->asides_publicite $asides_publicite->view($this->context['view']);
  202.         return $this->view('critiques/actualites.html.twig');
  203.     }
  204.     // }}}
  205.     // {{{ action_audios()
  206.     /** Critiques en audio
  207.      *
  208.      * @Route("/critiques/audios", name="critiques_audios")
  209.      * @Route("/critiques/audios/emission/{emission}", name="critiques_audios_emission")
  210.      *
  211.      */
  212.     public function action_audios($emission null)
  213.     {
  214.         $this->InitController(null'audios');
  215.         $this->context['params']['emission'] = $emission;
  216.         $emissions = [ 'la-dispute','le-masque-et-la-plume' ];
  217.         $podcasts $this->em->getRepository(Podcasts::class);
  218.         $culturebox_params = array(
  219.             'direction' => 'DESC',
  220.             'special' => array(
  221.                 'emission' => $emissions
  222.             ),
  223.             'dbg' => array('derniers_culturebox_current''Les replay France Culture référencés'),
  224.         );
  225.         //On récupère les podcasts une émission spécifique
  226.         if(!empty($emission) && in_array($emission$emissions)){
  227.             $culturebox_params['special']['emission'] = [$emission];
  228.         }
  229.         //On récupère toutes les émissions sans distinctions (d'après le contenu de la variable $emissionS)
  230.         else{
  231.             $culturebox_params['special']['emission'] = $emissions;
  232.         }
  233.         $this->perPage 20;
  234.         //Nombre total de podcasts
  235.         $total_podcasts $podcasts->countListPodcasts($culturebox_params);
  236.         $this->context['view']->pagination $this->getPagination($total_podcasts);
  237.         $this->context['view']->pagination['totalItems'] = $total_podcasts;
  238.         $this->context['view']->pagination['custom'] = true;
  239.         $this->context['view']->pagination['custom_name'] = "podcasts";
  240.         $culturebox_params['limit'] = array($this->getLimitStart(), $this->perPage);
  241.         //données renvoyées à la vue
  242.         $this->context['view']->list_captations $podcasts->getListPodcasts($culturebox_params);
  243.         $this->asides->load(['url_lists_alone,listes_emissions' => array(
  244.             'php' => array(
  245.                 'method' => 'asidesUrlLists',
  246.                 'urls' => [
  247.                     [
  248.                         'name' => 'Toutes les émissions',
  249.                         'key_emission' => false,
  250.                         'key_emission_2' => 'toutes'
  251.                     ],
  252.                     [
  253.                         'name' => 'La Dispute',
  254.                         'key_emission' => 'la-dispute'
  255.                     ],
  256.                     [
  257.                         'name' => 'Le Masque et la plume',
  258.                         'key_emission' => 'le-masque-et-la-plume'
  259.                     ]
  260.                 ],
  261.                 'url' => '/critiques/audios/generate_params',
  262.                 'params' => array(
  263.                     'activate' => ($emission) ? $emission 'toutes'
  264.                 ),
  265.                 'structure' => array(
  266.                     'emission' => 'key_emission'
  267.                 )
  268.             ),
  269.             'title' => 'émissions critiques'
  270.         )]);
  271.         $this->asides->load([
  272.             'contact_franceculture_menu,autres' => [
  273.                 'php' => [
  274.                     'method' => 'asidesPodcasts',
  275.                     'params' => [
  276.                         'station' => 'soundcloud',
  277.                         'em' => $this->em
  278.                     ]
  279.                 ]
  280.             ]
  281.         ]);
  282.         $this->asides->load([
  283.             'contact_franceculture_menu,franceculture' => [
  284.                 'php' => [
  285.                     'method' => 'asidesPodcasts',
  286.                     'params' => [
  287.                         'station' => 'franceculture',
  288.                         'em' => $this->em
  289.                     ]
  290.                 ]
  291.             ]
  292.         ]);
  293.         $this->asides->load([
  294.             'contact_franceculture_menu,franceinter' => [
  295.                 'php' => [
  296.                     'method' => 'asidesPodcasts',
  297.                     'params' => [
  298.                         'station' => 'franceinter',
  299.                         'em' => $this->em
  300.                     ]
  301.                 ]
  302.             ]
  303.         ]);
  304.         $this->asides->load('common_carte');
  305.         // situation et titre meta
  306.         $this->view->title_page 'Les spectacles à l\'affiche avec une critique';
  307.         $this->view->locate = array(
  308.             '/critiques/' => 'Espace critique',
  309.             => 'Spectacles à l\'affiche',
  310.         );
  311.         return $this->view('critiques/audios.html.twig');
  312.     }
  313.     // }}}
  314.     // {{{ action_view()
  315.     /** Dernières parutions
  316.      *
  317.      * @Route("/critiques/", name="critiques_accueil")
  318.      *
  319.      */
  320.     public function action_view()
  321.     {
  322.         $this->InitController(null'view');
  323.         $this->getListCritiques(array(), ['vignette_large_format' => true]);
  324.         $this->getAsidesDernieresParutions();
  325.         $this->view->title_page 'Toutes les critiques des spectacles de théâtre actuellement à l\'affiche';
  326.         $this->view->locate = array(=> 'Espace critique');
  327.         return $this->view('critiques/view.html.twig');
  328.     }
  329.     // }}}
  330.     // {{{ action_spectacles()
  331.     /** Spectacles à l'affiche
  332.      *
  333.      * @Route("/critiques/spectacles", name="critiques_spectacles")
  334.      * @Route("/critiques/spectacles/type/{type}", name="critiques_spectacles_type")
  335.      * @Route("/critiques/spectacles/area/{area}", name="critiques_spectacles_area")
  336.      * @Route("/critiques/spectacles/type/{type}/area/{area}", name="critiques_spectacles_type_area")
  337.      *
  338.      */
  339.     public function action_spectacles(Request $request$type null$area null)
  340.     {
  341.         $this->context['params']['type'] = $type;
  342.         $this->context['params']['area'] = $area;
  343.         $this->InitController(null'spectacles');
  344.         $choix_type = array('SN','TN','CDN','SC');
  345.         // les types de structure
  346.         $typesstructure_list $this->em->getRepository(Typesstructures::class)->getTypeStructureList(true,true,$choix_type);
  347.         // type de structure recherchée
  348.         if(!empty($_REQUEST['idtypestructure']) && array_key_exists($_REQUEST['idtypestructure'], $typesstructure_list)) {
  349.             $this->context['view']->idtypestructure filter_var($_REQUEST['idtypestructure'], FILTER_SANITIZE_STRING);
  350.             foreach(array('typestructure','typestructure_pluriel') as $s) {
  351.                 $typesstructure_list_simple[$s] = strtolower($typesstructure_list[$this->context['view']->idtypestructure][$s]);
  352.             }
  353.             $typesstructure_list_simple['idtypestructure'] = $this->context['view']->idtypestructure;
  354.             $this->context['view']->typestructure $typesstructure_list_simple;
  355.         }
  356.         // saison courante
  357.         $this->context['view']->current_saison Date_time::getLastSaison();
  358.         $this->context['view']->menu_jours = array(
  359.             => array('name' => '3 prochains jours','key_day' => 3),
  360.             => array('name' => '7 prochains jours','key_day' => 7),
  361.             30 => array('name' => '30 prochains jours','key_day' => 30),
  362. //            90 => array('name' => '3 prochains mois','key_day' => 90),
  363. //            365 => array('name' => '12 prochains mois','key_day' => 365),
  364.             //'saison' => array('name' => 'au cours de la saison '.$this->context['view']->current_saison),
  365.         );
  366.         // une saison ?
  367.         $this->context['view']->saison Date_time::getSaisonParam();
  368.         // une période ?
  369.         $this->context['view']->datestart Date_time::getDateParam('datestart');
  370.         $this->context['view']->dateend Date_time::getDateParam('dateend');
  371.         if(!Date_time::checkDateFormat($this->context['view']->datestart)) {
  372.             $this->context['view']->datestart null;
  373.         } else {
  374.             $this->context['view']->datestart_string $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->datestart,'d/m/y');
  375.         }
  376.         if(!Date_time::checkDateFormat($this->context['view']->dateend)) {
  377.             $this->context['view']->dateend null;
  378.         } else {
  379.             $this->context['view']->dateend_string $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->dateend,'d/m/y');
  380.         }
  381.         // un nombre de jours ?
  382.         $this->context['view']->days Date_time::getDaysParam($this->context['view']->menu_jours30);
  383.         $this->context['view']->days_name $this->context['view']->menu_jours[$this->context['view']->days]['name'];
  384.         // une année ?
  385.         $this->context['view']->year Date_time::getYearParam();
  386.         if(!$this->context['view']->saison && !$this->context['view']->year && !$this->context['view']->days && !$this->context['view']->datestart && !$this->context['view']->dateend) {
  387.             if(!empty($this->context['params']['area']) && $this->context['params']['area']!=11) {
  388.                 $this->context['view']->days 30;
  389.             } else {
  390.                 $this->context['view']->days 30;
  391.             }
  392.         }
  393.         $type 'tous';
  394.         if(!empty($this->context['params']['type']) && in_array($this->context['params']['type'], ['emissions'])) {
  395.             $type $this->context['params']['type'];
  396.         }
  397.         $this->context['view']->type $type;
  398.         $this->context['view']->{'type_'.$type} = true;
  399.         $spectacles $this->em->getRepository(Spectacles::class);
  400.         $total_count_sql $params_sql = array(
  401.             'params' => array(
  402.                 'limit' => 'all',
  403.             ),
  404.             'special' => array(
  405.                 'prochains' => true,
  406.                 'idclassification' => 101,
  407.                 'publish_valid' => true,
  408.             ),
  409.             'dbg' => array('scenes','Les spectacles à l\'affiche avec une critique'),
  410.         );
  411.         if($type == 'emissions') {
  412.             $params_sql['special']['podcasts'] = [
  413.                 'emission' => ['la-dispute''le-masque-et-la-plume'],
  414.                 'publish' => 1
  415.             ];
  416.         }
  417.         // recherche par saison
  418.         if(!empty($this->context['view']->saison)) {
  419.             $params_sql['special']['saison'] = $this->context['view']->saison;
  420.             $this->context['view']->days null;
  421.         } elseif(!empty($this->context['view']->year)) { // recherche par année
  422.             $params_sql['special']['year'] = $this->context['view']->year;
  423.             $this->context['view']->days null;
  424.         } elseif(!empty($this->context['view']->datestart) && !empty($this->context['view']->dateend)) { // par période
  425.             $params_sql['special']['period'] = array(
  426.                 'start' => $this->context['view']->datestart,
  427.                 'end' => $this->context['view']->dateend,
  428.             );
  429.             $this->context['view']->days null;
  430.         } else { // prochains jours
  431.             $params_sql['special']['prochains'] = $this->context['view']->days;
  432.         }
  433.         if(!empty($this->context['view']->idtypestructure)){
  434.             $params_sql['special']['idtypestructure'] = $this->context['view']->idtypestructure;
  435.             $params_sql['special']['structures_specifiques'] = $this->context['view']->idtypestructure;
  436.         }
  437.         $this->context['view']->area_active false;
  438.         $this->context['view']->area null;
  439.         $this->context['view']->area_view '';
  440.         // une région en particulier ?
  441.         if(!empty($this->context['params']['area']) &&
  442.             ($spectacles->my_is_int($this->context['params']['area']) || strlen($this->context['params']['area'])==2)) {
  443.             $this->context['view']->area_active true;
  444.             $this->context['view']->area $area $this->context['params']['area'];
  445.             $this->context['view']->area_view 'area/'.$area.'/';
  446.             $params_sql['special']['area'] = $area// recherche dans la région
  447.             $params_sql['special']['carte_version'] = 'Bigregions';
  448.             if($spectacles->my_is_int($area)) {
  449.                 $this->context['view']->region_name $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getRegionName($area); // nom de la région
  450.             } else {
  451.                 $this->context['view']->country_name $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getNameCountry($area); // nom de la région
  452.             }
  453.             // définir la zone de recherche
  454.             $area_sql $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getZipCode($area);
  455.             $spectacles->setZoneRecherche($area_sql); // définir la zone de recherche
  456.         }
  457.         $totalItems $spectacles->countListSpectacles($params_sql);
  458.         $this->perPage 20;
  459.         // pagination
  460.         $this->context['view']->pagination $this->getPagination($totalItems);
  461.         $urlpagination = new asidesUrlPagination(
  462.             '/critiques/spectacles/generate_params',
  463.             array(
  464.                 'area' => (isset($area)) ? $area 'all',
  465.                 'day' => $this->context['view']->days,
  466.                 'datestart' => $this->context['view']->datestart,
  467.                 'dateend' => $this->context['view']->dateend
  468.             ),
  469.             $this->context
  470.         );
  471.         $this->view->pagination['spectacle'] = true;
  472.         $this->view->pagination['url_custom'] = $urlpagination->url_pagination();
  473.         $params_sql['params']['limit'] = 'all'//array($this->getLimitStart(),$this->perPage);
  474.         $spectacles_datas $spectacles->getListSpectacles(
  475.             $params_sql,
  476.             array(
  477.                 'vignette' => array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop')
  478.             ),
  479.             false,
  480.             array(
  481.                 'allauthors' => true,
  482.                 'carrer_couleurs' => true
  483.             )
  484.         );
  485.         // Tri par nombre de critiques
  486.         $this->context['view']->orderBy 'date';
  487.         if ($request->query->get('order') === 'critiques') {
  488.             $this->context['view']->orderBy 'critiques';
  489.             array_multisort(array_map(function ($elem) {
  490.                 return $elem['carrer']['critiques'];
  491.             }, $spectacles_datas), SORT_DESC$spectacles_datas);
  492.         }
  493.         if ($request->query->get('order') === 'nbRecommandations') {
  494.             return $this->redirect("/critiques/recommandations/type/tous/area/" $area "?d=30&order=nbRecommandations");
  495.         }
  496.         $nb_total_critiques 0;
  497.         foreach($spectacles_datas AS $k=>$v) {
  498.             $spectacles_datas[$k]['footer_critique'] = true;
  499.             $nb_total_critiques += $spectacles_datas[$k]['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$v['idspectacle'],'class_critique',array('publish_valid' => 1));
  500.             if(!empty($this->context['params']['type']) && $this->context['params']['type'] == 'emissions'){
  501.                 $spectacles_datas[$k]['url_clean_more'] = 'podcasts/';
  502.             }
  503.             // add dots on spectacles for recommandations
  504.             $spectacles_datas[$k]['nbRecommandations'] = $spectacles->countSpectacleRecommandations($spectacles_datas[$k]['idspectacle']);
  505.             $spectacles_datas[$k] = $spectacles->clearSpectaclesAddAllPersons($spectacles_datas[$k]);
  506.         }
  507.         $this->context['view']->spectacles $spectacles_datas;
  508.         if($type != 'emissions') {
  509.             $this->view->pagination['totalItems'] = $totalItems;
  510.             $this->view->pagination['critique_spectacle'] = true;
  511.             $params_sql['special']['count_only'] = true;
  512.             $params_sql['special']['count_only_distinct'] = 'oc2.idcontent';
  513.             $params_sql['params']['limit'] = 'all';
  514.             $countQuery $spectacles->getSQLSpectacles($params_sql['params'], $params_sql['special']);
  515.             $this->context['view']->pagination['nb_total'] = $countQuery->getSingleResult(\Doctrine\ORM\Query::HYDRATE_SCALAR)['total'];
  516.         }
  517.         $this->getCommonSearch();
  518.         $this->getCommonSearchView();
  519.         //Total
  520.         $this->context['view']->nb_spectacles_total $spectacles->countListSpectacles($total_count_sql);
  521.         //Total par émission
  522.         $total_count_sql['special']['podcasts'] = [
  523.             'emission' => ['la-dispute''le-masque-et-la-plume'],
  524.             'publish' => 1
  525.         ];
  526.         $this->context['view']->nb_spectacles_emissions $spectacles->countListSpectacles($total_count_sql);
  527.         $this->getAsidesSpectacles($area$type);
  528.         // La légende des carrer_couleurs
  529.         $this->asides->load(['common_carrer_informations'=> array(
  530.             'color' => 'critiques'
  531.         )]);
  532.         // situation et titre meta
  533.         $this->view->title_page 'Les spectacles à l\'affiche avec une critique';
  534.         $this->view->locate = array(
  535.             '/critiques/' => 'Espace critique',
  536.             => 'Spectacles à l\'affiche',
  537.         );
  538.         return $this->view('critiques/spectacles.html.twig');
  539.     }
  540.     // }}}
  541.     // {{{ action_recommandations()
  542.     /** Spectacles recommandés
  543.      *
  544.      * @Route("/critiques/recommandations", name="critiques_recommandations")
  545.      * @Route("/critiques/recommandations/type/{type}", name="critiques_recommandations_type")
  546.      * @Route("/critiques/recommandations/area/{area}", name="critiques_recommandations_area")
  547.      * @Route("/critiques/recommandations/type/{type}/area/{area}", name="critiques_recommandations_type_area")
  548.      *
  549.      */
  550.     public function action_recommandations(Request $request$type null$area null)
  551.     {
  552.         $this->context['params']['type'] = $type;
  553.         $this->context['params']['area'] = $area;
  554.         $this->InitController(null'recommandations');
  555.         $choix_type = array('SN','TN','CDN','SC');
  556.         // les types de structure
  557.         $typesstructure_list $this->em->getRepository(Typesstructures::class)->getTypeStructureList(true,true,$choix_type);
  558.         // type de structure recherchée
  559.         if(!empty($_REQUEST['idtypestructure']) && array_key_exists($_REQUEST['idtypestructure'], $typesstructure_list)) {
  560.             $this->context['view']->idtypestructure filter_var($_REQUEST['idtypestructure'], FILTER_SANITIZE_STRING);
  561.             foreach(array('typestructure','typestructure_pluriel') as $s) {
  562.                 $typesstructure_list_simple[$s] = strtolower($typesstructure_list[$this->context['view']->idtypestructure][$s]);
  563.             }
  564.             $typesstructure_list_simple['idtypestructure'] = $this->context['view']->idtypestructure;
  565.             $this->context['view']->typestructure $typesstructure_list_simple;
  566.         }
  567.         // saison courante
  568.         $this->context['view']->current_saison Date_time::getLastSaison();
  569.         $this->context['view']->menu_jours = array(
  570.             => array('name' => '3 prochains jours','key_day' => 3),
  571.             => array('name' => '7 prochains jours','key_day' => 7),
  572.             30 => array('name' => '30 prochains jours','key_day' => 30),
  573.         );
  574.         // une saison ?
  575.         $this->context['view']->saison Date_time::getSaisonParam();
  576.         // une période ?
  577.         $this->context['view']->datestart Date_time::getDateParam('datestart');
  578.         $this->context['view']->dateend Date_time::getDateParam('dateend');
  579.         if(!Date_time::checkDateFormat($this->context['view']->datestart)) {
  580.             $this->context['view']->datestart null;
  581.         } else {
  582.             $this->context['view']->datestart_string $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->datestart,'d/m/y');
  583.         }
  584.         if(!Date_time::checkDateFormat($this->context['view']->dateend)) {
  585.             $this->context['view']->dateend null;
  586.         } else {
  587.             $this->context['view']->dateend_string $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->dateend,'d/m/y');
  588.         }
  589.         // un nombre de jours ?
  590.         $this->context['view']->days Date_time::getDaysParam($this->context['view']->menu_jours30);
  591.         $this->context['view']->days_name $this->context['view']->menu_jours[$this->context['view']->days]['name'];
  592.         $params_sql['special']['prochains'] = $this->context['view']->days;
  593.         // une année ?
  594.         $this->context['view']->year Date_time::getYearParam();
  595.         if(!$this->context['view']->saison && !$this->context['view']->year && !$this->context['view']->days && !$this->context['view']->datestart && !$this->context['view']->dateend) {
  596.             if(!empty($this->context['params']['area']) && $this->context['params']['area']!=11) {
  597.                 $this->context['view']->days 30;
  598.             } else {
  599.                 $this->context['view']->days 30;
  600.             }
  601.         }
  602.         $type 'tous';
  603.         if(!empty($this->context['params']['type']) && in_array($this->context['params']['type'], ['emissions'])) {
  604.             $type $this->context['params']['type'];
  605.         }
  606.         $this->context['view']->type $type;
  607.         $this->context['view']->{'type_'.$type} = true;
  608.         $spectacleRepo $this->em->getRepository(Spectacles::class);
  609.         $params_sql = array(
  610.             'params' => array(
  611.                 'limit' => 'all',
  612.             ),
  613.             'special' => array(
  614.                 'prochains' => true,
  615.                 'recommandations' => true,
  616.                 'publish_valid' => true,
  617.             )
  618.         );
  619.         if($type == 'emissions') {
  620.             $params_sql['special']['podcasts'] = [
  621.                 'emission' => ['la-dispute''le-masque-et-la-plume'],
  622.                 'publish' => 1
  623.             ];
  624.         }
  625.         // recherche par saison
  626.         if(!empty($this->context['view']->saison)) {
  627.             $params_sql['special']['saison'] = $this->context['view']->saison;
  628.             $this->context['view']->days null;
  629.         } elseif(!empty($this->context['view']->year)) { // recherche par année
  630.             $params_sql['special']['year'] = $this->context['view']->year;
  631.             $this->context['view']->days null;
  632.         } elseif(!empty($this->context['view']->datestart) && !empty($this->context['view']->dateend)) { // par période
  633.             $params_sql['special']['period'] = array(
  634.                 'start' => $this->context['view']->datestart,
  635.                 'end' => $this->context['view']->dateend,
  636.             );
  637.             $this->context['view']->days null;
  638.         } else { // prochains jours
  639.         $params_sql['special']['prochains'] = $this->context['view']->days;
  640.         }
  641.         if(!empty($this->context['view']->idtypestructure)){
  642.             $params_sql['special']['idtypestructure'] = $this->context['view']->idtypestructure;
  643.             $params_sql['special']['structures_specifiques'] = $this->context['view']->idtypestructure;
  644.         }
  645.         $this->context['view']->area_active false;
  646.         $this->context['view']->area null;
  647.         $this->context['view']->area_view '';
  648.         // une région en particulier ?
  649.         if(!empty($this->context['params']['area']) &&
  650.             ($spectacleRepo->my_is_int($this->context['params']['area']) || strlen($this->context['params']['area'])==2)) {
  651.             $this->context['view']->area_active true;
  652.             $this->context['view']->area $area $this->context['params']['area'];
  653.             $this->context['view']->area_view 'area/'.$area.'/';
  654.             $params_sql['special']['area'] = $area// recherche dans la région
  655.             $params_sql['special']['carte_version'] = 'Bigregions';
  656.             if($spectacleRepo->my_is_int($area)) {
  657.                 $this->context['view']->region_name $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getRegionName($area); // nom de la région
  658.             } else {
  659.                 $this->context['view']->country_name $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getNameCountry($area); // nom de la région
  660.             }
  661.             // définir la zone de recherche
  662.             $area_sql $this->em->getRepository('TheatreCore\Entity\\'.$params_sql['special']['carte_version'])->getZipCode($area);
  663.             $spectacleRepo->setZoneRecherche($area_sql); // définir la zone de recherche
  664.         }
  665.         
  666.         $recommandedSpectacles $spectacleRepo->getListSpectacles(
  667.             $params_sql,
  668.         );
  669.         $paramsVignette = [
  670.             'vignette' => [
  671.                 'width' => 100,
  672.                 'height' => 100,
  673.                 'direction' => 'crop',
  674.                 'fleche' => 'moyen'
  675.             ],
  676.             'get_vignette' => true
  677.         ];
  678.         $spectacles = [];
  679.         // Setup for the aside of contacts that recommanded the shown spectacles
  680.         $this->view->type_aides = array(
  681.             'recommandations' => array(
  682.                 'type_aides' => array(4),
  683.                 'label' => 'Médias référencés',
  684.             ),
  685.         );
  686.         $allRecommandationsContacts = [];
  687.         // Toutes les infos des prochains spectacles avec recommandations
  688.         foreach ($recommandedSpectacles as $spectacle) {
  689.             $spectacle $spectacleRepo->getInfosSpectacle($spectacle['idspectacle'], $paramsVignette);
  690.             $spectacle['carrer'] = $spectacleRepo->getObjectsCarrerDetails($spectacle['idspectacle']);
  691.             if ($dates $spectacleRepo->getProchDateLieu(array('prochains' => true), $spectacle['idspectacle'])) {
  692.                 $spectacle array_merge($spectacle$dates);
  693.             }
  694.             if (!isset($spectacle['affcontact'])
  695.                 && (isset($spectacle['contact']) && isset($spectacle['contact']['organisation']) && !empty($spectacle['contact']['organisation']))
  696.             ) {
  697.                 $spectacle['affcontact'] = true;
  698.             }
  699.             $spectacle['footer_critique'] = true;
  700.             $spectacle['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$spectacle['idspectacle'],'class_critique',array('publish_valid' => 1));
  701.             $spectacle['url_clean_more'] = 'critiques/';
  702.             $spectacle['nbRecommandations'] = $spectacleRepo->countSpectacleRecommandations($spectacle['idspectacle']);
  703.             
  704.             // Params to get additional infos on Aide
  705.             $params_sql_aide = array(
  706.                 'where' => array(
  707.                     array('spectacle_aide''publish'1)
  708.                 ),
  709.                 'idspectacle' => $spectacle['idspectacle'],
  710.                 'special' => array(
  711.                     'aides' => array(
  712.                         'type_aides' => 4
  713.                     ),
  714.                 ),
  715.                 "recommandations_only" => true,
  716.                 'dbg' => array('spectacle_recommandation'"Recommandation(s)"),
  717.             );
  718.             $spectacleRecommandationsIds $spectacleRepo->getSpectacleRecommandations($spectacle['idspectacle']);
  719.             $listSpectacleAide $this->em->getRepository(SpectacleAide::class)->getListSpectacleAide($params_sql_aide);
  720.             
  721.             foreach ($spectacleRecommandationsIds as $key => $value) {
  722.                 $singleRecommandation $this->em->getRepository(Aides::class)->getInfosAide($value["idaide"], array(
  723.                     'get_aidecontact' => true,
  724.                     'get_contact' => true,
  725.                 ));
  726.                 // Remove same contacts from the aside and get all the infos for the recommandations (if available)
  727.                 if (!in_array($singleRecommandation["contact"]["idcontact"], $allRecommandationsContacts)) {
  728.                     $allRecommandationsContacts[] = $singleRecommandation["contact"]["idcontact"];
  729.                     if (isset($listSpectacleAide[$value["idaide"]])) {
  730.                         $this->view->type_aides["recommandations"]['aides'][$value["idaide"]] = $listSpectacleAide[$value["idaide"]];
  731.                     }
  732.                     $this->view->type_aides["recommandations"]['aides'][$value["idaide"]]["aide"] = $singleRecommandation;
  733.                 }
  734.             }
  735.             $spectacle $spectacleRepo->clearSpectaclesAddAllPersons($spectacle);
  736.             $spectacles[] = $spectacle;
  737.         }
  738.         $this->context['view']->orderBy 'date';
  739.         
  740.         if(!empty($this->context['params']['area'])) {
  741.             if ($request->query->get('order') === 'date') {
  742.                 return $this->redirect("/critiques/spectacles/area/" $area "?d=30&order=date");
  743.             }
  744.         };
  745.         
  746.         // Tri par nombre de recommandation
  747.         if ($request->query->get('order') === 'nbRecommandations') {
  748.             $this->context['view']->orderBy 'nbRecommandations';
  749.             array_multisort(array_map(function ($elem) {
  750.                 return $elem['nbRecommandations'];
  751.             }, $spectacles), SORT_DESC$spectacles);
  752.         }
  753.         if ($request->query->get('order') === 'critiques') {
  754.             return $this->redirect("/critiques/spectacles/area/" $area "?d=30&order=critiques");
  755.         }
  756.         $this->context['view']->pagination['recommandations']['all'] = count($spectacles);
  757.         // Tri par nombre de critiques
  758.         if ($request->query->get('order') === 'critiques') {
  759.             $this->context['view']->orderBy 'critiques';
  760.             array_multisort(array_map(function ($elem) {
  761.                 return $elem['carrer']['critiques'];
  762.             }, $spectacles), SORT_DESC$spectacles);
  763.         }
  764.         $nb_total_critiques 0;
  765.         foreach($spectacles AS $k=>$v) {
  766.             $spectacles[$k]['footer_critique'] = true;
  767.             $nb_total_critiques += $spectacles[$k]['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$v['idspectacle'],'class_critique',array('publish_valid' => 1));
  768.             if(!empty($this->context['params']['type']) && $this->context['params']['type'] == 'emissions'){
  769.                 $spectacles[$k]['url_clean_more'] = 'podcasts/';
  770.             }
  771.         }
  772.         $this->view->spectacles $spectacles;
  773.         // asides
  774.         $spectacleAideRepo $this->em->getRepository(SpectacleAide::class);
  775.         $listPossibleRecommandationNb $spectacleAideRepo->getIndiceNombresRecommandations();
  776.         foreach ($listPossibleRecommandationNb as $key => $value) {
  777.             if ($value['totalRecommandation'] == 1) {
  778.                 unset($listPossibleRecommandationNb[$key]);
  779.             } else {
  780.                 /* just check if there is really at least 1 spectacle with the nb of recommandations because of a bug */
  781.                 $testSpectacleExist $spectacleRepo->getRecommandedSpectacles($value['totalRecommandation'], ['start' => 0'max' => 1]);
  782.                 if (empty($testSpectacleExist)) {
  783.                     unset($listPossibleRecommandationNb[$key]);
  784.                     continue;
  785.                 }
  786.                 $listPossibleRecommandationNb[$key]['name'] = $value['totalRecommandation'] . ' recommandations';
  787.             }
  788.         }
  789.         $this->getCommonSearch();
  790.         $this->getCommonSearchView();
  791.         $menu_trier = array(
  792.             'next-spectacles' => array(
  793.                 'name' => 'Tous les spectales',
  794.                 'key_type' => 'tous',
  795.             ),
  796.         );
  797.         $menu_order = [
  798.             'date' => [
  799.                 'name' => 'Dates',
  800.                 'key_order' => 'date'
  801.             ],
  802.         ];
  803.         if(!empty($this->context['params']['area'])) {
  804.             $menu_order['critiques'] = [
  805.                 'name' => 'Nombre de critiques',
  806.                 'key_order' => 'critiques'
  807.             ];
  808.         };
  809.         $menu_order['nbRecommandations'] = [
  810.             'name' => 'Nombre de recommandations',
  811.             'key_order' => 'nbRecommandations'
  812.         ];
  813.         $this->asides->load(['url_lists,trier' => array(
  814.             'exec' => array(
  815.                 'htmlstart' => true
  816.             ),
  817.             'php' => array(
  818.                 'method' => 'asidesUrlLists',
  819.                 'url' => '/critiques/recommandations/generate_params',
  820.                 'urls' => $menu_trier,
  821.                 'params' => array(
  822.                     'activate' => true,
  823.                     'key_area' => $this->context['view']->area,
  824.                     'key_order' => $this->context['view']->orderBy
  825.                 ),
  826.                 'structure' => array(
  827.                     'type' => 'key_type',
  828.                     'area' => 'key_area',
  829.                     'structure_classic' => array(
  830.                         'd' => 'v_day',
  831.                         's' => 'v_saison',
  832.                         'y' => 'v_year',
  833.                         'idtypestructure' => 'v_idtypestructure',
  834.                         'order' => 'key_order'
  835.                     )
  836.                 ),
  837.             ),
  838.             'title' => html_entity_decode('Trier'),
  839.         )]);
  840.         $this->asides->load(['url_lists,par' => array(
  841.             'exec' => array(
  842.                 'alone' => false
  843.             ),
  844.             'php' => array(
  845.                 'method' => 'asidesUrlLists',
  846.                 'url' => '/critiques/recommandations/generate_params',
  847.                 'urls' => $menu_order,
  848.                 'params' => array(
  849.                     'activate' => $this->context['view']->orderBy,
  850.                     'key_area' => $this->context['view']->area,
  851.                     'key_type' => $this->context['view']->type
  852.                 ),
  853.                 'structure' => array(
  854.                     'type' => 'key_type',
  855.                     'area' => 'key_area',
  856.                     'structure_classic' => array(
  857.                         'd' => 'v_days',
  858.                         's' => 'v_saison',
  859.                         'y' => 'v_year',
  860.                         'dateend' => 'v_dateend',
  861.                         'datestart' => 'v_datestart',
  862.                         'idtypestructure' => 'v_idtypestructure',
  863.                         'order' => 'key_order'
  864.                     )
  865.                 )
  866.             ),
  867.             'title' => html_entity_decode('Par')
  868.         )]);
  869.         $this->asides->load(['url_lists,textes_a_venir' => array(
  870.             'exec' => array(
  871.                 'alone' => false
  872.             ),
  873.             'php' => array(
  874.                 'method' => 'asidesUrlLists',
  875.                 'urls' => $this->context['view']->menu_jours,
  876.                 'url' => '/critiques/recommandations/generate_params',
  877.                 'params' => array(
  878.                     'activate' => $this->context['view']->days,
  879.                     'key_area' => $this->context['view']->area,
  880.                     'key_type' => $this->context['view']->type,
  881.                     'key_order' => $this->context['view']->orderBy
  882.                 ),
  883.                 'structure' => array(
  884.                     'type' => 'key_type',
  885.                     'area' => 'key_area',
  886.                     'structure_classic' => array(
  887.                         'd' => 'key_day',
  888.                         's' => 'v_saison',
  889.                         'y' => 'v_year',
  890.                         'idtypestructure' => 'v_idtypestructure',
  891.                         'order' => 'key_order'
  892.                     )
  893.                 )
  894.             ),
  895.             'title' => 'Recherche par période'
  896.         )]);
  897.         $this->asides->load(['recherche_par_periode' => array(
  898.             'exec' => array(
  899.                 'htmlend' => true
  900.             ),
  901.             'php' => array(
  902.                 'method' => 'asidesUrlListsForms',
  903.                 'action' => '/critiques/recommandations/generate_params',
  904.                 'params' => array(
  905.                     'activate' => $this->context['view']->days,
  906.                     'key_area' => (!empty($this->context['view']->area)) ? $this->context['view']->area 'null',
  907.                     'key_type' => (!empty($this->context['view']->type)) ? $this->context['view']->type 'null',
  908.                     'key_order' => $this->context['view']->orderBy
  909.                 ),
  910.                 'structure' => array(
  911.                     'type' => 'key_type',
  912.                     'area' => 'key_area',
  913.                     'structure_classic' => array(
  914.                         'idtypestructure' => 'v_idtypestructure'
  915.                     )
  916.                 )
  917.             ),
  918.             'action' => '/critiques/recommandations/'
  919.         )]);
  920.         $default_cdn_tn 'ALL';
  921.         if(isset($this->context['view']->area) && $this->context['view']->area){
  922.             $default_cdn_tn '';
  923.         }
  924.         $this->asides->load(['url_lists_alone,tn_cdn_sn' => array(
  925.             'php' => [
  926.                 'method' => 'tn_cdn_sn',
  927.                 'url' => '/critiques/recommandations/generate_params',
  928.                 'params' => array(
  929.                     'activate' => (isset($this->context['view']->idtypestructure) && !empty($this->context['view']->idtypestructure)) ? $this->context['view']->idtypestructure $default_cdn_tn,
  930.                     'key_type' => (!empty($this->context['view']->type)) ? $this->context['view']->type 'null',
  931.                     'key_order' => $this->context['view']->orderBy
  932.                 ),
  933.                 'structure' => array(
  934.                     'type' => 'key_type',
  935.                     'structure_classic' => array(
  936.                         'd' => 'v_days',
  937.                         's' => 'v_saison',
  938.                         'y' => 'v_year',
  939.                         'dateend' => 'v_dateend',
  940.                         'datestart' => 'v_datestart',
  941.                         'idtypestructure' => 'key_structure',
  942.                         'order' => 'key_order'
  943.                     )
  944.                 )
  945.             ],
  946.             'title' => 'Voir dans'
  947.         )]);
  948.         $this->asides->load(['common_carte' => array(
  949.             'php' => array(
  950.                 'method' => 'asidesUrlLists',
  951.                 'url' => '/critiques/recommandations/area/get_id/?d={v_days}&order=nbRecommandations'
  952.             )
  953.         )]);
  954.         $this->asides->load('common_aside_selections');
  955.         $this->asides->load('critiques_plusinfo');
  956.         $this->asides->load(['common_participer' => array(
  957.             'php' => array(
  958.                 'method' => 'asidesUrlLists_Ajoutez'
  959.             )
  960.         )]);
  961.         
  962.         // La légende des carrer_couleurs
  963.         $this->asides->load(['common_carrer_informations'=> array(
  964.             'color' => 'critiques'
  965.         )]);
  966.         // situation et titre meta
  967.         $this->view->title_page 'Tous les spectacles recommandés';
  968.         $this->view->locate = array(
  969.             '/critiques/' => 'Espace critique',
  970.             => 'Recommandations'
  971.         );
  972.         $this->view->rub_courante 'critiques';
  973.         return $this->view('critiques/recommandations.html.twig');
  974.     }
  975.     // }}}
  976.     // {{{ action_rss()
  977.     /** listing des flux rss
  978.      *
  979.      * @Route("/critiques/rss", name="critiques_rss")
  980.      * @Route("/critiques/rss/spectacle/{p_slug}", name="critiques_rss_spectacles_slug")
  981.      *
  982.      */
  983.     public function action_rss($p_slug null)
  984.     {
  985.         $this->InitController(null'rss');
  986.         // situation et titre meta
  987.         $this->view->title_page 'Toutes les critiques des spectacles de théâtre actuellement à l\'affiche';
  988.         $this->context['params']['spectacle'] = $p_slug;
  989.         $this->view->locate = array(=> 'Espace critique');
  990.         $this->view->rub_courante 'critiques';
  991.         // classe
  992.         $this->getRssCritiques();
  993.         $response =  $this->view('critiques/rss.xml.twig');
  994.         $response->headers->set('Content-Type''xml');
  995.         $response->setCharset('utf-8');
  996.         return $response;
  997.     }
  998.     // {{{ getListCritiques()
  999.     /** Lister les critiques
  1000.      *
  1001.      */
  1002.     public function getListCritiques($pagerOptions$params_display = array())
  1003.     {
  1004.         $pagerOptions['path'] = '/critiques/';
  1005.         // par page
  1006.         $perPage 20;
  1007.         if(!empty($params_display['perPage'])){
  1008.             $perPage $params_display['perPage'];
  1009.         }
  1010.         // les non-valide
  1011.         if(isset($this->params['publish'])) {
  1012.             $publish_valid['publish'] = (int)$this->params['publish'];
  1013.         } else {
  1014.             $publish_valid['publish'] = 1;
  1015.         }
  1016.         if(isset($this->params['valid'])) {
  1017.             $publish_valid['valid'] = (int)$this->params['valid'];
  1018.         } else {
  1019.             $publish_valid['valid'] = 1;
  1020.         }
  1021.         // nombre d'enregistrement
  1022.         $totalItems $this->em->getRepository(Classifications::class)->countByClassification(101,$publish_valid);
  1023.         if(empty($totalItems) && $totalItems>0) {
  1024.             $pagerOptions['perPage'] = $perPage;
  1025.             $pagerOptions['totalItems'] = $totalItems;
  1026.             // pagination
  1027.             require PATH_LIBS.'Pager/Pagersimple.php';
  1028.             $this->paged_data pagerSimple($pagerOptions);
  1029.             // limitation
  1030.             $limit $this->contents->dbLimit($pagerOptions['perPage'], $this->paged_data['from']-1);
  1031.         } else {
  1032.             $limit = array(0$perPage);
  1033.         }
  1034.         // trouver les contenus associés 101 et les classer par date
  1035.         $params_sql = array(
  1036.             'sql' => array(
  1037.                 'select' => 'ct.deck,ct.writer,ct.writer_group,ct.link,ct.writer_group_url,ct.idspectacle,ct.dateinsert,ct.date_article',
  1038.                 'order' => ' ct.date_article DESC',
  1039.                 // 'groupby' => 'ct.idspectacle',
  1040.                 'limit' => $limit,
  1041.             ),
  1042.             'special' => array(
  1043.                 'by_classification' => array(101),
  1044.                 'get_extranetuser' => true,
  1045.                 'publish' => 1,
  1046.                 'valid' => 1,
  1047.             ),
  1048.             'dbg' => array('critiques','Liste des critiques'),
  1049.         );
  1050.         // les non-valide
  1051.         if(isset($this->params['publish'])) {
  1052.             $params_sql['special']['publish'] = (int)$this->params['publish'];
  1053.         }
  1054.         if(isset($this->params['valid'])) {
  1055.             $params_sql['special']['valid'] = (int)$this->params['valid'];
  1056.         }
  1057.         $get_large_critiques false//on charge une vignette de taille "normal"
  1058.         if(!empty($params_display['vignette_large_format'])){
  1059.             $get_large_critiques true//on charge une vignette de taille "large"
  1060.         }
  1061.         // on récupère tout ?
  1062.         $params_display = array(
  1063.             'fields' => array(
  1064.                 'title',
  1065.                 'deck',
  1066.                 'idextranetuser',
  1067.                 'login',
  1068.                 'dateinsert',
  1069.                 'date_article',
  1070.                 'writer',
  1071.                 'writer_group',
  1072.                 'writer_group_url',
  1073.             ),
  1074.             'thumbnail' => true// on veut une vignette
  1075.             'get_critiques' => true,
  1076.             'get_critiques_vignette_large' => $get_large_critiques
  1077.             // 'get_infos_spectacle' => array(
  1078.             //     'vignette' => array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'forme'=>'round','direction'=>'crop','valround'=>$_ENV['VIGN_SPECTACLE_ROUND']),
  1079.             //     'stylemore' => array('imagep' => 'width:70px;', 'descsp' => 'width:300px;'),
  1080.             // ),
  1081.         );
  1082. //        $this->paged_data['links'] = str_replace('/index.php', '', $this->paged_data['links']);
  1083.         $this->view->critiques_list $this->contents->getListContents($params_sql,$params_display);
  1084.         foreach($this->view->critiques_list as $k=>$c) {
  1085.             // 2 lignes
  1086.             if(!empty($c['deck'])) {
  1087.                 $this->view->critiques_list[$k]['deck'] =  $this->contents->cutSentence($c['deck'],190);
  1088.             }
  1089.             if(!empty($c['spectacles'])){
  1090.                 foreach($c['spectacles'] as $s) {
  1091.                     $this->view->critiques_list[$k]['spectacle']['url_clean'] = $s['url_clean'];
  1092.                     $this->view->critiques_list[$k]['spectacle']['count_critiques'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$s['idspectacle'],'class_critique',array('publish_valid' => 1));;
  1093.                 }
  1094.             }
  1095.         }
  1096.         //setDebug($this->contents->getListContents($params_sql,$params_display));
  1097.     }
  1098.     // }}}
  1099.     // {{{ getRssCritiques()
  1100.     /** Lister les critiques pour le flux RSS
  1101.      *
  1102.      */
  1103.     public function getRssCritiques()
  1104.     {
  1105.         // trouver les contenus associés 101 et les classer par date
  1106.         $params_sql = array(
  1107.             'sql' => array(
  1108.                 'select' => 'ct.deck,ct.writer,ct.writer_group,ct.writer_group_url,ct.idspectacle,ct.dateinsert,ct.date_article',
  1109.                 'order' => ' ct.date_article DESC',
  1110.                 'limit' => array(0,10),
  1111.             ),
  1112.             'special' => array(
  1113.                 'by_classification' => array(101),
  1114.                 'get_extranetuser' => true,
  1115.                 'publish' => 1,
  1116.             ),
  1117.             'dbg' => array('critiques','Liste des critiques'),
  1118.         );
  1119.         // pour un spectacle
  1120.         if(!empty($this->context['params']['spectacle'])) {
  1121.             $idspectacle $this->em->getRepository(Spectacles::class)->getIdByUrl($this->context['params']['spectacle']);
  1122.             if(empty($idspectacle)) {
  1123.                 $this->view->critiques_list = array();
  1124.             } else {
  1125.                 $params_sql['special']['idspectacle'] = $idspectacle;
  1126.             }
  1127.         }
  1128.         if(!isset($this->view->critiques_list)) {
  1129.             // on récupère tout ?
  1130.             $params_display = array(
  1131.                 'fields' => array(
  1132.                     'title',
  1133.                     'deck',
  1134.                     'idextranetuser',
  1135.                     'login',
  1136.                     'dateinsert',
  1137.                     'date_article',
  1138.                     'writer',
  1139.                     'writer_group',
  1140.                     'writer_group_url'
  1141.                 ),
  1142.                 'thumbnail' => true// on veut une vignette
  1143.                 'get_infos_spectacle' => array(
  1144.                     'vignette' => array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'forme'=>'round','direction'=>'crop','valround'=>$_ENV['VIGN_SPECTACLE_ROUND']),
  1145.                     'stylemore' => array('imagep' => 'width:70px;''descsp' => 'width:300px;'),
  1146.                 ),
  1147.             );
  1148.             $this->view->critiques_list $this->contents->getListContents($params_sql,$params_display);
  1149.             foreach($this->view->critiques_list as $k=>$c) {
  1150.                 if(!empty($c['spectacles'])) {
  1151.                     foreach($c['spectacles'] as $s) {
  1152.                         $this->view->critiques_list[$k]['spectacle']['url_clean'] = $s['url_clean'];
  1153.                     }
  1154.                 }
  1155.                 $this->view->critiques_list[$k]['url'] = $_ENV['URL_THNET'].'/spectacles/'.$this->view->critiques_list[$k]['spectacle']['url_clean'].'/critiques/idcontent/'.$c['idcontent'];
  1156.                 // md5
  1157.                 $md5 md5($c['dateinsert']);
  1158.                 $this->view->critiques_list[$k]['md5'] = $md5;
  1159.                 // date
  1160.                 $date $c['date_article'];
  1161.                 $t explode(' '$date);
  1162.                 list($y,$m,$d) = explode('-',$t[0]);
  1163.                 $w3t gmdate(DATE_ATOMmktime(00,00,00,$m,$d,$y));
  1164.                 $this->view->critiques_list[$k]['w3t'] = $w3t;
  1165.                 // premiere annonce = updated
  1166.                 if(!isset($updated)) {
  1167.                     $this->view->updated $w3t;
  1168.                     $this->view->md5 $md5;
  1169.                     $updated true;
  1170.                 }
  1171.             }
  1172.         }
  1173.     }
  1174.     // }}}
  1175.     // {{{ getPagedData()
  1176.     /** Récupèrer la pagination
  1177.      *
  1178.      */
  1179.     public function getPagedData()
  1180.     {
  1181.         return $this->paged_data;
  1182.     }
  1183.     // }}}
  1184.     //  {{{ getSaisonsAndDates()
  1185.     /** Liste des saisons et années avec des critiques
  1186.      *
  1187.      * @access public
  1188.      * return array
  1189.      */
  1190.     public function getSaisonsAndAnnees()
  1191.     {
  1192.         // tous les spectacles des étudiants de l'école
  1193.         $sql_annees 'SELECT sc.`date`, YEAR(sc.`date`) as annee
  1194.                        FROM schedules sc
  1195.                         JOIN object_content oc ON oc.`idobject`=sc.`idspectacle` AND oc.`object`=\'spectacles\'
  1196.                         JOIN contents c ON c.`idcontent`=oc.`idcontent`
  1197.                         JOIN content_classification cc ON oc.`idcontent`=cc.`idcontent`
  1198.                         WHERE 1
  1199.                          AND cc.`idclassification` IN (101)
  1200.                          AND c.`publish`=1
  1201.                          AND c.`valid`=1
  1202.                         GROUP BY annee';
  1203.         $listdates $this->contents->queryAll($sql_annees);
  1204.         // liste des saisons et des années
  1205.         if(empty($listdates)) {
  1206.             return []; //$listdates->getDebugInfos()
  1207.         } elseif(!empty($listdates)) {
  1208.             foreach($listdates as $a) {
  1209.                 if($a['date']>date('Y-m-d'mktime(0,0,0,8,31,$a['annee'])) ) {
  1210.                     $s $a['annee'].'-'.($a['annee']+1);
  1211.                 } else {
  1212.                     $s = ($a['annee']-1).'-'.$a['annee'];
  1213.                 }
  1214.                 $saisons[$s] = $s;
  1215.                 $saisons_key[] = $s;
  1216.                 $annees[$a['annee']] = $a['annee'];
  1217.             }
  1218.         }
  1219.         return  array(
  1220.             'saisons' => $saisons,
  1221.             'saisons_key' => $saisons_key,
  1222.             'annees' => $annees,
  1223.         );
  1224.     }
  1225.     // }}}
  1226. //    private function uriOrderHandler (Request $request, string $orderBy): string
  1227. //    {
  1228. //        $pathInfo = $request->getPathInfo();
  1229. //        $requestUri = $request->getRequestUri();
  1230. //
  1231. //        if ($pathInfo === $requestUri) {
  1232. //            $uri = $pathInfo . '?order=' . $orderBy;
  1233. //        } else {
  1234. //            $requestUri = $request->getRequestUri();
  1235. //            $orderFlag = substr_count($requestUri, 'order');
  1236. //            if ($orderFlag === 0) {
  1237. //                $uri = $requestUri . '&order=' . $orderBy;
  1238. //            } else if ($orderFlag === 1) {
  1239. //                $uri = $requestUri;
  1240. //            }
  1241. //        }
  1242. //
  1243. //        return $uri;
  1244. //    }
  1245.     private function getAsidesSpectacles(){
  1246.         $menu_trier = array(
  1247.             'next-spectacles' => array(
  1248.                 'name' => 'Tous les spectales',
  1249.                 'key_type' => 'tous',
  1250.                 'count' => $this->context['view']->nb_spectacles_total
  1251.             ),
  1252.             'emissions-spectacles' => array(
  1253.                 'name' => 'Avec émissions critiques',
  1254.                 'key_type' => 'emissions',
  1255.                 'count' => $this->context['view']->nb_spectacles_emissions
  1256.             )
  1257.         );
  1258.         $menu_order = [
  1259.             'date' => [
  1260.                 'name' => 'Dates',
  1261.                 'key_order' => 'date'
  1262.             ],
  1263.             'critiques' => [
  1264.                 'name' => 'Nombre de critiques',
  1265.                 'key_order' => 'critiques'
  1266.             ]
  1267.         ];
  1268.         if(!empty($this->context['params']['area'])) {
  1269.             $menu_order['nbRecommandations'] = [
  1270.                 'name' => 'Nombre de recommandations',
  1271.                 'key_order' => 'nbRecommandations'
  1272.             ];
  1273.         };
  1274.         $this->asides->load(['url_lists,trier' => array(
  1275.             'exec' => array(
  1276.                 'htmlstart' => true
  1277.             ),
  1278.             'php' => array(
  1279.                 'method' => 'asidesUrlLists',
  1280.                 'url' => '/critiques/spectacles/generate_params',
  1281.                 'urls' => $menu_trier,
  1282.                 'params' => array(
  1283.                     'activate' => $this->context['view']->type,
  1284.                     'key_area' => $this->context['view']->area,
  1285.                     'key_order' => $this->context['view']->orderBy
  1286.                 ),
  1287.                 'structure' => array(
  1288.                     'type' => 'key_type',
  1289.                     'area' => 'key_area',
  1290.                     'structure_classic' => array(
  1291.                         'd' => 'v_day',
  1292.                         's' => 'v_saison',
  1293.                         'y' => 'v_year',
  1294.                         'idtypestructure' => 'v_idtypestructure',
  1295.                         'order' => 'key_order'
  1296.                     )
  1297.                 ),
  1298.             ),
  1299.             'title' => html_entity_decode('Trier'),
  1300.         )]);
  1301.         $this->asides->load(['url_lists,par' => array(
  1302.             'exec' => array(
  1303.                 'alone' => false
  1304.             ),
  1305.             'php' => array(
  1306.                 'method' => 'asidesUrlLists',
  1307.                 'url' => '/critiques/spectacles/generate_params',
  1308.                 'urls' => $menu_order,
  1309.                 'params' => array(
  1310.                     'activate' => $this->context['view']->orderBy,
  1311.                     'key_area' => $this->context['view']->area,
  1312.                     'key_type' => $this->context['view']->type
  1313.                 ),
  1314.                 'structure' => array(
  1315.                     'type' => 'key_type',
  1316.                     'area' => 'key_area',
  1317.                     'structure_classic' => array(
  1318.                         'd' => 'v_days',
  1319.                         's' => 'v_saison',
  1320.                         'y' => 'v_year',
  1321.                         'dateend' => 'v_dateend',
  1322.                         'datestart' => 'v_datestart',
  1323.                         'idtypestructure' => 'v_idtypestructure',
  1324.                         'order' => 'key_order'
  1325.                     )
  1326.                 )
  1327.             ),
  1328.             'title' => html_entity_decode('Par')
  1329.         )]);
  1330.         $this->asides->load(['url_lists,textes_a_venir' => array(
  1331.             'exec' => array(
  1332.                 'alone' => false,
  1333.             ),
  1334.             'php' => array(
  1335.                 'method' => 'asidesUrlLists',
  1336.                 'urls' => $this->context['view']->menu_jours,
  1337.                 'url' => '/critiques/spectacles/generate_params',
  1338.                 'params' => array(
  1339.                     'activate' => $this->context['view']->days,
  1340.                     'key_area' => $this->context['view']->area,
  1341.                     'key_type' => $this->context['view']->type,
  1342.                     'key_order' => $this->context['view']->orderBy
  1343.                 ),
  1344.                 'structure' => array(
  1345.                     'type' => 'key_type',
  1346.                     'area' => 'key_area',
  1347.                     'structure_classic' => array(
  1348.                         'd' => 'key_day',
  1349.                         's' => 'v_saison',
  1350.                         'y' => 'v_year',
  1351.                         'idtypestructure' => 'v_idtypestructure',
  1352.                         'order' => 'key_order'
  1353.                     )
  1354.                 )
  1355.             ),
  1356.             'title' => 'Recherche par période'
  1357.         )]);
  1358.         $this->asides->load(['recherche_par_periode' => array(
  1359.             'exec' => array(
  1360.                 'htmlend' => true
  1361.             ),
  1362.             'php' => array(
  1363.                 'method' => 'asidesUrlListsForms',
  1364.                 'action' => '/critiques/spectacles/generate_params',
  1365.                 'params' => array(
  1366.                     'activate' => $this->context['view']->days,
  1367.                     'key_area' => (!empty($this->context['view']->area)) ? $this->context['view']->area 'null',
  1368.                     'key_type' => $this->context['view']->type,
  1369.                     'key_order' => $this->context['view']->orderBy
  1370.                 ),
  1371.                 'structure' => array(
  1372.                     'type' => 'key_type',
  1373.                     'area' => 'key_area',
  1374.                     'structure_classic' => array(
  1375.                         'idtypestructure' => 'v_idtypestructure'
  1376.                     )
  1377.                 )
  1378.             ),
  1379.             'action' => '/critiques/spectacles/',
  1380.         )]);
  1381.         $default_cdn_tn 'ALL';
  1382.         if(isset($this->context['view']->area) && $this->context['view']->area){
  1383.             $default_cdn_tn '';
  1384.         }
  1385.         $this->asides->load(['url_lists_alone,tn_cdn_sn' => array(
  1386.             'php' => [
  1387.                 'method' => 'tn_cdn_sn',
  1388.                 'url' => '/critiques/spectacles/generate_params',
  1389.                 'params' => array(
  1390.                     'activate' => (isset($this->context['view']->idtypestructure) && !empty($this->context['view']->idtypestructure)) ? $this->context['view']->idtypestructure $default_cdn_tn,
  1391.                     'key_type' => $this->context['view']->type,
  1392.                     'key_order' => $this->context['view']->orderBy
  1393.                 ),
  1394.                 'structure' => array(
  1395.                     'type' => 'key_type',
  1396.                     'structure_classic' => array(
  1397.                         'd' => 'v_days',
  1398.                         's' => 'v_saison',
  1399.                         'y' => 'v_year',
  1400.                         'dateend' => 'v_dateend',
  1401.                         'datestart' => 'v_datestart',
  1402.                         'idtypestructure' => 'key_structure',
  1403.                         'order' => 'key_order'
  1404.                     )
  1405.                 )
  1406.             ],
  1407.             'title' => 'Voir dans'
  1408.         )]);
  1409.         $this->asides->load(['common_carte' => array(
  1410.             'php' => array(
  1411.                 'method' => 'asidesUrlLists',
  1412.                 'url' => '/critiques/spectacles/area/get_id/?d={v_days}'
  1413.             )
  1414.         )]);
  1415.         //Chargement de la pub par région
  1416.         asides::setEntityManager($this->em);
  1417.         asides::loadaside('Publicite')->addWithNational($this->asides); //$this->area
  1418.         asides::loadaside('Publicite')->addWithRegion($this->asides, ['region' => $this->context['view']->area]); //$this->area
  1419.         $this->asides->load('critiques_plusinfo');
  1420.         $this->asides->load(['common_participer' => array(
  1421.             'php' => array(
  1422.                 'method' => 'asidesUrlLists_Ajoutez'
  1423.             )
  1424.         )]);
  1425.     }
  1426.     public function getAsidesDernieresParutions(){
  1427.         $menu_contents = array(
  1428.             'spectacles' => array(
  1429.                 'name' => 'Spectacles à l\'affiche',
  1430.                 'key_url' => 'spectacles',
  1431.             ),
  1432.             'critique' => array(
  1433.                 'name' => 'Dernières parutions',
  1434.                 'key_url' => '',
  1435.                 'active' => 'on'
  1436.             )
  1437.         );
  1438.         // $asides->load('critiques_plusinfo');
  1439.         $this->asides->load(['common_participer' => array(
  1440.             'php' => array(
  1441.                 'method' => 'asidesUrlLists_Ajoutez',
  1442.                 'loadcustom' => array(
  1443.                     'spectacle' => array(
  1444.                         'name' => 'Un lien vers une critique',
  1445.                         'url' => '/critiques/ajouter'
  1446.                     )
  1447.                 )
  1448.             )
  1449.         )]);
  1450.         asides::setEntityManager($this->em);
  1451.         asides::loadaside('Publicite')->addWithNational($this->asides); //$this->area
  1452.     }
  1453. }