src/Controller/BiographieController.php line 3072

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\asides;
  4. use App\ClassTheatre\TheatreController;
  5. use App\Exception\RedirectException;
  6. use App\Service\Abonnements\Abonnements;
  7. use App\Service\Date_time;
  8. use App\Service\EditUtils;
  9. use App\Service\Functions;
  10. use App\Service\TheatreMail\TheatreMail;
  11. use App\Service\UploadUtils;
  12. use App\Service\UtilsEdit;
  13. use App\Service\wiki2xhtml\wiki2xhtml;
  14. use App\Validator\CheckWebsite;
  15. use Doctrine\ORM\AbstractQuery;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Symfony\Component\Cache\Adapter\AdapterInterface;
  18. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\Form\Extension\Core\Type\FileType;
  21. use Symfony\Component\Form\Extension\Core\Type\FormType;
  22. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  23. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  24. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  25. use Symfony\Component\Form\Extension\Core\Type\TextType;
  26. use Symfony\Component\Validator\Constraints as Assert;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. use Symfony\Component\Validator\Constraints\File;
  32. use Symfony\Component\Validator\Constraints\NotBlank;
  33. use TheatreCore\Classes\Images\Images;
  34. use TheatreCore\Entity\Bigregions;
  35. use TheatreCore\Entity\BookmarkExtranetuser;
  36. use TheatreCore\Entity\Contacts;
  37. use TheatreCore\Entity\Contents;
  38. use TheatreCore\Entity\Countries;
  39. use TheatreCore\Entity\Dvds;
  40. use TheatreCore\Entity\Extranetusers;
  41. use TheatreCore\Entity\Files;
  42. use TheatreCore\Entity\Languages;
  43. use TheatreCore\Entity\Multimedias;
  44. use TheatreCore\Entity\News;
  45. use TheatreCore\Entity\ObjectMultimedia;
  46. use TheatreCore\Entity\PersonEcole;
  47. use TheatreCore\Entity\Persons;
  48. use TheatreCore\Entity\Playlists;
  49. use TheatreCore\Entity\Podcasts;
  50. use TheatreCore\Entity\Schedules;
  51. use TheatreCore\Entity\Spectacles;
  52. use TheatreCore\Entity\Stats;
  53. use TheatreCore\Entity\TextAide;
  54. use TheatreCore\Entity\Texts;
  55. class BiographieController extends TheatreController
  56. {
  57.     // id de la personne
  58.     protected $idperson null;
  59.     // object persons
  60.     protected $persons;
  61.     // object contents
  62.     protected $contents;
  63.     // object multimedias
  64.     protected $multimedias;
  65.     // infos sur la personne
  66.     protected $infosperson = array();
  67.     // précision fil d'arianne
  68.     protected $locate null;
  69.     // titre de la page
  70.     protected $title_page null;
  71.     // style en plus
  72.     protected $style_more = array();
  73.     protected $js_more = array();
  74.     // meta keywords et meta description
  75.     protected $meta_keywords '';
  76.     protected $meta_description '';
  77.     // taille maxi des vidéos
  78.     protected $other_dimensions = array();
  79.     // infos pour mon théâtre
  80.     protected $mtinfos = array();
  81.     // pour le menu principal
  82.     protected $rub_courante null;
  83.     protected $extra_title '';
  84.     protected $extra_locate '';
  85.     protected $is_accueil false;
  86.     protected $stylemore_spectacle = array('imagep' => 'width:80px;''descsp' => 'width:300px;');
  87.     protected $stylemore_text = array('imagep' => 'width:60px;''desctxt' => 'width:295px;');
  88.     // tous les spectacles associés à une personne
  89.     protected $ids_spectacle_all = array();
  90.     // les textes associés
  91.     protected $idtexts_person = array();
  92.     // les asides
  93.     protected $asides "";
  94.     // résultat par page
  95.     protected $perPage 20;
  96.     protected $func;
  97.     protected $serviceAbonnements;
  98.     protected AdapterInterface $cache;
  99.     // {{{ _construct()
  100.     public function __construct(
  101.         EntityManagerInterface $em,
  102.         TranslatorInterface    $translator,
  103.         TokenStorageInterface  $tokenStorage,
  104.         Functions              $functions,
  105.         Abonnements            $Abonnements,
  106.         UploadUtils            $edit_utils,
  107.         AdapterInterface       $cache
  108.     )
  109.     {
  110.         $this->func $functions;
  111.         // surbrillance du menu principal (thnet)
  112.         $GLOBALS['rub_courante'] = 'biographies';
  113.         parent::__construct($translator$tokenStorage);
  114.         $this->em $em;
  115.         $this->serviceAbonnements $Abonnements;
  116.         $this->edit_utils $edit_utils;
  117.         $this->asides = new asides();
  118.         $this->cache $cache;
  119.         // charger jquery
  120.         $GLOBALS['jquery_load'] = true;
  121.         // seulement les données publiées
  122.         $GLOBALS['publish'] = 1;
  123.     }
  124.     public function InitController($slug null$action null$params = [])
  125.     {
  126.         $this->view->action $this->context['action'] = $action;
  127.         $this->RouterOptions($slug$action$GLOBALS['rub_courante']);
  128.         $this->view->controller $GLOBALS['rub_courante'];
  129.         if (!empty($params['idperson'])){
  130.             $this->idobject $this->idperson $this->id = (int)$params['idperson'];
  131.         }
  132.         else{
  133.             $params['idperson'] = $this->idperson $this->idobject = (int)($this->id ?? 0);
  134.         }
  135.         // si idperson n'existe pas, on renvoi sur une page d'erreur (a faire !!!)
  136.         // !! avant d'ajouter une page d'erreru, bine vérifier car j'ai ajouté un "$this->>idperson = null;" dans PersonsRepository.php
  137.         if (empty($params['idperson']) && ! isset($params['corvin'])) {
  138.             throw new RedirectException($this->context['url_module'].'/erreur/');
  139.         }
  140.         if (isset($params['corvin']) && $params['corvin'] == true) {
  141.             $this->persons $this->em->getRepository(Persons::class)->createQueryBuilder('p')
  142.                 ->andWhere('p.idcorvin is not null')
  143.                 ->getQuery()
  144.                 ->getResult();
  145.         } else {
  146.             /**
  147.              * Classe Persons
  148.              */
  149.             $this->persons $this->em->getRepository(Persons::class);
  150.             /**
  151.              * Classe Contents
  152.              */
  153.             $this->contents $this->em->getRepository(Contents::class);
  154.             /**
  155.              * Classe Multimedias
  156.              */
  157.             $this->multimedias $this->em->getRepository(Multimedias::class);
  158.             // status des contenus
  159.             $this->contents->setPublishStatus($this->publish_status);
  160.             // on recupere l'enregistrement
  161.             $this->infosperson $this->persons->getInfosPerson($this->idperson);
  162.             // si hors ligne, redirection vers 404
  163.             //        if (!$this->isGranted('ROLE_ISROOT') && $this->infosperson['publish']==0) {
  164.             //            $this->func->actionRedirect($this->context['url_module'].'/erreur/');
  165.             //        }
  166.             // voir si la personne dirige une structure
  167.             $boss $this->persons->getAssociateContacts($this->idperson1false);
  168.             foreach ($boss as $k => $v) {
  169.                 $date_current = new \Datetime(date('Y-m-d H:i:s'));
  170.                 if ($v['date_start'] != '0000-00-00 00:00:00') {
  171.                     $date_start = new \Datetime($v['date_start']);
  172.                     if ($date_start $date_current) {
  173.                         unset($boss[$k]);
  174.                     }
  175.                 }
  176.                 if ($v['date_end'] != '0000-00-00 00:00:00') {
  177.                     $date_end = new \Datetime($v['date_end']);
  178.                     if ($date_end $date_current) {
  179.                         unset($boss[$k]);
  180.                     }
  181.                 }
  182.             }
  183.             $this->infosperson['boss'] = $boss;
  184.             // la bio
  185.             $biotxt $this->contents->getAssociateContent($this->idperson'persons''class_biotxt', array('wiki_convert' => true));
  186.             //Si c'est une femme
  187.             if ($this->infosperson['sexe'] == 2) {
  188.                 $this->view->is_women true;
  189.             }
  190.             // si existe, voir aussi pour les liens
  191.             if (! empty($biotxt)) {
  192.                 foreach (array('link''facebook''twitter''linkedin''instagram') as $f) {
  193.                     if (! empty($biotxt[$f])) {
  194.                         $this->infosperson[$f] = $biotxt[$f];
  195.                     }
  196.                 }
  197.                 $this->infosperson['biotxt'] = $biotxt;
  198.             }
  199.             // si rentré dans le corp de la fiche
  200.             if (empty($this->infosperson['biotxt']['link']) && ! empty($this->infosperson['url'])) {
  201.                 $this->infosperson['link'] = $this->infosperson['url'];
  202.             }
  203.             // voir s'il y a au moins un lien
  204.             $types_liens = array(
  205.                 'link' => 'site personnel',
  206.                 'twitter' => 'twitter',
  207.                 'facebook' => 'facebook',
  208.                 'linkedin' => 'linkedin',
  209.                 'instagram' => 'instagram',
  210.             );
  211.             foreach ($types_liens as $k => $v) {
  212.                 if (! empty($this->infosperson[$k])) {
  213.                     unset($types_liens[$k]);
  214.                     $this->context['view']->links_exist true;
  215.                 }
  216.             }
  217.             if (! empty($types_liens)) {
  218.                 $this->context['view']->types_liens join(', '$types_liens);
  219.             }
  220.             // il faut également la vignette de la photo associée le cas échéant
  221.             $files $this->em->getRepository(Files::class);
  222.             $files->setPublishStatus($this->publish_status);
  223.             $photos_person $files->getObjectFiles($this->idperson'persons''class_photo_person');
  224.             if (! empty($photos_person)) {
  225.                 // creation d'une vignette
  226.                 $format_vignette_person_flou $format_vignette_person = array('width' => $_ENV['VIGN_PERSONS_WIDTH'], 'height' => $_ENV['VIGN_PERSONS_HEIGHT'], 'direction' => 'crop');
  227.                 $format_vignette_person_flou['blur'] = true;
  228.                 foreach ($photos_person as $k => $v) {
  229.                     $this->infosperson['thumbnail'] = $this->persons->getVignettePerson($this->idperson$format_vignette_person);
  230.                     $this->infosperson['thumbnail_flou'] = $this->persons->getVignettePerson($this->idperson$format_vignette_person_flou);
  231.                     break; // on ne prend que la première
  232.                 }
  233.             }
  234.             // les critiques
  235.             $this->infosperson['nb_critiques'] = $this->countAllCritiques();
  236.             // url_folder
  237.             $this->infosperson['url_folder'] = '/biographies/' $this->infosperson['url_clean'];
  238.             // url du dossier
  239.             $this->url_folder $this->infosperson['url_folder'];
  240.             // style
  241.             $this->style_more = array('rubrique''dossier''auteur');
  242.         }
  243.     }
  244.     // {{{ contenus()
  245.     /** Les articles associés aux persons
  246.      *
  247.      */
  248.     public function contenus_biographie($type_class$type_class_view$other_dimensions = array('width'=>500'grow'=>false), $params = array())
  249.     {
  250.         parent::contenus('persons',$this->idperson,$type_class,$type_class_view,$other_dimensions,$params);
  251.     }
  252.     // }}}
  253.     // {{{ buildMenu()
  254.     /** Construit le menu et l'envoie à la vue
  255.      *
  256.      *
  257.      * @access protected
  258.      * @return void
  259.      */
  260.     protected function buildMenu()
  261.     {
  262.         $menu_person = array();
  263.         // accueil avec l'actualite
  264.         $menu_person['biographie'] = array('nom' => 'Actu''title' => 'Actualités de '.$this->infosperson['fullname'],'icone' => 'info_24.png');
  265.         // presentation de la personne
  266.         if (!empty($this->infosperson['biotxt']['text']) || $this->contents->countAssociateContent('persons'$this->idperson,6)){
  267.             $menu_person['presentation'] = array('nom' => 'En savoir +''title' => 'Présentation de '.$this->infosperson['fullname'],'icone' => '111-user.png');
  268.         } else if ($this->getPersonTextAides(array(0,100), true, ['count_specifique' => true])){
  269.             $menu_person['presentation'] = array('nom' => 'En savoir +''title' => 'Présentation de '.$this->infosperson['fullname'],'icone' => '111-user.png');
  270.         }
  271.         // voir s'il y a des contenus l'auteur par lui même
  272.         if ($this->em->getRepository(Playlists::class)->countPlaylists('persons',$this->idperson,'class_auteur_meme')>0) {
  273.             $playlist $this->em->getRepository(Playlists::class)->getByClassification('persons',$this->idperson,'class_auteur_meme');
  274.             if ($this->infosperson['sexe']==2) {
  275.                 $texte_playlist 'Par elle-même';
  276.             } else {
  277.                 $texte_playlist 'Par lui-même';
  278.             }
  279.             $menu_person['playlist/id/'.$playlist['urlClean']] = array('nom' => $texte_playlist'title' => $this->infosperson['fullname'].' '.$texte_playlist);
  280.         }
  281.         if (!empty($this->ids_spectacle_all)) {
  282.             $schedules $this->em->getRepository(Schedules::class);
  283.             $biographies_dates_demains $schedules->getDateBySpectaclesDemain($this->ids_spectacle_all1);
  284.             if (count($biographies_dates_demains) > 0) {
  285.                 $menu_person['dates'] = array('nom' => 'Calendrier''title' => 'Calendrier de ' $this->infosperson['fullname'], 'icone' => '96-book.png');
  286.             }
  287.         }
  288.         // est-ce un auteur ?
  289.         if ($this->infosperson['is_author']>|| $this->contents->countAssociateContent('persons',$this->idperson,'class_biotextes')) {
  290.             $menu_person['textes'] = array('nom' => 'Textes''title' => 'Textes de '.$this->infosperson['fullname'],'icone' => '96-book.png');
  291.         }
  292.         else if ($this->infosperson['is_translator']>0) {
  293.             $menu_person['traductions'] = array('nom' => 'Textes''title' => 'Textes de '.$this->infosperson['fullname'],'icone' => 'book_24.png');
  294.         }
  295.         if (count($this->ids_spectacle_all) > 0){
  296.             $list_enscenes $this->getSpectaclesDates(falsetrue);
  297.             $menu_person['spectacles'] = array('nom' => 'En scène ('.count($list_enscenes).')''title' => 'Spectacles associés à '.$this->infosperson['fullname'],'icone' => 'tag_24.png');
  298.         }
  299.         // évènements
  300.         $news $this->em->getRepository(News::class);
  301.         $news_params = array(
  302.             'special' => array(
  303.                 'by_object' => array('idperson' => $this->idperson),
  304.             ),
  305.         );
  306.         $countnews $news->countNews($news_params);
  307.         if ($countnews>0) {
  308.             $menu_person['evenements'] = array('nom' => 'Évènements''title' => 'Évènements autour de '.$this->infosperson['fullname'].' proposés par les internautes','icone' => 'tag_24.png');
  309.         }
  310.         // Y a t"il des vidéos
  311.         $countmultimedias $this->countMultimediasPerson();
  312.         if ($countmultimedias>0) {
  313.             $menu_person['videos'] = array('nom' => 'Vidéos ('.$countmultimedias.')''title' => 'Vidéos de '.$this->infosperson['fullname'],'icone' => 'video_24.png');
  314.         }
  315.         // On vérifie s'il y a des podcasts
  316.         $countecouter $this->em->getRepository(Podcasts::class)->countPodcasts('persons',$this->idperson'franceinter');
  317.         $countecouter += $this->em->getRepository(Podcasts::class)->countPodcasts('persons',$this->idperson'soundcloud');
  318.         if ($countecouter 0) {
  319.             $menu_person['podcasts'] = array('nom' => html_entity_decode('Audio'), 'title' => 'Écouter');
  320.         }
  321.         // les critiques
  322.         if ($this->infosperson['nb_critiques']>0) {
  323.             $menu_person['critiques'] = array('nom' => 'Critiques ('.$this->infosperson['nb_critiques'].')''title' => 'Toutes les critiques des spectacles de '.$this->infosperson['fullname']);
  324.         }
  325.         // contenu éduction
  326.         $nb_educs $this->getEduc(['count' => true]);
  327.         if ($nb_educs>0) {
  328.             $menu_person['contenu-pedagogique'] = array('nom'=>'Éduc ('.$nb_educs.')','title' => 'Les contenus pédagogiques sur'.$this->infosperson['fullname'], 'id'=>'educ');
  329.         }
  330.         // menu courant actif
  331.         if ($this->context['action'] == 'spectacle') {
  332.             $menu_person['spectacles']['active'] = 'on';
  333.             $this->current $menu_person['textes'];
  334.         } else {
  335.             $menu_person[$this->context['action']]['active'] = 'on';
  336.             $this->current $menu_person[$this->context['action']];
  337.         }
  338.         if ($this->context['action'] == 'textes-auteurs' || $this->context['action'] == 'textes-traductions' || $this->context['action'] == 'traductions'){
  339.             $menu_person['textes']['active'] = 'on';
  340.         }
  341.         if (strpos($this->context['action'],'playlist')!==false) {
  342.             foreach($menu_person as $k=>$v) {
  343.                 if (strpos($k,'playlist')!==false) {
  344.                     $menu_person[$k]['active'] = 'on';
  345.                     $this->current $menu_person[$k];
  346.                     break;
  347.                 }
  348.             }
  349.         }
  350.         if ($this->context['action'] == 'prix-recompenses' || $this->context['action'] == 'aides-soutiens' || $this->context['action'] == 'selections' || $this->context['action'] == 'ensavoirplus'){
  351.             $menu_person['presentation']['active'] = 'on';
  352.         }
  353.         if ($this->context['action'] == 'premieres'){
  354.             $menu_person['dates']['active'] = 'on';
  355.         }
  356.         // envoyer le menu
  357.         foreach($menu_person as $k=>$v) {
  358.             // ajoute la class
  359.             $menu_person[$k]['classcolor'] = ' menu_'.$k;
  360.         }
  361.         $key_menu_person array_keys($menu_person);
  362.         $first reset($key_menu_person);
  363.         $menu_person[$first]['first'] = true;
  364.         $this->view->menu_person $menu_person;
  365.     }
  366.     // }}}
  367.     // {{{ finalizeAction()
  368.     /** Après l'action, construit le titre de page et le fil d'arianne
  369.      *
  370.      *
  371.      * @access protected
  372.      * @return void
  373.      */
  374.     protected function finalizeAction()
  375.     {
  376.         // construction du menu
  377.         $this->buildMenu();
  378.         if (!empty($this->extra_title)) {
  379.             $this->title_page .= $this->extra_title.' - '.$this->infosperson['fullname'];
  380.         } else if (!empty($this->current['title'])){
  381.             $this->title_page .= $this->current['title'];
  382.         } else {
  383.             $this->title_page .= $this->infosperson['fullname'];
  384.         }
  385.         // titre de la page
  386.         $this->title_page .= ', actualités, textes, spectacles, vidéos, tous ses liens avec la scène';
  387.         // situation
  388.         $this->locate = array('/biographies/' => 'Biographies');
  389.         // rubrique (pour le menu principal)
  390.         $this->rub_courante 'biographies';
  391.         // complément du fil d'arianne
  392.         if (empty($this->is_accueil)) {
  393.             if (empty($this->extra_locate) && !empty($this->current['nom'])) {
  394.                 $this->extra_locate $this->current['nom'];
  395.             }
  396.             // on ajoute la sous-rubrique actuelle
  397.             $this->locate[$this->url_folder.'/'] = $this->infosperson['fullname'];
  398.             $this->locate[0] = $this->extra_locate;
  399.         } else {
  400.             // à l'accueil, on ne précise pas la sous-rubrique
  401.             $this->locate[0] = $this->infosperson['fullname'];
  402.             $this->view->is_accueil true;
  403.         }
  404.         // envoi au template
  405.         $this->view->data_person $this->infosperson;
  406.         foreach($this->infosperson as $key=>$value) {
  407.             if ($key=='datestart') {
  408.                 $this->view->birth_year $value;
  409.             } elseif ($key=='dateend') {
  410.                 $this->view->death_year $value;
  411.             } else {
  412.                 $this->view->$key $value;
  413.             }
  414.         }
  415.         // autres infos pour mon theatre
  416.         $mtinfos = array(
  417.             'object' => 'persons',
  418.             'idobject' => $this->idperson,
  419.             'urifrom' => $this->url_folder.'/',
  420.             'info_rub' => 'cette biographie'
  421.         );
  422.         $this->view->mtinfos $mtinfos;
  423.         // widget
  424.         $this->view->barre_infos[] = array(
  425.             'url' => $this->url_folder.'/gadget',
  426.             'title' => 'widget',
  427.             'icone' => 'add_icon',
  428.         );
  429.         // voir si l'objet est bookmarke
  430.         $bookmark $this->em->getRepository(BookmarkExtranetuser::class);
  431.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')
  432.             && $bookmark->isBookmark($this->idperson,'persons',$this->context['session']->getIdextranetuser())) {
  433.             $this->view->is_bookmark true;
  434.         }
  435.         // action add/delete bookmark
  436.         if (isset($_GET['bookmark'])) {
  437.             $this->view->bookmark true;
  438.             $do_action $_GET['do_action'];
  439.             $this->view->$do_action true;
  440.         }
  441.         if (empty($this->current['idcontent'])) {
  442.             $this->current['idcontent'] = null;
  443.         }
  444.         // statistique de visite
  445.         //@TODO temporaire à supprimer pour la V2
  446.         if (!empty($this->idperson) && !$this->no_stats) {
  447.             $statsinfos = array(
  448.                 'type' => 'article',
  449.                 'module' => $this->context['module'],
  450.                 'url' => $_SERVER['REQUEST_URI'],
  451.                 'idcontent' => (int)$this->current['idcontent'],
  452.                 'object' => 'persons',
  453.                 'idobject' => $this->idperson,
  454.                 'video' => (int)(!empty($this->view->detailarticle['display_media']))
  455.             );
  456.             $stats $this->em->getRepository(Stats::class);
  457.             $stats->setStats($statsinfos__FILE__.':'.__LINE__);
  458.         }
  459.         // pour les liens dans le template
  460.         $this->view->url_folder $this->url_folder;
  461.         $this->context['view']->info_person true;
  462.         // aside
  463.         $this->view->aside $this->asides->view($this->view);
  464.         // fil d'arianne
  465.         $this->view->locate $this->getLocate();
  466.         if (empty($this->view->reseaux['fb']) && !isset($this->view->meta_video)){
  467.             $this->setReseauSocial();
  468.         }
  469.         $this->addPubliciteGoogle();
  470.     }
  471.     // }}}
  472.     // {{{ getInfosTextPerson()
  473.     /** TODO: getInfosTextPerson description
  474.      *
  475.      *
  476.      * @param  mixed $texts
  477.      * @access protected
  478.      * @return void
  479.      */
  480.     //protected function getInfosTextPerson($texts) {
  481.     public function getInfosTextPerson($texts,$format=array()) {
  482.         $derniers_textes $texts->getInfosTextRow();
  483.         $derniers_textes['publisher_first'] = true;
  484.         $derniers_textes['stylemore'] = $this->stylemore_text;
  485.         if (isset($texts->publisher_country)) {
  486.             $derniers_textes['publisher']['country'] = $texts->getNameCountry($texts->publisher_country,$GLOBALS['lng']);
  487.         }
  488.         if (empty($format)) {
  489.             $format = array('width'=>$_ENV['VIGN_TEXT_WIDTH'],'height'=>$_ENV['VIGN_TEXT_HEIGHT'],'direction'=>'thumb');
  490.         }
  491.         $derniers_textes['vignette'] = $texts->getVignetteText($texts->idtext,$format);
  492.         return $derniers_textes;
  493.     }
  494.     // }}}
  495.     // {{{ getRowSpectacle()
  496.     /** TODO: getRowSpectacle description
  497.      *
  498.      *
  499.      * @param  mixed $spectacles
  500.      * @param  mixed $format
  501.      * @access protected
  502.      * @return void
  503.      */
  504.     protected function getRowSpectacle($spectacles$format$widget false)
  505.     {
  506.         $tp = array();
  507.         $sexe = ($this->infosperson['sexe']==2) ? 'female' 'male';
  508.         // infos sur le spectacle
  509.         $idspectacle $spectacles->idspectacle;
  510.         $sp $spectacles->getInfosSpectacleRow($format);
  511.         //wjdget
  512.         if (!$widget){
  513.             $sp $spectacles->clearSpectaclesAddAllPersons($sp);
  514.         }
  515.         // trouver les roles de la personne
  516.         // auteur si dans array auteurs
  517.         if (empty($sp['textfictif']) && !$sp['textfictif']) {
  518.             if ((!empty($sp['allpersons']) && array_key_exists($this->idperson$sp['allpersons'])) || (!empty($sp['allauthors']) && array_key_exists($this->idperson$sp['allauthors']))) {
  519.                 //Il ne faut pas qu'il y ait l'attribut "rôles".
  520.                 if (empty($sp['allpersons'][$this->idperson]['roles'])) {
  521.                     if ($sp['idtypespectacle']['idtypespectacle'] == 2) {
  522.                         if ($sexe == 'female') {
  523.                             $tp[]['role'] = 'Adaptatrice';
  524.                         } else {
  525.                             $tp[]['role'] = 'Adaptateur';
  526.                         }
  527.                     } else {
  528.                         if ($sexe == 'female') {
  529.                             $tp[]['role'] = 'Auteure';
  530.                         } else {
  531.                             $tp[]['role'] = 'Auteur';
  532.                         }
  533.                     }
  534.                 }
  535.             }
  536.         }
  537.         // traduction si idperson dans quoi dans la liste des traducteurs du texte du spectacle ?
  538.         // il faut deja que type texte soit 1
  539.         if ($sp['idtypespectacle']['idtypespectacle']==&& (!empty($sp['allpersons']) || !empty($sp['allauthors']))){
  540.             // test textes du spectacles
  541.             /*foreach($sp['allauthors'] as $k=>$v) {
  542.                 $idtexts[] = $v['idtext'];
  543.             }*/
  544.             $sql 'SELECT COUNT(DISTINCT(ts.idspectacle))
  545.                 FROM text_spectacle ts
  546.                 WHERE 1
  547.                 AND ts.idspectacle='.$idspectacle.'
  548.                 AND ts.idtext IN (
  549.                         SELECT idtext
  550.                         FROM text_translator
  551.                         WHERE 1
  552.                         AND idperson='.$this->idperson.'
  553.                         )';
  554.             $trad $spectacles->queryOne($sql);
  555.             if ($trad>0) {
  556.                 $tp[]['role'] = 'Traduction';
  557.             }
  558.         }
  559.         // si c'est un collage, il est possible que la personne soit l'auteur ou le traducteur d'un des texts
  560.         // autre si dans spectacle_person
  561.         $sql 'SELECT sp.idrole,r.role_male,r.role_female,lg.'.$this->context['lng'].'
  562.             FROM spectacle_person sp, roles r, langterms lg
  563.             WHERE 1
  564.             AND sp.idrole=r.idrole
  565.             AND r.role=lg.id
  566.             AND sp.idspectacle='.$idspectacle.'
  567.             AND sp.idperson='.$this->idperson;
  568.         $roles $spectacles->queryAll($sql);
  569.         if (!empty($roles)) {
  570.             $roles_count count($roles);
  571.             for($s 0$roles_count>$s$s++) {
  572.                 $tp[]['role'] = $roles[$s]['role_'.$sexe];
  573.             }
  574.         }
  575.         $sp['roles'] = $this->persons->noPunct($tp);
  576.         $sp['stylemore'] = $this->stylemore_spectacle;
  577.         return $sp;
  578.     }
  579.     // }}}
  580.     // {{{ action_captations()
  581.     /** Captations de la page contact
  582.      *
  583.      * @Route("/biographies/{slug}/captations", name="biographie_captations")
  584.      * @Route("/biographies/{slug}/captations/filtre/{p_filtre}", name="biographie_captations_p_filtre")
  585.      * @Route("/biographies/{slug}/captations/type/{p_type}", name="biographie_captations_p_type")
  586.      *
  587.      * @access public
  588.      * @return void
  589.      */
  590.     public function action_captations($slug null$execute_corps true$p_filtre null$p_type null)
  591.     {
  592.         $this->context['params']['filtre'] = $p_filtre;
  593.         $this->context['params']['type'] = $p_type;
  594.         if (!is_null($slug) && $execute_corps){
  595.             $this->InitController($slug'videos');
  596.         }
  597.         $podcasts $this->em->getRepository(Podcasts::class);
  598.         $format_vignette = array('width'=>480,'direction'=>'thumb');
  599.         $filtre_vod = [
  600.             'vod' => [
  601.                 'type' => 1
  602.             ],
  603.             'svod' => [
  604.                 'type' => 2
  605.             ]
  606.         ];
  607.         $filtre_culturebox = [
  608.             'all' => [
  609.                 'name' => 'Toutes les captations en ligne',
  610.                 'key_type' => 'all'
  611.             ],
  612.             'derniere-chance' => [
  613.                 'name' => 'Dernière chance',
  614.                 'key_type' => 'derniere-chance'
  615.             ],
  616.             'captations-a-venir' => [
  617.                 'name' => 'Captations à venir',
  618.                 'key_type' => 'captations-a-venir'
  619.             ]
  620.         ];
  621.         $filtre = (!empty($this->context['params']['filtre']) && array_key_exists($this->context['params']['filtre'], $filtre_culturebox)) ? $this->context['params']['filtre'] : 'all';
  622.         $type = (!empty($this->context['params']['type']) && array_key_exists($this->context['params']['type'], $filtre_vod)) ? $this->context['params']['type'] : null;
  623.         $culturebox_params = array(
  624.             'limit' => ($filtre == 'derniere-chance') ? array(0,4) : array(0,200),
  625.             'special' => array(
  626.                 'type_podcast' => 'culturebox'//commun
  627.                 'is_integrale' => true//commun
  628.                 'idpersons' => array('idperson' => $this->idperson)
  629.             ),
  630.             'dbg' => array('culturebox_data''Les replay culturebox'),
  631.         );
  632.         if (!is_null($type)){
  633.             $culturebox_params['special']['type_diffusion'] = $filtre_vod[$type]['type'];
  634.             $this->view->subaside_action $type;
  635.         } else{
  636.             $culturebox_params['special']['current'] = true;
  637.         }
  638.         //prochains
  639.         $culturebox_params_opts['captations-a-venir']['special']['next'] = true;
  640.         //last chance
  641.         $culturebox_params_opts['derniere-chance']['special']['lastchance'] = true;
  642.         $culturebox_params_opts['derniere-chance']['special']['current'] = true;
  643.         foreach($filtre_culturebox AS $k => $v){
  644.             if (isset($culturebox_params_opts[$k])){
  645.                 $culturebox_params_counts array_merge_recursive($culturebox_params$culturebox_params_opts[$k]);
  646.                 $filtre_culturebox[$k]['count'] = $podcasts->countListPodcasts($culturebox_params_counts);
  647.             }
  648.         }
  649.         $this->context['view']->filtre_culturebox $filtre_culturebox;
  650.         if (!$execute_corps){
  651.             return true;
  652.         }
  653.         if (isset($culturebox_params_opts[$filtre])){
  654.             if ($filtre_culturebox[$filtre]['count'] > 0){
  655.                 $culturebox_params array_merge_recursive($culturebox_params$culturebox_params_opts[$filtre]);
  656.             }
  657.             else{
  658.                 return $this->redirectToRoute('contact_captations_p_type', ['slug' => $this->context['view']->url_clean'p_type' => 'all']);
  659.             }
  660.         }
  661.         $this->context['view']->list_captations $podcasts->getListPodcasts($culturebox_params,$format_vignette);
  662.         $arrays_contacts = [];
  663.         foreach($this->context['view']->list_captations AS $value){
  664.             if (!empty($value['podcast_contact'])){
  665.                 foreach($value['podcast_contact'] AS $key => $contact){
  666.                     $arrays_contacts[$key] = $contact;
  667.                 }
  668.             }
  669.         }
  670.         usort($arrays_contacts, function($a$b) {return strcmp($a['organisation'], $b['organisation']);});
  671.         $this->view->contacts_partenaires $arrays_contacts;
  672.         // compter le nombre totale de captations intégrales
  673.         $this->context['view']->nb_podcasts $podcasts->countPodcasts();
  674.         if ($filtre == 'all'){
  675.             $this->context['view']->is_all_captation true;
  676.         }
  677.         if ($filtre == 'derniere-chance'){
  678.             $this->context['view']->is_last_chance true;
  679.         }
  680.         if ($filtre == 'captations-a-venir'){
  681.             $this->context['view']->is_future_captation true;
  682.         }
  683.         $this->context['view']->type_spectacle null;
  684.         $this->context['view']->subaside_action_view 'type/' $type;
  685.         $this->getAsidesVideos('captations',null$filtre);
  686.         // titre de la page
  687.         $title_page 'Captation culturebox';
  688.         $rub_courante 'culturebox';
  689.         $this->view->locate = array(
  690.             => $title_page,
  691.         );
  692.         return $this->view('biographies/captations.html.twig');
  693.     }
  694.     // {{{ action_podcasts()
  695.     /** liste de lecture
  696.      *
  697.      * @Route("/biographies/{slug}/podcasts/", name="biogrpahie_podcasts")
  698.      * @Route("/biographies/{slug}/podcasts/emission/{pemission}", name="biogrpahie_podcasts_p_emission")
  699.      *
  700.      * @access public
  701.      * @return void
  702.      */
  703.     public function action_podcasts($slug null$pemission null)
  704.     {
  705.         $this->context['params']['emission'] = $pemission;
  706.         $this->InitController($slug'podcasts');
  707.         $podcasts $this->em->getRepository(Podcasts::class);
  708.         $format_vignette = array('width'=>480,'direction'=>'thumb');
  709.         // Culturebox => les derniers référencés
  710.         $culturebox_params = array(
  711.             'direction' => 'DESC',
  712.             'limit' => array(0,20),
  713.             'special' => array(
  714.                 'idpersons' => $this->idperson,
  715.                 'type_podcast' => 'franceculture'
  716.             ),
  717.             'dbg' => array('derniers_culturebox_current''Les replay France Culture référencés'),
  718.         );
  719.         $culturebox_params['special']['type_franceinter'] = null//Pour France Culture
  720.         $countFranceCulture $podcasts->countListPodcasts($culturebox_params);
  721.         $culturebox_params['special']['type_franceinter'] = 1;
  722.         $countFranceInter $podcasts->countListPodcasts($culturebox_params);
  723.         unset($culturebox_params['special']['type_franceinter']);
  724.         $culturebox_params['special']['type_podcast'] = 'soundcloud';
  725.         $countSoundCloud $podcasts->countListPodcasts($culturebox_params);
  726.         $filtres_emissions = [
  727.             'franceculture' => [
  728.                 'name' => 'France Culture',
  729.                 'count' => $countFranceCulture,
  730.                 'params' => null,
  731.                 'type' => 'franceculture'
  732.             ],
  733.             'franceinter' => [
  734.                 'name' => 'France Inter',
  735.                 'count' => $countFranceInter,
  736.                 'params' => 1,
  737.                 'type' => 'franceinter'
  738.             ],
  739.             'soundcloud' => [
  740.                 'name' => 'Soundcloud',
  741.                 'count' => $countSoundCloud,
  742.                 'type' => 'soundcloud'
  743.             ]
  744.         ];
  745.         $curseur null;
  746.         if (!empty($this->context['params']['emission']) && array_key_exists($this->context['params']['emission'], $filtres_emissions)){
  747.             $curseur $this->context['params']['emission'];
  748.             $culturebox_params['special']['type_podcast'] = 'franceculture';
  749.             if (array_key_exists('params'$filtres_emissions[$curseur])){
  750.                 $culturebox_params['special']['type_franceinter'] = $filtres_emissions[$curseur]['params'];
  751.             }
  752.             else{
  753.                 $culturebox_params['special']['type_podcast'] = 'soundcloud';
  754.             }
  755.         }
  756.         else{
  757.             unset($culturebox_params['special']['type_franceinter']);
  758.             $culturebox_params['special']['type_podcast'] = ['franceinter''soundcloud'];
  759.         }
  760.         $countFranceInterPagination $podcasts->countListPodcasts($culturebox_params);
  761.         $this->context['view']->pagination $this->getPagination($countFranceInterPagination20);
  762.         $this->context['view']->pagination['totalItems'] = $countFranceInterPagination;
  763. //        $this->context['view']->pagination['spectacle'] = true;
  764.         $culturebox_params['limit'] = array($this->getLimitStart(),$this->perPage);
  765.         $this->context['view']->list_captations $podcasts->getListPodcasts($culturebox_params,$format_vignette);
  766.         $this->asides->load(['url_lists' => array(
  767.             'exec' => [
  768.                 'htmlstart' => true,
  769.                 'alone' => false
  770.             ],
  771.             'php' => array(
  772.                 'method' => 'asidesUrlLists',
  773.                 'urls' => [
  774.                     [
  775.                         'name' => 'Toutes les émissions'
  776.                     ]
  777.                 ],
  778.                 'url' => '/biographies/{v_url_clean}/podcasts/',
  779.                 'params' => array(
  780.                     'activate' => (is_null($curseur)) ? true false
  781.                 )
  782.             ),
  783.             'title' => 'écouter'
  784.         )]);
  785.         $this->asides->load(['url_lists,tst' => array(
  786.             'exec' => [
  787.                 'htmlend' => true,
  788.                 'alone' => false
  789.             ],
  790.             'php' => array(
  791.                 'method' => 'asidesUrlLists',
  792.                 'urls' => $filtres_emissions,
  793.                 'url' => '/biographies/{v_url_clean}/podcasts/emission/key_type',
  794.                 'params' => array(
  795.                     'key_type' => 'auto_key',
  796.                     'activate' => $curseur
  797.                 )
  798.             ),
  799.             'title' => 'Trier'
  800.         )]);
  801.         if ($countFranceCulture){
  802.             $this->asides->load(['bio_franceculture' => [ 'noactive' => true ]]);
  803.         }
  804.         //Pour France Inter
  805.         if ($countFranceInter){
  806.             $this->asides->load([
  807.                 'contact_franceculture_menu,franceinter' => [
  808.                     'custom_url_clean' => 'France-Inter',
  809.                     'title_custom' => 'France Inter',
  810.                     'logo_custom' => 'france-inter'
  811.                 ]
  812.             ]);
  813.         }
  814.         $this->asides->load('common_participer_personne');
  815.         $this->asides->load('bio_formation');
  816.         return $this->view('biographies/podcasts.html.twig');
  817.     }
  818.     // }}}
  819.     // {{{ action_playlist()
  820.     /** liste de lecture
  821.      *
  822.      * @Route("/biographies/{slug}/playlist/id/{p_id}/", name="biographie_playlist")
  823.      * @Route("/biographies/{slug}/playlist/id/{p_id}/video/{p_video}", name="biographie_playlist_video")
  824.      *
  825.      * @access public
  826.      * @return void
  827.      */
  828.     public function action_playlist_biographie($slug null$p_id null$p_video null)
  829.     {
  830.         $this->context['params']['id'] = $p_id;
  831.         $this->context['params']['video'] = $p_video;
  832.         $this->InitController($slug'playlist');
  833.         if (empty($this->idperson)) {
  834.             return $this->redirectToRoute('erreur_type', ['type' => 'introuvable']);
  835.         }
  836.         $this->view->controller $this->context['controller'] = 'biographies';
  837.         $params_display = array(
  838.             'limitmultimedias' => array('all')
  839.         );
  840.         $route parent::action_playlist($params_display);
  841.         if ($route != null) {
  842.             return $route;
  843.         }
  844.         //aside
  845.         $this->asides->load('playlists_aside');
  846.         return $this->view('biographies/playlist.html.twig');
  847.     }
  848.     // }}}
  849.     // {{{ action_ensavoirplus()
  850.     /** ensavoirplus
  851.      *
  852.      * @Route("/biographies/{slug}/ensavoirplus/idcontent/{idcontent}", name="biographie_ensavoirplus")
  853.      * @Route("/biographies/{slug}/ensavoirplus/idcontent/{idcontent}/pdf/{p_pdf}", name="biographie_ensavoirplus_pdf")
  854.      * @Route("/biographies/{slug}/ensavoirplus/idcontent/{idcontent}/pdf/{p_pdf}/download/{p_download}", name="biographie_ensavoirplus_pdf_download")
  855.      *
  856.      * @access public
  857.      * @return void
  858.      */
  859.     public function action_ensavoirplus($slug null$idcontent$aside true$default_content false$p_pdf null$p_download null)
  860.     {
  861.         // objet contents
  862.         $this->contents $this->em->getRepository(Contents::class);
  863.         if (!is_null($idcontent)){
  864.             $this->context['params']['idcontent'] = $idcontent;
  865.             $this->view->idcontentCurrent $idcontent;
  866.         }
  867.         if ($aside){
  868.             $this->setParamsPDF($p_pdf$p_download);
  869.             $this->InitController($slug'ensavoirplus');
  870.         }
  871.         $this->extra_locate $this->extra_title 'En savoir +';
  872.         $bioarticles $this->contents->getAssociateContent($this->idperson,'persons','class_article');
  873.         if (!empty($bioarticles['text'])) {
  874.             $this->view->bioarticles $bioarticles;
  875.             if ($default_content){
  876.                 return $this->redirectToRoute('biographie_ensavoirplus', ['slug' => $this->infosperson['url_clean'], 'idcontent' => $bioarticles['idcontent']]);
  877.             }
  878.         }
  879.         $this->contenus_biographie('class_article','ensavoirplus',array(),array('limit' => 'all'));
  880.         if ($aside) {
  881.             if (!empty($this->context['params'])) {
  882.                 $params $this->context['params'];
  883.             }
  884.             if (isset($params) && (!empty($params['idcontent']) || my_is_int($params['idcontent']))) {
  885.                 $this->context['view']->bioarticles $this->em->getRepository(Contents::class)->getInfosContent($params['idcontent'], ['wiki_convert' => true'get_files' => true]);
  886.             } else if (!empty($this->context['view']->list_captations)) {
  887.             } else {
  888.                 return $this->redirect('/biographies/' $this->context['view']->url_clean '/presentation/');
  889.             }
  890.             //Gestion du réseau social custom
  891.             if (!empty($this->view->detailarticle['deck'])) {
  892.                 $description_html $this->view->detailarticle['deck'];
  893.             } else {
  894.                 $description_html $this->view->detailarticle['text'];
  895.             }
  896.             $url $_ENV['URL_THNET'] . '/biographies/' $this->infosperson['url_clean'] . '/' $this->context['action'] . '/idcontent/' $this->view->detailarticle['idcontent'];
  897.             $title $this->view->detailarticle['title'] . ' - ' $this->infosperson['fullname'];
  898.             $this->setReseauSocial($title$description_html$url);
  899.             $this->setAsidesCommunEnSavoirPlus();
  900.             //Réservé à Jean-Luc Lagarce
  901.             if ($this->idperson == 3) {
  902.                 $this->asides->load('bio_lettre_lagarce');
  903.             }
  904.             $this->checkConditionsPDF();
  905.             return $this->view('biographies/ensavoirplus.html.twig');
  906.         }
  907.     }
  908.     // }}}
  909.     // {{{ action_biographie()
  910.     /** biographie
  911.      *
  912.      * @Route("/biographies/{slug}/", name="biographie_biographie")
  913.      * @Route("/biographies/{slug}/biographie/", name="biographie_biographie_current")
  914.      *
  915.      * @access public
  916.      * @return void
  917.      */
  918.     public function action_biographie($slug null)
  919.     {
  920.         $this->InitController($slug'biographie');
  921.         if (empty($this->idperson)) {
  922.             return $this->redirectToRoute('erreur_type', ['type' => 'introuvable']);
  923.         }
  924.         $this->is_accueil true;
  925.         // page en cours
  926.         $this->view->from_page $this->url_folder.'/';
  927.         //Si la description existe nous l'affichons
  928.         if (!empty($this->infosperson['biotxt']['text'])) {
  929.             //On donne à texte le contenu de la description
  930.             $text $this->infosperson['biotxt']['text'];
  931.             // mots-clés et description
  932.             $this->func->makeMetaFromHtml($this->infosperson['biotxt']['text'], $this->meta_description$this->meta_keywords);
  933.         }
  934.         //Si la description n'existe pas, nous vérifions qu'un contenu avec la classification CORVIN et en récupérons son contenu
  935.         else if (!empty($associateContent $this->contents->getAssociateContents($this->idperson,'persons',206))){
  936.             $corvin_id reset($associateContent);
  937.             $corvin $this->em->getRepository(Contents::class)->getInfosContent($corvin_id[0]['idcontent'],['wiki_convert' => true]);
  938.             //On donne à texte le contenu de corvin
  939.             $text $corvin['deck'];
  940.             // mots-clés et description
  941.             $this->func->makeMetaFromHtml($corvin['text'], $this->meta_description$this->meta_keywords);
  942.         }
  943.         //Si texte dépasse 302 caractères on y applique différents filtres
  944.         if (!empty($text)){
  945.             if (strlen($text) > 302){
  946.                 $html substr($text0302);
  947.                 $search = array('@<[\/\!]*?[^<>]*?>@si',          // suppression HTML tags
  948.                     '@[[:space:]\n\r]+@sm',           // suppression espaces et sauts de lignes
  949.                 );
  950.                 $text preg_replace($search' '$html); // on remplace par des espaces
  951.                 $text preg_replace('@[[:space:]\n\r]+@sm'' '$text); // on ne conserve qu'un seul espace
  952.             }
  953.             //On affiche la valeur de texte
  954.             $this->infosperson['biotxt']['text_cut'] = html_entity_decode(strip_tags($text), ENT_COMPAT'utf-8');
  955.         }
  956.         $files $this->em->getRepository(Files::class);
  957.         $files->setPublishStatus($this->publish_status);
  958.         $photos_person $files->getObjectFiles($this->idperson,'persons','class_photo_person');
  959.         $format_vignette_person = array('width'=>220,'height'=>'180','direction'=>'L');
  960.         if (!empty($photos_person)) {
  961.             // creation d'une vignette
  962.             foreach($photos_person as $k=>$v) {
  963.                 $photos_person[$k]['vignette'] = $this->persons->getVignettePerson($this->idperson,$format_vignette_person);
  964.             }
  965.             $this->view->photos $photos_person;
  966.         }
  967.         if (!empty($this->infosperson['biotxt']['text'])) {
  968.             $this->view->biotxt $this->infosperson['biotxt'];
  969.             if (strlen($this->view->biotxt['text']) > 150){
  970.                 $this->view->biotxt['text_cut'] = substr($this->view->biotxt['text'], 0150);
  971.             }
  972.             // mots-clés et description
  973.             $this->func->makeMetaFromHtml($this->infosperson['biotxt']['text'], $this->meta_description$this->meta_keywords);
  974.         }
  975.         //Les deux prochains spectacles avec vidéos à l'affiche
  976.         if ($lists_spectacles $this->getSpectaclesPerson()){
  977.             $params_sql_spectacles = array(
  978.                 'params' => array(
  979.                     'groupby' => 's.idspectacle',
  980.                     'order' => ['creation_date''DESC'],
  981.                     'limit' => array(0,2)
  982.                 ),
  983.                 'special' => array(
  984.                     // 'idperson_author' => true,
  985.                     // 'idperson_idtexts' => $this->idtexts_person,
  986.                     'multimedias_videos_associes' => true,
  987.                     'idspectacle' => $lists_spectacles,
  988.                     'prochains' => '720'
  989.                 ),
  990.                 'dbg' => array('nb_spectacles_author''Les spectacles à partir des textes de la personne')
  991.             );
  992.             $listes  $this->em->getRepository(Spectacles::class)->getListSpectacles($params_sql_spectacles);
  993.             $set_format = array('width'=>$_ENV['VIGN_VIDEO_WIDTH'],'height'=>$_ENV['VIGN_VIDEO_HEIGHT'],'fleche'=>'none','ratio' => '169');
  994.             foreach($listes AS $idspectacle => $spectacle){
  995.                 $multimediass $this->em->getRepository(Multimedias::class);
  996.                 $videos[$idspectacle] = $multimediass->getInfosMultimedia($spectacle['idmultimedia'],false,false,array('vignette' => $set_format'tableau'=>true));
  997.                 $spectacle['schedule'] = $this->em->getRepository(Spectacles::class)->getProchDateLieu(
  998.                     array(),
  999.                     $spectacle['idspectacle']
  1000.                 );
  1001.                 $videos[$idspectacle]['spectacle'] = $spectacle;
  1002.             }
  1003.             if (!empty($videos)){
  1004.                 $this->view->spectacles_videos_affiche $videos;
  1005.             }
  1006.         }
  1007.         $this->context['view']->schedules_dates_demains_par_mois $this->getSpectaclesPremieres(['limit' => [0,3]]);
  1008.         $this->context['view']->schedules_dates_premieres_light_templates true;
  1009.         // trouver 7 prochains évènements
  1010.         // si pas de 7 prochains, trouver 7 anciens
  1011.         $news $this->em->getRepository(News::class);
  1012.         $news_params = array(
  1013.             'params' => array(
  1014.                 'limit' => array(0,7),
  1015.                 'order' => 'T3.date DESC',
  1016.             ),
  1017.             'special' => array(
  1018.                 'publish_valid' => true,
  1019.                 'by_object' => array('idperson' => $this->idperson),
  1020.             ),
  1021.             'dbg' => array('derniers_news''Les derniers/prochains évènements'),
  1022.         );
  1023.         //foreach(array('news','spectacles') as $t) {
  1024.         foreach(array('news') as $t) {
  1025.             $news_list = array();
  1026.             $news_params['special']['type_news'] = $t;
  1027.             foreach(array('prochains','anciens') as $d) {
  1028.                 $news_params['special'][$d] = true;
  1029.                 $news_params['dbg'] = array('essai'.$d'Pour '.$d);
  1030.                 // si ancien, seulement 3
  1031.                 if ($d=='anciens') {
  1032.                     $news_params['params']['limit' ] = array(0,3);
  1033.                 }
  1034.                 $news_list[$d] = $news->getListNews($news_params);
  1035.                 if (!empty($news_list[$d])) {
  1036.                     $this->view->{'is_news_list_'.$t} = true;
  1037.                 }
  1038.                 unset($news_params['special'][$d]);
  1039.             }
  1040.             if (!empty($news_list['prochains'])) {
  1041.                 $news_list['prochains'] = array_reverse($news_list['prochains'], true);
  1042.             }
  1043.             $this->view->{'news_list_'.$t} = $news_list;
  1044.         }
  1045.         //Les deux dernières vidéos des textes par l'auteur
  1046.         $this->context['view']->textes_auteurs $this->em->getRepository(Playlists::class)->getListPlaylists(array(
  1047.             'limit' => array(0,2),
  1048.             'special' => array(
  1049.                 'idclassifications' => 144// class_texte_parauteur //
  1050.                 'idtext' => explode(','$this->idtexts_person), // les texts de la personne
  1051.             ),
  1052.             'dbg' => array('list_playlists','Playlist texte par l\'auteur'),
  1053.         ));
  1054.         if (!empty($this->context['view']->textes_auteurs)) {
  1055.             foreach($this->context['view']->textes_auteurs as $k=>$v) {
  1056.                 // le lien vers le contenu directement
  1057.                 if (!empty($v['idtext'])) {
  1058.                     foreach($v['idtext'] as $t) {
  1059.                         $this->context['view']->textes_auteurs[$k]['nameview'] = $t['title'];
  1060.                         $this->context['view']->textes_auteurs[$k]['other_url_clean'] = '/textes/'.$t['url_clean'].'/playlist/id/'.$v['urlClean'];
  1061.                     }
  1062.                 }
  1063.             }
  1064.         }
  1065.         // Culturebox => les derniers référencés
  1066.         $culturebox_params = array(
  1067.             'limit' => array(0,1),
  1068.             'special' => array(
  1069.                 'idpersons' => array('idperson' => $this->idperson),
  1070.                 'type_podcast' => 'culturebox',
  1071.                 // 'current' => true,
  1072.             ),
  1073.             'dbg' => array('derniers_culturebox''Les derniers replay culturebox référencés'),
  1074.         );
  1075.         $format_vignette = array('width'=>480,'direction'=>'thumb');
  1076.         $this->context['view']->derniers_culturebox_gratuit $this->em->getRepository(Podcasts::class)->getListPodcasts($culturebox_params,$format_vignette);
  1077.         $culturebox_params['special']['type_diffusion'] = 1;
  1078.         $this->context['view']->derniers_culturebox_vod $this->em->getRepository(Podcasts::class)->getListPodcasts($culturebox_params,$format_vignette);
  1079.         $culturebox_params['special']['type_diffusion'] = 2;
  1080.         $this->context['view']->derniers_culturebox_svod $this->em->getRepository(Podcasts::class)->getListPodcasts($culturebox_params,$format_vignette);
  1081.         //Les prochaines dates
  1082.         if (!empty($this->ids_spectacle_all)) {
  1083.             $schedules $this->em->getRepository(Schedules::class);
  1084.             $biographies_dates_demains $schedules->getDateBySpectaclesDemain($this->ids_spectacle_all3);
  1085.             $calendrier_listes_spectacles = [];
  1086.             foreach ($biographies_dates_demains AS $k => $v) {
  1087.                 foreach ($biographies_dates_demains[$k]['datas'] AS $idata => $data) {
  1088.                     $idspectacle $data['idspectacle'];
  1089.                     if (empty($calendrier_listes_spectacles[$idspectacle])) {
  1090.                         $calendrier_listes_spectacles[$idspectacle] = $this->em->getRepository(Spectacles::class)->getInfosSpectacle($data['idspectacle'], ['get_vignette' => true]);
  1091.                     }
  1092.                     $biographies_dates_demains[$k]['datas'][$idata]['spectacle'] = $calendrier_listes_spectacles[$idspectacle];
  1093.                 }
  1094.             }
  1095.             unset($calendrier_listes_spectacles);
  1096.             $this->context['view']->schedules_dates_demains $biographies_dates_demains;
  1097.         }
  1098.         $liste_videos_dernieres $this->getMultimediasPerson(array(
  1099.             'limit' => array(0,4)
  1100.         ));
  1101.         $params_display = array(
  1102.             'tableau' => true,
  1103.             'vignette' => array('width'=>$_ENV['VIGN_VIDEO_WIDTH'],'height'=>$_ENV['VIGN_VIDEO_HEIGHT'],'fleche'=>'none','ratio' => '169'),
  1104.             'display' => array('no_footer' => true'videos_169_format' => true)
  1105.         );
  1106.         foreach($liste_videos_dernieres as $item) {
  1107.             $idmultimedia $item['idmultimedia'];
  1108.             $multimedias $this->em->getRepository(Multimedias::class);
  1109.             $this->view->dernieres_videos[$idmultimedia] = $multimedias->getInfosMultimedia($idmultimedia,false,false,$params_display);
  1110.         }
  1111.         // classe des Textes/Traductions
  1112.         $texts $this->em->getRepository(Texts::class);
  1113.         // selection commune
  1114.         $from_txt 'DISTINCT(t.idtext),t.title,t.url_clean,c.organisation,
  1115.                      c.url_clean as url_clean_publisher, c.country as publisher_country,
  1116.                      CONCAT_WS(\'-\',t.publication_year,t.publication_month,\'01\') as datepublication,
  1117.                      t.publication_month,t.publication_year,t.date as datewrite,t.textorder';
  1118.         //{if:derniers_textes}
  1119.         // derniers textes publiés
  1120.         $sql_derniers_textes '
  1121.             SELECT '.$from_txt.'
  1122.             FROM texts t, contacts c, text_author ta
  1123.             WHERE 1
  1124.             AND ta.idtext=t.idtext
  1125.             AND c.idcontact=t.idcontact_publisher
  1126.             AND ta.idperson='.$this->idperson.'
  1127.             AND t.type=0
  1128.             AND t.publish=1 ORDER BY datepublication DESC LIMIT 0,2';
  1129.         $texts->query($sql_derniers_textes);
  1130.         $derniers_textes = array();
  1131.         while($texts->fetch()) {
  1132.             $derniers_textes[$texts->idtext] = $this->getInfosTextPerson($texts);
  1133.         }
  1134.         $this->view->derniers_textes $derniers_textes;
  1135.         // {if:derniers_traductions_publi}
  1136.         // dernieres traductions publies d'un texte de l'auteur (traductions : titre, titre original, langue, langue originale, pays, année)
  1137.         $sql_derniers_traductions_publi '
  1138.             SELECT '.$from_txt.', t.type
  1139.             FROM text_traduction tt, texts t
  1140.             LEFT OUTER JOIN contacts c ON c.idcontact=t.idcontact_publisher
  1141.             WHERE 1
  1142.             AND tt.idtexttraduction=t.idtext
  1143.             AND t.publish=1
  1144.             AND tt.idtext IN (
  1145.                 SELECT idtext
  1146.                 FROM text_author
  1147.                 WHERE idperson='.$this->idperson.'
  1148.                 )
  1149.             ORDER BY datepublication DESC LIMIT 0,2';
  1150.         $texts->query($sql_derniers_traductions_publi);
  1151.         $derniers_traductions_publi = array();
  1152.         while($texts->fetch()) {
  1153.             $derniers_traductions_publi[$texts->idtext] = $this->getInfosTextPerson($texts);
  1154.         }
  1155.         // print_r($derniers_traductions_publi); // debug
  1156.         $this->view->derniers_traductions_publi $derniers_traductions_publi;
  1157.         // {if:derniers_traductions}
  1158.         // dernieres traductions publies par l'auteur (traductions : titre, titre original, langue, langue originale, pays, année)
  1159.         $sql_derniers_traductions '
  1160.             SELECT '.$from_txt.', t.type
  1161.             FROM text_translator tt, texts t
  1162.             LEFT OUTER JOIN contacts c ON c.idcontact=t.idcontact_publisher
  1163.             WHERE 1
  1164.             AND tt.idtext=t.idtext
  1165.             AND t.publish=1
  1166.             AND tt.idperson='.$this->idperson.'
  1167.             ORDER BY datepublication DESC LIMIT 0,2';
  1168.         $texts->query($sql_derniers_traductions);
  1169.         $derniers_traductions = array();
  1170.         while($texts->fetch()) {
  1171.             $derniers_traductions[$texts->idtext] = $this->getInfosTextPerson($texts);
  1172.         }
  1173.         //print_r($derniers_traductions); // debug
  1174.         $this->view->derniers_traductions $derniers_traductions;
  1175.         // spectacles à l'affiche en temps que : auteur du texte, metteur en scene, acteur, technicien
  1176.         $spectacles $this->em->getRepository(Spectacles::class);
  1177.         // la liste des texts associés à la personne
  1178.         if (empty($this->idtexts_person)) {
  1179.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  1180.         }
  1181.         // trouver les contenus associés 101 et les classer par date
  1182.         $item $this->cache->getItem("biographie_dernieres_critiques_person_" $this->idperson "_texts_" . ($this->idtexts_person ?: 0));
  1183.         if (! $item->isHit()) {
  1184.             $params_sql = array(
  1185.                 'special' => array(
  1186.                     'get_critiques_idperson' => array(
  1187.                         'idperson' => $this->idperson// critiques d'une personne
  1188.                         'idtexts_person' => $this->idtexts_person// liste des textes de la personne
  1189.                     ),
  1190.                     'get_extranetuser' => true// on veut l'utilisateur
  1191.                     'publish' => 1// les critiques publiées
  1192.                 ),
  1193.                 'sql' => array(
  1194.                     'limit' => array(0,4),
  1195.                     'order' => ' ct.`date_article` DESC'// classement
  1196.                 ),
  1197.                 'dbg' => array('critiques','Liste des critiques'),
  1198.             );
  1199.             $dernieres_critiques $this->em->getRepository(Contents::class)->getListContents($params_sql,array('get_critiques' => true'shorten_title' => true));
  1200.             $item->set($dernieres_critiques)->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  1201.             $this->cache->save($item);
  1202.         } else {
  1203.             $dernieres_critiques $item->get();
  1204.         }
  1205.         $this->context['view']->dernieres_critiques $dernieres_critiques;
  1206.         //textes aides et soutiens en savoir +
  1207.         $this->context['view']->texts_aides_soutiens $this->getPersonTextAides(array(0,3), false, ['types_aides' => array(1), 'group_by_aide_type_aide_texte' => true]);
  1208.         if (!empty($this->context['view']->texts_aides_soutiens)){
  1209.             foreach($this->context['view']->texts_aides_soutiens AS $k => $v){
  1210.                 $this->context['view']->texts_aides_soutiens[$k]['texts'] = reset($v['texts']);
  1211.             }
  1212.         }
  1213.         //Le dernier podcast
  1214.         $podcasts $this->em->getRepository(Podcasts::class);
  1215.         // Podcast France Culture  => les derniers référencés
  1216.         $franceculture_params = array(
  1217.             //'direction' => 'DESC',
  1218.             'limit' => array(0,1),
  1219.             'special' => array(
  1220.                 'idpersons' => $this->idperson,
  1221.                 'type_podcast' => ['franceinter''soundcloud'],
  1222.             ),
  1223.             'dbg' => array('derniers_franceculture''Les derniers podcasts franceculture référencés'),
  1224.         );
  1225.         $this->context['view']->derniers_franceculture $podcasts->getListPodcasts($franceculture_params);
  1226.         $this->context['view']->nb_derniers_franceculture $podcasts->countListPodcasts($franceculture_params);
  1227.         // Podcast Arte  => les derniers référencés
  1228.         $arte_params = array(
  1229.             //'direction' => 'DESC',
  1230.             'limit' => array(0,1),
  1231.             'special' => array(
  1232.                 'type_podcast' => 'arte',
  1233.             ),
  1234.             'dbg' => array('derniers_Arte''Les derniers podcasts Arte référencés'),
  1235.         );
  1236.         $this->context['view']->derniers_arte $podcasts->getListPodcasts($arte_params);
  1237.         $this->context['view']->nb_derniers_arte $podcasts->countListPodcasts($arte_params);
  1238.         //tableaux
  1239.         $spec = array();
  1240.         $spec_old = array();
  1241.         // format vignette
  1242.         $format = array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop');
  1243.         // contrainte en plus
  1244.         $sql_more ' AND (sp.`idperson`='.$this->idperson;
  1245.         // les textes de la personne
  1246.         if (!empty($this->idtexts_person)) {
  1247.             $sql_more .= ' OR t.idtext IN ('.$this->idtexts_person.') ';
  1248.         }
  1249.         // spectacles publiés
  1250.         $sql_more .= ') AND s.`publish`=1 ';
  1251.         // selection des spectacles aujourd'hui et demain
  1252.         $item $this->cache->getItem("biographie_sql_prochains_"  date('Y-m-d') . "_in_person_" $this->idperson "_or_in_texts_" . ($this->idtexts_person ?: 0));
  1253.         if (! $item->isHit()) {
  1254.             $params_sql_prochains = array(
  1255.                 'params' => array(
  1256.                     'where' => $sql_more,
  1257.                     'limit' => array(0,4)
  1258.                 ),
  1259.                 'special' => array(
  1260.                     'prochains' => true
  1261.                 ),
  1262.                 'dbg' => array('a_affiche''Spectacles à l\'affiche'),
  1263.             );
  1264.             $sql_prochains $spectacles->getSQLSpectacles($params_sql_prochains['params'],$params_sql_prochains['special'],false);
  1265.             $datas $sql_prochains->getResult(AbstractQuery::HYDRATE_ARRAY);
  1266.             $item->set($datas)->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  1267.             $this->cache->save($item);
  1268.         } else {
  1269.             $datas $item->get();
  1270.         }
  1271.         // mettre en forme chaque reponse
  1272.         foreach($datas AS $spectacle_value) {
  1273.             $spectacles->loadResult($spectacle_value[0]);
  1274.             $spectacles->loadResult($spectacle_value);
  1275.             $spec[$spectacles->idspectacle] = $this->getRowSpectacle($spectacles,$format);
  1276.         }
  1277.         // exclure de la liste derniers spectacles ceux déja présents dans la liste des spectacles à l'affiche
  1278.         if (!empty($spec)) {
  1279.             $spectacles_deja_listes implode(','array_keys($spec));
  1280.             $sql_more .= ' AND s.idspectacle NOT IN ('.$spectacles_deja_listes.') AND s.publish=1 ';
  1281.         }
  1282.         // selection des spectacles passés
  1283.         $item $this->cache->getItem("biographie_sql_anciens_spectacles_"  date('Y-m-d') . "_in_person_" $this->idperson "_or_in_texts_" . ($this->idtexts_person ?: 0) . "_not_in_spectacles_" . ($spectacles_deja_listes ?? 0));
  1284.         if (! $item->isHit()) {
  1285.             $params_sql_anciens_spectacles = array(
  1286.                 'params' => array(
  1287.                     'where' => $sql_more,
  1288.                     // 'groupby' => 's.`idspectacle`',
  1289.                     'order' => ['MAX(sc.date)''DESC'],
  1290.                     'limit' => array(0,4),
  1291.                 ),
  1292.                 'special' => array(
  1293.                     'anciens_stricts' => true
  1294.                 ),
  1295.                 'dbg' => array('ancien''Spectacles dernièrement à l\'affiche'),
  1296.             );
  1297.             $sql_anciens_spectacles $spectacles->getSQLSpectacles($params_sql_anciens_spectacles['params'],$params_sql_anciens_spectacles['special'], false);
  1298.             $datas $sql_anciens_spectacles->getResult(AbstractQuery::HYDRATE_ARRAY);
  1299.             $item->set($datas)->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  1300.             $this->cache->save($item);
  1301.         } else {
  1302.             $datas $item->get();
  1303.         }
  1304.         // mettre en forme chaque reponse
  1305.         foreach($datas AS $spectacle_value) {
  1306.             $spectacles->loadResult($spectacle_value[0]);
  1307.             $spectacles->loadResult($spectacle_value);
  1308.             $sp $this->getRowSpectacle($spectacles,$format);
  1309.             $spec_old[$spectacles->idspectacle] = $spectacles->clearSpectaclesAddAllPersons($sp);
  1310.             $spec_old[$spectacles->idspectacle]['footer_contact'] = true;
  1311.             if ((!empty($spec_old[$spectacles->idspectacle]['typespectacle']) && $spec_old[$spectacles->idspectacle]['typespectacle'] != 'lecture') || $spec_old[$spectacles->idspectacle]['idtypespectacle']['idtypespectacle'] == 1){
  1312.                 unset($spec_old[$spectacles->idspectacle]['typespectacle']);
  1313.             }
  1314.         }
  1315.         $this->view->spec $spec;
  1316.         $this->view->spec_old $spec_old;
  1317.         // aides, lauréats nominations
  1318.         if (!empty($this->idtexts_person)) {
  1319.             $format = array('width'=>$_ENV['VIGN_TEXT_WIDTH'],'height'=>$_ENV['VIGN_TEXT_HEIGHT'],'direction'=>'thumb');
  1320.             // trouver les textes de l'auteur qui ont eu une aide à la création
  1321.             $this->context['view']->texts_aides $this->em->getRepository(Texts::class)->getListTexts(
  1322.                 array(
  1323.                     'special' => array(
  1324.                         'aides' => array(
  1325.                             'idaidecontact' => 25,
  1326.                         ),
  1327.                         //'authors' => array($this->idperson),
  1328.                         'idtext' => explode(','$this->idtexts_person),
  1329.                         'join' => true,
  1330.                     ),
  1331.                     'params' => array(
  1332.                         'limit' => array(0,30),
  1333.                         'classement' => 'DESC',
  1334.                     ),
  1335.                     'dbg' => array('list_texts_aides''Texte de l\'auteur ayant reçus une aide à la création'),
  1336.                     'api' => false,
  1337.                 ),
  1338.                 array(
  1339.                     'vignette_format' => $format,
  1340.                     'publisher_first_inverse'=> true,
  1341.                 )
  1342.             );
  1343.             if (sizeof($this->context['view']->texts_aides) > 3){
  1344.                 $this->context['view']->texts_aides array_slice($this->context['view']->texts_aides03);
  1345.                 $this->context['view']->texts_aides_limit_on true;
  1346.             }
  1347.             // trouver les textes avec des prix/récompenses
  1348.             $this->context['view']->laureats_nominations $this->getPersonTextAides(array(03));
  1349.             // trouver les textes avec des sélections
  1350.             $this->context['view']->texts_selections $this->getPersonTextAides(array(0,3), false, ['types_aides' => array(4), 'group_by_aide_type_aide_texte' => true]);
  1351.             foreach($this->context['view']->texts_selections AS $k => $v){
  1352.                 $this->context['view']->texts_selections[$k]['texts'] = reset($v['texts']);
  1353.             }
  1354.         }
  1355.         $this->meta_description 'Toutes les informations et l\'actualité de '.$this->infosperson['firstname'].' '.$this->infosperson['lastname'].' : biographie, textes, publications, spectacles et dates de représentations à l\'affiche et archivées, DVD, vidéos et événements liés';
  1356.         $this->context['view']->ecoles $this->persons->noPunct($this->em->getRepository(PersonEcole::class)->getEcoles($this->idperson));
  1357.         /* vidéo par l'auteur */
  1358.         if ($this->em->getRepository(Playlists::class)->countPlaylists('persons',$this->idperson,'class_auteur_meme')>0) {
  1359.             $playlists $this->em->getRepository(Playlists::class);
  1360.             $playlist $playlists->getByClassification('persons',$this->idperson,'class_auteur_meme');
  1361.             $playlist $playlists->getInfosPlaylist(
  1362.                 $playlist['idplaylist'],
  1363.                 array(
  1364.                     'all' => true,
  1365.                     'multimedias' => true,
  1366.                 )
  1367.             );
  1368.             $this->context['view']->videos_par_auteur reset($playlist['multimedias']);
  1369.             $this->context['view']->videos_par_auteur['more_url_clean'] = $playlist['urlClean'];
  1370.         }
  1371.         // on affiche le dernier dvd associé à la biographie
  1372.         $this->view->dernier_dvd $this->getDvds(false,['limit'=>array(0,1)]);
  1373.         // On affiche ce block que pour ces personnes
  1374.         $asides_listes_persons = array(
  1375.             'Valerie-Dreville',
  1376.             'Ariane-Mnouchkine',
  1377.             'Eric-Lacascade',
  1378.             'Guy-Cassiers',
  1379.             'Krystian-Lupa',
  1380.             'Christian-Schiaretti',
  1381.             'Yves-Noel-Genod',
  1382.             'Jean-Francois-Sivadier',
  1383.             'Stephane-Braunschweig',
  1384.             'CANDEL-Jeanne',
  1385.             'Christiane-Jatahy',
  1386.             'RUF-Eric',
  1387.             'Bernard-Murat',
  1388.             'RENUCCI-Robin',
  1389.             'Alain-Francon',
  1390.             'Brigitte-Jaques-Wajeman',
  1391.             'Falk-Richter',
  1392.             'Jean-Pierre-Vincent',
  1393.             'Olivier-Py',
  1394.             'Jean-Christohe-Meurisse',
  1395.             'Stanislas-Nordey',
  1396.             'Jean-Michel-Ribes',
  1397.             'Francois-Delaroziere',
  1398.             'Alexis-Michalik',
  1399.             'Dieudonne-Niangouna',
  1400.             'Emmanuel-Demarcy-Mota',
  1401.             'Anne-Laure-Liegeois',
  1402.             'Thomas-Jolly',
  1403.             'Ivo-Van-Hove',
  1404.             'Jean-Louis-Martinelli',
  1405.             'Joel-Pommerat',
  1406.             'Wajdi-Mouawad'
  1407.         );
  1408.         //aside
  1409.         $this->asides->load('bio_thumbnail');
  1410.         $this->asides->load('bio_par_auteur');
  1411.         $this->asides->load('common_prochain_evenement');
  1412.         // On affiche ce block que pour ces personnes
  1413.         if (in_array($this->context['view']->url_clean$asides_listes_persons)){
  1414.             $this->asides->load('bio_ecole_charles_dullin');
  1415.         }
  1416.         $this->asides->load(['common_culturebox,common_culturebox_free' => [
  1417.             'footer_custom' => true,
  1418.             'content' => $this->context['view']->derniers_culturebox_gratuit
  1419.         ]]);
  1420.         if (!empty($this->context['view']->derniers_culturebox_vod)){
  1421.             $this->asides->load(['common_culturebox,common_culturebox_vod' => [
  1422.                 'footer_custom' => true,
  1423.                 'content' => $this->context['view']->derniers_culturebox_vod,
  1424.                 'vod' => true,
  1425.                 'param_type' => 'vod'
  1426.             ]]);
  1427.         }
  1428.         if (!empty($this->context['view']->derniers_culturebox_svod)){
  1429.             $this->asides->load(['common_culturebox,common_culturebox_svod' => [
  1430.                 'footer_custom' => true,
  1431.                 'content' => $this->context['view']->derniers_culturebox_svod,
  1432.                 'svod' => true
  1433.             ]]);
  1434.         }
  1435.         // $this->asides->load('bio_link_exist');
  1436.         $this->asides->load('bio_formation');
  1437.         $this->asides->load('bio_MAV');
  1438.         $this->asides->load('bio_navigation');
  1439.         $this->asides->load('common_participer_personne');
  1440.         //Réservé à Jean-Luc Lagarce
  1441.         if ($this->idperson == 3){
  1442.             $this->asides->load('bio_lettre_lagarce');
  1443.         }
  1444.         if (!empty($this->infosperson['facebook'])){
  1445.             $this->asides->load(['common_facebook' => array(
  1446.                 'url_custom' => $this->infosperson['facebook']
  1447.             )]);
  1448.         }
  1449.         if (!empty($this->infosperson['twitter'])){
  1450.             $this->asides->load(['common_twitter' => array(
  1451.                 'url_custom' => $this->infosperson['twitter']
  1452.             )]);
  1453.         }
  1454.         // Ajout de la clé role_header
  1455.         foreach($this->context['view']->spec as $k=>$v) {
  1456.             $this->context['view']->spec[$k]['role_header'] = true;
  1457.             $this->context['view']->spec[$k]['footer_contact'] = true;
  1458.         }
  1459.         // Ajout de la clé role_header
  1460.         foreach($this->context['view']->spec_old as $k=>$v) {
  1461.             $this->context['view']->spec_old[$k]['role_header'] = true;
  1462.         }
  1463.         return $this->view('biographies/biographie.html.twig');
  1464.     }
  1465.     // }}}
  1466.     /** Calendrier
  1467.      *
  1468.      * @Route("/biographies/{slug}/dates/", name="biographie_dates")
  1469.      *
  1470.      * @access public
  1471.      * @return void
  1472.      */
  1473.     public function action_dates($slug null)
  1474.     {
  1475.         $this->InitController($slug'dates');
  1476.         $schedules $this->em->getRepository(Schedules::class);
  1477.         $biographies_dates_demains $schedules->getDateBySpectaclesDemain($this->ids_spectacle_all1000);
  1478.         // Cette variable est utiliser pour stocker les résultats & éviter plusieurs requêtes SQL identiques
  1479.         $calendrier_listes_spectacles = [];
  1480.         $biographies_dates_demains_reconstruction = [];
  1481.         foreach($biographies_dates_demains AS $k => $v){
  1482.             $date_month $schedules->getFormeDate($k,"%B %Y",true);
  1483.             $date_month_hastag $schedules->getFormeDate($k,"%B_%Y",true);
  1484.             if (empty($biographies_dates_demains_reconstruction[$date_month_hastag])){
  1485.                 $menu_aside[$date_month_hastag] = [
  1486.                     'name' => $date_month,
  1487.                     'params' => $date_month_hastag,
  1488.                 ];
  1489.                 $biographies_dates_demains_reconstruction[$date_month_hastag] = $menu_aside[$date_month_hastag];
  1490.             }
  1491.             $biographies_dates_demains_reconstruction[$date_month_hastag]['datas'][$k] = $v;
  1492.             foreach ($biographies_dates_demains_reconstruction[$date_month_hastag]['datas'][$k]['datas'] AS $idata => $data) {
  1493.                 $idspectacle $data['idspectacle'];
  1494.                 // Si la requête s'exécute pour la première fois
  1495.                 if (empty($calendrier_listes_spectacles[$idspectacle])) {
  1496.                     $calendrier_listes_spectacles[$idspectacle] = $this->em->getRepository(Spectacles::class)->getInfosSpectacle($data['idspectacle'], ['get_vignette' => true]);
  1497.                 }
  1498.                 // On assigne la valeur stocké précédément
  1499.                 $biographies_dates_demains_reconstruction[$date_month_hastag]['datas'][$k]['datas'][$idata]['spectacle'] = $calendrier_listes_spectacles[$idspectacle];
  1500.             }
  1501.         }
  1502.         // On vide la variable en mémoire car maintenant inutile
  1503.         unset($calendrier_listes_spectacles);
  1504.         $this->context['view']->schedules_dates_demains_par_mois $biographies_dates_demains_reconstruction;
  1505.         $this->context['view']->menu_aside_dates $menu_aside ?? null;
  1506.         $this->getAsidesDates();
  1507.         return $this->view('biographies/dates.html.twig');
  1508.     }
  1509.     // {{{ action_prix_recompenses()
  1510.     /** Prix et distinctions
  1511.      *
  1512.      * @Route("/biographies/{slug}/prix-recompenses/", name="biographie_prix_recompenses")
  1513.      *
  1514.      * @access public
  1515.      * @return void
  1516.      */
  1517.     public function action_prix_recompenses($slug null)
  1518.     {
  1519.         $this->InitController($slug'prix-recompenses');
  1520.         //si c'est vide on redirige l'utilisateur
  1521.         if ($this->getPersonTextAides(array(0,100), true, ['count_specifique' => true]) == 0){
  1522.             return $this->redirectToRoute('biographie_presentation', ['slug' => $this->infosperson['url_clean']], Response::HTTP_MOVED_PERMANENTLY);
  1523.         }
  1524.         // trouver les textes avec des prix/distinctions
  1525.         $this->context['view']->laureats_nominations $this->getPersonTextAides(array(0,100));
  1526.         $this->setAsidesCommunEnSavoirPlus();
  1527.         return $this->view('biographies/prix-recompenses.html.twig');
  1528.     }
  1529.     // }}}
  1530.     /** Les textes par l'auteur
  1531.      *
  1532.      * @Route("/biographies/{slug}/textes-auteurs/", name="biographie_textes_auteurs")
  1533.      *
  1534.      * @access public
  1535.      * @return void
  1536.      */
  1537.     public function action_textes_auteurs($slug null)
  1538.     {
  1539.         $this->InitController($slug'textes-auteurs');
  1540.         if (!empty($this->idtexts_person)) {
  1541.             $playlists $this->em->getRepository(Playlists::class);
  1542.             $spectacles $this->em->getRepository(Spectacles::class);
  1543.             $this->context['view']->list_playlists $playlists->getListPlaylists(array(
  1544.                 'special' => array(
  1545.                     'idclassifications' => 144// class_texte_parauteur //
  1546.                     'idtext' => explode(','$this->idtexts_person), // les texts de la personne
  1547.                 ),
  1548.                 'dbg' => array('list_playlists','Playlist texte par l\'auteur'),
  1549.             ));
  1550.             if (!empty($this->context['view']->list_playlists)) {
  1551.                 foreach($this->context['view']->list_playlists as $k=>$v) {
  1552.                     // le lien vers le contenu directement
  1553.                     if (!empty($v['idtext'])) {
  1554.                         foreach($v['idtext'] as $t) {
  1555.                             $this->context['view']->list_playlists[$k]['nameview'] = $t['title'];
  1556.                             $this->context['view']->list_playlists[$k]['other_url_clean'] = '/textes/'.$t['url_clean'].'/playlist/id/'.$v['urlClean'];
  1557.                         }
  1558.                     }
  1559.                 }
  1560.             }
  1561.         }
  1562.         $this->extra_locate 'Le texte par l\'auteur';
  1563.         $this->extra_title 'Le texte par l\'auteur';
  1564.         $this->getAsidesTextesAuteurs();
  1565.         $this->asides->load('bio_textes_auteurs');
  1566.         $this->asides->load('common_participer_personne');
  1567.         return $this->view('biographies/textes-auteurs.html.twig');
  1568.     }
  1569.     // }}}
  1570.     /** Les textes par l'auteur
  1571.      *
  1572.      *
  1573.      * @access public
  1574.      * @return void
  1575.      */
  1576.     public function count_textes_par_auteurs()
  1577.     {
  1578.         if (!empty($this->idtexts_person)) {
  1579.             $playlists $this->em->getRepository(Playlists::class);
  1580.             $spectacles $this->em->getRepository(Spectacles::class);
  1581.             $list_playlists $playlists->getListPlaylists(array(
  1582.                 'params' => array(
  1583.                     'get_texts_with_aides' => true
  1584.                 ),
  1585.                 'special' => array(
  1586.                     'idclassifications' => 144// class_texte_par auteur //
  1587.                     'idtext' => explode(','$this->idtexts_person), // les texts de la personne
  1588.                 ),
  1589.                 'dbg' => array('list_playlists','Playlist texte par l\'auteur'),
  1590.             ));
  1591.             if (!empty($list_playlists)) {
  1592.                 return count($list_playlists);
  1593.             }
  1594.         }
  1595.         return 0;
  1596.     }
  1597.     // }}}
  1598.     /** Les textes sur l'auteur
  1599.      *
  1600.      *
  1601.      * @access public
  1602.      * @return void
  1603.      */
  1604.     public function count_textes_sur_auteurs()
  1605.     {
  1606.         if (!empty($this->idtexts_person)) {
  1607.             $playlists Theatre::factory('playlists');
  1608.             $spectacles Theatre::factory('spectacles');
  1609.             $list_playlists $playlists->getListPlaylists(array(
  1610.                 'params' => array(
  1611.                     'get_texts_with_aides' => true
  1612.                 ),
  1613.                 'special' => array(
  1614.                     'idclassifications' => 144// class_texte_par auteur //
  1615.                     'idtext' => explode(','$this->idtexts_person), // les texts de la personne
  1616.                 ),
  1617.                 'dbg' => array('list_playlists','Playlist texte par l\'auteur'),
  1618.             ));
  1619.             if (!empty($list_playlists)) {
  1620.                 return count($list_playlists);
  1621.             }
  1622.         }
  1623.         return 0;
  1624.     }
  1625.     // }}}
  1626.     /** Sélections
  1627.      *
  1628.      * @Route("/biographies/{slug}/selections/", name="biographie_selections")
  1629.      *
  1630.      * @access public
  1631.      * @return void
  1632.      */
  1633.     public function action_selections($slug null)
  1634.     {
  1635.         $this->InitController($slug'selections');
  1636.         $this->context['view']->texts_selections $x $this->getPersonTextAides(array(0,100), false, ['types_aides' => array(4), 'group_by_aide_type_aide_texte' => true]);
  1637.         if ($this->context['view']->texts_selections){
  1638.             foreach($this->context['view']->texts_selections AS $k => $v){
  1639.                 $this->context['view']->texts_selections[$k]['texts'] = reset($v['texts']);
  1640.             }
  1641.         }
  1642.         $this->action_ensavoirplus($slugnull,falsenull);
  1643.         $this->setAsidesCommunEnSavoirPlus();
  1644.         return $this->view('biographies/selections.html.twig');
  1645.     }
  1646.     // }}}
  1647.     /** Aides et Soutiens
  1648.      *
  1649.      * @Route("/biographies/{slug}/aides-soutiens/", name="biographie_aides_soutiens")
  1650.      *
  1651.      * @access public
  1652.      * @return void
  1653.      */
  1654.     public function action_aides_soutiens($slug null)
  1655.     {
  1656.         $this->InitController($slug'aides-soutiens');
  1657.         $this->context['view']->texts_aides $this->getPersonTextAides(array(0,100), false, ['types_aides' => array(1), 'group_by_aide_type_aide_texte' => true]);
  1658.         if ($this->context['view']->texts_aides){
  1659.             foreach($this->context['view']->texts_aides AS $k => $v){
  1660.                 $this->context['view']->texts_aides[$k]['texts'] = reset($v['texts']);
  1661.             }
  1662.         }
  1663.         $this->action_ensavoirplus($slugnull,falsenull);
  1664.         $this->setAsidesCommunEnSavoirPlus();
  1665.         return $this->view('biographies/aides-soutiens.html.twig');
  1666.     }
  1667.     // }}}
  1668.     // {{{ action_presentation_edit()
  1669.     /** Modifier la présentation
  1670.      *
  1671.      * @Route("/biographies/{slug}/presentation-edit/", name="biographie_presentation_edit")
  1672.      *
  1673.      * @access public
  1674.      * @return void
  1675.      */
  1676.     public function action_presentation_edit($slug nullRequest $requestTheatreMail $TheatreMailUtilsEdit $edit_utilsImages $imagesEditUtils $editUtils)
  1677.     {
  1678.         return $this->redirectToRoute('index', [], Response::HTTP_MOVED_PERMANENTLY);
  1679.     }
  1680.     // }}}
  1681.     // {{{ action_presentation()
  1682.     /** Présentation
  1683.      *
  1684.      * @Route("/biographies/{slug}/presentation/", name="biographie_presentation")
  1685.      * @Route("/biographies/{slug}/presentation/idcontent/{idcontent}/pdf/{p_pdf}", name="biographie_presentation_pdf")
  1686.      * @Route("/biographies/{slug}/presentation/idcontent/{idcontent}/pdf/{p_pdf}/download/{p_download}", name="biographie_presentation_pdf_download")
  1687.      *
  1688.      * @access public
  1689.      * @return void
  1690.      */
  1691.     public function action_presentation($slug null$showaside true$idcontent null$p_pdf null$p_download null)
  1692.     {
  1693.         $this->persons $this->em->getRepository(Persons::class);
  1694.         $this->InitController($slug'presentation');
  1695.         $this->setParamsPDF($p_pdf$p_download);
  1696.         if (!is_null($idcontent)){
  1697.             $this->context['params']['idcontent'] = $idcontent;
  1698.         }
  1699.         $show_default_ensavoirplus true;
  1700.         if (!empty($this->infosperson['biotxt']['text'])) {
  1701.             $this->view->biotxt $this->infosperson['biotxt'];
  1702.             // mots-clés et description
  1703.             $this->func->makeMetaFromHtml($this->infosperson['biotxt']['text'], $this->meta_description$this->meta_keywords);
  1704.             $show_default_ensavoirplus false;
  1705.         }
  1706.         //si biotxt est vide on affiche par defaut un contenu en savoirplus, sinon, on affiche biotxt
  1707.         $this->action_ensavoirplus($slugnull,false$show_default_ensavoirplus);
  1708.         // voir si la personne est dans une ou plusieurs écoles
  1709.         // "<lien>ecole</lien>" <lien>promotion "année promo"</lien>
  1710.         $this->context['view']->ecoles $this->persons->noPunct($this->em->getRepository(PersonEcole::class)->getEcoles($this->idperson));
  1711.         // si il y al bio txt ou l'école ?
  1712.         if (!empty($this->context['view']->ecoles) || !empty($this->view->biotxt)) {
  1713.             $this->context['view']->is_content true;
  1714.         }
  1715.         // il faut également la photo associé et le site web
  1716.         $files $this->em->getRepository(Files::class);
  1717.         $files->setPublishStatus($this->publish_status);
  1718.         $photos_person $files->getObjectFiles($this->idperson,'persons','class_photo_person');
  1719.         $format_vignette_person = array('width'=>220,'height'=>'180','direction'=>'L');
  1720.         if (!empty($photos_person)) {
  1721.             // creation d'une vignette
  1722.             foreach($photos_person as $k=>$v) {
  1723.                 $photos_person[$k]['vignette'] = $this->persons->getVignettePerson($this->idperson,$format_vignette_person);
  1724.             }
  1725.             $this->view->photos $photos_person;
  1726.         }
  1727.         $this->context['view']->page_presentation true;
  1728.         // trouver les textes avec des prix/récompenses
  1729.         $this->context['view']->laureats_nominations $this->getPersonTextAides(array(0,100));
  1730.         if ($showaside){
  1731.             // checker si la personne connectée à les droits sur cette fiche et
  1732.             // sil elle a déjà proposé un texte
  1733.             // paramètre d'instanciation
  1734.             $params_edit = array(
  1735.                 'idobject' => $this->idperson,
  1736.                 'object' => 'persons'
  1737.             );
  1738.             // controlleur pour l'edition
  1739.             $this->edit_utils->load($this->context,$params_edit);
  1740.             if ($object_rights $this->edit_utils->checkObjectRights()) {
  1741.                 $this->view->object_rights $object_rights;
  1742.                 $this->view->last_draft['id'] = $this->edit_utils->lastDraft();
  1743.             }
  1744.             $this->setAsidesCommunEnSavoirPlus();
  1745.             //Réservé à Jean-Luc Lagarce
  1746.             if ($this->idperson == 3){
  1747.                 $this->asides->load('bio_lettre_lagarce');
  1748.             }
  1749.             $this->checkConditionsPDF();
  1750.             return $this->view('biographies/presentation.html.twig');
  1751.         }
  1752.     }
  1753.     // }}}
  1754.     // {{{ action_widget()
  1755.     /** widget actu de la personne
  1756.      *
  1757.      * @Route("/biographies/{slug}/widget/", name="biographie_widget")
  1758.      *
  1759.      * @access public
  1760.      * @return void
  1761.      */
  1762.     public function action_widget($slug null$format=array())
  1763.     {
  1764.         $this->InitController($slug'widget');
  1765.         $this->style_more[] = 'widget_thnet';
  1766.         $this->context['view']->tracking_ga '#utm_source=thnet&utm_medium=widget&utm_campaing='.$this->url_folder;
  1767.         // renvoyer en json ou en html ?
  1768.         if (!empty($_GET['v']) && $_GET['v']=='ajax') {
  1769.             $this->context['json_response'] = true;
  1770.         } else {
  1771.             $this->view->iframe_style true;
  1772.         }
  1773.         // avec ou sans image (null,small,medium)
  1774.         $preview_sizes = array(
  1775.             'none' => 0,
  1776.             'small' => 55,
  1777.             'bigsmall' => 80,
  1778.             'large' => 100,
  1779.         );
  1780.         if (!empty($_GET['preview']) && array_key_exists($_GET['preview'], $preview_sizes)) {
  1781.             $vignette_size $preview_sizes[$_GET['preview']];
  1782.         } else {
  1783.             $vignette_size 100;
  1784.         }
  1785.         // largeur de la colonne du texte
  1786.         $max_colsize 10000;
  1787.         if (!empty($_GET['colsize']) && $this->func->my_is_int($_GET['colsize']) && $_GET['colsize']<=$max_colsize) {
  1788.             $colsize $_GET['colsize'];
  1789.         } else {
  1790.             $colsize 200+$vignette_size;
  1791.         }
  1792.         $colsize $colsize-$vignette_size;
  1793.         // nombre d'items maxi
  1794.         $max_nbitems 50;
  1795.         if (!empty($_GET['nbitems']) && $this->func->my_is_int($_GET['nbitems']) && $_GET['nbitems']<=$max_nbitems) {
  1796.             $nbitems $_GET['nbitems'];
  1797.         } else {
  1798.             $nbitems 1;
  1799.         }
  1800.         if (!empty($_GET['multiple_element']) && $_GET['multiple_element']){
  1801.             $this->view->multiple_element true;
  1802.         }
  1803.         if (!empty($_GET['responsive']) && $_GET['responsive']){
  1804.             $this->view->responsive_display true;
  1805.         }
  1806.         // format vignette
  1807.         if (!empty($vignette_size)) {
  1808.             $format = array('width'=>$vignette_size,'height'=>$vignette_size,'forme'=>'round','direction'=>'crop','valround'=>0);
  1809.         } else {
  1810.             $format false;
  1811.             $vignette_size 0;
  1812.         }
  1813.         // spectacles à l'affiche en temps que : auteur du texte, metteur en scene, acteur, technicien
  1814.         $spectacles $this->em->getRepository(Spectacles::class);
  1815.         if (empty($this->idtexts_person)) {
  1816.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  1817.         }
  1818.         //tableaux
  1819.         $spec = array();
  1820.         $spec_old = array();
  1821.         // contrainte en plus
  1822.         $sql_more ' AND (sp.idperson='.$this->idperson;
  1823.         // les textes de la personne
  1824.         if (!empty($this->idtexts_person)) {
  1825.             $sql_more .= ' OR t.idtext IN ('.$this->idtexts_person.') ';
  1826.         }
  1827.         // spectacles publiés
  1828.         $sql_more .= ') AND s.publish=1 ';
  1829.         // selection des spectacles aujourd'hui et demain
  1830.         $params_sql_prochains = array(
  1831.             'params' => array(
  1832.                 'where' => $sql_more,
  1833.                 'limit' => array(0,$nbitems)
  1834.             ),
  1835.             'special' => array(
  1836.                 'prochains' => true
  1837.             ),
  1838.         );
  1839.         $sql_prochains $spectacles->getSQLSpectacles($params_sql_prochains['params'],$params_sql_prochains['special'],false);
  1840.         $datas $sql_prochains->getResult(AbstractQuery::HYDRATE_ARRAY);
  1841.         // mettre en forme chaque reponse
  1842.         foreach($datas AS $spectacle_value) {
  1843.             $spectacles->loadResult($spectacle_value[0]);
  1844.             $spectacles->loadResult($spectacle_value);
  1845.             // infos de base
  1846.             $spec[$spectacles->idspectacle] = $this->getRowSpectacle($spectacles,$format,false);
  1847.             $spec[$spectacles->idspectacle] = $spectacles->clearSpectaclesAddAllPersons($spec[$spectacles->idspectacle]);
  1848.             // largeur du conteneur de la vignette
  1849.             if (!empty($vignette_size)) {
  1850.                 $spec[$spectacles->idspectacle]['stylemore']['imagep'] = 'width:'.$vignette_size.'px;';
  1851.             }
  1852.             // largeur du conteneur du texte
  1853.             if (!empty($colsize)) {
  1854.                 $spec[$spectacles->idspectacle]['stylemore']['descsp'] = 'width:'.$colsize.'px;';
  1855.             }
  1856.         }
  1857.         // exclure de la liste derniers spectacles ceux déja présents dans la liste des spectacles à l'affiche
  1858.         if (!empty($spec)) {
  1859.             $spectacles_deja_listes join(',',array_keys($spec));
  1860.             $sql_more .= ' AND s.idspectacle NOT IN ('.$spectacles_deja_listes.')';
  1861.         }
  1862.         // selection des spectacles passés
  1863.         $params_sql_avant = array(
  1864.             'params' => array(
  1865.                 'where' => $sql_more,
  1866.                 'limit' => array(0,$nbitems)
  1867.             ),
  1868.             'special' => array(
  1869.                 'anciens' => true
  1870.             ),
  1871.         );
  1872.         $query $spectacles->getSQLSpectacles($params_sql_avant['params'],$params_sql_avant['special']);
  1873.         $datas $query->getResult(AbstractQuery::HYDRATE_ARRAY);
  1874.         // mettre en forme chaque reponse
  1875.         foreach($datas AS $spectacle_value) {
  1876.             $spectacles->loadResult($spectacle_value[0]);
  1877.             // infos de base
  1878.             $x $spec_old[$spectacles->idspectacle] = $this->getRowSpectacle($spectacles,$format,true);
  1879.             $spec_old[$spectacles->idspectacle] = $spectacles->clearSpectaclesAddAllPersons($spec_old[$spectacles->idspectacle]);
  1880.             // largeur du conteneur de la vignette
  1881.             if (!empty($vignette_size)) {
  1882.                 $spec_old[$spectacles->idspectacle]['stylemore']['imagep'] = 'width:'.$vignette_size.'px;';
  1883.             }
  1884.             // largeur du conteneur du texte
  1885.             if (!empty($colsize)) {
  1886.                 $spec_old[$spectacles->idspectacle]['stylemore']['descsp'] = 'width:'.$colsize.'px;';
  1887.             }
  1888.         }
  1889.         // largeur de la colonne = vignette_size + colsize + les marges
  1890.         $this->view->widget_width $vignette_size+$colsize+10;
  1891.         $this->view->li_fleche_width $vignette_size+$colsize+5;
  1892.         // widget persons et titre des listes
  1893.         $this->view->widget_persons true;
  1894.         $this->view->title_widget_list true;
  1895.         if (!empty($spec)) {
  1896.             $this->view->spec $spec;
  1897.         } else {
  1898.             $this->view->spec $spec_old;
  1899.             $this->view->spec_old true;
  1900.         }
  1901.         return $this->view('biographies/widget.html.twig');
  1902.     }
  1903.     // }}}
  1904.     // {{{ action_gadget()
  1905.     /** Gadget
  1906.      *
  1907.      * @Route("/biographies/{slug}/gadget", name="biographie_gadget")
  1908.      *
  1909.      * @access public
  1910.      * @return void
  1911.      */
  1912.     public function action_gadget_biographie($slug null)
  1913.     {
  1914.         $this->InitController($slug'gadget');
  1915.         parent::action_gadget();
  1916.         return $this->view('biographies/gadget.html.twig', [
  1917.             'form' => $this->context['form']->createView()
  1918.         ]);
  1919.     }
  1920.     // {{{ action_gadget_presentation()
  1921.     /** Gadget
  1922.      *
  1923.      * @Route("/biographies/{slug}/gadget-presentation/", name="biographie_gadget_presentation")
  1924.      *
  1925.      * @access public
  1926.      * @return void
  1927.      */
  1928.     public function action_gadget_presentation($slug null)
  1929.     {
  1930.         $this->InitController($slug'gadget-presentation');
  1931.         $url_widget $_ENV['URL_THNET'].$this->url_folder.'/widget-presentation/';
  1932.         $url_widget_iframe $url_widget;
  1933.         $iframe_code '<iframe src="'.$url_widget_iframe.'" style="width:100%; height:500px;border:none;"></iframe>';
  1934.         $this->view->iframe_code_html $iframe_code;
  1935.         $this->view->iframe_code htmlentities($iframe_code);
  1936.         $url_widget_ajax $url_widget.'?v=ajax';
  1937.         $rtl "\n";
  1938.         $ajax_code  '<script type="text/javascript" src="'.$_ENV['URL_THNET'].'/navigation/js/widget_thnet.js"></script>'.$rtl;
  1939. //        $ajax_code .= '<script type="text/javascript">'.$rtl.'var widget_thnet_url = \''.$url_widget_ajax.'\';'.$rtl.'widgetThnet(widget_thnet_url);'.$rtl.'</script>'.$rtl;
  1940.         $ajax_code .= '<div class="widget_thnet_content" data-content="'.$url_widget_ajax.'"></div>';
  1941.         $this->view->ajax_code_html trim($ajax_code);
  1942.         $this->view->ajax_code htmlentities(trim($ajax_code));
  1943.         $this->extra_title 'Widget';
  1944.         $this->extra_locate 'Widget';
  1945.         return $this->view('biographies/gadget-presentation.html.twig');
  1946.     }
  1947.     // {{{ action_widget_presentation()
  1948.     /** widget présentation de la personne
  1949.      *
  1950.      * @Route("/biographies/{slug}/widget-presentation/", name="biographie_widget_presentation")
  1951.      *
  1952.      * @access public
  1953.      * @return void
  1954.      */
  1955.     public function action_widget_presentation($slug null)
  1956.     {
  1957.         $this->InitController($slug'widget-presentation');
  1958.         // page sans menu et sans pide de page
  1959.         $this->view->page_nobody true;
  1960.         $this->view->ultra_simple true;
  1961.         $this->context['view']->use_addthis false;
  1962.         $this->context['view']->no_montheatre true;
  1963.         // pas de tidy et format json
  1964.         if (!empty($_GET['v']) && $_GET['v']=='ajax') {
  1965.             $ajaxreponse true;
  1966.             $json_response true;
  1967.         }
  1968.         $this->style_more[] = 'widget_thnet';
  1969.         $this->context['view']->tracking_ga '#utm_source=thnet&utm_medium=widget&utm_campaing='.$this->url_folder;
  1970.         return $this->view('biographies/widget-presentation.html.twig');
  1971.     }
  1972.     // }}}
  1973.     // {{{ action_api()
  1974.     /** Spectacles de la personnes
  1975.      *
  1976.      *
  1977.      * @access public
  1978.      * @return void
  1979.      */
  1980.     public function action_api($api_data=true)
  1981.     {
  1982.         // les spectacles
  1983.         if (array_key_exists('spectacles'$this->context['params'])) {
  1984.             // spectacles à l'affiche en temps que : auteur du texte, metteur en scene, acteur, technicien
  1985.             $spectacles $this->em->getRepository(Spectacles::class);
  1986.             // on a pas les texts de la personne
  1987.             if (empty($this->idtexts_person)) {
  1988.                 $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  1989.             }
  1990.             // selection des spectacles aujourd'hui et demain
  1991.             $params_sql_spectacles = array(
  1992.                 'params' => array(
  1993.                     'limit' => $this->getLimit(null,true), // limiter les résultats
  1994.                 ),
  1995.                 'special' => array(
  1996.                     'publish' => 1// spectacles en ligne
  1997.                     'idperson' => array(
  1998.                         'idperson' => $this->idperson// la personne
  1999.                     ),
  2000.                 ),
  2001.             );
  2002.             // recherche par période
  2003.             if ($this->isSearchPeriod()) {
  2004.                 $params_sql_spectacles['special']['period'] = array(
  2005.                     'start' => $this->getFromPeriod(),
  2006.                     'end' => $this->getToPeriod(),
  2007.                 );
  2008.             }
  2009.             // ajout des textes associés à la personne
  2010.             if (!empty($this->idtexts_person)) {
  2011.                 $params_sql_spectacles['special']['idperson']['idtexts'] = $this->idtexts_person;
  2012.             }
  2013.             // affichage
  2014.             $params_display = array(
  2015.                 'api' => true,
  2016.             );
  2017.             $datas = array();
  2018.             // on veux les spectacles à l'affiche uniquement ou tous
  2019.             if ($this->context['params']['spectacles']=='next' || $this->context['params']['spectacles']=='all') {
  2020.                 $params_sql_prochains array_merge_recursive($params_sql_spectacles, array(
  2021.                     'special' => array(
  2022.                         'prochains' => true// les prochains spectacles
  2023.                     ),
  2024.                     'dbg' => array('api_spectacles_prochains','Les prochains spectacles d\'une personne')
  2025.                 ));
  2026.                 $datas $this->em->getRepository(Spectacles::class)->getListSpectacles($params_sql_prochains,$this->format_vignette,false,$params_display);
  2027.                 // identifiant des spectacles
  2028.                 if (!empty($datas)) {
  2029.                     foreach($datas as $k=>$v) {
  2030.                         $k str_replace("@"""$k);
  2031.                         $idspectacles_exclude[$k] = $k;
  2032.                     }
  2033.                 }
  2034.             }
  2035.             if ($this->context['params']['spectacles']=='previous' || $this->context['params']['spectacles']=='all') {
  2036.                 // ajouter les spectacles anciens
  2037.                 $params_sql_anciens array_merge_recursive($params_sql_spectacles, array(
  2038.                     'special' => array(
  2039.                         'anciens' => true// les anciens spectacles
  2040.                     ),
  2041.                     'dbg' => array('api_spectacles_anciens','Les anciens spectacles d\'une personne')
  2042.                 ));
  2043.                 // exclure les prochains
  2044.                 if (!empty($idspectacles_exclude)) {
  2045.                     $params_sql_anciens['special']['idspectacles'] = array('NOT IN'$idspectacles_exclude);
  2046.                 }
  2047.                 $datas += $this->em->getRepository(Spectacles::class)->getListSpectacles($params_sql_anciens,$this->format_vignette,false,$params_display);
  2048.             }
  2049.             // les textes
  2050.         } elseif (array_key_exists('texts'$this->context['params'])) {
  2051.             $params_sql = array(
  2052.                 'special' => array(
  2053.                     'authors' => array($this->idobject),
  2054.                     'join' => true// afficher également les textes non publiés
  2055.                 ),
  2056.                 'dbg' => array('texts_person','Textes de la personne')
  2057.             );
  2058.             $datas $this->em->getRepository(Texts::class)->getListTexts($params_sql,array('api' => true));
  2059.             // les infos de base
  2060.         } elseif (is_array($this->persons)) {
  2061.             $datas = [];
  2062.             /** @var Persons $persons */
  2063.             foreach ($this->persons as $persons) {
  2064.                 $infosperson $this->em->getRepository(Persons::class)->getInfosPerson($persons->getIdperson());
  2065.                 $personDto = [
  2066.                     'lastname' => $infosperson['lastname'],
  2067.                     'firstname' => $infosperson['firstname'],
  2068.                     'permanent_url' => $_ENV['URL_THNET'].'/biographies/'.$infosperson['url_clean'].'/',
  2069.                 ];
  2070.                 if (isset($_REQUEST['corvin']) && $_REQUEST['corvin'] == true) {
  2071.                     $personDto['idcorvin'] = $infosperson['idcorvin'];
  2072.                 }
  2073.                 $datas[] = $personDto;
  2074.             }
  2075.         } else {
  2076.             $datas = array(
  2077.                 array(
  2078.                     'lastname' => $this->infosperson['lastname'],
  2079.                     'firstname' => $this->infosperson['firstname'],
  2080.                     'permanent_url' => $_ENV['URL_THNET'].'/biographies/'.$this->infosperson['url_clean'].'/',
  2081.                 )
  2082.             );
  2083.             // ajouter les infos complémentaires
  2084.             if (!empty($GLOBALS['api']['data']) && $GLOBALS['api']['data']=='extended') {
  2085.                 // récupèrer la photo
  2086.                 $datas[0]['poster'] = $this->persons->getVignettePerson($this->idperson,array('width'=>800,'height'=>800,'direction'=>'thumb'),true);
  2087.                 // récupère la présentation
  2088.                 $datas[0]['resume'] = $this->infosperson['biotxt']['text'];
  2089.                 $datas[0]['facebook'] = $this->infosperson['biotxt']['facebook'];
  2090.                 $datas[0]['twitter'] = $this->infosperson['biotxt']['twitter'];
  2091.                 $datas[0]['linkedin'] = $this->infosperson['biotxt']['linkedin'];
  2092.                 $datas[0]['instagram'] = $this->infosperson['biotxt']['instagram'];
  2093.                 $datas[0]['birth_year'] = $this->infosperson['datestart'];
  2094.                 $datas[0]['death_year'] = $this->infosperson['dateend'];
  2095.             }
  2096.         }
  2097.         return $datas;
  2098.     }
  2099.     // }}}
  2100.     // {{{ action_critiques()
  2101.     /** Critiques des spectacles associés à la personne
  2102.      *
  2103.      * @Route("/biographies/{slug}/critiques/", name="biographie_critiques")
  2104.      * @Route("/biographies/{slug}/critiques/tri/{tri}", name="biographie_critiques_tri")
  2105.      *
  2106.      * @access public
  2107.      * @return void
  2108.      */
  2109.     public function action_critiques($slug null$tri null)
  2110.     {
  2111.         $this->InitController($slug'critiques');
  2112.         $this->context['params']['tri'] = $tri;
  2113.         // recherche une année ?
  2114.         $current_year $this->getYear();
  2115.         // une saison ?
  2116.         $saison $this->getSaison();
  2117.         // tous les spectacles avec une critique pour trouver les saisons
  2118.         $listdates $this->getSpectaclesDates(true);
  2119.         //menu critiques pour les asides
  2120.         $this->context['view']->nav_critiques = array(
  2121.             'dernieres-critiques' => array(
  2122.                 'name' => 'Dernières critiques',
  2123.                 'key_url' => 'dernieres-critiques'
  2124.             ),
  2125.             'affiche-critiques' => array(
  2126.                 'name' => 'Spectacles à venir avec critiques',
  2127.                 'key_url' => 'affiche-critiques'
  2128.             ),
  2129.             'toutes-critiques' => array(
  2130.                 'name' => 'Tous les spectacles',
  2131.                 'key_url' => 'toutes-critiques'
  2132.             ),
  2133.         );
  2134.         $params 'dernieres-critiques';
  2135.         if (!empty($this->context['params']['tri']) && array_key_exists($this->context['params']['tri'], $this->context['view']->nav_critiques)){
  2136.             $params $this->context['view']->nav_critiques[$this->context['params']['tri']]['key_url'];
  2137.         }
  2138.         // récupérer la liste des années et des saisons et générer les listes déroulantes
  2139.         if (!empty($listdates)) {
  2140.             $annees_saisons $this->getListSeasonsYears($listdates);
  2141.             // liste des saisons
  2142.             $this->view->saisons $annees_saisons['saisons'];
  2143. //            $this->context['form']->addElement('select', 's', 'Saisons', array_merge(array('' => 'Choisir la saison'),$annees_saisons['saisons']), array('id' => 'saisons'));
  2144.             // liste des annees
  2145.             $this->view->annees $annees_saisons['annees'];
  2146. //            $this->context['form']->addElement('select', 'y', 'Années', array_diff_key(array(0 => 'Choisissez une année...'),$annees_saisons['annees'])+$annees_saisons['annees'], array('id' => 'annees'));
  2147.         }
  2148.         // si aucune recherche par person, par année ou par saison => recherche par saison
  2149.         // if (empty($current_year) && empty($saison) && empty($idperson_director) && empty($idperson_author)) {
  2150.         // prendre la dernière saison
  2151.         // $saison = Date_time::getLastSaison($annees_saisons['saisons']);
  2152.         // }
  2153.         // recherche par saison
  2154.         if (!empty($saison)) {
  2155.             $annees_saison explode('-'$saison);
  2156.             if (count($annees_saison)==2) {
  2157.                 $datestart Date_time::getSaisonDatestart((int)$annees_saison[0]);
  2158.                 $dateend Date_time::getSaisonDateend((int)$annees_saison[1]);
  2159.             }
  2160.             // saison de recherche
  2161.             $this->view->saison $saison;
  2162.             // saison précédente / suivante
  2163.             $this->view->saisons_nav $this->getSaisonsNav($annees_saisons['saisons'],$saison);
  2164.         }
  2165.         // annee
  2166.         if (!empty($current_year)) { // recherche par année
  2167.             $datestart date('Y-m-d',mktime(0,0,0,1,1,$current_year));
  2168.             $dateend date('Y-m-d',mktime(0,0,0,12,31,$current_year));
  2169.             // annee de recherche
  2170.             $this->view->current_year $current_year;
  2171.         }
  2172.         $where_idperson '';
  2173.         // recherche période
  2174.         // if (!empty($datestart) && !empty($dateend)) {
  2175.         //     $where_idperson .= ' AND sc.`date` BETWEEN \''.$datestart.'\' AND \''.$dateend.'\' ';
  2176.         // }
  2177.         if (empty($this->idtexts_person)) {
  2178.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  2179.         }
  2180.         // trouver les contenus associés 101 et les classer par date
  2181.         $this->perPage 10;
  2182.         $sql_spectacles = array(
  2183.             'params' => [
  2184.                 // '' =>
  2185.                 'groupby' => 's.idspectacle',
  2186.                 'order' => ['ct.dateArticle''DESC']
  2187.             ],
  2188.             'special' => [
  2189.                 'contenus_associes_critiques' => true,
  2190.                 'idspectacle' => $this->getSpectaclesPerson()
  2191.             ]
  2192.         );
  2193.         //affiche-critiques
  2194.         if ($params == 'affiche-critiques'){
  2195.             $sql_spectacles['special']['prochains'] = 700;
  2196.         }
  2197.         //nous recherchons les les spectacles avec critiques
  2198.         if ($params != 'dernieres-critiques'){
  2199.             if ($params == 'toutes-critiques'){
  2200.                 $sql_spectacles['params']['order'] = ['creation_date''DESC'];
  2201.             }
  2202.             $sql_spectacles_count $sql_spectacles;
  2203.             // $sql_spectacles_count['special']['count_only'] = true;
  2204.             $sql_spectacles_count['special']['count_only'] = array(
  2205.                 'count_only_distinct' => 's.idSpectacle'
  2206.             );
  2207.             $sql_count_spectacles $this->em->getRepository(Spectacles::class)->getSQLSpectacles($sql_spectacles_count['params'], $sql_spectacles_count['special']);
  2208.             $nombre_critiques $sql_count_spectacles->getSingleResult()['total'];
  2209.             $this->context['view']->pagination $this->getPagination($nombre_critiques10);
  2210.             $this->context['view']->pagination['totalItems'] = $nombre_critiques;
  2211.             $this->context['view']->pagination['spectacle'] = true;
  2212.             $sql_spectacles['params']['limit'] = array($this->getLimitStart(),$this->perPage);
  2213.         }
  2214.         //nous recherchons les les dernières critiques
  2215.         else{
  2216.             $sql_critiques = array(
  2217.                 'special' => array(
  2218.                     'get_critiques_idperson' => array(
  2219.                         'idperson' => $this->idperson// critiques d'un person
  2220.                         'idtexts_person' => $this->idtexts_person,
  2221.                     ),
  2222.                     'publish' => 1// publiées
  2223.                 ),
  2224.                 'sql' => array(
  2225.                     'order' => 'ct.date_article DESC ',
  2226.                     'limit' => array(0,10), // limiter le nb de résultats
  2227.                     'where' => $where_idperson// recherche spéciale
  2228.                 ),
  2229.                 'dbg' => array('critiques','Liste des critiques'),
  2230.             );
  2231.         }
  2232.         $this->view->{'title_page_'.preg_replace('/-/''_'$params)} = true;
  2233.         //nous recherchons les dernières critiques
  2234.         if ($params == 'dernieres-critiques') {
  2235.             $cacheItem $this->cache->getItem("biographie_critiques_schedules_{$this->idperson}_" str_replace(',''-'$this->idtexts_person));
  2236.             if (! $cacheItem->isHit()) {
  2237.                 $res $this->em->getRepository(Contents::class)->getListContents($sql_critiques,array('get_critiques' => true));
  2238.                 $cacheItem->set($res)
  2239.                     ->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  2240.                 $this->cache->save($cacheItem);
  2241.             }
  2242.             $this->context['view']->critiques_list $cacheItem->get();
  2243.         }
  2244.         //nous recherchons les spectacles avec critiques
  2245.         else{
  2246.             $this->view->spectacles $this->em->getRepository(Spectacles::class)->getListSpectacles($sql_spectacles,null,false,['allauthors' => true]);
  2247.             foreach($this->view->spectacles as $k=>$v) {
  2248.                 $this->view->spectacles[$k]['footer_critique'] = true;
  2249.                 $this->view->spectacles[$k]['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles',$v['idspectacle'],'class_critique',array('publish_valid' => 1));
  2250.                 $this->view->spectacles[$k]['url_clean_more'] = 'critiques/';
  2251.                 if ($params == 'toutes-critiques'){
  2252.                     $this->view->spectacles[$k]['display']['affiche_date_creation'] = true;
  2253.                     $this->view->spectacles[$k]['annee_creation'] = $this->em->getRepository(Spectacles::class)->getFormeDate($this->view->spectacles[$k]['creation_date'], '%Y'true); //%a %d/%m/%Y
  2254.                 }
  2255.             }
  2256.         }
  2257.         $this->asides->load(['url_lists_alone' => array(
  2258.             'exec' => ['color' => 'critiques'],
  2259.             'php' => array(
  2260.                 'method' => 'asidesUrlLists',
  2261.                 'urls' => $this->context['view']->nav_critiques,
  2262.                 'url' => '/biographies/{v_url_clean}/critiques/tri/key_url',
  2263.                 'params' => array(
  2264.                     'activate' => $params
  2265.                 )
  2266.             ),
  2267.             'title' => 'Voir'
  2268.         )]);
  2269.         $this->asides->load(['common_participer_personne' => array(
  2270.             'exec' => ['color' => 'critiques'],
  2271.         )]);
  2272.         $this->asides->load('bio_critiques_info');
  2273.         return $this->view('biographies/critiques.html.twig');
  2274.     }
  2275.     // }}}
  2276.     // {{{ textsByGenre()
  2277.     /** Liste des textes par genre
  2278.      *
  2279.      *
  2280.      * @param  mixed $texts_person
  2281.      * @param  mixed $format
  2282.      * @param  boolean $traductions
  2283.      * @access protected
  2284.      * @return array
  2285.      */
  2286.     protected function textsByGenre($texts_person$format=null$traductions=false$by_genre=true)
  2287.     {
  2288.         if (empty($texts_person)) return array();
  2289.         $texts $this->em->getRepository(Texts::class);
  2290.         // on peut aussi ne pas avoir de classement par genre
  2291.         if ($by_genre) {
  2292.             $liste_genres $texts->getGenretextList('_aff_liste');
  2293.         }
  2294.         // format des vignettes
  2295.         if (is_null($format)) {
  2296.             $format = array('width'=>$_ENV['VIGN_TEXT_WIDTH'],'height'=>$_ENV['VIGN_TEXT_HEIGHT'],'direction'=>'thumb');
  2297.         }
  2298.         $genres = array();
  2299.         foreach($texts_person as $idtext=>$text) {
  2300.             // $text['nb_trad'] = $texts->getOriginalsTexts($idtext,'text_traduction','idtext'); //en développement
  2301.             $text['nb_mes'] = $texts->countSpectacles($idtext1);
  2302.             $text['nb_trad'] = $texts->countTranslations($idtext1);
  2303.             $text['stylemore'] = array('imagep' => 'width:65px;''desctxt' => 'width:350px;');
  2304.             $text['publisher_first'] = true;
  2305.             $text['no_author'] = true;
  2306.             if (!empty($text['date'])) {
  2307.                 $text['date_ecriture'] = true;
  2308.             }
  2309.             // on peut aussi ne pas avoir de classement par genre
  2310.             if ($by_genre) {
  2311.                 if (empty($genres[$text['idgenretext']])) {
  2312.                     $genres[$text['idgenretext']] = array();
  2313.                     $genres[$text['idgenretext']]['genretext'] = $liste_genres[$text['idgenretext']];
  2314.                     $genres[$text['idgenretext']]['texts'] = array();
  2315.                 }
  2316.                 $genres[$text['idgenretext']]['texts'][$idtext] = $text;
  2317.             } else {
  2318.                 $genres[$idtext] = $text;
  2319.             }
  2320.         }
  2321.         // reclasser par genre
  2322.         if ($by_genre) {
  2323.             foreach($liste_genres as $k=>$v) {
  2324.                 if (!empty($genres[$k])) {
  2325.                     $genres_classer[$k] = $genres[$k];
  2326.                 }
  2327.             }
  2328.             $genres $genres_classer;
  2329.         }
  2330.         return $genres;
  2331.     }
  2332.     // }}}
  2333.     // {{{ action_textes()-
  2334.     /** Textes
  2335.      *
  2336.      * @Route("/biographies/{slug}/textes/", name="biographie_textes")
  2337.      * @Route("/biographies/{slug}/textes/type/{type}/", name="biographie_textes_type")
  2338.      *
  2339.      * @access public
  2340.      * @return void
  2341.      */
  2342.     public function action_textes($slug null$type null)
  2343.     {
  2344.         $this->InitController($slug,  'textes');
  2345.         $this->context['params']['type'] = $type;
  2346.         $this->context['view']->show_translate false;
  2347.         $this->context['view']->detail_date true;
  2348.         // si c'est un auteur étranger, on choisi déjà les traductions puis les textes originaux
  2349.         // if (!empty($this->infosperson['language_code']) && $this->infosperson['language_code']!='fr') {
  2350.         // $translations_person = $this->persons->getTextsPerson($this->idperson,'search_translation',1,'fr',null,true);
  2351.         // $this->view->translations_by_genre = $this->textsByGenre($translations_person);
  2352.         // }
  2353.         $texts_person $this->persons->getTextsPerson($this->idperson,'original',1,null,null,true);
  2354.         $this->view->texts_by_genre $this->textsByGenre($texts_person);
  2355.         // récupèrer les adaptations de l'auteur sans classement par genre
  2356.         $this->view->adaptations $this->textsByGenre($this->persons->getTextsPerson($this->idperson,'adaptation',1,null,null,true),null,false,false);
  2357.         // si adaptation = les ajouter en 4ème position de texts_by_genre
  2358.         /*if (!empty($adaptations)) {
  2359.             foreach($this->view->texts_by_genre as $k=>$v) {
  2360.                 if (isset($push_adaptation)) {
  2361.                     $this->view->texts_by_genre[11111] = array(
  2362.                         'genretext' => 'Adaptation(s) de texte(s)',
  2363.                         'texts' => $adaptations
  2364.                     );
  2365.                     break;
  2366.                 }
  2367.                 if ($k==10) {
  2368.                     $push_adaptation = true;
  2369.                 }
  2370.             }
  2371.         }*/
  2372.         // voir si bio_txt
  2373.         $biotextes $this->contents->getAssociateContent($this->idperson,'persons','class_biotextes',array('wiki_convert'=>true));
  2374.         if (!empty($biotextes['text'])) {
  2375.             $this->view->biotextes $biotextes;
  2376.         }
  2377.         /* on récupère à partir du tableau la sélection de l'utilisateur sur le type de texte devant être affiché */
  2378.         $menu_textes_trier = array();
  2379.         // $selected_texts_by_genre = 1;
  2380.         //Les adaptations théâtrale
  2381.         $this->view->texts_by_genre['a']['texts'] = $this->view->adaptations;
  2382.         $this->view->texts_by_genre['a']['genretext'] = 'Adaptation théâtrale';
  2383.         /* on récupère la liste des différents types de textes disponibles inclus les adaptations*/
  2384.         $menu_textes_trier = array();
  2385.         foreach($this->view->texts_by_genre AS $k => $v){
  2386.             if (!empty($v['texts'])){
  2387.                 $menu_textes_trier[$k] = array(
  2388.                     'name' => $v['genretext'],
  2389.                     'key_type' => $k
  2390.                 );
  2391.             }
  2392.         }
  2393.         //on sélectionne le choix de l'utilisateur
  2394.         $selected_texts_by_genre_default key($menu_textes_trier);
  2395.         if (!empty($this->context['params']['type'])){
  2396.             $selected_texts_by_genre $this->context['params']['type'];
  2397.             if (!array_key_exists($selected_texts_by_genre$this->view->texts_by_genre)){
  2398.                 $selected_texts_by_genre $selected_texts_by_genre_default;
  2399.             }
  2400.             $texts_by_genre[$selected_texts_by_genre] = $this->view->texts_by_genre[$selected_texts_by_genre];
  2401.             unset($this->view->texts_by_genre);
  2402.             $this->view->texts_by_genre $texts_by_genre;
  2403.         }
  2404.         $return_params $this->getAsidesTextesAuteurs(['htmlend' => true]);
  2405.         if ($return_params){
  2406.             $this->asides->load(['url_lists,tri_genre' => array(
  2407.                 'exec' => array(
  2408.                     'htmlend' => (!empty($return_params['htmlstart'])) ? true false,
  2409.                     'color' => 'textes'
  2410.                 ),
  2411.                 'php' => array(
  2412.                     'method' => 'asidesUrlLists',
  2413.                     'urls' => $menu_textes_trier,
  2414.                     'url' => '/biographies/{v_url_clean}/textes/type/key_type',
  2415.                     'params' => array(
  2416.                         'activate' => (!empty($selected_texts_by_genre)) ? $selected_texts_by_genre null
  2417.                     )
  2418.                 ),
  2419.                 'title' => 'Trier'
  2420.             )]);
  2421.         }
  2422.         $this->getAsidesTextesSurAuteurs();
  2423.         $this->getAsidesTraductions($this->infosperson['firstname'].' '.$this->infosperson['lastname'], false);
  2424.         return $this->view('biographies/textes.html.twig');
  2425.     }
  2426.     // }}}
  2427.     // {{{ action_textes_sur_auteurs()
  2428.     /** Les textes sur l'auteur
  2429.      *
  2430.      * @Route("/biographies/{slug}/textes-sur-auteurs", name="biographie_textes_sur_auteurs")
  2431.      *
  2432.      * @access public
  2433.      * @return void
  2434.      */
  2435.     public function action_textes_sur_auteurs($slug null)
  2436.     {
  2437.         $this->InitController($slug'textes-sur-auteurs');
  2438.         $params_link = array(
  2439.             'order' => 'T1.publication_year DESC'
  2440.         );
  2441.         $this->context['view']->texts_list $this->persons->getAssociateTexts($this->idperson,null,null,$params_link);
  2442.         //On affichage le détails des textes
  2443.         $this->context['view']->detail_date true;
  2444.         $this->getAsidesTextesAuteurs(['htmlend' => true]);
  2445.         $this->getAsidesTextesSurAuteurs();
  2446.         $this->getAsidesTraductions($this->infosperson['firstname'].' '.$this->infosperson['lastname']);
  2447.         return $this->view('biographies/textes-sur-auteurs.html.twig');
  2448.     }
  2449.     // {{{ action_textes_traductions()
  2450.     /** Traductions des textes par d'autres auteurs
  2451.      *
  2452.      * @Route("/biographies/{slug}/textes-traductions/", name="biographie_textes_traductions")
  2453.      *
  2454.      * @access public
  2455.      * @return void
  2456.      */
  2457.     public function action_textes_traductions($slug null)
  2458.     {
  2459.         $this->InitController($slug'textes-traductions');
  2460.         $texts $this->em->getRepository(Texts::class);
  2461.         $texts->getPersons();
  2462.         $this->context['view']->show_editor true;
  2463.         $this->context['view']->show_translate true;
  2464.         $this->context['view']->show_vo true;
  2465.         $x $this->persons->getTextsPerson($this->idperson,'count_all_texts_translations',1,null,null,true);
  2466.         $sql_derniers_traductions_publi '
  2467.             SELECT DISTINCT(t.idtext),c.organisation,
  2468.                          c.url_clean as url_clean_publisher, c.country as publisher_country,
  2469.                          CONCAT_WS(\'-\',t.publication_year,t.publication_month,\'01\') as datepublication,
  2470.                          t.*
  2471.             FROM text_traduction tt, texts t
  2472.             LEFT OUTER JOIN contacts c ON c.idcontact=t.idcontact_publisher';
  2473.         $where ' WHERE 1
  2474.         AND tt.idtexttraduction=t.idtext
  2475.         AND t.publish=1
  2476.         AND tt.idtext IN (
  2477.             SELECT idtext
  2478.             FROM text_author
  2479.             WHERE idperson='.$this->idperson.'
  2480.         )';
  2481.         $nombretexttraductions $x;
  2482.         $this->context['view']->pagination $this->getPagination($nombretexttraductions);
  2483.         $this->context['view']->pagination['traductions'] = true;
  2484.         $this->context['view']->pagination['totalItems'] = $nombretexttraductions;
  2485.         $where .= 'ORDER BY date DESC ';
  2486.         $limit ' LIMIT '.$this->getLimitStart().', '.$this->perPage;
  2487.         $datas $texts->query($sql_derniers_traductions_publi.$where.$limit);
  2488.         $derniers_traductions_publi = array();
  2489.         foreach($datas AS $data){
  2490.             $texts->loadResult($data);
  2491.             $derniers_traductions_publi[$texts->idtext] = $this->getInfosTextPerson($texts);
  2492.             $derniers_traductions_publi[$texts->idtext]['nb_mes'] = $texts->countSpectacles($texts->idtext1);
  2493.             $derniers_traductions_publi[$texts->idtext]['nb_trad'] = $texts->countTranslations($texts->idtext1);
  2494.             if (!empty($texts->date)){
  2495.                 $derniers_traductions_publi[$texts->idtext]['date_ecriture'] = true;
  2496.             }
  2497.         }
  2498.         $this->view->derniers_traductions_publi $derniers_traductions_publi;
  2499.         $menu_textes_textes = array(
  2500.             array(
  2501.                 'name' => 'Tous les textes',
  2502.                 'url' => '/biographies/key_controller/key_sub/',
  2503.                 'key_sub' => 'textes'
  2504.             ),
  2505.             array(
  2506.                 'name' => 'Les textes par l\'auteur',
  2507.                 'url' => '/biographies/key_controller/key_sub/',
  2508.                 'key_sub' => 'textes-auteurs',
  2509.                 'count' => $this->count_textes_par_auteurs()
  2510.             ),
  2511.         );
  2512.         // aside
  2513.         $this->asides->load(['url_lists_alone,bio_textes' => array(
  2514.             'exec' => [
  2515.                 'color' => 'textes'
  2516.             ],
  2517.             'php' => array(
  2518.                 'method' => 'asidesUrlLists',
  2519.                 'urls' => $menu_textes_textes,
  2520.                 'url' => '/biographies/{v_url_clean}/textes/',
  2521.                 'params' => array(
  2522.                     'key_controller' => $this->context['view']->url_clean,
  2523.                     'activate' => $this->context['action']
  2524.                 )
  2525.             ),
  2526.             'title' => 'Texte(s)',
  2527.         )]);
  2528.         $this->getAsidesTraductions($this->infosperson['firstname'].' '.$this->infosperson['lastname']);
  2529.         return $this->view('biographies/textes-traductions.html.twig');
  2530.     }
  2531.     // }}}
  2532.     // {{{ action_traductions()
  2533.     /** Traductions
  2534.      *
  2535.      * @Route("/biographies/{slug}/traductions/", name="biographie_traductions")
  2536.      *
  2537.      * @access public
  2538.      * @return void
  2539.      */
  2540.     public function action_traductions($slug null)
  2541.     {
  2542.         $this->InitController($slug'textes');
  2543.         $this->context['view']->show_translate false;
  2544.         // recuperer les traductions
  2545.         $texts_person $this->persons->getTextsPerson($this->idperson,'translator_translation',1,null,null,true);
  2546.         $this->view->affiche_original_author true;
  2547.         // filtrer par genre
  2548.         $this->view->texts_by_genre $this->textsByGenre($texts_person);
  2549.         /* on récupère à partir du tableau la sélection de l'utilisateur sur le type de texte devant être affiché */
  2550.         $menu_textes_trier = array();
  2551.         $selected_texts_by_genre 1;
  2552.         //Les adaptations théâtrale
  2553.         $this->view->texts_by_genre['a']['texts'] = (!empty($this->view->adaptations)) ? $this->view->adaptations '';
  2554.         $this->view->texts_by_genre['a']['genretext'] = 'Adaptation théâtrale';
  2555.         /* on récupère la liste des différents types de textes disponibles inclus les adaptations*/
  2556.         $menu_textes_trier = array();
  2557.         foreach($this->view->texts_by_genre AS $k => $v){
  2558.             $menu_textes_trier[$k] = array(
  2559.                 'name' => $v['genretext'],
  2560.                 'key_type' => $k
  2561.             );
  2562.         }
  2563.         //on sélectionne le choix de l'utilisateur
  2564.         $selected_texts_by_genre_default key($menu_textes_trier);
  2565.         if (!empty($this->context['params']['type'])){
  2566.             $selected_texts_by_genre $this->context['params']['type'];
  2567.             if (!array_key_exists($selected_texts_by_genre$this->view->texts_by_genre)){
  2568.                 $selected_texts_by_genre $selected_texts_by_genre_default;
  2569.             }
  2570.             $texts_by_genre[$selected_texts_by_genre] = $this->view->texts_by_genre[$selected_texts_by_genre];
  2571.             unset($this->view->texts_by_genre);
  2572.             $this->view->texts_by_genre $texts_by_genre;
  2573.         }
  2574.         $this->getAsidesTextesAuteurs();
  2575.         $this->getAsidesTraductions($this->infosperson['firstname'].' '.$this->infosperson['lastname']);
  2576.         return $this->view('biographies/traductions.html.twig');
  2577.     }
  2578.     // }}}
  2579.     // {{{ action get aside pour les videos
  2580.     /**
  2581.      *
  2582.      */
  2583.     public function getAsidesVideos($action 'dvds'$nb_videos_partenariats null$filtre_captation null)
  2584.     {
  2585.         $multimedias $this->em->getRepository(Multimedias::class);
  2586.         if (is_null($nb_videos_partenariats)){
  2587.             $params_query_commun = array(
  2588.                 'object' => array($this->idobject => ['persons']),
  2589.                 'where' => array(array('multimedias','audio_video',2)),
  2590.                 'order' => array('multimedias.date'),
  2591.                 'limit' => array('all'),
  2592.                 'dbg' => array('last_commun','Vidéos en partenariat du contact'),
  2593.             );
  2594.             $sql_dates_multimedias $multimedias->getSQLMultimedias($params_query_communfalse);
  2595.             $total $multimedias->queryAll($sql_dates_multimedias);
  2596.         }
  2597.         if (empty($this->context['view']->nb_spectacles_anciens)){
  2598.             $this->action_spectacles(nullfalse);
  2599.         }
  2600.         if (!isset($this->context['view']->nb_spectacles_videos_count)){
  2601.             if ($lists_spectacles $this->getSpectaclesPerson()) {
  2602.                 $this->getParamsSpectaclesVideos($lists_spectacles);
  2603.             }
  2604.         }
  2605.         //La liste des menu qui sera affiché à travers les asides
  2606.         //aside
  2607.         $this->context['view']->menu_videos = array(
  2608.             'affiche' => array(
  2609.                 'name' => 'Spectacles à venir',
  2610.                 'key_genre' => 'affiche',
  2611.                 'count' => (!empty($this->context['view']->nb_spectacles_videos_count['affiche'])) ? $this->context['view']->nb_spectacles_videos_count['affiche'] : 0
  2612.             ),
  2613.             'anciens' => array(
  2614.                 'name' => 'Spectacles passés',
  2615.                 'key_genre' => 'anciens',
  2616.                 'count' => (!empty($this->context['view']->nb_spectacles_videos_count['anciens'])) ? $this->context['view']->nb_spectacles_videos_count['anciens'] : 0
  2617.             ),
  2618.             'all' => array(
  2619.                 'url' => '/biographies/{v_url_clean}/videos/type/key_genre',
  2620.                 'name' => 'Toutes les vidéos',
  2621.                 'key_genre' => 'all',
  2622.                 'count' => (isset($this->context['view']->nb_spectacles_videos_type['all'])) ? (int)$this->context['view']->nb_spectacles_videos_type['all'] : null
  2623.             )
  2624.         );
  2625.         $this->asides->load(['url_lists' => array(
  2626.             'exec' => array(
  2627.                 'htmlstart' => true,
  2628.                 'htmlend' => true,
  2629. //                'htmlend' => (in_array($this->context['view']->type_spectacle, ['anciens','partenariat'])) ? false : true,
  2630.                 'color' => 'videos',
  2631.             ),
  2632.             'php' => array(
  2633.                 'method' => 'asidesUrlLists',
  2634.                 'urls' => $this->context['view']->menu_videos,
  2635.                 'url' => '/biographies/{v_url_clean}/videos/periode/key_genre',
  2636.                 'params' => array(
  2637.                     'activate' => ($action != 'dvd' && $action != 'captations') ? $this->context['view']->type_spectacle ''
  2638.                 ),
  2639.             ),
  2640.             'title' => html_entity_decode('Voir'),
  2641.         )]);
  2642. //        if (in_array($this->context['view']->type_spectacle, ['anciens','partenariat'])){
  2643. //            $this->asides->load(['par_saison' => array(
  2644. //                'exec' => array(
  2645. //                    'htmlend' => true,
  2646. //                    'color' => 'videos',
  2647. //                ),
  2648. //                'php' => array(
  2649. //                    'method' => 'asidesUrlListsForms',
  2650. //                    'url' => '/biographies/{v_url_clean}/videos/type/key_type/',
  2651. //                    'params' => array(
  2652. //                        'key_type' => $this->context['view']->type_spectacle
  2653. //                    )
  2654. //                ),
  2655. //                'title' => html_entity_decode('Recherche par période')
  2656. //            )]);
  2657. //        }
  2658.         if (empty($this->view->subaside_action)){
  2659.             $this->view->subaside_action null;
  2660.         }
  2661.         $count_dvds $this->getDvds(true);
  2662.         $podcasts $this->em->getRepository(Podcasts::class);
  2663.         $culturebox_params = array(
  2664.             'special' => array(
  2665.                 'type_podcast' => 'culturebox'//commun
  2666.                 'is_integrale' => true//commun
  2667.                 'idpersons' => $this->idobject,
  2668.                 'current' => true
  2669.             ),
  2670.             'dbg' => array('culturebox_data''Les replay culturebox'),
  2671.         );
  2672.         $nb_captations $podcasts->countListPodcasts($culturebox_params);
  2673.         $culturebox_params_vod = array(
  2674.             'special' => array(
  2675.                 'type_podcast' => 'culturebox'//commun
  2676.                 'idpersons' => $this->idobject,
  2677.                 'type_diffusion' => 1
  2678.             ),
  2679.             'dbg' => array('culturebox_data''Les vods culturebox'),
  2680.         );
  2681.         $nb_vod $podcasts->countListPodcasts($culturebox_params_vod);
  2682.         $culturebox_params_vod['special']['type_diffusion'] = 2;
  2683.         $nb_svod $podcasts->countListPodcasts($culturebox_params_vod);
  2684.         $contact_dvd = array(
  2685.             'dvd' => array(
  2686.                 'name' => 'DVD',
  2687.                 'key_url' => '/biographies/' $this->context['view']->url_clean '/dvd',
  2688.                 'count' => $count_dvds,
  2689.                 'key_type' => 'dvd_'
  2690.             ),
  2691.             'captations' => array(
  2692.                 'name' => 'Captation(s) en streaming (gratuit)',
  2693.                 'key_url' => '/biographies/' $this->context['view']->url_clean '/captations',
  2694.                 'count' => $nb_captations,
  2695.                 'key_type' => 'captations_'
  2696.             ),
  2697.             'vod' => array(
  2698.                 'name' => 'VOD',
  2699.                 'key_url' => '/biographies/' $this->context['view']->url_clean '/captations/type/vod',
  2700.                 'count' => $nb_vod,
  2701.                 'key_type' => 'captations_vod'
  2702.             ),
  2703.             'svod' => array(
  2704.                 'name' => 'SVOD',
  2705.                 'key_url' => '/biographies/' $this->context['view']->url_clean '/captations/type/svod',
  2706.                 'count' => $nb_svod,
  2707.                 'key_type' => 'captations_svod'
  2708.             )
  2709.         );
  2710.         if ($count_dvds>|| $nb_captations 0) {
  2711.             $this->asides->load(['url_lists_alone,contact_dvd' => array(
  2712.                 'exec' => ['alone' => true,'color' => 'videos'],
  2713.                 'php' => [
  2714.                     'method' => 'asidesUrlLists',
  2715.                     'urls' => $contact_dvd,
  2716.                     'url' => 'key_url',
  2717.                     'params' => array(
  2718.                         'activate' => $action.'_'.$this->view->subaside_action
  2719.                     )
  2720.                 ],
  2721.                 'title' => 'Films & Captations'
  2722.             )]);
  2723.         }
  2724.         if (!empty($this->context['view']->filtre_culturebox)){
  2725.             $this->asides->load(['url_lists_alone' => array(
  2726.                 'exec' => ['alone' => true,'color' => 'videos'],
  2727.                 'php' => array(
  2728.                     'method' => 'asidesUrlLists',
  2729.                     'urls' => $this->context['view']->filtre_culturebox,
  2730.                     'url' => '/biographies/' $this->context['view']->url_clean '/captations/filtre/key_type',
  2731.                     'params' => array(
  2732.                         'key_type' => 'auto_key',
  2733.                         'activate' => $filtre_captation,
  2734.                     )
  2735.                 ),
  2736.                 'title' => 'Filtres'
  2737.             )]);
  2738.             $this->asides->load('common_partenaire_culturebox');
  2739.         }
  2740.         $this->asides->load(['common_participer_contacts' => array(
  2741.             'exec' => ['color' => 'videos']
  2742.         )]);
  2743.     }
  2744.     // {{{ getAsidesDates()
  2745.     /** Création des asides pour les dates
  2746.      *
  2747.      *
  2748.      * @access private
  2749.      */
  2750.     private function getAsidesDates(){
  2751.         $currentSaison Date_time::getLastSaison();
  2752.         $implode_currentSaison explode('-'$currentSaison);
  2753.         $nextSaison Date_time::getNextSaison($currentSaison);
  2754.         $implode_nextSaison explode('-'$nextSaison);
  2755.         $this->getSpectaclesPremieres(['count' => true'current_saison' => $currentSaison]);
  2756.         $menu_premieres = [
  2757.             [
  2758.                 'url' => '/biographies/{v_url_clean}/dates/',
  2759.                 'name' => 'Toutes les dates',
  2760.                 'key_type' => 'all'
  2761.             ],
  2762.             [
  2763.                 'name' => 'Première(s)',
  2764.                 'key_type' => 'premieres',
  2765.                 'key_type_a' => 'premieres_0',
  2766.                 'count' => $this->getSpectaclesPremieres(['count' => true])
  2767.             ],
  2768. //            [
  2769. //                'name' => 'Première(s) en France',
  2770. //                'key_type' => 'france',
  2771. //                'count' => $this->getSpectaclesPremieres(['count' => true, 'france' => true])
  2772. //            ],
  2773.             [
  2774.                 'name' => 'Première(s) de la saison '.substr($implode_currentSaison[0], -22).'/'.substr($implode_currentSaison[1], -22),
  2775.                 'key_type' => 'saison',
  2776.                 'key_type_a' => 'saison_0',
  2777.                 'count' => $this->getSpectaclesPremieres(['count' => true'current_saison' => $currentSaison'having_start_to_saison' => true])
  2778.             ],
  2779.             [
  2780.                 'name' => 'Première(s) de la saison '.substr($implode_nextSaison[0], -22).'/'.substr($implode_nextSaison[1], -22),
  2781.                 'key_type' => 'saison',
  2782.                 'key_type_a' => 'saison_1',
  2783.                 'key_saison' => 1,
  2784.                 'count' => $this->getSpectaclesPremieres(['count' => true'current_saison' => $nextSaison'having_start_to_saison' => true])
  2785.             ]
  2786.         ];
  2787.         $active_saison 'all';
  2788.         if (!empty($this->context['params']['type'])){
  2789.             $active_saison $this->context['params']['type'];
  2790.             if (isset($_GET['next'])){
  2791.                 $active_saison .= '_'.(int)$_GET['next'];
  2792.             }
  2793.             else{
  2794.                 $active_saison .= '_0';
  2795.             }
  2796.         }
  2797.         $this->asides->load(['url_lists' => array(
  2798.             'exec' => [
  2799.                 'color' => 'spectacles',
  2800.                 'htmlstart' => true,
  2801.                 'htmlend' => (empty($this->context['view']->menu_aside_dates)) ? true false
  2802.             ],
  2803.             'php' => array(
  2804.                 'method' => 'asidesUrlLists',
  2805.                 'urls' => $menu_premieres,
  2806.                 'url' => '/biographies/{v_url_clean}/premieres/generate_params',
  2807.                 'params' => array(
  2808.                     'activate' => $active_saison,
  2809.                     'key_test' => 'key_type',
  2810.                 ),
  2811.                 'structure' => array(
  2812.                     'type' => 'key_type',
  2813.                     'structure_classic' => array(
  2814.                         'next' => 'key_saison'
  2815.                     )
  2816.                 )
  2817.             ),
  2818.             'title' => 'Voir'
  2819.         )]);
  2820.         if (!empty($this->context['view']->menu_aside_dates)) {
  2821.             $this->asides->load(['url_lists,filtre' => array(
  2822.                 'exec' => [
  2823.                     'color' => 'spectacles',
  2824.                     'htmlend' => true,
  2825.                 ],
  2826.                 'php' => array(
  2827.                     'method' => 'asidesUrlLists',
  2828.                     'urls' => $this->context['view']->menu_aside_dates,
  2829.                     'url' => '/biographies/{v_url_clean}/dates/#params',
  2830.                 ),
  2831.                 'title' => 'Recherche par période'
  2832.             )]);
  2833.         }
  2834.         $this->context['view']->area $this->context['params']['area'] ?? null;
  2835.         $this->asides->load(['common_carte' => array(
  2836.             'url' => '/biographies/'.$this->context['view']->url_clean.'/premieres/type/france/area/get_id',
  2837.             'disable_menu' => true
  2838.         )]);
  2839.         $this->asides->load('common_participer_personne');
  2840.     }
  2841.     // }}}
  2842.     public function getParamsSpectaclesVideos($lists_spectacles)
  2843.     {
  2844.         $params_sql_spectacles = array(
  2845.             'params' => array(
  2846.                 'groupby' => 's.idspectacle',
  2847.                 'order' => ['creation_date''DESC'],
  2848.                 'limit' => 'all'
  2849.             ),
  2850.             'special' => array(
  2851.                 // 'idperson_author' => true,
  2852.                 // 'idperson_idtexts' => $this->idtexts_person,
  2853.                 'multimedias_videos_associes' => true,
  2854.                 'idspectacle' => $lists_spectacles
  2855.             ),
  2856.             'dbg' => array('nb_spectacles_author''Les spectacles à partir des textes de la personne')
  2857.         );
  2858.         foreach (['affiche''anciens'] AS $value) {
  2859.             $params_sql_spectacles_count $params_sql_spectacles;
  2860.             if ($value == 'affiche') {
  2861.                 $params_sql_spectacles_count['special']['prochains'] = '720';
  2862.             } else {
  2863.                 $params_sql_spectacles_count['special']['anciens'] = true;
  2864.             }
  2865.             $this->context['view']->nb_spectacles_videos_count[$value] = $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql_spectacles_count);
  2866.         }
  2867.         return $params_sql_spectacles;
  2868.     }
  2869.     // {{{ getAsideListesFranceCulture()
  2870.     /** Création de l'aside pour france culture
  2871.      *
  2872.      *
  2873.      * @access private
  2874.      */
  2875.     private function getAsideListesFranceCulture($params = array()){
  2876.         // france culture et culture box
  2877.         $podcasts $this->em->getRepository(Podcasts::class);
  2878.         // Podcast France Culture  => les derniers référencés
  2879.         $franceculture_params = array(
  2880.             //'direction' => 'DESC',
  2881.             'limit' => array(0,3),
  2882.             'special' => array(
  2883.                 'idpersons' => $this->idperson,
  2884.                 'type_podcast' => 'franceculture',
  2885.             ),
  2886.             'dbg' => array('derniers_franceculture''Les derniers podcasts franceculture référencés'),
  2887.         );
  2888.         $this->context['view']->derniers_franceculture $derniers_franceculture $podcasts->getListPodcasts($franceculture_params);
  2889.         $this->asides->load(['franceculture_lastpodcast_iframe' => [
  2890.             'podcast' => $derniers_franceculture,
  2891.             'custom_url' => '/'.$this->context['controller'].'/'.$this->context['view']->url_clean.'/podcasts'
  2892.         ]]  );
  2893.     }
  2894.     // }}}
  2895.     // {{{ getAsidesTextesAuteurs()
  2896.     /** Liste des asides pour les traductions
  2897.      *
  2898.      *
  2899.      * @access private
  2900.      */
  2901.     private function getAsidesTextesAuteurs($params = array()){
  2902.         //Si il existe des textes associés à la personne
  2903.         $total_textes = ($this->infosperson['is_author']>|| $this->contents->countAssociateContent('persons',$this->idperson,'class_biotextes')) ? 0;
  2904.         // playlist - par l'auteur
  2905.         $total_textes_par_auteurs $this->count_textes_par_auteurs();
  2906.         //Les livres sur l'auteur (par d'autres auteurs)
  2907.         $total_textes_sur_auteurs $this->persons->getAssociateTexts($this->idpersonnullnull, ['count_only' => true]);
  2908.         //  if ($this->persons->getAssociateTexts($this->idperson,'','',['count_only' => true])){
  2909.         $menu_textes_textes = array(
  2910.             array(
  2911.                 'name' => 'Tous les textes',
  2912.                 'url' => '/biographies/key_controller/key_sub/',
  2913.                 'key_sub' => 'textes',
  2914.                 'count' => $total_textes
  2915.             ),
  2916.             array(
  2917.                 'name' => 'Les textes par l\'auteur',
  2918.                 'url' => '/biographies/key_controller/key_sub/',
  2919.                 'key_sub' => 'textes-auteurs',
  2920.                 'count' => $total_textes_par_auteurs
  2921.             ),
  2922.         );
  2923.         // aside
  2924.         if ($total_textes_par_auteurs || $total_textes || $total_textes_sur_auteurs){
  2925.             $params_aside = array(
  2926.                 'exec' => [
  2927.                     'htmlstart' => true,
  2928.                     'htmlend' => true,
  2929.                     'color' => 'textes'
  2930.                 ],
  2931.                 'php' => array(
  2932.                     'method' => 'asidesUrlLists',
  2933.                     'urls' => $menu_textes_textes,
  2934.                     'url' => '/biographies/{v_url_clean}/textes/',
  2935.                     'params' => array(
  2936.                         'key_controller' => $this->context['view']->url_clean,
  2937.                         'activate' => $this->context['action']
  2938.                     )
  2939.                 ),
  2940.                 'title' => 'Texte(s)',
  2941.             );
  2942.             if (!empty($params['htmlend'])){
  2943.                 $params_aside['exec']['htmlend'] = false;
  2944.             }
  2945.             $this->asides->load(['url_lists,bio_textes' => $params_aside]);
  2946.             return ['htmlstart' => true];
  2947.         }
  2948.         else{
  2949.             return false;
  2950.         }
  2951.     }
  2952.     // }}}
  2953.     // {{{ getAsidesTextesSurAuteurs()
  2954.     /** Liste des asides pour les traductions
  2955.      *
  2956.      *
  2957.      * @access private
  2958.      */
  2959.     private function getAsidesTextesSurAuteurs($params = array())
  2960.     {
  2961.         //Les livres sur l'auteur (par d'autres auteurs)
  2962.         $total_textes_sur_auteurs $this->em->getRepository(Persons::class)->getAssociateTexts($this->idpersonnullnull, ['count_only' => true]);
  2963.         $urls_menu = [
  2964.             [
  2965.                 'name' => 'Tous les textes',
  2966.                 'url' => '/biographies/key_controller/key_sub/',
  2967.                 'key_sub' => 'textes-sur-auteurs',
  2968.                 'count' => $total_textes_sur_auteurs
  2969.             ]
  2970.         ];
  2971.         if (!empty($total_textes_sur_auteurs)){
  2972.             $params_aside = array(
  2973.                 'exec' => [
  2974.                     'htmlstart' => true,
  2975.                     'htmlend' => true,
  2976.                     'color' => 'textes'
  2977.                 ],
  2978.                 'php' => array(
  2979.                     'method' => 'asidesUrlLists',
  2980.                     'urls' => $urls_menu,
  2981.                     'url' => '/biographies/{v_url_clean}/textes/',
  2982.                     'params' => array(
  2983.                         'key_controller' => $this->context['view']->url_clean,
  2984.                         'activate' => $this->context['action']
  2985.                     )
  2986.                 ),
  2987.                 'title' => 'sur '.$this->infosperson['lastname'].' '.$this->infosperson['firstname'],
  2988.             );
  2989.             if (!empty($params['htmlend'])){
  2990.                 $params_aside['exec']['htmlend'] = false;
  2991.             }
  2992.             $this->asides->load(['url_lists,textes_sur_auteur' => $params_aside]);
  2993.         }
  2994.     }
  2995.     // }}}
  2996.     // {{{ action_scenes()
  2997.     /** Liste des asides pour les traductions
  2998.      *
  2999.      *
  3000.      * @access private
  3001.      */
  3002.     private function getAsidesTraductions($name ''$getAsidesTextesAuteurs true){
  3003.         $menu_textes_traduction_par_auteur = array(
  3004.             array(
  3005.                 'name' => 'Toutes ses traductions',
  3006.                 'url' => '/biographies/key_controller/traductions',
  3007.                 'key' => 'traductions'
  3008.             )
  3009.         );
  3010.         $menu_textes_traduction_de_auteur = array(
  3011.             array(
  3012.                 'name' => 'Toutes les traductions de ses textes',
  3013.                 'url' => '/biographies/key_controller/textes-traductions',
  3014.                 'key' => 'textes-traductions'
  3015.             )
  3016.         );
  3017.         if ($this->persons->getTextsPerson($this->idperson,'translator_translation_count',1,null,null,true)){
  3018.             $this->asides->load(['url_lists_alone,bio_traduction_par_auteur' => array(
  3019.                 'exec' => [
  3020.                     'color' => 'textes'
  3021.                 ],
  3022.                 'php' => array(
  3023.                     'method' => 'asidesUrlLists',
  3024.                     'urls' => $menu_textes_traduction_par_auteur,
  3025.                     'params' => array(
  3026.                         'key_controller' => $this->context['view']->url_clean,
  3027.                         'activate' => $this->context['action']
  3028.                     )
  3029.                 ),
  3030.                 'title' => 'Traductions',
  3031.                 'subtitle' => (!empty($name)) ? 'par '.$name.'' '',
  3032.             )]);
  3033.         }
  3034.         if ($this->persons->getTextsPerson($this->idperson,'count_all_texts_translations',1,null,null,true)){
  3035.             $this->asides->load(['url_lists_alone,bio_traduction_de_auteur' => array(
  3036.                 'exec' => [
  3037.                     'color' => 'textes'
  3038.                 ],
  3039.                 'php' => array(
  3040.                     'method' => 'asidesUrlLists',
  3041.                     'urls' => $menu_textes_traduction_de_auteur,
  3042.                     'params' => array(
  3043.                         'key_controller' => $this->context['view']->url_clean,
  3044.                         'activate' => $this->context['action']
  3045.                     )
  3046.                 ),
  3047.                 'title' => 'Traductions',
  3048.                 'subtitle' => (!empty($name)) ? 'des textes de '.$name.'' '',
  3049.             )]);
  3050.         }
  3051.         if ($getAsidesTextesAuteurs){
  3052.             $this->getAsidesTextesAuteurs($this->infosperson['firstname'].' '.$this->infosperson['lastname']);
  3053.         }
  3054.         $this->asides->load(['common_participer_personne' => array(
  3055.             'exec' => ['color' => 'textes']
  3056.         )]);
  3057.     }
  3058.     // }}}
  3059.     // {{{ action_scenes()
  3060.     /** Mises en scène
  3061.      *
  3062.      *
  3063.      * @access public
  3064.      * @return void
  3065.      */
  3066.     public function action_scenes() {
  3067.         return $this->redirectToRoute('biographie_spectacles', ['slug' => $this->infosperson['url_clean']], Response::HTTP_MOVED_PERMANENTLY);
  3068.     }
  3069.     // }}}
  3070.     // {{{ action_acteur()
  3071.     /** Interprétations
  3072.      *
  3073.      *
  3074.      * @access public
  3075.      * @return void
  3076.      */
  3077.     public function action_acteur() {
  3078.         return $this->redirectToRoute('biographie_spectacles', ['slug' => $this->infosperson['url_clean']], Response::HTTP_MOVED_PERMANENTLY);
  3079.     }
  3080.     // }}}
  3081.     // {{{ action_activites()
  3082.     /** Autres activités
  3083.      *
  3084.      *
  3085.      * @access public
  3086.      * @return void
  3087.      */
  3088.     public function action_activites()
  3089.     {
  3090.         $this->extra_locate $this->extra_title 'Autres activités';
  3091.         // voir si bioautres
  3092.         $bioautres $this->contents->getAssociateContent($this->idperson,'persons','class_bioautres',array('wiki_convert'=>true));
  3093.         if (!empty($bioautres['text'])) {
  3094.             $this->view->bioautres $bioautres;
  3095.         }
  3096.     }
  3097.     // }}}
  3098.     // {{{ action_videos()
  3099.     /** Vidéos associés à cette personne
  3100.      *
  3101.      * @Route("/biographies/{slug}/videos/", name="biographie_videos")
  3102.      * @Route("/biographies/{slug}/videos/type/{type}", name="biographie_videos_type")
  3103.      * @Route("/biographies/{slug}/videos/periode/{periode}", name="biographie_videos_periode")
  3104.      *
  3105.      * @access public
  3106.      * @return void
  3107.      */
  3108.     public function action_videos($slug null$type null$periode null)
  3109.     {
  3110.         $this->InitController($slug'videos');
  3111.         $this->context['params']['type'] = $type;
  3112.         $this->view->context['params']['type'] = &$this->context['params']['type'];
  3113.         $this->context['params']['periode'] = $periode;
  3114.         $this->view->context['params']['periode'] = &$this->context['params']['periode'];
  3115.         $type_filtre = (!empty($this->view->context['params']['type'])) ? $this->view->context['params']['type'] : null;
  3116.         $videos = array();
  3117.         $set_format = array('width'=>$_ENV['VIGN_VIDEO_WIDTH'],'height'=>$_ENV['VIGN_VIDEO_HEIGHT'],'fleche'=>'none','ratio' => '169');
  3118.         $this->context['view']->contactsvideos true;
  3119.         //Comptes du toal des vidéos liés à une personne
  3120.         //les prochains spectacles avec vidéos
  3121.         if (empty($this->idtexts_person)) {
  3122.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  3123.         }
  3124.         if ($lists_spectacles $this->getSpectaclesPerson()) {
  3125.             $params_sql_spectacles $this->getParamsSpectaclesVideos($lists_spectacles);
  3126.         }
  3127.         //FIN Comptes du toal des vidéos liés à une personne
  3128.         //Toutes les vidéos qui ne sont pas des vidéos liés aux spectacles
  3129.         if (!is_null($type_filtre)){
  3130.             $liste_total $this->getMultimediasPerson(array('count' => true));
  3131.             //affichage du block classique dans la vue
  3132.             $this->view->videos_classic true;
  3133.             //Nombre d'élément limité à 20
  3134.             $this->perPage 20;
  3135.             //Tout ce qui concerne la pagination
  3136.             $this->context['view']->pagination $this->getPagination($liste_total);
  3137.             $this->context['view']->pagination['custom'] = true;
  3138.             $this->context['view']->pagination['custom_name'] = 'vidéos';
  3139.             $this->context['view']->pagination['totalItems'] = $this->context['view']->pagination['total'];
  3140.             //Limitation pour la pagination
  3141.             $limit = array(
  3142.                 'limit' => array($this->getLimitStart(),$this->perPage)
  3143.             );
  3144.             $liste $this->getMultimediasPerson($limit);
  3145.             foreach($liste as $item) {
  3146.                 $idmultimedia $item['idmultimedia'];
  3147.                 $multimedias $this->em->getRepository(Multimedias::class);
  3148.                 $videos[$idmultimedia] = $multimedias->getInfosMultimedia($idmultimedia,false,false,array('vignette' => $set_format,'tableau'=>true));
  3149.             }
  3150.         }
  3151.         //Toutes les vidéos liés à une personne
  3152.         else {
  3153.             //les prochains spectacles avec vidéos
  3154.             if (empty($this->idtexts_person)) {
  3155.                 $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  3156.             }
  3157.             $periode_filtre_default 'affiche';
  3158.             $periode_filtre = (!empty($this->view->context['params']['periode'])) ? $this->view->context['params']['periode'] : $periode_filtre_default;
  3159.             if ($lists_spectacles){
  3160.                 $redirect false;
  3161.                 foreach(['affiche''anciens'] AS $value){
  3162.                     //si il n'y a pas de vidéo, nous redirigons l'utilisateur sur une autre page
  3163.                     if ($this->context['view']->nb_spectacles_videos_count[$value] == && $value == $periode_filtre){
  3164.                         $redirect true;
  3165.                     }
  3166.                     else if ($redirect){
  3167.                         $custom_path $value;
  3168.                     }
  3169.                 }
  3170.                 if ($redirect){
  3171.                     return $this->redirectToRoute('biographie_videos_type', ['slug' => $this->infosperson['url_clean'], 'type' => 'all']);
  3172.                 }
  3173.                 else if (!empty($custom_path)){
  3174.                     return $this->redirectToRoute('biographie_videos_periode', ['slug' => $this->infosperson['url_clean'], 'periode' => $custom_path]);
  3175.                 }
  3176.                 if ($periode_filtre == 'affiche'){
  3177.                     $params_sql_spectacles['special']['prochains'] = '720';
  3178.                 }
  3179.                 else{
  3180.                     $params_sql_spectacles['special']['anciens'] = true;
  3181.                 }
  3182.                 $this->context['view']->{'spectacle_'.$periode_filtre} = true;
  3183.                 $this->context['view']->nb_spectacles_texts $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql_spectacles);
  3184.                 if (!is_numeric($this->context['view']->nb_spectacles_texts)){
  3185.                     $this->context['view']->nb_spectacles_texts 0;
  3186.                 }
  3187.                 $this->perPage 10;
  3188.                 $this->context['view']->pagination $this->getPagination($this->context['view']->nb_spectacles_texts);
  3189.                 //affichage des spectacles
  3190.                 $this->context['view']->pagination['spectacle'] = true;
  3191.                 $this->context['view']->pagination['totalItems'] = $this->context['view']->pagination['total'];
  3192.                 unset($this->context['view']->pagination['total']);
  3193.                 $params_sql_spectacles['params']['limit'] = array($this->getLimitStart(),$this->perPage);
  3194.                 $listes  $this->em->getRepository(Spectacles::class)->getListSpectacles($params_sql_spectacles);
  3195.                 foreach($listes AS $idspectacle => $spectacle){
  3196.                     $multimedias $this->em->getRepository(Multimedias::class);
  3197.                     $videos[$idspectacle] = $multimedias->getInfosMultimedia($spectacle['idmultimedia'],false,false,array('vignette' => $set_format,'tableau'=>true));
  3198.                     //la date de création uniquement pour les spectacles passés
  3199.                     if ($periode_filtre == 'anciens'){
  3200.                         $spectacle['annee_creation'] = $this->em->getRepository(Spectacles::class)->getYear($spectacle['creation_date_us']);
  3201.                         $spectacle['footer_creation_date'] = true//on force l'affichage de la date de création
  3202.                         // $spectacle['footer_artiste_associe'] = true; //on force l'affichage de la date de création
  3203.                         $spectacle $this->em->getRepository(Spectacles::class)->clearSpectaclesAddAllPersons($spectacle);
  3204.                     }
  3205.                     if ($periode_filtre == 'affiche'){
  3206.                         $spectacle['schedule'] = $this->em->getRepository(Spectacles::class)->getProchDateLieu(
  3207.                             array(),
  3208.                             $spectacle['idspectacle']
  3209.                         );
  3210.                     }
  3211.                     $videos[$idspectacle]['spectacle'] = $spectacle;
  3212.                 }
  3213.             }
  3214.             else{
  3215.                 return $this->redirectToRoute('biographie_videos_type', ['slug' => $this->infosperson['url_clean'], 'type' => 'all']);
  3216.             }
  3217.         }
  3218.         $this->view->spectacles_videos $videos;
  3219.         $this->extra_locate 'Vidéos';
  3220.         $filtre_activate 'prochains';
  3221.         if (isset($periode_filtre)){
  3222.             $filtre_activate $periode_filtre;
  3223.         }
  3224.         else if ($type_filtre){
  3225.             $filtre_activate $type_filtre;
  3226.         }
  3227.         $this->context['view']->type_spectacle $filtre_activate;
  3228.         // Get number of video of type all to display or not the 'Toutes les vidéos' aside link
  3229.         $this->context['view']->nb_spectacles_videos_type['all'] = $this->getMultimediasPerson(array('count' => true));
  3230.         //aside
  3231.         $this->getAsidesVideos('videos',null);
  3232.         //pour le titre de la page
  3233.         $this->view->entete_page[$filtre_activate] = true;
  3234.         $subtitle "Toutes les vidéos des spectacles";
  3235.         if ($filtre_activate != "all" && !empty($this->context['view']->menu_periodes[$filtre_activate]['name'])){
  3236.             $subtitle $this->context['view']->menu_periodes[$filtre_activate]['name'].' en vidéos';
  3237.         }
  3238.         $url $_ENV['URL_THNET'].'/biograpahies/'.$this->infosperson['url_clean'].'/'.$this->context['action'].'/videos/';
  3239.         $title $this->infosperson['fullname'].' - '.$subtitle;
  3240.         $this->setReseauSocial($titlenull$url);
  3241.         return $this->view('biographies/videos.html.twig');
  3242.     }
  3243.     // }}}
  3244.     // {{{ action_dvd()
  3245.     /** DVD associés à cette personne
  3246.      *
  3247.      * @Route("/biographies/{slug}/dvd/", name="biographie_dvd")
  3248.      *
  3249.      * @access public
  3250.      * @return void
  3251.      */
  3252.     public function action_dvd($slug null)
  3253.     {
  3254.         $this->InitController($slug'videos');
  3255.         $periode_filtre null;
  3256.         $dvds $this->em->getRepository(Dvds::class);
  3257.         $nb_dvds $dvds->countDvds('persons',$this->idperson);
  3258.         if ($nb_dvds>0) {
  3259.             $params_sql = array(
  3260.                 'limit' => array(01000),
  3261.                 'dbg' => array('dvds_dernier''Liste des DVD'),
  3262.                 'special' => array(
  3263.                     'idpersons' => array($this->idperson),
  3264.                 )
  3265.             );
  3266.             $this->view->list_dvds $dvds->getListDvds($params_sql);
  3267.         } else {
  3268.             $this->view->list_dvds = [];
  3269.         }
  3270.         $this->extra_locate 'DVD';
  3271.         $this->extra_title 'DVD';
  3272.         //aside
  3273.         $contact_dvd = array(
  3274.             array(
  3275.                 'name' => 'DVD',
  3276.                 'key_url' => '/biographies/' $this->context['view']->url_clean '/dvd'
  3277.             )
  3278.         );
  3279.         $this->getAsidesVideos('dvd'null);
  3280.         return $this->view('biographies/dvd.html.twig');
  3281.     }
  3282.     // }}}
  3283.     // {{{ action_spectacle()
  3284.     /** Spectacles associés à cette personne
  3285.      *
  3286.      *
  3287.      * @access public
  3288.      * @return void
  3289.      */
  3290.     public function action_spectacle()
  3291.     {
  3292.         // les mises en scene d'un texte
  3293.         $idtext = (int)$this->context['params']['idtext'];
  3294.         if (!empty($idtext)) {
  3295.             $texts $this->em->getRepository(Texts::class);
  3296.             $text $texts->getInfosText($idtext);
  3297.             if (!empty($text['title'])) {
  3298.                 // recuperer les mises en scene d'un texte et de ses traductions
  3299.                 // liste des textes
  3300.                 $sql_texts '
  3301.                     SELECT tt.idtexttraduction
  3302.                         FROM text_traduction tt, texts t
  3303.                         WHERE t.idtext=tt.idtext
  3304.                         AND t.publish=1
  3305.                         AND tt.idtext='.$idtext.'
  3306.                     UNION
  3307.                     SELECT idtext
  3308.                         FROM texts
  3309.                         WHERE publish=1
  3310.                         AND idtext='.$idtext;
  3311.                 $results_texts $this->persons->queryAll($sql_texts);
  3312.                 foreach($results_texts as $k=>$v) {
  3313.                     $ids_texts[$v['idtexttraduction']] = $v['idtexttraduction'];
  3314.                 }
  3315.                 $spectacles $this->em->getRepository(Spectacles::class);
  3316.                 $params = array(
  3317.                     'params' => array(
  3318.                         'where' => ' AND t.idtext IN ('.join(','$ids_texts).') ',
  3319.                         'order' => ['creation_date''DESC'],
  3320.                         'limit' => array(0,200)
  3321.                     ),
  3322.                     'special' => array(
  3323.                         'plus_proche' => true,
  3324.                     ),
  3325.                     'dbg' => array('spectacle_txt''Spectacles associés au texte')
  3326.                 );
  3327.                 // affichage
  3328.                 $params_display = array(
  3329.                     'stylemore' => array('imagep' => 'width:80px;''descsp' => 'width:500px;'),
  3330.                     'vignette' => array('width'=>65,'height'=>65,'forme'=>'round','direction'=>'crop','valround'=>7),
  3331.                     'display' => array( // ne pas afficher l'auteur et le titre
  3332.                         'no_author' => true,
  3333.                         'no_title' => true,
  3334.                     )
  3335.                 );
  3336.                 $list_spectacles $spectacles->getListSpectacles($params,$params_display);
  3337.                 $this->infosperson['text'] = $text;
  3338.                 $this->infosperson['spectacles'] = $list_spectacles;
  3339.             }
  3340.         }
  3341.         if (isset($this->context['params']['from']) && ($this->context['params']['from'] == 'traductions')) {
  3342.             $this->view->from_traductions true;
  3343.             $this->extra_title 'Événements autour du texte traduit';
  3344.         } else {
  3345.             $this->extra_title 'Événements autour du texte';
  3346.         }
  3347.         if (!empty($text['title'])) {
  3348.             $this->extra_title .= ' « '.$text['title']. ' »';
  3349.         }
  3350.         $this->extra_locate $this->extra_title;
  3351.         $this->view->textson 'on';
  3352.         //asides
  3353.         $this->asides->load('common_participer_personne');
  3354.     }
  3355.     // }}}
  3356.     // {{{ action_spectacles()
  3357.     /** Spectacles associés à une personne
  3358.      *
  3359.      * @Route("/biographies/{slug}/spectacles/", name="biographie_spectacles")
  3360.      * @Route("/biographies/{slug}/spectacles/type/{type}", name="biographie_spectacles_type")
  3361.      * @Route("/biographies/{slug}/spectacles/type/{type}/periode/{periode}", name="biographie_spectacles_type_periode")
  3362.      *
  3363.      * @access public
  3364.      * @return void
  3365.      */
  3366.     public function action_spectacles($slug null$execute_corps_page true$type null$periode null)
  3367.     {
  3368.         if ($execute_corps_page){
  3369.             $this->context['params']['type'] = $type;
  3370.             $this->context['params']['periode'] = $periode;
  3371.         }
  3372.         if ($execute_corps_page && empty($params)) {
  3373.             $this->InitController($slug'spectacles');
  3374.             $this->perPage 20;
  3375.             $this->context['view']->current_page 'spectacles';
  3376.         }
  3377.         if (empty($this->idperson)) {
  3378.             return $this->redirectToRoute('erreur_type', ['type' => 'introuvable']);
  3379.         }
  3380.         $default_type_spectacle 'all';
  3381.         $texts $this->em->getRepository(Texts::class);
  3382.         $spectacles $this->em->getRepository(Spectacles::class);
  3383.         $this->context['view']->menu_periodes = array(
  3384.             'all' => array(
  3385.                 'name' => 'Tous les spectacles associés',
  3386.                 'key_genre' => 'all'
  3387.             ),
  3388.             'affiche' => array(
  3389.                 'name' => 'À venir',
  3390.                 'is_simple' => true,
  3391.                 'key_genre' => 'affiche'
  3392.             )
  3393.         );
  3394.         // tous les spectacles ou ceux à l'affiche
  3395.         if (!empty($this->context['params']['periode']) && !empty($this->context['view']->menu_periodes[$this->context['params']['periode']])) {
  3396.             $this->context['view']->periode_spectacle $this->context['params']['periode'];
  3397.         } else {
  3398.             $this->context['view']->periode_spectacle 'affiche';
  3399.         }
  3400.         // marquer l'élément actif
  3401.         // $this->context['view']->menu_periodes[$this->context['view']->periode_spectacle]['activate'] = 'on';
  3402.         // tous les spectacles
  3403.         $roles['all']['type'] = 'spectacles';
  3404.         $roles['all']['name'] = 'Tous';
  3405.         $this->context['view']->menu_types_spectacle['all'] = array(
  3406.             'name' => 'Toutes',
  3407.         );
  3408.         $spectacle_roles $this->persons->getSpectacleRoles($this->idperson);
  3409.         if ($this->infosperson['sexe']==2) {
  3410.             $sexe 'female';
  3411.         } else {
  3412.             $sexe 'male';
  3413.         }
  3414.         foreach($spectacle_roles as $k=>$v) {
  3415.             $exist false;
  3416.             foreach($roles as $rk=>$rv) {
  3417.                 if (!empty($rv['name']) && $v['role_'.$sexe]==$rv['name']) {
  3418.                     $roles[$rk]['idrole'][] = $v['idrole'];
  3419.                     $exist true;
  3420.                 }
  3421.             }
  3422.             if (!$exist) {
  3423.                 $roles[$v['role']]['type'] = 'spectacle_person';
  3424.                 $roles[$v['role']]['name'] = $v['role_'.$sexe];
  3425.                 $roles[$v['role']]['idrole'] = array($v['idrole']);
  3426.                 $this->context['view']->menu_types_spectacle[$v['role']] = array(
  3427.                     'name' => $v['role_'.$sexe],
  3428.                 );
  3429.             }
  3430.         }
  3431.         // des spectacles ou la personne est l'auteur
  3432.         if (empty($this->idtexts_person)) {
  3433.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  3434.         }
  3435.         if (!empty($this->idtexts_person)) {
  3436.             $params_sql_texts = array(
  3437.                 'special' => array(
  3438.                     'idperson_author' => true,
  3439.                     'idperson_idtexts' => $this->idtexts_person,
  3440.                 ),
  3441.                 'dbg' => array('nb_spectacles_author''Les spectacles à partir des textes de la personne')
  3442.             );
  3443.             $this->context['view']->nb_spectacles_texts  $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql_texts);
  3444.             $roles['author'] = array(
  3445.                 'type' => 'text_author',
  3446.                 'name' => 'Auteur',
  3447.                 'idtexts' =>  $this->idtexts_person,
  3448.                 'nb_spectacles_texts' =>  $this->context['view']->nb_spectacles_texts,
  3449.             );
  3450.             if ($roles['author']['nb_spectacles_texts']>0) {
  3451.                 $this->context['view']->menu_types_spectacle['author'] = array(
  3452.                     'name' => 'Auteur',
  3453.                 );
  3454.                 if (empty($default_type_spectacle)) {
  3455.                     $default_type_spectacle 'author';
  3456.                 }
  3457.             }
  3458.             if ($this->infosperson['sexe']==2) {
  3459.                 $this->context['view']->menu_types_spectacle['author']['name'] = 'Auteure';
  3460.                 $roles['author']['name'] = 'Auteure';
  3461.             }
  3462.         }
  3463.         if ($execute_corps_page){
  3464.             if (!empty($this->context['params']['type']) && !empty($this->context['view']->menu_types_spectacle[$this->context['params']['type']])) {
  3465.                 $this->context['view']->type_spectacle $this->context['params']['type'];
  3466.             } else {
  3467.                 $this->context['view']->type_spectacle $default_type_spectacle;
  3468.             }
  3469.         }
  3470.         //On arrête là l'execution de cette fonction
  3471.         if (!$execute_corps_page)
  3472.             return null;
  3473.         $role $roles[$this->context['view']->type_spectacle];
  3474.         $this->context['view']->{'spectacles_'.$this->context['view']->type_spectacle} = true;
  3475.         $this->context['view']->{'periode_'.$this->context['view']->periode_spectacle} = true;
  3476.         $this->context['view']->menu_types_spectacle[$this->context['view']->type_spectacle]['active'] = 'on';
  3477.         // trouver les années où il y a eu des lauréats pour toutes les aides
  3478.         if (!$this->getSpectaclesDates()) {
  3479.             return $this->redirectToRoute("biographie_biographie", [
  3480.                 "slug" => $slug
  3481.             ]);
  3482.         }
  3483.         $this->getCommonSearch(array(
  3484.                 'inverse_periode' => true,
  3485.                 'saisons_annees' => $this->getListSeasonsYears($this->getSpectaclesDates()),
  3486.                 'nb_days' => 720,
  3487.             )
  3488.         );
  3489.         $this->getCommonSearchView();
  3490.         $params_sql = array(
  3491.             'params' => array(
  3492.                 'groupby' => 's.idspectacle'
  3493.             ),
  3494.             'special' => array(
  3495.                 'plus_proche' => true,
  3496.             ),
  3497.             'dbg' => array('spectacles_'.$this->context['view']->type_spectacle.'_list','Spectacles '.$this->context['view']->type_spectacle.' par cette personne')
  3498.         );
  3499.         $params_sql $this->setCommonSearchSpectacles($params_sql);
  3500.         // dans spectacle person
  3501.         if ($role['type']=='spectacle_person') {
  3502.             $params_sql['special']['join_person'] = array(
  3503.                 'idperson' => $this->idperson,
  3504.                 'idrole' => $role['idrole'],
  3505.             );
  3506.         } elseif ($role['type']=='text_author') {
  3507.             $params_sql['special']['idperson_author'] = true;
  3508.             $params_sql['special']['idperson_idtexts'] = $this->idtexts_person;
  3509.         } else { // TOUS LES SPECTACLES
  3510.             $this->context['view']->all true;
  3511.             $params_sql['special']['idspectacle'] = $this->getSpectaclesPerson();
  3512.             $this->context['view']->menu_periode['all']['active'] = 'on';
  3513.         }
  3514.         // tous les spectacles on affiche la date de création
  3515.         $show_date_creation true;
  3516.         //on affiche pas l'aside des saisons
  3517.         $aside_saison false;
  3518.         //Si on a pas activé le filtre, on force le passage pour vérifier si il existe des éléments
  3519.         $force_filtre_spectacles false;
  3520.         if ($this->context['view']->periode_spectacle!='all'){
  3521.             $force_filtre_spectacles true;
  3522.             //on affiche pas la date de création pour le spectacles
  3523.             $show_date_creation false;
  3524.         }
  3525.         if ($this->context['view']->periode_spectacle=='all' || $force_filtre_spectacles) {
  3526.             if ($force_filtre_spectacles){
  3527.                 $backup_params_sql $params_sql;
  3528.             }
  3529.             //on affiche l'aside des saisons
  3530.             if ($this->context['view']->periode_spectacle != 'affiche'){
  3531.                 $aside_saison true;
  3532.             }
  3533.             // on affiche pas le lieu
  3534.             if ($this->context['view']->periode_spectacle == 'all'){
  3535.                 $this->context['view']->no_lieu true;
  3536.             }
  3537.             // on cherche tous les spectacles classés par ordre anté-chronologique
  3538.             unset($params_sql['special']['prochains']);
  3539.             unset($this->context['view']->days);
  3540.             // $params_sql['params']['classement'] = 'DESC'; ancien order (classement ?!)
  3541.             $params_sql['params']['order'] = ['creation_date''DESC'];
  3542.             // si periode == all, on doit vérifier qu'il y a des spectacles à l'affiche
  3543.             $params_sql_affiche = array(
  3544.                 'special' => array(
  3545.                     'idspectacle' => $this->getSpectaclesPerson(),
  3546.                     'prochains' => '720',
  3547.                 ),
  3548.                 'dbg' => array('spectacles_affiche_list','Spectacles à l\'affiche liés à cette personne')
  3549.             );
  3550.             //On compte le nombre total de spectacle à venir
  3551.             $this->context['view']->nb_spectacle_tous $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql);
  3552.             //On compte les spectacles associés
  3553.             $this->context['view']->nb_spectacle_a_venir $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql_affiche);
  3554.         }
  3555.         if ($force_filtre_spectacles){
  3556.             $params_sql $backup_params_sql;
  3557.         }
  3558.         //Si il n'y a pas de spectacle à venir et qu'il y a des spectacles (tous) on redirige à tous
  3559.         if ($this->context['view']->periode_spectacle=='affiche' && $this->context['view']->nb_spectacle_a_venir == && $this->context['view']->nb_spectacle_tous 0){
  3560.             return $this->redirect("/biographies/".$this->context['view']->url_clean."/spectacles/type/".$this->context['view']->type_spectacle."/periode/all");
  3561.         }
  3562.         //Si il y a  des spectacles à venir et qu'il n'y a pas de spectacles (tous) on redirige à à l'affiche
  3563.         else if ($this->context['view']->periode_spectacle=='all' && $this->context['view']->nb_spectacle_a_venir && $this->context['view']->nb_spectacle_tous == 0){
  3564.             return $this->redirect("/biographies/".$this->context['view']->url_clean."/spectacles/type/".$this->context['view']->type_spectacle."/periode/affiche");
  3565.         }
  3566.         else if ($this->context['view']->nb_spectacle_a_venir == && $this->context['view']->nb_spectacle_tous == 0){
  3567.             return $this->redirectToRoute('biographie_biographie', ['slug' => $this->context['view']->url_clean]);
  3568.         }
  3569.         $this->context['view']->nb_spectacles_search $this->em->getRepository(Spectacles::class)->countListSpectacles($params_sql);
  3570.         $params_sql['params']['limit'] = array($this->getLimitStart(),$this->perPage);
  3571.         $this->format_vignette = array(
  3572.             $format = array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop')
  3573.         );
  3574.         $query_spectacles $this->em->getRepository(Spectacles::class)->getSQLSpectacles($params_sql['params'],$params_sql['special']);
  3575.         $datas $query_spectacles->getArrayResult();
  3576.         $params_query_count $this->em->getRepository(Spectacles::class)->countListSchedules($params_sql);
  3577.         foreach($datas AS $value) {
  3578.             $spectacles->loadResult($value[0]);
  3579.             $spectacles->loadResult($value);
  3580.             $this->context['view']->spectacles[$spectacles->idspectacle] = $this->getRowSpectacle($spectacles,$format);
  3581.             $this->context['view']->spectacles[$spectacles->idspectacle]['carrer'] = $spectacles->getObjectsCarrerDetails($spectacles->idspectacle);
  3582.             if ($show_date_creation){
  3583.                 $this->context['view']->spectacles[$spectacles->idspectacle]['display']['affiche_date_creation'] = true;
  3584.                 $this->context['view']->spectacles[$spectacles->idspectacle]['annee_creation'] = $this->em->getRepository(Spectacles::class)->getFormeDate($value['creation_date'], '%Y'true); //%a %d/%m/%Y
  3585.             }
  3586.             if ($this->context['view']->periode_spectacle=='all') {
  3587.                 $this->context['view']->spectacles[$spectacles->idspectacle]['no_date'] = true;
  3588.             }
  3589.             $this->context['view']->spectacles[$spectacles->idspectacle]['role_header'] = true;
  3590.             $this->context['view']->spectacles[$spectacles->idspectacle]['footer_contact'] = true;
  3591.         }
  3592.         $this->context['view']->pagination $this->getPagination($this->context['view']->nb_spectacles_search);
  3593.         $this->context['view']->pagination['representation_spectacle'] = true;
  3594.         $this->context['view']->pagination['spectacle'] = true;
  3595.         $this->context['view']->pagination['total_dates'] = $params_query_count;
  3596.         $this->context['view']->pagination['totalItems'] = $this->context['view']->pagination['total'];
  3597.         unset($this->context['view']->pagination['total']);
  3598.         //On indique à la vue la période de spectacle sélectionné
  3599.         $this->context['view']->{'periode_'.$this->context['view']->periode_spectacle} = true;
  3600.         $this->extra_locate $this->extra_title 'En scène';
  3601.         $this->action_getAsideSpectacle(false$aside_saison);
  3602.         return $this->view('biographies/spectacles.html.twig');
  3603.     }
  3604.     // }}}
  3605.     // {{{ action_getAsideSpectacle()
  3606.     public function action_getAsideSpectacle($aside_periode true$aside_saison false)
  3607.     {
  3608.         $this->context['view']->menu_periodes = array(
  3609.             'affiche' => array(
  3610.                 'name' => 'Spectacles à venir',
  3611.                 // 'is_simple' => true,
  3612.                 'key_genre' => 'affiche',
  3613.                 'count' => $this->context['view']->nb_spectacle_a_venir
  3614.             ),
  3615.             'all' => array(
  3616.                 'name' => 'Tous les spectacles associés',
  3617.                 'key_genre' => 'all',
  3618.                 'count' => $this->context['view']->nb_spectacle_tous
  3619.             )
  3620.         );
  3621.         $this->asides->load(['url_lists,spectacles_menu_voir' => array(
  3622.             'exec' => array(
  3623.                 'htmlstart' => true,
  3624.                 'htmlend' => ($aside_periode || $aside_saison) ? false true,
  3625.                 'color' => 'spectacles'
  3626.             ),
  3627.             'php' => array(
  3628.                 'method' => 'asidesUrlLists',
  3629.                 'urls' => $this->context['view']->menu_periodes,
  3630.                 'url' => '/biographies/{v_url_clean}/{v_current_page}/type/{v_type_spectacle}/periode/key_genre',
  3631.                 'params' => array(
  3632.                     'activate' => $this->context['view']->periode_spectacle
  3633.                 )
  3634.             ),
  3635.             'title' => 'Voir'
  3636.         )]);
  3637.         // $this->asides->load(['url_lists,menu_role' => array(
  3638.         //     'exec' => array(
  3639.         //         'alone' => false,
  3640.         //         'htmlend' => ($aside_periode || $aside_saison) ? false : true,
  3641.         //         'color' => 'spectacles'
  3642.         //     ),
  3643.         //     'php' => array(
  3644.         //         'method' => 'asidesUrlLists',
  3645.         //         'urls' => $this->context['view']->menu_types_spectacle,
  3646.         //         'url' => '/biographies/'.$this->context['view']->url_clean.'/spectacles/type/key_role/periode/{v_periode_spectacle}',
  3647.         //         'params' => array(
  3648.         //             'activate' => '',
  3649.         //             'key_role' => 'auto_key'
  3650.         //         )
  3651.         //     ),
  3652.         //     'title' => 'Filtrer par catégorie'
  3653.         // )]);
  3654.         if ($aside_saison){
  3655.             $this->asides->load(['par_saison_alone' => array(
  3656.                 'exec' => array(
  3657.                     'alone' => false,
  3658.                     'htmlend' => true,
  3659.                     'color' => 'spectacles'
  3660.                 ),
  3661.                 'php' => array(
  3662.                     'method' => 'asidesUrlListsForms',
  3663.                     'url' => '/biographies/'.$this->context['view']->url_clean.'/spectacles/type/{p_type}/periode/{p_periode}',
  3664.                     'params' => array(
  3665.                         'key_role' => 'auto_key'
  3666.                     )
  3667.                 ),
  3668.                 'title' => 'Recherche par période',
  3669.             )]);
  3670.         }
  3671.         if ($aside_periode){
  3672.             $this->asides->load(['recherche_par_periode' => array(
  3673.                 'exec' => array(
  3674.                     'htmlend' => true,
  3675.                     'color' => 'spectacles'
  3676.                 ),
  3677.                 'title' => 'Recherche par période',
  3678.                 'action' => '/biographies/'.$this->context['view']->url_clean.'/spectacles/',
  3679.             )]);
  3680.         }
  3681.         $this->asides->load(['common_carrer_informations' => [
  3682.             'exec' => [
  3683.                 'color' => 'spectacles'
  3684.             ]
  3685.         ]]);
  3686.         $this->asides->load(['common_participer_personne' => array(
  3687.             'exec' => array(
  3688.                 'color' => 'spectacles'
  3689.             )
  3690.         )]);
  3691.         $this->asides->load(['bio_spectacle_info' => array(
  3692.             'exec' => array(
  3693.                 'color' => 'spectacles'
  3694.             )
  3695.         )]);
  3696.     }
  3697.     // }}}
  3698.     // {{{ action_premieres()
  3699.     /** Premières de Spectacles associés à cette personne
  3700.      *
  3701.      * @Route("/biographies/{slug}/premieres/", name="biographie_premieres")
  3702.      * @Route("/biographies/{slug}/premieres/type/{p_type}", name="biographie_premieres_type")
  3703.      * @Route("/biographies/{slug}/premieres/type/{p_type}/area/{p_area}", name="biographie_premieres_type_area")
  3704.      *
  3705.      * @access public
  3706.      * @return void
  3707.      */
  3708.     public function action_premieres($slug null$p_type null$p_area null)
  3709.     {
  3710.         $this->InitController($slug'dates');
  3711.         $this->context['params']['type'] = $p_type;
  3712.         $this->context['params']['area'] = $p_area;
  3713.         $params = [];
  3714.         $type 'premieres';
  3715.         if (!empty($this->context['params']['type'])){
  3716.             $type $this->context['params']['type'];
  3717.             if ($type == 'france') {
  3718.                 $params['france'] = true;
  3719.                 if (!empty($this->context['params']['area'])) {
  3720.                     $this->view->region_name $this->em->getRepository(Bigregions::class)->getBigbigregionName(intval($this->context['params']['area']));
  3721.                     if (!$this->view->region_name) {
  3722.                         return $this->redirectToRoute("biographie_premieres", [
  3723.                             "slug" => $slug
  3724.                         ]);
  3725.                     }
  3726.                 }
  3727.             }
  3728.             else if ($type == 'saison') {
  3729.                 $saison_select Date_time::getLastSaison();
  3730.                 if (!empty($_GET['next']) && $_GET['next'] == 1) {
  3731.                     $saison_select Date_time::getNextSaison($saison_select);
  3732.                 }
  3733.                 $this->context['view']->saison_select $saison_select;
  3734.                 $params = ['current_saison' => $saison_select];
  3735.                 $params['having_start_to_saison'] = true;
  3736.             }
  3737.         }
  3738.         $params['limit'] = [0400];
  3739.         $this->context['view']->schedules_dates_demains_par_mois $this->getSpectaclesPremieres($params);
  3740.         $this->getAsidesDates();
  3741.         return $this->view('biographies/premieres.html.twig');
  3742.     }
  3743.     // }}}
  3744.     // {{{ action_abecedaire()
  3745.     /** Action abécédaire
  3746.      *
  3747.      *
  3748.      * @access public
  3749.      * @return void
  3750.      */
  3751.     public function action_abecedaire()
  3752.     {
  3753.         require_once PATH_LIBS.'/Controllers/Abecedaire.class.php';
  3754.         $abecedaire = new Abecedaire($this->context$this->idperson'persons');
  3755.         $abecedaire->view();
  3756.         $this->view->abecedaire $abecedaire;
  3757.         $this->view->lettre_courante $abecedaire->lettre_courante;
  3758.         if ($abecedaire->lettre_courante) {
  3759.             $this->extra_locate $this->extra_title 'Lettre '.$abecedaire->lettre_courante;
  3760.         }
  3761.     }
  3762.     // }}}
  3763.     // {{{ action_contenu_pedagogique()
  3764.     /** Les contenus éduc sur la personne
  3765.      *
  3766.      * @Route("/biographies/{slug}/contenu-pedagogique/", name="biographie_contenu_pedagogique")
  3767.      * @Route("/biographies/{slug}/contenu-pedagogique/idcontent/{idcontent}", name="biographie_contenu_pedagogique_idcontent")
  3768.      *
  3769.      */
  3770.     public function action_contenu_pedagogique($slug null$idcontent null)
  3771.     {
  3772.         $this->InitController($slug'contenu-pedagogique');
  3773.         $this->context['params']['idcontent'] = $idcontent;
  3774.         $params_sql_specific = array();
  3775.         //on récupère le contenu theatre-en-acte
  3776.         if ($theatre_en_acte $this->contents->getAssociateContents($this->idperson,'persons','class_theatre_en_acte')){
  3777.             $theatre_en_acte reset($theatre_en_acte);
  3778.             //On prépare les liens pour les asides
  3779.             foreach($theatre_en_acte AS $k => $v){
  3780.                 $id_contents_exclude[] = $v['idcontent'];
  3781.                 $urls_theatrenacte[$v['idcontent']] = array(
  3782.                     'url' => '/biographies/{v_url_clean}/contenu-pedagogique/idcontent/key_content',
  3783.                     'name' => $v['title'],
  3784.                     'key_content' => $v['idcontent']
  3785.                 );
  3786.             }
  3787.             $urls_theatrenacte['allspectacles'] = array(
  3788.                 'url' => '/educ/theatre-en-acte-auteurs',
  3789.                 'name' => 'Tous les auteurs'
  3790.             );
  3791.             //on indique quel contenus ne devant pas être récupérés avec les contenus-pedagogiques
  3792.             if ($id_contents_exclude){
  3793.                 $params_sql_specific = array(
  3794.                     'where' => ' oc.idobject='.(int)$this->idperson.' AND c.idcontent NOT IN ('.implode(','$id_contents_exclude).')'
  3795.                 );
  3796.             }
  3797.         }
  3798.         //on récupère le contenu-pedagogique en supprimant les contenus theatre-en-acte qui pourrait être récupérés
  3799.         $this->contenus_biographie('class_contenu_educ','contenus-pedagogiques', array('width'=>150), $params_sql_specific);
  3800.         $nb_contenu_educ $this->getEduc();
  3801.         $this->extra_locate 'Contenus pédagogiques';
  3802.         $this->extra_title 'Contenus pédagogiques - Éduc';
  3803.         $this->view->detail_orga true;
  3804.         $this->view->detail_date true;
  3805.         if ($nb_contenu_educ 0){
  3806.             $menu_educ = array(
  3807.                 array(
  3808.                     'url' => '/biographies/{v_url_clean}/contenu-pedagogique/',
  3809.                     'name' => html_entity_decode('Tous les contenus &laquo; éduc &raquo; '),
  3810.                     'params_activate' => 'contenu-pedagogique'
  3811.                 )
  3812.             );
  3813.             $this->asides->load(['url_lists_alone,content_educ' => array(
  3814.                 'exec' => array('color' => 'educ'),
  3815.                 'php' => array(
  3816.                     'method' => 'asidesUrlLists',
  3817.                     'urls' => $menu_educ,
  3818.                     'params' => array(
  3819.                         'activate' => (empty($this->context['params']['idcontent'])) ? $this->context['action'] : null
  3820.                     )
  3821.                 ),
  3822.                 'title' => 'Voir'
  3823.             )]);
  3824.         }
  3825.         //on force l'affichage du menu
  3826.         // $this->context['view']->morearticle = true;
  3827.         // $this->asides->load('spectacles_educ');
  3828.         if (!empty($theatre_en_acte)){
  3829.             $this->asides->load(['url_lists_alone' => array(
  3830.                 'exec' => array('color' => 'educ'),
  3831.                 'php' => array(
  3832.                     'method' => 'asidesUrlLists',
  3833.                     'urls' => $urls_theatrenacte,
  3834.                     'params' => array(
  3835.                         'activate' => (!empty($this->context['params']['idcontent'])) ? $this->context['params']['idcontent'] : null
  3836.                     )
  3837.                 ),
  3838.                 'title' => 'Théâtre-en-acte'
  3839.             )]);
  3840.         }
  3841.         $this->asides->load(['common_participer_personne' => array(
  3842.             'exec' => ['color' => 'educ']
  3843.         )]);
  3844.         return $this->view('biographies/contenu-pedagogique.html.twig');
  3845.     }
  3846.     // }}}
  3847.     // {{{ action_autorisation()
  3848.     /** Les diaporamas sur la personne
  3849.      *
  3850.      * @Route("/biographies/{slug}/autorisation/", name="biographie_autorisation")
  3851.      *
  3852.      */
  3853.     public function action_autorisation($slug nullRequest $request)
  3854.     {
  3855.         return $this->redirectToRoute('index', [], Response::HTTP_MOVED_PERMANENTLY);
  3856.     }
  3857.     // }}}
  3858.     // {{{ action_enimages()
  3859.     /** Les diaporamas sur la personne
  3860.      *
  3861.      */
  3862.     public function action_enimages_biographie() { $this->action_photos(); }
  3863.     // }}}
  3864.     // {{{ action_evenements()
  3865.     /** evenements et spectacles proposé par les internautes
  3866.      *
  3867.      * @Route("/biographies/{slug}/evenements/", name="biographie_evenements")
  3868.      *
  3869.      * @access public
  3870.      * @return void
  3871.      */
  3872.     public function action_evenements($slug null)
  3873.     {
  3874.         $this->InitController($slug'evenements');
  3875.         // recuperer les actualites de la personne proposé par les internautes
  3876.         $news $this->em->getRepository(News::class);
  3877.         $news_params = array(
  3878.             'params' => array(
  3879.                 'limit' => 'all',
  3880.                 'order' => 'T3.date DESC',
  3881.             ),
  3882.             'special' => array(
  3883.                 'publish_valid' => true,
  3884.                 'by_object' => array('idperson' => $this->idperson),
  3885.             ),
  3886.         );
  3887.         // trouver 7 prochains évènements
  3888.         // si pas de 7 prochains, trouver 7 anciens
  3889.         //foreach(array('news','spectacles') as $t) {
  3890.         foreach(array('news') as $t) {
  3891.             $news_list = array();
  3892.             $news_params['special']['type_news'] = $t;
  3893.             foreach(array('prochains','anciens') as $d) {
  3894.                 $news_params['special'][$d] = true;
  3895.                 $news_params['dbg'] = array('essai'.$d'Pour '.$d);
  3896.                 // si ancien, seulement 3
  3897.                 if ($d=='anciens') {
  3898.                     $news_params['params']['limit' ] = array(0,3);
  3899.                 }
  3900.                 $news_list[$d] = $news->getListNews($news_params);
  3901.                 if (!empty($news_list[$d])) {
  3902.                     $this->view->{'is_news_list_'.$t} = true;
  3903.                 }
  3904.                 unset($news_params['special'][$d]);
  3905.             }
  3906.             $this->view->{'news_list_'.$t} = $news_list;
  3907.         }
  3908.         if (!empty($this->view->news_list_news['anciens'])) {
  3909.             $this->view->news_list_news['anciens'] = array_reverse($this->view->news_list_news['anciens']);
  3910.         }
  3911.         // page en cours
  3912.         $this->view->from_page $this->url_folder.'/evenements/';
  3913.         $this->context['view']->is_description true;
  3914.         // asides
  3915.         $this->asides->load(['common_participer_personne' => array(
  3916.             'exec' => ['color' => 'evenements']
  3917.         )]);
  3918.         return $this->view('biographies/evenements.html.twig');
  3919.     }
  3920.     // }}}
  3921.     // {{{ setAsidesCommunEnSavoirPlus()
  3922.     /** method permettant d'éviter de dupliquer du code à différents endroits
  3923.      *
  3924.      */
  3925.     private function setAsidesCommunEnSavoirPlus(){
  3926.         // new array pour v2
  3927.         $idextranetuser null;
  3928.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')){
  3929.             $idextranetuser $this->context['session']->getIdextranetuser();
  3930.         }
  3931.         $auteurs_menu_genre = array(
  3932.             'presentation' => array(
  3933.                 'name' => 'Présentation',
  3934.                 'key_genre' => 'presentation',
  3935.             ),
  3936.             array(
  3937.                 'name' => 'Prix et distinctions',
  3938.                 'key_genre' => 'prix-recompenses',
  3939.                 'count' => $this->getPersonTextAides(array(0,100), true, ['count_specifique' => true])
  3940.             ),
  3941.             array(
  3942.                 'name' => 'Aides et soutiens',
  3943.                 'key_genre' => 'aides-soutiens',
  3944.                 'count' => $this->getPersonTextAides([], true, ['types_aides' => array(1), 'count_specifique' => true'group_by_aide_type_aide_texte' => true])
  3945.             ),
  3946.             array(
  3947.                 'name' => 'Sélections',
  3948.                 'key_genre' => 'selections',
  3949.                 'count' => $this->getPersonTextAides([], true, ['types_aides' => array(4), 'count_specifique' => true'group_by_aide_type_aide_texte' => true])
  3950.             )
  3951.         );
  3952.         if (empty($this->infosperson['biotxt']['text'])){
  3953.             unset($auteurs_menu_genre['presentation']);
  3954.         }
  3955.         if (isset($this->view->articles)){
  3956.             $this->context['view']->morearticle true;
  3957.         }
  3958.         $this->asides->load(['bio_files' => array(
  3959.             'exec' => array(
  3960.                 'alone' => true,
  3961.                 'color' => 'context'
  3962.             )
  3963.         )]);
  3964.         $this->asides->load(['url_lists_alone,bio_lists_new' => array(
  3965.             'php' => array(
  3966.                 'method' => 'asidesUrlLists',
  3967.                 'urls' => $auteurs_menu_genre,
  3968.                 'url' => '/biographies/{v_url_clean}/key_genre',
  3969.                 'params' => array(
  3970.                     'activate' => $this->context['action']
  3971.                 )
  3972.             )
  3973.         )]);
  3974.         $this->asides->load(['textes_menu_educ' => array(
  3975.             'exec' => array(
  3976.                 'alone' => true,
  3977.                 'color' => 'context'
  3978.             ),
  3979.         )]);
  3980.         $this->asides->load('common_participer_personne');
  3981.         $this->asides->load('bio_formation');
  3982.     }
  3983.     // {{{ getMultimediasPerson()
  3984.     /** Les vidéos de la personne
  3985.      *
  3986.      */
  3987.     public function getMultimediasPerson($params = array())
  3988.     {
  3989.         $extrasql 'ORDER BY m.date DESC';
  3990.         if (!empty($params['limit']) && is_array($params['limit'])){
  3991.             $extrasql .= ' LIMIT '.$params['limit'][0].', '.$params['limit'][1];
  3992.         }
  3993.         $select 'm.*';
  3994.         if (!empty($params['count'])){
  3995.             $select 'count';
  3996.         }
  3997.         return $this->multimedias->getMultimediasBy('persons'$this->idperson,$extrasql,$select);
  3998.     }
  3999.     // }}}
  4000.     // {{{ getCountDvds()
  4001.     /** On récupère le nombre de dvd de a personne
  4002.      *
  4003.      */
  4004.     public function getCountDvds(){
  4005.         // DVD => le dernier DVD référencé
  4006.         $dvds $this->em->getRepository(Dvds::class);
  4007.         return $dvds->countDvds('persons',$this->idperson);
  4008.     }
  4009.     // {{{ countMultimediasPerson()
  4010.     /** Compter les vidéos de la personne
  4011.      *
  4012.      */
  4013.     public function countMultimediasPerson()
  4014.     {
  4015.         return $this->multimedias->getMultimediasBy('persons'$this->idperson,null,'count');
  4016.     }
  4017.     // }}}
  4018.     // {{{ getInfosPerson()
  4019.     /** Les infos sur la personne
  4020.      *
  4021.      */
  4022.     public function getInfosPerson() { return $this->infosperson; }
  4023.     // }}}
  4024.     // {{{ getLocate()
  4025.     /** Ou se trouve t'on (getter)
  4026.      *
  4027.      */
  4028.     public function getLocate() { return $this->locate; }
  4029.     // }}}
  4030.     // {{{ getTitlePage()
  4031.     /** Titre de la page (getter)
  4032.      *
  4033.      */
  4034.     public function getTitlePage() { return $this->title_page; }
  4035.     // }}}
  4036.     // {{{ getStyleMore()
  4037.     /** Style en plus (getter)
  4038.      *
  4039.      */
  4040.     public function getStyleMore() { return $this->style_more; }
  4041.     // }}}
  4042.     // {{{ getMetaKeywords()
  4043.     /** Keywords (getter)
  4044.      *
  4045.      */
  4046.     public function getMetaKeywords() { return $this->meta_keywords; }
  4047.     // }}}
  4048.     // {{{ getMetaDescription()
  4049.     /** Description (getter)
  4050.      *
  4051.      */
  4052.     public function getMetaDescription() { return $this->meta_description; }
  4053.     // }}}
  4054.     // {{{ getMtinfos()
  4055.     /** Infos mon théâtre
  4056.      *
  4057.      */
  4058.     public function getMtinfos() { return $this->mtinfos; }
  4059.     // }}}
  4060.     // {{{ setOtherDimensions()
  4061.     /** Taille maxi des vidéos
  4062.      *
  4063.      */
  4064.     public function setOtherDimensions($other_dimensions)
  4065.     {
  4066.         $this->other_dimensions $other_dimensions;
  4067.     }
  4068.     // }}}
  4069.     // {{{ setStylemoreSpectacle()
  4070.     /** Pour l'affichage des listes
  4071.      *
  4072.      */
  4073.     public function setStylemoreSpectacle($stylemore_spectacle) { $this->stylemore_spectacle $stylemore_spectacle; }
  4074.     // }}}
  4075.     // {{{ setStylemoreText()
  4076.     /** Pour l'affichage des listes
  4077.      *
  4078.      */
  4079.     public function setStylemoreText($stylemore_text) { $this->stylemore_text $stylemore_text; }
  4080.     // }}}
  4081.     // {{{ getRubCourante()
  4082.     /** Pour la rubrique courante
  4083.      *
  4084.      */
  4085.     public function getRubCourante() { return $this->rub_courante; }
  4086.     // }}}
  4087.     // {{{ getSpectaclesPremieres()
  4088.     /** Récupere  la liste des dates de première des spectacles associés à la personne
  4089.      *
  4090.      * @return array
  4091.      */
  4092.     public function getSpectaclesPremieres($params = array())
  4093.     {
  4094.         if (empty($this->ids_spectacle_all)) {
  4095.             return null;
  4096.         }
  4097.         $expr '>=';
  4098.         $params_sql = array(
  4099.             'order' => ['datemin ASC''datemax'],
  4100.             'select' => ['MIN(schedules.date) AS datemin''MAX(schedules.date) AS datemax'],
  4101.             'group' => array('schedules' => 'idspectacle'),
  4102.             'count_only' => true,
  4103.             'count_disctint_by' => ['schedules' => 'idspectacle'],
  4104. //            'idsschedules' => $this->ids_spectacle_all,
  4105.             'where' => [' AND schedules.`idspectacle` IN ('.implode(',' ,$this->ids_spectacle_all).') '],
  4106.             'having' => [' AND MIN(schedules.`date`) '.$expr.'\''.date('Y-m-d').'\''],
  4107.             'dbg' => array('list_dates_valid','Liste des dates à valider')
  4108.         );
  4109.         if (!empty($params['france'])){
  4110.             $params_sql['special'] = [
  4111.                 'regions' => true
  4112.             ];
  4113.             if (!empty($this->context['params']['area'])) {
  4114.                 $bigreghions $this->em->getRepository(Bigregions::class);
  4115.                 $where_zone $bigreghions->getZipCode(intval($this->context['params']['area']), 'contacts');
  4116.                 $params_sql['where'][] = ' AND ' $where_zone;
  4117.             }
  4118.             else{
  4119.                 $params_sql['where'][] = 'AND contacts.country = "fr"';
  4120.             }
  4121.         }
  4122.         if (!empty($params['current_saison'])){
  4123.             $params_sql['saison'] = $params['current_saison'];
  4124.             $s explode('-'$params_sql['saison']);
  4125.             if (!empty($params['having_start_to_saison'])){
  4126.                 unset($params_sql['having']);
  4127.                 $params_sql['having']= [' AND MIN(schedules.`date`) '.$expr.'\''.$s[0].'-09-01'.'\''] ;
  4128.             }
  4129.         }
  4130.         $schedules $this->em->getRepository(Schedules::class);
  4131.         $nb_total_calendrier $schedules->getListSchedules($params_sql);
  4132.         if (!empty($params['count'])){
  4133.             return $nb_total_calendrier;
  4134.         }
  4135.         unset($params_sql['count_only']);
  4136.         unset($params_sql['count_disctint_by']);
  4137.         if (!empty($params['limit'])){
  4138.             $params_sql['limit'] = $params['limit'];
  4139.         }
  4140.         else{
  4141.             $params_sql['limit'] = array($this->getLimitStart(),$this->perPage);
  4142.         }
  4143.         $datas $schedules->getListSchedules($params_sql);
  4144.         // Cette variable est utiliser pour stocker les résultats & éviter plusieurs requêtes SQL identiques
  4145.         $calendrier_listes_spectacles = [];
  4146.         $calendrier_listes_calendrier = [];
  4147.         $datas_lists = array();
  4148.         foreach($datas AS $k => $value) {
  4149.             $date_month $schedules->getFormeDate($value['datemin'], "%B %Y"true);
  4150.             $date_month_hastag $schedules->getFormeDate($value['datemin'], "%B_%Y"true);
  4151.             if (empty($datas_lists[$date_month_hastag])) {
  4152.                 $menu_aside[$date_month_hastag] = [
  4153.                     'name' => $date_month,
  4154.                     'params' => $date_month_hastag,
  4155.                 ];
  4156.                 $datas_lists[$date_month_hastag] = $menu_aside[$date_month_hastag];
  4157.             }
  4158.             $date $value['date'];
  4159.             if (empty($datas_lists[$date_month_hastag]['datas'][$date]['date_str'])) {
  4160.                 $datas_lists[$date_month_hastag]['datas'][$date]['date_str'] = $schedules->getFormeDate($date"%a %d/%m/%y"true);
  4161.                 $datas_lists[$date_month_hastag]['datas'][$date]['date_full_str'] = $schedules->getFormeDate($date"%A %d %B %Y"true);
  4162.                 $datas_lists[$date_month_hastag]['datas'][$date]['date_orig'] = $schedules->getFormeDate($date$GLOBALS['format_date'][$GLOBALS['lng']]);
  4163.             }
  4164.             $idspectacle $value['idspectacle'];
  4165.             // Si la requête s'exécute pour la première fois
  4166.             if (empty($calendrier_listes_spectacles[$idspectacle])) {
  4167.                 $calendrier_listes_spectacles[$idspectacle] = $this->em->getRepository(Spectacles::class)->getInfosSpectacle($value['idspectacle'], ['get_vignette' => true]);
  4168.             }
  4169.             $idcontact $value['idcontact'];
  4170.             if (empty($calendrier_listes_spectacles[$idcontact])) {
  4171.                 $calendrier_listes_calendrier[$idcontact] = $this->em->getRepository(Contacts::class)->getInfosContact($value['idcontact']);
  4172.             }
  4173.             $datas_lists[$date_month_hastag]['datas'][$date]['spectacles'][$idspectacle] = $calendrier_listes_spectacles[$idspectacle];
  4174.             $datas_lists[$date_month_hastag]['datas'][$date]['spectacles'][$idspectacle]['footer_contact'] = true;
  4175.             $datas_lists[$date_month_hastag]['datas'][$date]['spectacles'][$idspectacle]['contact'] = $calendrier_listes_calendrier[$idcontact];
  4176.         }
  4177.         unset($calendrier_listes_spectacles);
  4178.         unset($calendrier_listes_calendrier);
  4179.         return $datas_lists;
  4180.     }
  4181.     // }}}
  4182.     // {{{ getSpectaclesDates()
  4183.     /** Récupere  la liste des dates des spectacles associés à la personne
  4184.      *
  4185.      * @return array
  4186.      */
  4187.     public function getSpectaclesDates($critique=false$prochains false)
  4188.     {
  4189.         if (empty($this->ids_spectacle_all)) {
  4190.             $this->getSpectaclesPerson();
  4191.             if (empty($this->getSpectaclesPerson())) {
  4192.                 return false;
  4193.             }
  4194.         }
  4195.         $cacheKey "biographie_spectacles_date_annees_";
  4196.         $joinedIds implode(','$this->ids_spectacle_all);
  4197.         $sql_annees '
  4198.             SELECT schedules.`date`, YEAR(schedules.`date`) as annee
  4199.             FROM schedules, spectacles
  4200.             WHERE schedules.`idspectacle`=spectacles.`idspectacle`
  4201.             AND spectacles.`publish`=1
  4202.             AND schedules.`idspectacle` IN ('.$joinedIds.')
  4203.             ORDER BY schedules.`date`';
  4204.         if ($prochains){
  4205.             $cacheKey .= "prochains_";
  4206.             $sql_annees '
  4207.             SELECT schedules.`date`, YEAR(schedules.`date`) as annee
  4208.             FROM schedules, spectacles
  4209.             WHERE schedules.`idspectacle`=spectacles.`idspectacle`
  4210.             AND spectacles.`publish`=1
  4211.             AND schedules.`idspectacle` IN ('.$joinedIds.')
  4212.             GROUP BY spectacles.`idspectacle`
  4213.             ORDER BY schedules.`date`';
  4214.         }
  4215.         // uniquement les spectacles avec une critique
  4216.         if ($critique) {
  4217.             $cacheKey .= "critique_";
  4218.             $sql_annees '
  4219.                 SELECT sc.`date`, YEAR(sc.`date`) as annee  
  4220.                 FROM schedules sc
  4221.                 JOIN spectacles s ON s.`idspectacle`=sc.`idspectacle`
  4222.                 JOIN object_content oc ON s.`idspectacle`=oc.`idobject`
  4223.                 JOIN contents ct ON oc.`idcontent`=ct.`idcontent`
  4224.                 JOIN content_classification cc ON ct.`idcontent`=cc.`idcontent`
  4225.                 WHERE s.`publish`=1 AND s.`valid`=1
  4226.                 AND ct.`publish`=1 AND ct.`valid`=1
  4227.                 AND cc.`idclassification`=101
  4228.                 AND sc.`idspectacle` IN ('.$joinedIds.')
  4229.                 ORDER BY sc.`date`';
  4230.         }
  4231.         $cacheKey .= implode('-'$this->ids_spectacle_all);
  4232.         $cacheItem $this->cache->getItem($cacheKey);
  4233.         if (! $cacheItem->isHit()) {
  4234.             $listdates $this->persons->queryAll($sql_annees);
  4235.             $cacheItem->set($listdates)
  4236.                 ->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  4237.             $this->cache->save($cacheItem);
  4238.         }
  4239.         return empty($cacheItem->get())
  4240.             ? []
  4241.             : $cacheItem->get();
  4242.     }
  4243.     // }}}
  4244.     // {{{ getSpectaclesPerson()
  4245.     /** Récupere  la liste des spectacles associés à la personne
  4246.      *
  4247.      * @return array
  4248.      */
  4249.     public function getSpectaclesPerson($params=false)
  4250.     {
  4251.         // la liste des texts associés à la personne
  4252.         if (empty($this->idtexts_person)) {
  4253.             $this->idtexts_person $this->em->getRepository(Texts::class)->getTextsPersons($this->idperson,'all','all',true);
  4254.         }
  4255.         // les spectacles
  4256.         $item $this->cache->getItem("biographie_getSpectaclesPerson_" $this->idperson "_text_not_in_" . ($this->idtexts_person ?: 0));
  4257.         if (! $item->isHit()) {
  4258.             $sql_all_spectacles 'SELECT s.`idspectacle`
  4259.                                FROM spectacles s
  4260.                                LEFT JOIN spectacle_person sp ON sp.`idspectacle`=s.`idspectacle`
  4261.                                LEFT JOIN text_spectacle ts ON ts.`idspectacle`=s.`idspectacle`
  4262.                                WHERE s.`publish`=1 AND s.`valid`=1
  4263.                                AND (sp.`idperson`='.$this->idperson;
  4264.             // les textes de la personne
  4265.             if (!empty($this->idtexts_person)) {
  4266.                 $sql_all_spectacles .= ' OR ts.`idtext` IN ('.$this->idtexts_person.') ';
  4267.             }
  4268.             // spectacles publiés
  4269.             $sql_all_spectacles .= ')';
  4270.             // tous les spectacles associés à une personne
  4271.             $ids_spectacle_all $this->persons->queryCol($sql_all_spectacles);
  4272.             $item->set($ids_spectacle_all)->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  4273.             $this->cache->save($item);
  4274.         } else {
  4275.             $ids_spectacle_all $item->get();
  4276.         }
  4277.         foreach($ids_spectacle_all as $k=>$v) {
  4278.             $this->ids_spectacle_all[$v] = $v;
  4279.         }
  4280.         if ($this->context['action'] != 'spectacles') {
  4281.             $multimedias $this->em->getRepository(Multimedias::class);
  4282.             $ids_multimedias $multimedias->queryAll($multimedias->getSQLMultimedias([
  4283.                 'only_custom_select' => true,
  4284.                 'object' => [
  4285.                     'persons' => $this->idperson
  4286.                 ],
  4287.                 'where' => array(
  4288.                     array('object_multimedia''idrole'25'AND')
  4289.                 )
  4290.             ]));
  4291.             $object_multimedia $this->em->getRepository(ObjectMultimedia::class);
  4292.             $fields = ['idspectacle'];
  4293.             foreach($ids_multimedias AS $idmultimedia){
  4294.                 $obj_multimedias $object_multimedia->getObjectsMultimedia($idmultimedia['idmultimedia'],'spectacles',$fields);
  4295.                 foreach($obj_multimedias AS $k => $v){
  4296.     //                $spectacles[] = $k;
  4297.                     $this->ids_spectacle_all[$k] = $k;
  4298.                 }
  4299.             }
  4300.         }
  4301.         // liste des saisons et des années
  4302.         if (empty($this->ids_spectacle_all)) {
  4303.             //echo $listdates->getDebugInfos();
  4304.             return array();
  4305.         } else {
  4306.             return $this->ids_spectacle_all;
  4307.         }
  4308.     }
  4309.     // }}}
  4310.     // {{{ countAllCritiques()
  4311.     /** Compter le nb de critiques
  4312.      *
  4313.      * @return array
  4314.      */
  4315.     public function countAllCritiques()
  4316.     {
  4317.         if (empty($this->ids_spectacle_all)) {
  4318.             $this->getSpectaclesPerson();
  4319.         }
  4320.         // uniquement les spectacles avec une critique
  4321.         if (!empty($this->ids_spectacle_all)){
  4322.             $sql_count '
  4323.             SELECT COUNT(DISTINCT(ct.`idcontent`))
  4324.             FROM spectacles s
  4325.             JOIN object_content oc ON s.`idspectacle`=oc.`idobject`
  4326.             JOIN contents ct ON oc.`idcontent`=ct.`idcontent`
  4327.             JOIN content_classification cc ON ct.`idcontent`=cc.`idcontent`
  4328.             WHERE s.`publish`=1 AND s.`valid`=1
  4329.             AND ct.`publish`=1 AND ct.`valid`=1
  4330.             AND cc.`idclassification`=101
  4331.             AND s.`idspectacle` IN ('.join(','$this->ids_spectacle_all).') ';
  4332.             $nb_critiques $this->persons->queryOne($sql_count);
  4333.         }
  4334.         if (empty($nb_critiques)) {
  4335.             //echo $listdates->getDebugInfos();
  4336.             return null;
  4337.         } else {
  4338.             return $nb_critiques;
  4339.         }
  4340.     }
  4341.     // }}}
  4342.     // {{{ countEduc()
  4343.     /** Les contenus éduc sur la personne
  4344.      *
  4345.      */
  4346.     public function getEduc($params = []) {
  4347.         // les objets
  4348.         $texts $this->em->getRepository(Texts::class);
  4349.         $spectacles $this->em->getRepository(Spectacles::class);
  4350.         $nb_educ null;
  4351.         // les textes de la personne avec un contenu éduc
  4352.         if (!empty($this->idtexts_person)) {
  4353.             $params_educ_texts = [
  4354.                 'params' => array(
  4355.                     'order' => 'publication_year DESC'
  4356.                 ),
  4357.                 'special' => array(
  4358.                     'idclassification' => array(125), // classification educ
  4359.                     'idtext' => $this->idtexts_person// textes de la personne
  4360.                     'join' => true// texte pas forcément publié
  4361.                 ),
  4362.                 'dbg' => array('list_texts','Liste des textes à contenus pédagogiques')
  4363.             ];
  4364.             if (!empty($params['count'])) {
  4365.                 $nb_educ += $texts->countListTexts($params_educ_texts);
  4366.             } else {
  4367.                 $this->context['view']->list_texts $texts->getListTexts($params_educ_texts);
  4368.                 if (!empty($this->context['view']->list_texts)) {
  4369.                     foreach($this->context['view']->list_texts as $k=>$v) {
  4370.                         $this->context['view']->list_texts[$k]['url_clean_more'] = 'contenus-pedagogiques/';
  4371.                     }
  4372.                 }
  4373.                 $nb_educ += count($this->context['view']->list_texts);
  4374.             }
  4375.         }
  4376.         // les spectacles de la personne avec un contenu éduc
  4377.         if (!empty($this->ids_spectacle_all)) {
  4378.             $params_educ_spectacles = [
  4379.                 'params' => array(
  4380.                     'order' => ['creation_date''DESC']
  4381.                 ),
  4382.                 'special' => array(
  4383.                     'idspectacles' => array('IN'$this->ids_spectacle_all), // les spectacles associés à la personne
  4384.                     'idclassification' => array(125), // avec un contenu pédagogique 125
  4385.                     'tri_plus_proches' => true
  4386.                 ),
  4387.                 'dbg' => array('list_spectacles''Liste des spectacles avec contenus pédagogiques')
  4388.             ];
  4389.             if (!empty($params['count'])) {
  4390.                 $nb_educ += $spectacles->countListSpectacles($params_educ_spectacles);
  4391.             } else {
  4392.                 $this->context['view']->list_spectacles $spectacles->getListSpectacles(
  4393.                     $params_educ_spectacles,
  4394.                     null,
  4395.                     false,
  4396.                     [
  4397.                         'allauthors' => true //on supprime les doublons dans les auteurs/metteurs-en-scene etc.
  4398.                     ]
  4399.                 );
  4400.                 if (!empty($this->context['view']->list_spectacles)) {
  4401.                     foreach ($this->context['view']->list_spectacles as $k => $v) {
  4402.                         $this->context['view']->list_spectacles[$k]['url_clean_more'] = 'contenus-pedagogiques/';
  4403.                         $this->context['view']->list_spectacles[$k]['display']['affiche_date_creation'] = true;
  4404.                         $this->context['view']->list_spectacles[$k]['annee_creation'] = $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->list_spectacles[$k]['creation_date'], '%Y'true); //%a %d/%m/%Y
  4405.                     }
  4406.                 }
  4407.                 $nb_educ += count($this->context['view']->list_spectacles);
  4408.             }
  4409.         }
  4410.         // les spectacles de la personne avec des pièces démontées
  4411.         if (!empty($this->ids_spectacle_all)) {
  4412.             $params_educ_spectacles = [
  4413.                 'params' => [
  4414.                     'order' => ['creation_date''DESC']
  4415.                 ],
  4416.                 'special' => [
  4417.                     'idspectacles' => ['IN'$this->ids_spectacle_all], // les spectacles associés à la personne
  4418.                     'idclassification' => [82], // avec un contenu pièce démontée (82)
  4419.                     'tri_plus_proches' => true,
  4420.                 ],
  4421.                 'dbg' => ['list_spectacles''Liste des spectacles avec une pièce démontée']
  4422.             ];
  4423.             if (!empty($params['count'])) {
  4424.                 $nb_educ += $spectacles->countListSpectacles($params_educ_spectacles);
  4425.             } else {
  4426.                 $this->context['view']->list_pieces_demontees $spectacles->getListSpectacles(
  4427.                     $params_educ_spectacles,
  4428.                     null,
  4429.                     false,
  4430.                     array(
  4431.                         'allauthors' => true //on supprime les doublons dans les auteurs/metteurs-en-scene etc.
  4432.                     )
  4433.                 );
  4434.                 // on a besoin de la vignette picèe démontée et du lien direct
  4435.                 if (!empty($this->context['view']->list_pieces_demontees)) {
  4436.                     $contents $this->em->getRepository(Contents::class);
  4437.                     foreach ($this->context['view']->list_pieces_demontees as $k => $v) {
  4438.                         $this->context['view']->list_pieces_demontees[$k]['display']['affiche_date_creation'] = true;
  4439.                         $this->context['view']->list_pieces_demontees[$k]['annee_creation'] = $this->em->getRepository(Spectacles::class)->getFormeDate($this->context['view']->list_pieces_demontees[$k]['creation_date'], '%Y'true); //%a %d/%m/%Y
  4440.                         // récupèrer le fichier associé à la pièce démontée
  4441.                         if (!empty($v['idcontent'])) {
  4442.                             $datafile $contents->getAssociateFileContent($v['idcontent']);
  4443.                             if (!empty($datafile)) {
  4444.                                 foreach ($datafile as $f) {
  4445.                                     if (!empty($f['is_image'])) {
  4446.                                         $this->context['view']->list_pieces_demontees[$k]['vignette_affiche'] = $_ENV['URL_DIRECTORYUPLOAD'] . $contents->getThumbnail($f['file'], 150'thumb');
  4447.                                     }
  4448.                                 }
  4449.                             }
  4450.                         }
  4451.                         // lien directe sur la piece démontée
  4452.                         $this->context['view']->list_pieces_demontees[$k]['url_clean_more'] = 'contenus-pedagogiques/idcontent/' $v['idcontent'];
  4453.                     }
  4454.                 }
  4455.                 $nb_educ += count($this->context['view']->list_pieces_demontees);
  4456.             }
  4457.         }
  4458.         // minutes pédagogiques => recherche directe sur la personne ou via les spectacles
  4459.         if (!empty($this->ids_spectacle_all)) {
  4460.             $multimedias $this->em->getRepository(Multimedias::class);
  4461.             // recherche de base
  4462.             $params_query_minutes = array(
  4463.                 'affiche' => array(
  4464.                     'datestart' => '1999-01-01',
  4465.                     'dateend' => '2030-01-01',
  4466.                 ),
  4467.                 'object' => array(array('spectacles',$this->ids_spectacle_all)),
  4468.                 'idclassification' => 145,
  4469.                 'limit' => array(0,100),
  4470.                 'dbg' => array('minutes','Vidéos de minutes pédagogiques'),
  4471.             );
  4472.             if (!empty($params['count'])) {
  4473.                 $nb_educ += $multimedias->getCountMultimedias($params_query_minutes);
  4474.             } else {
  4475.                 $this->context['view']->list_minutes $multimedias->getListMultimedias($params_query_minutes, array(), array('get_schedule' => true));
  4476.                 $nb_educ += count($this->context['view']->list_minutes);
  4477.             }
  4478.         }
  4479.         return $nb_educ;
  4480.     }
  4481.     // }}}
  4482.     // {{{ getPersonAides()
  4483.     /** Les prix et récopense
  4484.      *
  4485.      */
  4486.     public function getPersonTextAides($limit=array(), $count false$params = array()){
  4487.         if (!empty($this->idtexts_person)) {
  4488.             $aides = array();
  4489.             $type_aides = array(2,3);
  4490.             if (!empty($params['types_aides'])){
  4491.                 $type_aides $params['types_aides'];
  4492.             }
  4493.             if (empty($limit)) {
  4494.                 $limit = array(0,5);
  4495.             }
  4496.             $params_aides = array(
  4497.                 'special' => array(
  4498.                     'aides' => array(
  4499.                         'type_aides' => $type_aides// laureat et nomination
  4500.                     ),
  4501.                 ),
  4502.                 'limit' => $limit,
  4503.                 'idtext' => explode(','$this->idtexts_person),
  4504.                 'get_texts_with_aides' => true,
  4505.                 'group_by_aide_type_aide_text' => true,
  4506.                 'dbg' => array('list_text_aide''Texte de l\'auteur avec prix (laureats et nominations)'),
  4507.                 'api' => false,
  4508.             );
  4509.             if ($count){
  4510.                 if (empty($params['count_specifique'])){
  4511.                     $params_aides = array();
  4512.                 }
  4513.                 return $this->em->getRepository(TextAide::class)->countListTextAide(
  4514.                     $params_aides
  4515.                 );
  4516.             }
  4517.             else{
  4518.                 // trouver les textes avec des prix/récompenses
  4519.                 $aides $this->em->getRepository(TextAide::class)->getListTextAide(
  4520.                     $params_aides
  4521.                 );
  4522.                 if (!empty($aides)) {
  4523.                     foreach($aides as $k=>$v) {
  4524.                         $aides[$k]['profile_picture'] = $this->em->getRepository(Contacts::class)->getVignetteContact($v['aide']['contact']['idcontact'],array(), 'class_pp');
  4525.                         if (strpos($aides[$k]['profile_picture'],'normal-def.jpg')!==false) {
  4526.                             $aides[$k]['profile_picture'] = $_ENV['URL_THNET'].'/images/menu/interface/no_contact-100x100.png';
  4527.                         }
  4528.                     }
  4529.                 }
  4530.             }
  4531.             return $aides;
  4532.         }
  4533.         return 0;
  4534.     }
  4535.     // }}}
  4536.     // {{{ getDvds()
  4537.     /** Les dvds et la VOD associées à cette biographie
  4538.      *
  4539.      * @param bool $count_only Compter seulement
  4540.      * @return array|int
  4541.      *
  4542.      */
  4543.     public function getDvds($count_only=false$params=array())
  4544.     {
  4545.         $params_sql = array(
  4546.             'dbg' => array('dvds_contact''Les dvds associés aux spectacles coproduits par la structure'),
  4547.             'special' => array(
  4548.                 'idspectacles' => $this->ids_spectacle_all,
  4549.             )
  4550.         );
  4551.         if (empty($this->ids_spectacle_all)) {
  4552.             $params_sql['special']['idpersons'] = $this->id;
  4553.         }
  4554.         if ($count_only) {
  4555.             $params_sql['count_only'] = true;
  4556.             $params_sql['limit'] = array('all');
  4557.         } else {
  4558.             if (!empty($params['limit'])){
  4559.                 $params_sql['limit'] = $params['limit'];
  4560.             }
  4561.             else {
  4562.                 $params_sql['limit'] = array(0100);
  4563.             }
  4564.         }
  4565.         $format_vignette = array('vignette_format' => array('width'=>300,'height'=>300,'direction'=>'thumb')); // taille de la vignette
  4566.         return $this->em->getRepository(Dvds::class)->getListDvds($params_sql$format_vignette);
  4567.     }
  4568.     // }}}
  4569.     public function setReseauSocial($title null$description_html null$url null$image null){
  4570.         if (is_null($description_html) && isset($this->infosperson['biotxt']['text'])){
  4571.             $description_html $this->infosperson['biotxt']['text'];
  4572.         }
  4573.         $description null;
  4574.         $this->func->makeMetaFromHtmlSimple($description_html$description$keyword);
  4575.         if (is_null($image) && empty($image)){
  4576.             $format_vignette_person = array('width'=>428,'height'=>640);
  4577.             $photos_person $this->em->getRepository(Files::class)->getObjectFiles($this->idperson,'persons','class_photo_person');
  4578.             if (!empty($photos_person)) {
  4579.                 foreach($photos_person as $k=>$v) {
  4580.                     $image $this->persons->getVignettePerson($this->idperson,$format_vignette_person);
  4581.                     break;
  4582.                 }
  4583.             }
  4584.         }
  4585.         if (is_null($title)){
  4586.             $title $this->title_page;
  4587.         }
  4588.         if (is_null($url)){
  4589.             $url $_ENV['URL_THNET'].'/biographies/'.$this->infosperson['url_clean'].'/'.$this->context['action'];
  4590.         }
  4591.         $social = array(
  4592.             'type' => 'profile',
  4593.             'title' => $title,
  4594.             'description' => $description,
  4595.             'image' => (isset($image)) ? $image '',
  4596.             'url' => $url
  4597.         );
  4598.         $this->setSocialCustomContent($social'fb');
  4599.     }
  4600. }