vendor/theatre/core/src/Repository/SpectaclesRepository.php line 2466

Open in your IDE?
  1. <?php
  2. namespace TheatreCore\Repository;
  3. use TheatreCore\Classes\Images\Images;
  4. use TheatreCore\Entity\Aides;
  5. use TheatreCore\Entity\Bigregions;
  6. use TheatreCore\Entity\Classifications;
  7. use TheatreCore\Entity\Contacts;
  8. use TheatreCore\Entity\Contents;
  9. use TheatreCore\Entity\Multimedias;
  10. use TheatreCore\Entity\ObjectContent;
  11. use TheatreCore\Entity\ObjectMultimedia;
  12. use TheatreCore\Entity\PersonEcole;
  13. use TheatreCore\Entity\Persons;
  14. use TheatreCore\Entity\Playlists;
  15. use TheatreCore\Entity\Schedules;
  16. use TheatreCore\Entity\SpectacleAide;
  17. use TheatreCore\Entity\Spectacles;
  18. use TheatreCore\Entity\Texts;
  19. use TheatreCore\Traits\TheatreTrait;
  20. use TheatreCore\Entity\Typesspectacles;
  21. use Theatre_Extranetusers;
  22. use DateInterval;
  23. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  24. use Doctrine\Persistence\ManagerRegistry;
  25. use Doctrine\ORM\Query;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. /**
  28.  * SpectaclesRepository
  29.  *
  30.  * This class was generated by the Doctrine ORM. Add your own custom
  31.  * repository methods below.
  32.  */
  33. class SpectaclesRepository extends ServiceEntityRepository
  34. {
  35.     use TheatreTrait {
  36.         getRelationsArray as protected getRelationsArrayTrait;
  37.         getItemsList as protected getItemsListTrait;
  38.         getApiTab as protected getApiTabTrait;
  39.     }
  40.     private $em;
  41.     public $__table;
  42.     public $__table_object;
  43.     public $__idtable;
  44.     public function __construct(ManagerRegistry $registryTranslatorInterface $translatorImages $images)
  45.     {
  46.         parent::__construct($registrySpectacles::class);
  47.         $this->__table $this->getClassMetadata()->getTableName();
  48.         $this->__table_object $this->getClassMetadata()->name;
  49.         $this->__idtable $this->getClassMetadata()->getSingleIdentifierFieldName();
  50.         $this->translator $translator;
  51.         $this->images $images;
  52.     }
  53.     /* the code above is auto generated do not remove the tag below */
  54.     ###END_AUTOCODE
  55.     // nb of recommandations for one spectacle
  56.     public function countSpectacleRecommandations(int $idSpectacle): int
  57.     {
  58.         return $this->createQueryBuilder('s')
  59.             ->select('COUNT(a.idaide)')
  60.             ->join('s.aides''sa')
  61.             ->join('sa.idaide''a')
  62.             ->join('a.idaidecontact''ac')
  63.             ->where('s.idspectacle = :idSpectacle')
  64.             ->andWhere('ac.title LIKE \'Spectacle recommandé\'')
  65.             ->setParameter(':idSpectacle'$idSpectacle)
  66.             ->getQuery()
  67.             ->getSingleScalarResult();
  68.     }
  69.     // Nb of recommanded spectacles
  70.     public function countRecommandedSpectacles(): int
  71.     {
  72.         return $this->createQueryBuilder('s')
  73.             ->select('COUNT(DISTINCT s.idspectacle)')
  74.             ->join('s.aides''sa')
  75.             ->join('sa.idaide''a')
  76.             ->join('a.idaidecontact''ac')
  77.             ->andWhere('ac.title LIKE \'Spectacle recommandé\'')
  78.             ->getQuery()
  79.             ->getSingleScalarResult();
  80.     }
  81.     // Get nb of recommanded spectacles by recommandations number
  82.     public function countRecommandedSpectaclesByNb(int $nb): int
  83.     {
  84.         $result $this->createQueryBuilder('s')
  85.             ->select('COUNT(DISTINCT s.idspectacle)')
  86.             ->addSelect('COUNT(sa.idaide) as HIDDEN nb')
  87.             ->join('s.aides''sa')
  88.             ->join('sa.idaide''a')
  89.             ->join('a.idaidecontact''ac')
  90.             ->andWhere('ac.title LIKE \'Spectacle recommandé\'')
  91.             ->groupBy('s')
  92.             ->having('nb = :recommandationsNb')
  93.             ->setParameter(':recommandationsNb'$nb)
  94.             ->getQuery()
  95.             ->getScalarResult();
  96.         return count($result);
  97.     }
  98.     // Aide id of recommandations for one spectacle
  99.     public function getSpectacleRecommandations(int $idSpectacle)
  100.     {
  101.         return $this->createQueryBuilder('s')
  102.             ->select('a.idaide')
  103.             ->join('s.aides''sa')
  104.             ->join('sa.idaide''a')
  105.             ->join('a.idaidecontact''ac')
  106.             ->where('s.idspectacle = :idSpectacle')
  107.             ->andWhere('ac.title LIKE \'Spectacle recommandé\'')
  108.             ->setParameter(':idSpectacle'$idSpectacle)
  109.             ->getQuery()
  110.             ->getResult();
  111.     }
  112.     //  {{{ findData()
  113.     /** Recherche des spectacles
  114.      *
  115.      * Permet de rechercher des spectacles selon différents critères
  116.      *
  117.      * @access  public
  118.      * @see     Theatre::find()
  119.      */
  120.     public function findData($idperson null$idtext null$keywords null$id null$count null)
  121.     {
  122.         $query $this->createQueryBuilder('e');
  123. //            ->select('e')
  124. //            ->andWhere('e.idspectacle = :idspectacle')
  125. //            ->setParameter('idspectacle', $idspectacle)
  126. //            ->getQuery()
  127. //            ->getSingleResult();
  128.         // les spectacles d'une personne
  129.         if (isset($_REQUEST['idperson']) && is_numeric($_REQUEST['idperson'])) {
  130.             $idperson $_REQUEST['idperson'];
  131.         }
  132.         // les mises en scene d'un texte
  133.         if (isset($_REQUEST['idtext']) && is_numeric($_REQUEST['idtext'])) {
  134.             $idtext $_REQUEST['idtext'];
  135.         }
  136.         // recherche par id
  137.         if (isset($_REQUEST['idspectacle']) && $_REQUEST['idspectacle'] != 'ID' && !empty($_REQUEST['idspectacle'])) {
  138.             $idspectacle $_REQUEST['idspectacle'];
  139.         }
  140.         // recherche par titre
  141.         if (isset($_REQUEST['keywords']) && $_REQUEST['keywords'] != 'titre' && !empty($_REQUEST['keywords'])) {
  142.             $keywords filter_var(trim($_REQUEST['keywords']), FILTER_SANITIZE_STRINGFILTER_FLAG_NO_ENCODE_QUOTES);
  143.             if ($this->my_is_int($keywords)) {
  144.                 $idspectacle = (int)$keywords;
  145.                 $keywords null;
  146.             }
  147.         }
  148.         // recherche par ville
  149.         if (isset($_REQUEST['city']) && $_REQUEST['city'] != 'ville' && !empty($_REQUEST['city'])) {
  150.             $city $_REQUEST['city'];
  151.         }
  152.         // recherche par metteur en scene
  153.         if (isset($_REQUEST['director']) && $_REQUEST['director'] != 'met. en sc.' && !empty($_REQUEST['director'])) {
  154.             $director $_REQUEST['director'];
  155.         }
  156.         $conn $this->getEntityManager()->getConnection();
  157.         // recherche par contraintes
  158.         // recherche stricte par id
  159.         if (!empty($idspectacle)) {
  160.             $idspectacle = (int)$idspectacle;
  161. //            $this->whereAdd('spectacles.idspectacle='.$idspectacle);
  162.             $query->andWhere('e.idspectacle = :idspectacle')->setParameter('idspectacle'$idspectacle);
  163.         } else {
  164.             //recherches par titre et/ou ville et/ou metteur en scene
  165.             if (!empty($keywords) || !empty($city) || !empty($director)
  166.                 || !empty($_REQUEST['external'])
  167.                 || !empty($_REQUEST['fc'])
  168.                 || !empty($_REQUEST['userfc'])
  169.                 || !empty($_REQUEST['idextranetuser'])
  170.                 || !empty($_REQUEST['partenaires'])) {
  171.                 //realiser la jointure
  172. //                $query = 'SELECT s.idspectacle,s.title,s.creation_date,s.url_clean,s.idcontact_creation,s.idtypespectacle,s.language,s.statut,s.valid,s.publish,s.idextranetuser,s.textfictif,
  173. //                                t.title as text_title,t.idtext,t.url_clean as url_clean_text
  174. //                         FROM texts t, text_spectacle ts, spectacles s
  175. //                         WHERE t.idtext=ts.idtext AND ts.idspectacle=s.idspectacle';
  176.                 //recherche par titre
  177.                 if (!empty($keywords)) {
  178. //                    $query .= ' AND ( (s.title LIKE \'%'.$this->escape($keywords).'%\') OR (t.title LIKE \'%'.$this->escape($keywords).'%\') ) ';
  179.                     $query->andWhere(' ( (e.title LIKE \'%' $this->escape($keywords) . '%\') OR (texts.title LIKE \'%' $this->escape($keywords) . '%\') ) ');
  180.                 }
  181.                 //recherche par ville
  182.                 if (!empty($city)) {
  183.                     $queryIN $conn->executeQuery('SELECT DISTINCT(idcontact) FROM contacts WHERE city LIKE \'' $this->escape($city) . '%\'')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  184.                     $query->andWhere(' e.idcontactCreation IN (' implode(','$queryIN) . ') ');
  185.                 }
  186.                 //recherche par metteur en scene
  187.                 if (!empty($director)) {
  188.                     $queryIN $conn->executeQuery('SELECT DISTINCT(sp.idspectacle) FROM spectacle_person sp, persons p WHERE sp.idperson=p.idperson AND sp.idrole=1 AND p.lastname LIKE \'%' $this->escape($director) . '%\'')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  189.                     $query->andWhere(' e.idspectacle IN (' implode(','$queryIN) . ') ');
  190. //                    $query .= ' AND  s.idspectacle IN (
  191. //                                'SELECT DISTINCT(sp.idspectacle) FROM spectacle_person sp, persons p WHERE sp.idperson=p.idperson AND sp.idrole=1 AND p.lastname LIKE \'%'.$this->escape($director).'%\'
  192. //                            ) ';
  193.                 }
  194.                 // les utilisateur extérieurs => ceux qui ne sont pas root
  195.                 if (isset($_REQUEST['external']) && $_REQUEST['external'] == 'only') {
  196. //                    $query .= ' AND s.`idextranetuser` IN (SELECT idextranetuser FROM extranetusers WHERE userrights=0) ';
  197.                     $queryIN $conn->executeQuery('SELECT idextranetuser FROM extranetusers WHERE userrights=0')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  198.                     $query->andWhere(' e.idextranetuser IN (' implode(','$queryIN) . ') ');
  199.                 }
  200.                 // les contacts partenaires = spectacles postés par des utilisateurs associés à un contact qui a la classification partenaireTODO
  201.                 if (isset($_REQUEST['partenaires']) && $_REQUEST['partenaires'] == 'only') {
  202.                     $queryIN $conn->executeQuery('SELECT contact_extranetuser.`contact_idextranetuser` FROM contact_extranetuser JOIN contact_classification ON contact_classification.`idcontact`=contact_extranetuser.`idcontact` AND contact_classification.`idclassification`=113')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  203.                     $query->andWhere(' e.idextranetuser IN (' implode(','$queryIN) . ') ');
  204.                 }
  205.                 // les spectacles FC
  206.                 if (isset($_REQUEST['fc']) && $_REQUEST['fc'] == 'only') {
  207. //                    $queryIN = $conn->executeQuery('SELECT idspectacle FROM spectacle_aide WHERE idcontact=15995')->fetchAll(\PDO::FETCH_COLUMN|\PDO::FETCH_ASSOC);
  208. //                    $query->andWhere(' e.idspectacle IN ('.implode(',', $queryIN).') ');
  209. //                    $query .= ' AND s.`idspectacle` IN (
  210. //                        SELECT idspectacle FROM spectacle_aide WHERE idcontact=15995
  211. //                    ) ';
  212.                 }
  213.                 // les utilisateurs FC
  214.                 if (isset($_REQUEST['userfc']) && $_REQUEST['userfc'] == 'only') {
  215.                     // trouver les spectacles des utilisateurs qui sont associés à une compagnie FC
  216.                     // = contact qui ont la classification 122
  217.                     $query .= ' AND s.`idextranetuser` IN (
  218.                         SELECT idextranetuser FROM contact_extranetuser WHERE idcontact IN (
  219.                             SELECT idcontact FROM contact_classification WHERE idclassification=122
  220.                         )
  221.                     )';
  222.                 }
  223.                 // les utilisateur extérieurs => ceux qui ne sont pas root
  224.                 if (isset($_REQUEST['idextranetuser']) && $this->my_is_int($_REQUEST['idextranetuser'])) {
  225.                     $queryIN $conn->executeQuery('SELECT idobject FROM user_action WHERE 1 AND object=\'spectacles\' AND action=\'create\' AND idextranetuser=' . (int)$_REQUEST['idextranetuser'] . '')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  226.                     $query->andWhere('e.idextranetuser=' . (int)$_REQUEST['idextranetuser'] . '');
  227.                     if (!empty($queryIN)) {
  228.                         $query->orWhere('e.idspectacle IN (' implode(','$queryIN) . ')');
  229.                     }
  230. //                    $query .= ' AND (
  231. //                        s.idextranetuser='.(int)$_REQUEST['idextranetuser'].'
  232. //                        OR s.idspectacle IN (SELECT idobject FROM user_action WHERE 1 AND object=\'spectacles\' AND action=\'create\' AND idextranetuser='.(int)$_REQUEST['idextranetuser'].')
  233. //                        ) ';
  234.                 }
  235.             }
  236.         }
  237.         // on precise les champs pour le SELECT
  238.         if (empty($idtext) && empty($idperson)) {
  239. //
  240. ////                $this->selectAdd();
  241. ////                $this->selectAdd('idspectacle,title,creation_date,idcontact_creation,idtypespectacle,language,url_clean,statut,valid,publish,idextranetuser,textfictif');
  242. //                $query->leftJoin('e.idextranetuser', 'extranetuser');
  243. //                $query->leftJoin('e.text_spectacle', 'texts');
  244. //                $query->leftJoin('texts.textAuthorperson', 'authors');
  245. //                $query->leftJoin('e.idtypespectacle', 'idtypespectacle');
  246.             $query->leftJoin('e.text_spectacle''text');
  247.             $query->select('e, text');
  248. //                $query->select('e, extranetuser, texts, authors, idtypespectacle');
  249.         }
  250.         // si un texte en particulier (jointure sur text_spectacle)
  251.         if (!empty($idtext)) {
  252.             $idtext = (int)$idtext;
  253. //            $ts = DB_DataObject::factory('text_spectacle')
  254.             $query->leftJoin('e.text_spectacle''texts');
  255.             $query->select('e, texts');
  256.             $query->andWhere('texts.idtext = ' . (int)$idtext);
  257. //            $this->joinAdd($ts);
  258. //            $this->selectAs();
  259. //            $this->selectAs($ts,'ts_%s');
  260. //            $this->whereAdd('text_spectacle.idtext='.$idtext);
  261.         }
  262.         // si aide
  263.         if (!empty($_REQUEST['idaide'])) {
  264.             $query->leftJoin('e.aides''aides');
  265.             $query->select('e, aides');
  266.             $query->andWhere('aides.idaide=' . (int)$_REQUEST['idaide']);
  267.         }
  268.         // si un metteur en scene (jointure sur spectacle_person)
  269.         if (!empty($idperson)) {
  270.             $idperson = (int)$idperson;
  271.             $sp DB_DataObject::factory('spectacle_person');
  272.             $this->joinAdd($sp);
  273.             $this->selectAs();
  274.             $this->selectAs($sp'sp_%s');
  275.             $this->whereAdd('spectacle_person.idperson=' $idperson);
  276.             $this->whereAdd('spectacle_person.idrole=1');
  277.             if ($_ENV['CHECK_IF_ONLINE']) {
  278.                 $this->whereAdd('spectacles.publish=1');
  279.             }
  280.         }
  281.         if ($this->getCount()) {
  282.             $query->select('COUNT(e.idspectacle)');
  283.             $this->setCount(false);
  284.             return $query;
  285.         }
  286.         $query->orderBy('e.idspectacle''desc');
  287.         // on lance la recherche
  288.         return $query->getQuery();
  289.     }
  290.     // }}}
  291.     //  {{{ setToArray()
  292.     /** Listes des spectacles dans un tableau associatif
  293.      *
  294.      * Tableau associatif notament utilisé pour lister les informations sur des spectacles
  295.      * Utile pour générer les tableaux HTML de listes de spectacles
  296.      *
  297.      * @access  public
  298.      * @return  array
  299.      * @see     findData()
  300.      * @see     getInfosSpectacle()
  301.      */
  302.     public function setToArray($spec true$idperson null$idtext null)
  303.     {
  304.         // recherche
  305.         if ($spec == true) {
  306.             $this->findData($idperson$idtext);
  307.         }
  308.         $values = array();
  309.         $color null;
  310.         $nb 0;
  311.         while ($this->fetch()) {
  312. //            $this->getLinks();
  313.             $values[$nb] = $this->getInfosSpectacle();
  314.             $values[$nb]['id'] = $this->idspectacle;
  315.             // couleur de ligne alternative
  316.             $color $this->colorAlternate($color);
  317.             $values[$nb]['colorline'] = $color;
  318.             $nb++;
  319.         }
  320.         return $values;
  321.     }
  322.     // }}}
  323.     //  {{{ getInfosSpectacle()
  324.     /** Infos sur un spectacle
  325.      *
  326.      * Retourne un tableau associatif avec les principales
  327.      * informations sur un spectacle
  328.      *
  329.      * @access  public
  330.      * @param int $idspectacle Identifiant de la fiche spectacle
  331.      * @return  array
  332.      * @see     findData()
  333.      */
  334.     public function getInfosSpectacle($idspectacle null$params_display = array())
  335.     {
  336.         $repo false;
  337.         $conn $this->getEntityManager();
  338.         ////////////// infos extraites de la table si on est pas dans une boucle
  339.         if (!empty($idspectacle)) {
  340.         } else {
  341.             $idspectacle $this->idspectacle;
  342.             $infos = array();
  343.         }
  344.         $data $this->createQueryBuilder('e')
  345.             ->select('e')
  346.             ->andWhere('e.idspectacle = :idspectacle')
  347.             ->setParameter('idspectacle'$idspectacle)
  348.             ->getQuery()
  349.             ->getSingleResult();
  350.         $repo true;
  351.         $this->idspectacle $data->getIdspectacle();
  352.         // infos de base
  353.         $infos = array(
  354.             'idspectacle' => $data->getIdspectacle(),
  355.             'url_clean' => $data->getUrlClean(),
  356.             'idtypespectacle' => (int)$data->getIdtypespectacle()->getIdtypespectacle(),
  357.             'idspectaclegenre' => (!empty($data->getIdspectaclegenre())) ? (int)$data->getIdspectaclegenre()->getIdspectaclegenre() : null,
  358.             'duration' => $data->getDuration(),
  359.             'textfictif' => $data->getTextfictif(),
  360.             'interlude' => $data->getInterlude(),
  361.             'publish' => (int)$data->getPublish()
  362.         );
  363.         $infos['valid'] = (int)$data->getValid();
  364.         $infos['statut'] = 0;
  365.         if ($data->getStatut()) {
  366.             $infos['statut'] = (int)$data->getStatut();
  367.             // incomplet ?
  368.             if ($infos['statut'] == 1) {
  369.                 $infos['validation_encours'] = true;
  370.             }
  371.             if ($infos['statut'] == 0) {
  372.                 $infos['incomplet'] = true;
  373.             }
  374.             if ($infos['statut'] > 1) {
  375.                 $infos['valide'] = true;
  376.             }
  377.         }
  378.         // utilisateur
  379.         $infos['idextranetuser'] = $data->getIdextranetuser();
  380.         $this->creation_date $data->getCreationDate();
  381.         if (!is_null($this->creation_date)) {
  382.             $this->creation_date $this->creation_date->format('Y-m-d H:i:s');
  383.         }
  384.         // date de creation
  385.         if (isset($this->creation_date) && $this->creation_date != '0000-00-00' && $this->creation_date != null) {
  386.             $infos['creation_date'] = $this->getFormeDate($this->creation_date$GLOBALS['format_date'][$GLOBALS['lng']]);
  387.             $infos['creation_date_us'] = $this->creation_date;
  388.         } else {
  389.             $infos['creation_date'] = null;
  390.         }
  391.         // la ville de creation
  392.         if (is_object($data->getIdcontactCreation())) {
  393.             $infos['city'] = $data->getIdcontactCreation()->getCity();
  394.             if (!empty($data->getIdcontactCreation()->getCountry())) {
  395.                 $infos['country'] = $this->getNameCountry($data->getIdcontactCreation()->getCountry()->getId());
  396.             }
  397.             $infos['location'] = $data->getIdcontactCreation()->getOrganisation();
  398.             $infos['url_clean_location'] = $data->getIdcontactCreation()->getUrlClean();
  399.         }
  400.         // le type de spectacle
  401.         if (!empty($infos['idtypespectacle'])) {
  402.             $typesspectacles $conn->getRepository(Typesspectacles::class);
  403.             $infos['type'] = $typesspectacles->getTypespectacle($infos['idtypespectacle'], $GLOBALS['lng']);
  404.         }
  405.         // la langue
  406.         if ($data->getLanguage()) {
  407.             $infos['language'] = $this->getNameLanguage($data->getLanguage(), $GLOBALS['lng']);
  408.             $infos['language_src'] = $data->getLanguage();
  409.         }
  410.         // ancien spectacle ?
  411.         if ($data->getUrlPage()) {
  412.             $infos['url_page'] = $data->getUrlPage();
  413.         }
  414.         // annee de creation
  415.         $infos['annee_creation'] = $this->getYear($this->creation_date);
  416.         if (!empty($data->getTitle())) { // on a un titre pour le spectacle
  417.             $infos['title'] = $data->getTitle();
  418.             $infos['adaptation'] = true;
  419.         } else {
  420.             $texts $this->getSpectacleText();
  421.             $infos['title'] = $texts['title'];
  422.             $infos['idtext'] = $texts['idtext'];
  423.             $infos['url_clean_text'] = $texts['url_clean'];
  424.         }
  425.         ///////// le(s) auteur(s) du texte original
  426.         if (!array_key_exists('adaptation'$infos) && !empty($infos['idtext'])) {
  427.             $aut $conn->getRepository(Texts::class);
  428.             $authors $aut->getAuthors($infos['idtext']);
  429.             // au dela de 1 auteur, on dit que c'est un collectif
  430.             if (!empty($authors) && count($authors) > 1) {
  431.                 $infos['authors'] = array(=> array('lastname' => '(' count($authors) . ' auteurs)',
  432.                     'firstname' => 'Collectif',
  433.                     'collectif' => true));
  434.             } else {
  435.                 $infos['authors'] = $authors;
  436.             }
  437.         } else {
  438.             $infos['authors'] = array(=> array('lastname' => 'Adaptation''collectif' => true));
  439.         }
  440.         // tous les auteurs
  441.         if (isset($authors)) {
  442.             $infos['allauthors'] = $this->noPunct($authors);
  443.         }
  444.         ///////// le(s) metteur(s) en scene
  445.         $directors $this->getDirectors($idspectacle);
  446.         // Cas avec plusieurs metteurs en scene
  447.         if (count($directors) > && $infos['textfictif'] == 0) {
  448.             $infos['directors'] = array(=> array(
  449.                 'lastname' => '(' count($directors) . ' metteurs en scene)',
  450.                 'firstname' => 'Collectif',
  451.                 'collectif' => true)
  452.             );
  453.         } else {
  454.             $infos['directors'] = $directors;
  455.         }
  456.         // tous les metteurs
  457.         $infos['alldirectors'] = $this->noPunct($directors);
  458.         if (empty($params_display['nocleanperson'])) {
  459.             $infos $this->clearSpectaclesAddAllPersons($infos);
  460.         }
  461.         // recuperer l'affiche du spectacle
  462.         if (!empty($params_display['get_illustration'])) {
  463.             $illustrations $conn->getRepository(Contents::class)->getIllustrations($this->idspectacle'spectacles''class_affiche_spec');
  464.             if (!empty($illustrations)) {
  465.                 // illustrations
  466.                 $infos['illustrations'] = $illustrations['illustrations'];
  467.                 // vignettes
  468.                 if (!empty($illustrations['vignette_object'])) {
  469.                     $infos['vignette_object'] = $illustrations['vignette_object'];
  470.                 }
  471.             }
  472.         }
  473.         // recuperer l'affiche du spectacle
  474.         if (!empty($params_display['get_vignette'])) {
  475.             $format_vignette = array('width' => $_ENV['VIGN_SPECTACLE_WIDTH'], 'height' => $_ENV['VIGN_SPECTACLE_HEIGHT'], 'direction' => 'crop');
  476.             $infos['vignette_affiche'] = $this->getVignetteSpectacle($idspectacle$format_vignette);
  477.             $format_vignette['blur'] = true;
  478.             $infos['vignette_affiche_flou'] = $this->getVignetteSpectacle($idspectacle$format_vignette);
  479.         }
  480.         // voir si il y a des aides
  481.         if (!empty($params_display['get_aides'])) {
  482.             $spectacleAide $conn->getRepository(SpectacleAide::class);
  483.             $infos['nb_aides'] = $spectacleAide->countAides(null$this->idspectacle);
  484.             if ($infos['nb_aides'] > 0) {
  485.                 $infos['aides'] = $spectacleAide->getListSpectacleAide(array(
  486.                     'idspectacle' => array($this->idspectacle),
  487.                     'get_spectacles_with_aides' => true,
  488.                     'dbg' => array('liste_aides''Liste des aides du spectaclee')
  489.                 ));
  490.             }
  491.         }
  492.         if (!empty($params_display['carrer_couleurs'])) {
  493.             $infos['carrer'] = $this->getObjectsCarrerDetails($this->idspectacle);
  494.         }
  495.         if (!empty($params_display['api'])) {
  496.             $infos $this->getApiTab($infos$_ENV['URL_THNET'], $params_display['api']);
  497.         }
  498.         // infos sur le texte avec url
  499.         return $infos;
  500.     }
  501.     // }}}
  502.     //  {{{ getInfosObject()
  503.     /** Alias de getInfosSpectacle
  504.      *
  505.      * @access  public
  506.      * @param int $idobject identifiant
  507.      * @return  array
  508.      * @see     getInfosSpectacle()
  509.      */
  510.     public function getInfosObject($idobject null$params_display = array())
  511.     {
  512.         return $this->getInfosSpectacle($idobject$params_display);
  513.     }
  514.     // }}}
  515.     //  {{{ getSpectacleText()
  516.     /** les textes associé à un spectacle
  517.      *
  518.      * recupere le titre du texte associe a un spectacle
  519.      *
  520.      * @access   public
  521.      * @return   array
  522.      */
  523.     public function getSpectacleText($all false$idspectacle null$k null)
  524.     {
  525.         if (empty($idspectacle)) {
  526.             $idspectacle $this->idspectacle;
  527.         }
  528.         $idspectacle = (int)$idspectacle;
  529.         // on recupere les textes associes
  530.         $sql 'SELECT t.idtext,t.title,t.type,t.url_clean, t.textfictif FROM texts t, text_spectacle ts
  531.                 WHERE 1
  532.                 AND ts.idspectacle=' $idspectacle '
  533.                 AND t.idtext=ts.idtext';
  534.         if (!empty($k)) {
  535.             $texts $this->queryAll($sql, array(), nulltrue);
  536.         } else {
  537.             $texts $this->queryAll($sql);
  538.         }
  539.         if (!$all && !empty($texts)) {
  540.             $texts $texts[0];
  541.         }
  542.         return $texts;
  543.     }
  544.     // }}}
  545.     //  {{{ getPlageDate()
  546.     /** la plage de date du spectacle
  547.      *
  548.      * Récupère la plage de date du spectacle
  549.      *
  550.      * @access   public
  551.      * @param int $idspectacle Identifiant du spectacle
  552.      * @param int $month On ne veux que les dates du mois
  553.      * @param int $year On ne veux que les dates de l'année
  554.      * @return   array
  555.      */
  556.     public function getPlageDate($idspectacle$month null$year null)
  557.     {
  558.         $idspectacle = (int)$idspectacle;
  559.         //annee
  560.         if (empty($year)) {
  561.             $year date('Y');
  562.         }
  563.         //pas de recherche par mois
  564.         if (empty($month)) {
  565.             // on recuperer la plage de dates du spectacle
  566.             $sql 'SELECT MIN(sc.date) as datestart ,MAX(sc.date) as dateend , MAX(hour) as hour FROM schedules sc
  567.                     WHERE sc.idspectacle=' $idspectacle;
  568.         } else { // recherche avec un mois precis
  569.             //premier du mois
  570.             $datestart date('Y-m-d'mktime(000$month1$year));
  571.             //dernier du mois
  572.             $dateend date('Y-m-d'mktime(000$month 10$year));
  573.             // on recupere la plage de dates pour le mois indique
  574.             $sql 'SELECT MIN(sc.date) as datestart ,MAX(sc.date) as dateend , MAX(hour) as hour FROM schedules sc
  575.                     WHERE sc.idspectacle=' $idspectacle ' AND (sc.date BETWEEN (\'' $datestart '\') AND (\'' $dateend '\'))';
  576.         }
  577.         // executer la requete
  578.         $dates $this->queryRow($sql);
  579.         $dates['datestart'] = $this->getFormeDate($dates['datestart'], $GLOBALS['format_date'][$GLOBALS['lng']]);
  580.         $dates['dateend'] = $this->getFormeDate($dates['dateend'], $GLOBALS['format_date'][$GLOBALS['lng']]);
  581.         //date de debut = date de fin, vider la date de fin
  582.         if ($dates['datestart'] == $dates['dateend']) {
  583.             $dates['dateend'] = '';
  584.         }
  585.         // retourner les dates
  586.         return $dates;
  587.     }
  588.     // }}}
  589.     //  {{{ getTextSpectacle()
  590.     /** les spectacles associes a un texte
  591.      *
  592.      * recupere le titre du texte associe a un spectacle
  593.      *
  594.      * @access   public
  595.      * @param int $idtext identifiant du texte
  596.      * @param bool $limit limiter le nombre de resultat
  597.      * @param bool $all obtenir aussi le titre et le metteur en scene du spectacle
  598.      * @return   array
  599.      */
  600.     public function getTextSpectacle($idtext$limit false$all false)
  601.     {
  602.         $idtext = (int)$idtext;
  603.         // on recupere les spectacles associes
  604.         $sql 'SELECT s.idspectacle,s.language,s.title as titlespectacle, t.title as titletext
  605.                 FROM spectacles s, text_spectacle ts, texts t
  606.                 WHERE t.idtext=ts.idtext
  607.                 AND ts.idspectacle=s.idspectacle
  608.                 AND ts.idtext=' $idtext;
  609.         //on veut une limite
  610.         $limit = (int)$limit;
  611.         if ($limit 0) {
  612.             $sql .= ' LIMIT 0,' $limit;
  613.         }
  614.         // executer la requete
  615.         $spectacles $this->queryAll($sql);
  616.         foreach ($spectacles as $k => $v) {
  617.             $idspectacle $v['idspectacle'];
  618.             if (!empty($idspectacle) && is_numeric($idspectacle) && $all == true) {
  619.                 $infos_spectacle = array(
  620.                     'idspectacle' => $idspectacle,
  621.                     'title' => $v['titletext'],
  622.                     'title_spectacle' => $v['titlespectacle']
  623.                 );
  624.                 $spectacles[$k]['title'] = $this->getObjectTitle($idspectacle$infos_spectacle);
  625.                 $spectacles[$k]['director'] = $this->getDirectorsString($idspectacle);
  626.             }
  627.         }
  628.         return $spectacles;
  629.     }
  630.     // }}}
  631.     //  {{{ getTextTraductionSpectacles()
  632.     /** Les spectacles associes a aux traductions d'un texte
  633.      *
  634.      * @access   public
  635.      * @param int $idtext id du texte original
  636.      * @param int $limit limiter les reponses
  637.      * @param bool $extended retourner seulement l'id ou plus d'infos
  638.      * @return   array
  639.      */
  640.     public function getTextTraductionSpectacles($idtext$limit false$extended true)
  641.     {
  642.         $idtext = (int)$idtext;
  643.         $sql 'SELECT idspectacle,language FROM spectacles
  644.                 WHERE idspectacle IN (
  645.                     SELECT idspectacle FROM text_spectacle
  646.                     WHERE idtext IN (
  647.                         SELECT idtexttraduction FROM text_traduction
  648.                         WHERE idtext=' $idtext '
  649.                     )
  650.                 )';
  651.         //on veut une limite
  652.         $limit = (int)$limit;
  653.         if ($limit 0) {
  654.             $sql .= ' LIMIT 0,' $limit;
  655.         }
  656.         // executer la requete
  657.         $spectacles $this->queryAll($sql);
  658.         if ($extended) {
  659.             foreach ($spectacles as $key => $value) {
  660.                 if (!empty($value['idspectacle']) && is_numeric($value['idspectacle'])) {
  661.                     $spectacles[$key]['title'] = $this->getObjectTitle($value['idspectacle']);
  662.                     $spectacles[$key]['director'] = $this->getDirectorsString($value['idspectacle']);
  663.                 }
  664.             }
  665.         }
  666.         return $spectacles;
  667.     }
  668.     // }}}
  669.     //  {{{ getContactsByRole()
  670.     /** Contacts associés à un spectacle
  671.      *
  672.      * @access  public
  673.      * @param int $idspectacle identifiant du spectacle
  674.      * @param string|array $idrole role de la personne
  675.      * @return  array
  676.      */
  677.     public function getContactsByRole($idspectacle$idrole)
  678.     {
  679.         // on a deja l'id ?
  680.         if (empty($idspectacle)) {
  681.             $idspectacle $this->idspectacle;
  682.         }
  683.         $idspectacle = (int)$idspectacle;
  684.         $infos = array();
  685.         $roles = array(
  686.             'spectacle_prod' => 17,
  687.             'spectacle_coprod' => 18,
  688.             'spectacle_prodel' => 19,
  689.             'spectacle_struct_diffusion' => 77,
  690.             'spectacle_partenaire' => 23,
  691.         );
  692.         // idrole ou role
  693.         if (!$this->my_is_int($idrole)) {
  694.             if (!is_array($idrole)) {
  695.                 if (array_key_exists($idrole$roles)) {
  696.                     $idrole $roles[$idrole];
  697.                 }
  698.             }
  699.         } else {
  700.             $idrole = (int)$idrole;
  701.         }
  702.         $query 'SELECT c.`idcontact`, c.`organisation`, c.`lastname`, c.`firstname`, c.`url`, c.`url_clean`, c.`valid`
  703.                     FROM contacts c
  704.                     JOIN spectacle_contact sc ON sc.`idcontact`=c.`idcontact`
  705.                     WHERE sc.`idspectacle`=' $idspectacle '
  706.                     AND sc.`idrole` IN (' $this->arrayToIn($idrole) . ')
  707.                     ORDER BY c.`organisation`';
  708.         // lancer la requete
  709.         $p $this->query($query);
  710.         while ($r $this->fetchRow()) { //$p->fetchRow()
  711.             $infos[$r['idcontact']] = array(
  712.                 'lastname' => $r['lastname'],
  713.                 'firstname' => $r['firstname'],
  714.                 'idcontact' => $r['idcontact'],
  715.                 'organisation' => $r['organisation'],
  716.                 'valid' => $r['valid'],
  717.                 'url_clean' => $r['url_clean'],
  718.                 'url' => $r['url']
  719.             );
  720.         }
  721.         $this->free(); //$p->free()
  722.         return $infos;
  723.     }
  724.     // }}}
  725.     //  {{{ getPersonsByRole()
  726.     /** Personnes associées à un spectacle
  727.      *
  728.      * @access  public
  729.      * @param int $idspectacle identifiant du spectacle
  730.      * @param string|int $idrole role de la personne
  731.      * @param array $params_search paramètres supplémentaires
  732.      * @return  array
  733.      */
  734.     public function getPersonsByRole($idspectacle$idrole$params_search = array())
  735.     {
  736.         $conn $this->getEntityManager();
  737.         // on a deja l'id ?
  738.         if (empty($idspectacle)) {
  739.             $idspectacle $this->idspectacle;
  740.         }
  741.         $idspectacle = (int)$idspectacle;
  742.         // requête classique
  743.         $query 'SELECT p.`idperson` as id, p.`idperson` as idperson, p.`lastname`, p.`firstname`, p.`url_clean`, p.`valid`,
  744.                         lt.`fr`,
  745.                         r.`idrole`, r.`role`, r.`type`,
  746.                         sp.`comment`,sp.`date_start`,sp.`date_end`
  747.                         FROM persons p
  748.                             JOIN spectacle_person sp ON sp.`idperson`=p.`idperson`
  749.                             JOIN roles r ON r.`idrole`=sp.`idrole`
  750.                             JOIN langterms lt ON r.`role`=lt.`id`
  751.                         WHERE sp.idspectacle=' $idspectacle ' ';
  752.         // on ne veut pas tous le monde
  753.         if (empty($params_search['all'])) {
  754.             // les roles
  755.             $roles = array(
  756.                 /*'directors' => 1,
  757.                 'spectacle_director' => 1,*/
  758.                 'actors' => 5,
  759.                 'spectacle_actor' => 5,
  760.             );
  761.             // les types de roles
  762.             $types = array(
  763.                 'distributions' => 1,
  764.                 'spectacle_distrib' => 1,
  765.                 'all' => 'all',
  766.             );
  767.             // les types de créateur
  768.             $types_creator = array(
  769.                 'spectacle_director' => 1,
  770.                 'directors' => 1,
  771.             );
  772.             // idrole ou role
  773.             if (!$this->my_is_int($idrole)) {
  774.                 if (array_key_exists($idrole$roles)) {
  775.                     $idrole $roles[$idrole];
  776.                 } elseif (array_key_exists($idrole$types)) {
  777.                     $type $types[$idrole];
  778.                 } elseif (array_key_exists($idrole$types_creator)) {
  779.                     $type_creator $types_creator[$idrole];
  780.                 }
  781.             } else {
  782.                 $idrole = (int)$idrole;
  783.             }
  784.             // recherche par type ou par idrole
  785.             if (empty($type) && empty($type_creator)) {
  786.                 $query .= ' AND sp.idrole=' $idrole;
  787.             } elseif (!empty($type) && $type != 'all') {
  788.                 $query .= ' AND r.type=' . (int)$type;
  789.             } elseif (!empty($type_creator) && $type_creator != 'all') {
  790.                 $query .= ' AND r.type_creator=' . (int)$type_creator;
  791.             }
  792.             // sélectionner les personnes d'un spectacle qui font parti de l'école
  793.             if (!empty($params_search['ecole']['idcontact'])) {
  794.                 // si on a une école => on veut le début et la fin d'étude + savoir si il était "supported"
  795.                 // les élèves soutenus pendant le spectacle, les élèves ayant été dans cette école
  796.                 // sélectionner les personnes qui ont été JTN pendant au moins une date de la tournée du spectacle. On sélectionne aussi le rôle
  797.                 $query 'SELECT persons.`idperson`, persons.`idperson`, persons.`lastname`, persons.`firstname`, persons.`url_clean`, persons.`valid`,
  798.                                 langterms.`' $GLOBALS['lng'] . '`,
  799.                                 roles.`idrole`, roles.`role`, roles.`type`,
  800.                                 spectacle_person.`comment`,spectacle_person.`date_start`,spectacle_person.`date_end`
  801.                             FROM spectacles
  802.                                 JOIN schedules ON spectacles.`idspectacle`=schedules.`idspectacle`
  803.                                 JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
  804.                                 JOIN roles ON spectacle_person.`idrole`=roles.`idrole`
  805.                                 JOIN langterms ON roles.`role`=langterms.`id`
  806.                                 JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
  807.                                 JOIN persons ON person_ecole.`idperson`=persons.`idperson`
  808.                             WHERE
  809.                                 person_ecole.`idcontact`=' . (int)$params_search['ecole']['idcontact'] . '
  810.                                 AND spectacles.`idspectacle`=' $idspectacle ' ';
  811.                 if (!empty($params_search['ecole']['strict'])) {
  812.                     $query .= ' AND (schedules.`date` BETWEEN person_ecole.`date_start` AND person_ecole.`date_end`) ';
  813.                 }
  814.             }
  815.         }
  816.         // classement par nom ou par classement pour les créateurs
  817.         if (!empty($type_creator)) {
  818.             $query .= ' ORDER BY sp.`classement` ';
  819.         } else {
  820.             $query .= ' ORDER BY p.`lastname` ';
  821.         }
  822.         // lancer la requete
  823.         $results $this->queryAll($query);
  824.         if (!empty($results)) {
  825. //             trouver les écoles de chaque personnes sans exclure le JTN
  826.             if (!empty($params_search['eleves'])) {
  827.                 // les clés
  828.                 foreach ($results as $k => $v) {
  829.                     $ids_person[] = $v['idperson'];
  830.                 }
  831.                 $ecoles $conn->getRepository(PersonEcole::class)->getEcoles($ids_personfalse);
  832.                 // ajouter au résultats
  833.                 foreach ($results as $k => $v) {
  834.                     if (!empty($ecoles[$v['idperson']])) {
  835.                         $results[$k]['ecoles'] = $ecoles[$v['idperson']];
  836.                     }
  837.                 }
  838.             }
  839.             // trouver les personnes qui ont été élvèves du contact
  840.             if (!empty($params_search['eleves']['idcontact'])) {
  841.                 // sélectionner les personnes qui ont été JTN pendant au moins une date de la tournée du spectacle. On sélectionne aussi le rôle
  842.                 $query_supported 'SELECT DISTINCT(person_ecole.`idperson`) as idperson, person_ecole.`idperson` as idpersonb
  843.                                     FROM spectacles
  844.                                         JOIN schedules ON spectacles.`idspectacle`=schedules.`idspectacle`
  845.                                         JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
  846.                                         JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
  847.                                     WHERE
  848.                                         person_ecole.`idcontact`=' . (int)$params_search['eleves']['idcontact'] . '
  849.                                         AND spectacles.`idspectacle`=' $idspectacle ' ';
  850.                 $query_supported .= ' AND (schedules.`date` BETWEEN person_ecole.`date_start` AND person_ecole.`date_end`) ';
  851.                 // liste des personnes soutenues
  852.                 $result_ecoles_supported $this->queryAll($query_supported, array(), nulltrue);
  853.                 $ecoles_supported = [];
  854.                 foreach ($result_ecoles_supported as $ecole) {
  855.                     $ecoles_supported[$ecole['idperson']] = $ecole;
  856.                 }
  857.                 if (!empty($ecoles_supported)) {
  858.                     // ajouter aux résultats
  859.                     foreach ($results as $k => $v) {
  860.                         if (isset($ecoles_supported[$v['idperson']])) {
  861.                             $results[$k]['supported'] = true;
  862.                         }
  863.                     }
  864.                 }
  865.             }
  866.             $i 0;
  867.             foreach ($results as $r) {
  868.                 // on veut classer les gens par roles
  869.                 if (!empty($params_search['all'])) {
  870.                     // grouper les types de roles de distribution
  871.                     if ($r['type'] == 1) {
  872.                         // si déjà dans distributions
  873.                         if (!isset($infos['distributions'][$r['idperson']])) {
  874.                             $infos['distributions'][$r['idperson']] = $r;
  875.                         }
  876.                         // ajouter le role
  877.                         $infos['distributions'][$r['idperson']]['role'] = $r[$GLOBALS['lng']];
  878.                         $infos['distributions'][$r['idperson']]['roles'][$r['role']] = $r[$GLOBALS['lng']];
  879.                     } else {
  880.                         $infos[$r['role']][$r['idperson']] = $r// ne peut pas voir 2x le mm role
  881.                         $infos[$r['role']][$r['idperson']]['role'] = $r[$GLOBALS['lng']];
  882.                         $infos[$r['role']][$r['idperson']]['roles'][$r['role']] = $r[$GLOBALS['lng']];
  883.                     }
  884.                 } else { // ne pas classer => toute la distribution qui est dans spectacle_person
  885.                     // si la personne est déjà dans infos, ajouter son role et écraser l'ancien
  886.                     if (empty($params_search['multiple_result_by_person'])) {
  887.                         $id $r['idperson'];
  888.                     } else {
  889.                         $id $i;
  890.                     }
  891.                     if (!isset($infos[$id])) {
  892.                         $infos[$id] = $r;
  893.                     }
  894.                     $infos[$id]['view_name'] = mb_strtoupper($r['lastname']) . ' ' $r['firstname'];
  895.                     $infos[$id]['role'] = $r['fr']; //$GLOBALS['lng']
  896.                     if (isset($r['comment'])) {
  897.                         $infos[$id]['comment'] = $r['comment'];
  898.                         $infos[$id]['more_infos'] = true// le com ou les dates
  899.                     }
  900.                     foreach (array('start''end') as $f) {
  901.                         if (!empty($r['date_' $f])) {
  902.                             $infos[$id]['more_infos'] = true// le com ou les dates
  903.                             $infos[$id]['date_' $f] = $r['date_' $f];
  904.                             $infos[$id]['date_' $f '_string'] = $this->getFormeDate($r['date_' $f], 'd/m/Y');
  905.                         }
  906.                     }
  907.                     $infos[$id]['roles'][$r['role']] = $r['fr']; //$GLOBALS['lng']
  908.                 }
  909.                 $i++;
  910.             }
  911.             return $infos;
  912.         }
  913.         return array();
  914.     }
  915.     // }}}
  916.     //  {{{ getSoutiens()
  917.     /** Récupèrer les soutiens JTN, ENSATT...
  918.      *
  919.      * @access  public
  920.      * @param array tableau de données
  921.      */
  922.     public function getSoutiens($idspectacle$idclassifications = array())
  923.     {
  924.         $idclassifications = (!is_array($idclassifications)) ? array($idclassifications) : $idclassifications;
  925.         // rapprochement idcontact, idclassification
  926.         $sql 'SELECT idclassification
  927.                 FROM spectacle_classification WHERE 1 ';
  928.         if (!is_null($idspectacle) && is_numeric($idspectacle)) {
  929.             $sql .= 'AND idspectacle=' . (int)$idspectacle ' ';
  930.         }
  931.         if (!empty($idclassifications)) {
  932.             $sql .= 'AND idclassification IN (' join(','$idclassifications) . ') ';
  933.         }
  934.         return $sql;
  935.     }
  936.     // }}}
  937.     //  {{{ getDirectors()
  938.     /** Metteurs en scene
  939.      *
  940.      * Liste des metteurs en scene
  941.      *
  942.      * @access  public
  943.      * @param int $idspectacle identifiant du spectacle
  944.      * @return  array
  945.      * @see     getPersonsByRole()
  946.      */
  947.     public function getDirectors($idspectacle null)
  948.     {
  949.         // on a deja l'id ?
  950.         if (empty($idspectacle)) {
  951.             $idspectacle $this->idspectacle;
  952.         }
  953.         return $this->getPersonsByRole($idspectacle'directors');
  954.     }
  955.     // }}}
  956.     //  {{{ getAuthors()
  957.     /** Auteurs (tous, même collage)
  958.      *
  959.      * @access  public
  960.      * @param int $idspectacle identifiant du spectacle
  961.      * @return  array
  962.      */
  963.     public function getAuthors($idspectacle null)
  964.     {
  965.         // pourquoi ne pas aussi récup les auteurs des textes du montage ?
  966.         $sql 'SELECT DISTINCT(p.`idperson`),p.`lastname`,p.`firstname`,p.`url_clean`
  967.                 FROM persons p
  968.                     JOIN text_author ta ON ta.`idperson`=p.`idperson`
  969.                     JOIN text_spectacle ts ON ts.`idtext`=ta.`idtext`
  970.                 WHERE ts.`idspectacle`=' . (int)$this->idspectacle;
  971.         return $authors $this->queryAll($sql);
  972.     }
  973.     // }}}
  974.     //  {{{ getDirectorsString()
  975.     /** Metteurs en scene au format texte
  976.      *
  977.      * Liste des metteurs en scene au format string
  978.      *
  979.      * @access  public
  980.      * @param int $idspectacle identifiant du spectacle
  981.      * @return  string
  982.      * @see     getPersonsByRole()
  983.      */
  984.     public function getDirectorsString($idspectacle null$directors = array())
  985.     {
  986.         // on a deja l'id ?
  987.         if (empty($idspectacle)) {
  988.             $idspectacle $this->idspectacle;
  989.         }
  990.         // on déjà les metteurs dans le tableau directors
  991.         if (!empty($director)) {
  992.             $tab $directors;
  993.         } else {
  994.             $tab $this->getPersonsByRole($idspectacle'directors');
  995.         }
  996.         $string = array();
  997.         foreach ($tab as $key => $value) {
  998.             $string[] = $value['firstname'] . ' ' $value['lastname'] . ',';
  999.         }
  1000.         return join(', '$string);
  1001.     }
  1002.     // }}}
  1003.     //  {{{ getObjectTitle()
  1004.     /** Titre d'un spectacle
  1005.      *
  1006.      * Retourne le titre du spectacle :
  1007.      *      - de la table 'spectacle' si c'est une adaptation
  1008.      *      - de la table texte si c'est une mise en scene 'simple'
  1009.      *
  1010.      * @access  public
  1011.      * @param int $idobject Identifiant de l'item
  1012.      * @param array $infos_object Informations pour construire le titre
  1013.      * @param array $params Paramétres supplémentaires
  1014.      * @return  string|array
  1015.      */
  1016.     public function getObjectTitle($idobject null$infos_object = array(), $params = array())
  1017.     {
  1018.         // si on n'a pas passé l'id a la méthode, on doit-être dans une boucle
  1019.         if (!$idobject) {
  1020.             $idobject $this->idspectacle;
  1021.         }
  1022.         $idobject = (int)$idobject;
  1023.         // champs utile et virtuels
  1024.         $fields = array('idspectacle''title''title_spectacle''url_clean''valid');
  1025.         $fields_exists = array('idspectacle''title''url_clean''valid');
  1026.         // si on a les valeurs
  1027.         if (!empty($infos_object)) {
  1028.             foreach ($fields as $k => $v) {
  1029.                 if (array_key_exists($v$infos_object)) {
  1030.                     $infos[$v] = $infos_object[$v];
  1031.                 }
  1032.             }
  1033.             // si on a title_spectacle, il faut l'utiliser en titre
  1034.             if (!empty($infos_object['title_spectacle'])) {
  1035.                 $infos['title'] = $infos_object['title_spectacle'];
  1036.             }
  1037.         } else { // si on n'a les valeurs dans une boucle
  1038.             // si on n'a pas $this->title, c'est qu'il faut les infos
  1039.             if (!isset($this->title)) {
  1040.                 $sql 'SELECT ' implode(','$fields_exists) . '
  1041.                         FROM ' $this->__table '
  1042.                         WHERE ' $this->__idtable '=' $idobject;
  1043.                 $infos $this->queryRow($sql);
  1044.             } else { // sinon, dans le tableau infos
  1045.                 foreach ($fields as $k => $v) {
  1046.                     if (isset($this->$v) && $this->$v != '') {
  1047.                         $infos[$v] = trim($this->$v);
  1048.                     }
  1049.                 }
  1050.             }
  1051.         }
  1052.         // si le titre est vide on le cherche dans les texts
  1053.         if (empty($infos['title'])) {
  1054.             if (!isset($infos['idspectacle'])) {
  1055.                 return false;
  1056.             }
  1057.             $query 'SELECT t.title FROM texts t, text_spectacle ts
  1058.                       WHERE t.idtext=ts.idtext AND ts.idspectacle=' $infos['idspectacle'];
  1059.             $infos['title'] = $this->queryOne($query);
  1060.         }
  1061.         // title
  1062.         $title_view $infos['title'];
  1063.         // ajouter les metteurs en scène en chaine si demandé
  1064.         if (array_key_exists('directors'$params)) {
  1065.             $title_view .= ' - ' $this->getDirectorsString($idobject);
  1066.             $infos['title_directors'] = $title_view;
  1067.         }
  1068.         // renvoyer un array plutôt que le titre (utile si on veux l'url)
  1069.         if (array_key_exists('return_array'$params)) {
  1070.             return $infos;
  1071.         }
  1072.         return $title_view;
  1073.     }
  1074.     // }}}
  1075.     //  {{{ getListSearch()
  1076.     /** Liste des spectacles
  1077.      *
  1078.      * Pour les champs Ajax de relations et les recherches diverses
  1079.      * permet de générer un tabelau associatif des titres des textes en
  1080.      * fonction de critères de recherche alphabétique ou mots clès
  1081.      *
  1082.      * @access  public
  1083.      * @param string $lettres Pour la recherche alphabetique
  1084.      * @param string $keywords Recherche par mots cles
  1085.      * @return  array
  1086.      */
  1087.     public function getListSearch($lettre$type null$keywords null)
  1088.     {
  1089.         // DB_DataObject::debugLevel(1);
  1090.         $tr $this->translator;
  1091.         // requete
  1092.         $sql 'SELECT DISTINCT(s.idspectacle),s.title as titlespectacle,t.title as titletext,
  1093.                 pd.idperson as pdidperson,pd.lastname as pdlastname, pd.firstname as pdfirstname,
  1094.                 s.idtypespectacle, ty.typespectacle';
  1095.         // table
  1096.         $sql .= ' FROM spectacles s, texts t, text_spectacle ts, persons pd, spectacle_person sp, typesspectacles ty, roles r';
  1097.         // conditions
  1098.         $sql .= ' WHERE t.idtext=ts.idtext
  1099.                     AND sp.idrole=r.idrole
  1100.                     AND r.type_creator=1
  1101.                     AND s.idspectacle=ts.idspectacle
  1102.                     AND (sp.idperson=pd.idperson AND s.idspectacle=sp.idspectacle)
  1103.                     AND s.idtypespectacle=ty.idtypespectacle';
  1104.         //echo 'LETTRE : $lettre - KEYWORDS : $keywords <br/>';
  1105.         // par lettre
  1106.         if (!empty($lettre)) {
  1107.             $sql .= ' AND (LOWER(LEFT(LTRIM(s.title),1))=\'' $this->escape($lettre) . '\' OR LOWER(LEFT(LTRIM(t.title),1))=\'' $this->escape($lettre) . '\')';
  1108.         }
  1109.         // recherche avec un mot cle
  1110.         $list $this->splitKeywords($keywords);
  1111.         if ($list) {
  1112.             $subsql '';
  1113.             if (!empty($list[$this->IDSTR])) {
  1114.                 // mots clés
  1115.                 $ssubsql '';
  1116.                 foreach ($list[$this->IDSTR] as $s) {
  1117.                     if ($ssubsql$ssubsql .= ' AND ';
  1118.                     $ssubsql .= 's.title LIKE \'%' $s '%\'';
  1119.                 }
  1120.                 $subsql .= '(' $ssubsql ') OR ';
  1121.                 $ssubsql '';
  1122.                 foreach ($list[$this->IDSTR] as $s) {
  1123.                     if ($ssubsql$ssubsql .= ' AND ';
  1124.                     $ssubsql .= 't.title LIKE \'%' $s '%\'';
  1125.                 }
  1126.                 $subsql .= '(' $ssubsql ')';
  1127.             }
  1128.             if (!empty($list[$this->IDNUM])) {
  1129.                 // recherche par numéro d'id pour les mots clés numériques
  1130.                 if ($subsql$subsql .= ' OR ';
  1131.                 $subsql .= 's.idspectacle IN (' implode(','$list[$this->IDNUM]) . ')';
  1132.             }
  1133.             if ($subsql$sql .= ' AND (' $subsql ')';
  1134.         }
  1135.         //echo "SQL : $sql <br/>";
  1136.         // executer la requete
  1137.         $p $this->query($sql);
  1138.         // mettre en forme les resultats
  1139.         $r = array();
  1140.         foreach ($p as $spec) {
  1141.             //id + titre + metteur en scene + type
  1142.             $infos_spectacle = array(
  1143.                 'idspectacle' => $spec['idspectacle'],
  1144.                 'title' => $spec['titletext'],
  1145.                 'title_spectacle' => $spec['titlespectacle'],
  1146.             );
  1147.             $r[$spec['idspectacle']] = $this->getObjectTitle($spec['idspectacle'], $infos_spectacle) . ' - ' $spec['pdlastname'] . ' ' $spec['pdfirstname'] . ' - ';//.$tr->trans($spec['typespectacle'])
  1148.             // si trouvé par id, on l'affiche en fin de titre
  1149.             if (!empty($list[$this->IDNUM]) && in_array($spec['idspectacle'], $list[$this->IDNUM])) {
  1150.                 $r[$spec['idspectacle']] .= ' - n°' $spec['idspectacle'];
  1151.             }
  1152.         }
  1153.         return $r;
  1154.     }
  1155.     // }}}
  1156.     //  {{{ getItemsList()
  1157.     /** Liste des items pour les champs relationnels
  1158.      *
  1159.      * Retourne un tableau associatif contenant la liste des items
  1160.      * d'une relation. Exemple : getItemsList(4,'text_author'); retourne les noms
  1161.      * et prénom des auteurs du texte numéro 4
  1162.      *
  1163.      * @access  public
  1164.      * @param string $type Ce qu'on recherche
  1165.      * @param string $idtext L'id de l'objet
  1166.      * @return  array
  1167.      */
  1168.     public function getItemsList($idobject$type)
  1169.     {
  1170.         $itemslist = array();
  1171.         // contact (liaison simple)
  1172.         if ($type == 'idcontact_creation' || $type == 'idcontact_production') {
  1173.             $query 'SELECT c.`idcontact`, c.`lastname`, c.`firstname`, c.`url_clean`, c.`organisation`, c.`valid`
  1174.                       FROM contacts c, spectacles s
  1175.                       WHERE s.' $type '=c.`idcontact`
  1176.                       AND s.`idspectacle`=' $idobject ' ORDER BY c.lastname';
  1177.             $p $this->query($query);
  1178.             // generer un exception
  1179.             if (empty($p)) {
  1180.                 return [];
  1181.             }
  1182.             foreach ($p as $r) {
  1183.                 $itemslist[$r['idcontact']] = array(
  1184.                     'lastname' => $r['lastname'],
  1185.                     'firstname' => $r['firstname'],
  1186.                     'valid' => $r['valid'],
  1187.                     'organisation' => $r['organisation'],
  1188.                     'url_clean' => $r['url_clean']
  1189.                 );
  1190.             }
  1191. //            $p->free();
  1192.         // extranetusers (liaison simple)
  1193.         elseif ($type == 'idextranetuser') {
  1194.             return $this->getItemsListTrait($idobject$type'extranetusers');
  1195.         } // les multimedias associés à un contenu associé
  1196.         elseif ($type == 'spectacle_classification') {
  1197.             return $this->getItemsListTrait($idobject$type'spectacles');
  1198.         } // les multimedias associés à un contenu associé
  1199.         elseif ($type == 'spectacle_trailer') {
  1200.             return $this->getMultimediaList($idobject$type);
  1201.         } // textes liés
  1202.         elseif ($type == 'text_spectacle') {
  1203.             $itemslist $this->getSpectacleText('all'$idobject1);
  1204.         } // tous le reste
  1205.         else {
  1206.             // es-ce dans contact ou dans person ?
  1207.             $roles = array(
  1208.                 'spectacle_director' => 'persons',
  1209.                 'spectacle_actor' => 'persons',
  1210.                 'spectacle_distrib' => 'persons',
  1211.                 'spectacle_prod' => 'contacts',
  1212.                 'spectacle_coprod' => 'contacts',
  1213.                 'spectacle_prodel' => 'contacts',
  1214.                 'spectacle_struct_diffusion' => 'contacts',
  1215.                 'spectacle_partenaire' => 'contacts',
  1216.             );
  1217.             if (array_key_exists($type$roles)) {
  1218.                 if ($roles[$type] == 'contacts') {
  1219.                     $itemslist $this->getContactsByRole($idobject$type);
  1220.                 } else {
  1221.                     $itemslist $this->getPersonsByRole($idobject$type);
  1222.                 }
  1223.             }
  1224.         }
  1225.         // mise en forme
  1226.         if (!empty($itemslist) && is_array($itemslist)) {
  1227.             foreach ($itemslist as $key => $value) {
  1228.                 if ($type == 'text_spectacle') { // c'est le texte
  1229.                     $itemslist[$key]['view_name'] = $value['title'];
  1230.                 } else {
  1231.                     if (!empty($value['organisation'])) { // c'est un contact
  1232.                         $itemslist[$key]['view_name'] = $value['organisation'];
  1233.                     } else { // c'est une personne
  1234.                         $itemslist[$key]['view_name'] = mb_strtoupper($value['lastname']) . ' ' $value['firstname'];
  1235.                     }
  1236.                 }
  1237.             }
  1238.         }
  1239.         return $itemslist;
  1240.     }
  1241.     // }}}
  1242.     //  {{{ getTypeList()
  1243.     /** Liste des types de spectacles
  1244.      *
  1245.      * Retourne la liste des type de spectacle : mise en scene, mise en espace ...
  1246.      *
  1247.      * @access  public
  1248.      * @return  array
  1249.      */
  1250.     public function getTypeList()
  1251.     {
  1252.         $conn $this->getEntityManager();
  1253.         $tps $conn->getRepository(Typesspectacles::class);
  1254.         $x $tps->findAll();
  1255.         $type_list = array();
  1256.         foreach ($x as $val) {
  1257.             $type_list[$val->getIdtypespectacle()] = $GLOBALS['tr']->trans($val->getTypespectacle());
  1258.         }
  1259.         return $type_list;
  1260.     }
  1261.     // }}}
  1262.     //  {{{ setRole()
  1263.     /** Enregistrement dans la table des personnes liees
  1264.      *
  1265.      * Permet l'enregistrement multiple de valeur dans la table
  1266.      * de relation des comediens lies a un spectacle
  1267.      *
  1268.      * @access   public
  1269.      * @param string $idspectacle identifiant du spectacle
  1270.      * @param string $idrole role
  1271.      * @param array $array_values valeurs a inserer
  1272.      * @param bool $contact il s'agit d'un contact ?
  1273.      * @param bool $allRights les droits de faire ça ?
  1274.      * @return   bool
  1275.      */
  1276.     public function setRole($idspectacle$idrole$array_values$contact null$allRights true)
  1277.     {
  1278.         $idspectacle = (int)$idspectacle;
  1279.         $idrole = (int)$idrole;
  1280.         if ($allRights) {
  1281.             $rights = array('update' => 1);
  1282.         }
  1283.         if ($this->setCheckRights() || !$allRights) {
  1284.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  1285.             $rights $extranetusers->getRights();
  1286.         }
  1287.         if (isset($rights) && $rights['update'] == 1) {
  1288.             if (!empty($contact)) {
  1289.                 $table 'spectacle_contact';
  1290.             } else {
  1291.                 $table 'spectacle_person';
  1292.             }
  1293.             // on supprime puis on insere (replace ne marche pas)
  1294.             $del $this->_em->getConnection()->executeQuery('DELETE FROM ' $table ' WHERE idspectacle=' $idspectacle ' AND idrole=' $idrole ' ');
  1295.             if (!empty($array_values)) {
  1296.                 if (!empty($contact)) {
  1297.                     $sql 'INSERT INTO ' $table ' (idspectacle, idcontact, idrole) VALUES ( ?, ?, ?)';
  1298.                 } else {
  1299.                     // si 5 clé = extended pour un role
  1300.                     foreach ($array_values as $k => $v) {
  1301.                         if (is_array($v) && (count($v) == || count($v) == 4)) {
  1302.                             $sql 'INSERT INTO ' $table ' (idspectacle, idperson, idrole, comment, date_start, date_end) VALUES ( ?, ?, ?, ?, ?, ?)';
  1303.                             $extended true;
  1304.                         } else {
  1305.                             $sql 'INSERT INTO ' $table ' (idspectacle, idperson, idrole) VALUES ( ?, ?, ?)';
  1306.                         }
  1307.                         break;
  1308.                     }
  1309.                 }
  1310.                 $prep $this->_em->getConnection()->prepare($sql);
  1311.                 if (!empty($extended)) {
  1312.                     foreach ($array_values as $key => $value) {
  1313.                         foreach (array('start''end') as $f) {
  1314.                             if (strpos($value['date_' $f], '/') !== false) {
  1315.                                 $value['date_' $f] = $this->getFormeDate($value['date_' $f], 'Y-m-d');
  1316.                             }
  1317.                         }
  1318.                         if (empty($value['date_start']) && !empty($value['date_end'])) {
  1319.                             $value['date_start'] = $value['date_end'];
  1320.                         }
  1321.                         if (empty($value['date_end']) && !empty($value['date_start'])) {
  1322.                             $value['date_end'] = $value['date_start'];
  1323.                         }
  1324.                         if (empty($value['date_start'])) {
  1325.                             $value['date_start'] = null;
  1326.                         }
  1327.                         if (empty($value['date_end'])) {
  1328.                             $value['date_end'] = null;
  1329.                         }
  1330.                         $prep_values[] = array($idspectacle$value['idperson'], $idrole$value['comment'], $value['date_start'], $value['date_end']);
  1331.                     }
  1332.                 } else {
  1333.                     foreach ($array_values as $key => $idperson) {
  1334.                         $prep_values[] = array($idspectacle$idperson$idrole);
  1335.                     }
  1336.                 }
  1337.                 foreach ($prep_values as $value) {
  1338.                     $res $prep->execute($value);
  1339.                 }
  1340.                 return true;
  1341.             }
  1342.         } else {
  1343.             throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
  1344.         }
  1345.     }
  1346.     // }}}
  1347.     //  {{{ setDistribution()
  1348.     /** Enregistrement dans la table des personnes liees
  1349.      *
  1350.      * Permet l'enregistrement multiple de valeur dans la table
  1351.      * de relation des comediens lies a un spectacle
  1352.      *
  1353.      * @access   public
  1354.      * @param string $idspectacle identifiant du spectacle
  1355.      * @param array $array_values valeurs a inserer
  1356.      * @param bool $allRights les droits de faire ça ?
  1357.      * @return   bool
  1358.      */
  1359.     public function setDistribution($idspectacle$array_values$allRights true$type_creator false)
  1360.     {
  1361.         $idspectacle = (int)$idspectacle;
  1362.         if ($allRights) {
  1363.             $rights = array('update' => 1);
  1364.         }
  1365.         if ($this->setCheckRights() || !$allRights) {
  1366.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  1367.             $rights $extranetusers->getRights();
  1368.         }
  1369.         if (isset($rights) && $rights['update'] == 1) {
  1370.             $table 'spectacle_person';
  1371.             // on supprime puis on insere (replace ne marche pas)
  1372.             // acteur => on supprime tout ce qui a un role avec un type egla a 1
  1373.             if (!$type_creator) {
  1374.                 $sql 'DELETE FROM ' $table ' WHERE idspectacle=' $idspectacle ' AND idrole NOT IN (
  1375.                         (SELECT idrole FROM roles WHERE type=0)
  1376.                        )';
  1377.                 // createur => on supprime avec type_creator=1
  1378.             } else {
  1379.                 $sql 'DELETE FROM ' $table ' WHERE idspectacle=' $idspectacle ' AND idrole NOT IN (
  1380.                         (SELECT idrole FROM roles WHERE type_creator=0)
  1381.                        )';
  1382.             }
  1383.             $del $this->execute($sql);
  1384.             if (!empty($array_values)) {
  1385.                 // pour le type creator, on va enregistrer le classement également
  1386.                 if (!$type_creator) {
  1387.                     // si 5 clé = extended pour un role
  1388.                     foreach ($array_values as $k => $v) {
  1389.                         if (count($v) == || count($v) == 4) {
  1390.                             $sql 'INSERT INTO ' $table ' (idspectacle, idperson, idrole, comment, date_start, date_end) VALUES ( ?, ?, ?, ?, ?, ?)';
  1391.                             $extended true;
  1392.                         } else {
  1393.                             $sql 'INSERT INTO ' $table ' (idspectacle, idperson, idrole) VALUES ( ?, ?, ?)';
  1394.                         }
  1395.                         break;
  1396.                     }
  1397.                     $prep $this->_em->getConnection()->prepare($sql);
  1398.                     if (!empty($extended)) {
  1399.                         foreach ($array_values as $key => $value) {
  1400.                             foreach (array('start''end') as $f) {
  1401.                                 if (strpos($value['date_' $f], '/') !== false) {
  1402.                                     $value['date_' $f] = $this->getFormeDate($value['date_' $f], 'Y-m-d');
  1403.                                 }
  1404.                             }
  1405.                             if (empty($value['date_start']) && !empty($value['date_end'])) {
  1406.                                 $value['date_start'] = $value['date_end'];
  1407.                             }
  1408.                             if (empty($value['date_end']) && !empty($value['date_start'])) {
  1409.                                 $value['date_end'] = $value['date_start'];
  1410.                             }
  1411.                             if (empty($value['date_start'])) {
  1412.                                 $value['date_start'] = null;
  1413.                             }
  1414.                             if (empty($value['date_end'])) {
  1415.                                 $value['date_end'] = null;
  1416.                             }
  1417.                             if (empty($value['comment'])) {
  1418.                                 $value['comment'] = '';
  1419.                             }
  1420.                             $prep_values[] = array($idspectacle$value['idperson'], $value['role'], $value['comment'], $value['date_start'], $value['date_end']);
  1421.                         }
  1422.                     } else {
  1423.                         foreach ($array_values as $key => $value) {
  1424.                             $prep_values[] = array($idspectacle$value['idperson'], $value['role']);
  1425.                         }
  1426.                     }
  1427.                 } else {
  1428. //                    $prep = $this->prepare('INSERT INTO '.$table.' (idspectacle, idperson, idrole, classement) VALUES ( ?, ?, ?, ?)');
  1429.                     $prep $this->_em->getConnection()->prepare('INSERT INTO ' $table ' (idspectacle, idperson, idrole, classement) VALUES ( ?, ?, ?, ?)');
  1430.                     $i 1;
  1431.                     foreach ($array_values as $key => $value) {
  1432.                         $prep_values[] = array($idspectacle$value['idperson'], $value['role'], $i);
  1433.                         $i++;
  1434.                     }
  1435.                 }
  1436.                 foreach ($prep_values as $value) {
  1437.                     $res $prep->execute($value);
  1438.                 }
  1439. //                $res = $this->executeMultiple($prep, $prep_values);
  1440.                 return true;
  1441.             }
  1442.         } else {
  1443.             throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
  1444.         }
  1445.     }
  1446.     // }}}
  1447.     //  {{{ setSpectacleAuthor()
  1448.     /** Liaison directe entre un spectacle et les auteurs du/des texte(s)
  1449.      *
  1450.      * Permet l'enregistrement multiple de valeur dans la table
  1451.      * de relation
  1452.      *
  1453.      * @access   public
  1454.      * @param string $idspectacle identifiant du spectacle
  1455.      * @param array $array_values valeurs a inserer
  1456.      * @param bool $allRights les droits de faire ça ?
  1457.      * @return   bool
  1458.      */
  1459.     public function setSpectacleAuthor($idspectacle$allRights true)
  1460.     {
  1461.         $idspectacle = (int)$idspectacle;
  1462.         if ($allRights) {
  1463.             $rights = array('update' => 1);
  1464.         }
  1465.         if ($this->setCheckRights() || !$allRights) {
  1466.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  1467.             $rights $extranetusers->getRights();
  1468.         }
  1469.         if (isset($rights) && $rights['update'] == 1) {
  1470.             // récupèrer les auteurs des textes associés au spectacle
  1471.             $texts $this->getSpectacleText(true$idspectacle);
  1472.             if (empty($texts)) {
  1473.                 return false;
  1474.             }
  1475.             foreach ($texts as $text) {
  1476. //                $authors = Theatre::factory('texts')->getAuthors($text['idtext'],$text['type']);
  1477. //                if(!empty($authors)) {
  1478. //                    foreach($authors as $k=>$v) {
  1479. //                        $idpersons[$v['idperson']] = $v['idperson'];
  1480. //                    }
  1481. //                }
  1482.             }
  1483.             $table 'spectacle_author';
  1484.             // on supprime puis on insere (replace ne marche pas)
  1485.             $sql 'DELETE FROM ' $table ' WHERE idspectacle=' $idspectacle;
  1486.             $del $this->query($sql);
  1487.             if (!empty($authors)) {
  1488.                 $prep $this->prepare('INSERT INTO ' $table ' (idspectacle, idperson) VALUES ( ?, ?)');
  1489.                 foreach ($authors as $key => $value) {
  1490.                     $prep_values[] = array($idspectacle$value['idperson']);
  1491.                 }
  1492.                 $res $this->executeMultiple($prep$prep_values);
  1493.                 return true;
  1494.             }
  1495.         } else {
  1496.             throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
  1497.         }
  1498.     }
  1499.     // }}}
  1500.     //  {{{ orderByDefaut()
  1501.     /** Classement par défaut
  1502.      *
  1503.      * Défini le tri par défaut pour les requêtes de type SELECT
  1504.      *
  1505.      * @access public
  1506.      * @return string
  1507.      */
  1508.     public function orderByDefaut($order null)
  1509.     {
  1510.         // tri par défaut
  1511.         if (empty($order)) {
  1512.             $order 'idspectacle';
  1513.         }
  1514.         return $order;
  1515.     }
  1516.     // }}}
  1517.     //  {{{ getTranslateTitle()
  1518.     /** Titre du spectacle traduit
  1519.      *
  1520.      * Donne le titre d'un spectacle dans une langue donné
  1521.      * @access public
  1522.      * @return string
  1523.      */
  1524.     public function getTranslateTitle($idspectacle null$lng null)
  1525.     {
  1526.         $idspectacle = (int)$idspectacle;
  1527.         // il faut d'abord trouver l'identifiant du texte li矡u spectacle
  1528.         $idtext $this->queryOne('SELECT idtext FROM text_spectacle WHERE idspectacle=' $idspectacle);
  1529.         //Ensuite on va cherche le titre dans la langue
  1530.         $sql 'SELECT texts.title
  1531.                 FROM texts, text_traduction
  1532.                 WHERE texts.idtext=text_traduction.idtexttraduction
  1533.                 AND texts.language=\'' $lng '\' AND text_traduction.idtext=' . ((int)$idtext);
  1534.         $res $this->query($sql);
  1535.         if ($res->numRows() > 0) {
  1536.             while ($row $res->fetchRow()) {
  1537.                 $result $row['title'];
  1538.             }
  1539.         } else { // aucun titre pour ce spectacle
  1540.             $result '';
  1541.         }
  1542.         // et voila l'travail!
  1543.         return $result;
  1544.     }
  1545.     // }}}
  1546.     //  {{{ getSpectacleCountryList()
  1547.     /** Récupère la liste des pays dans lesquels sont répertorié des spectacles pour un auteur donné
  1548.      *
  1549.      * @access   public
  1550.      * @param int idperson - identifiant de l'auteur
  1551.      * @see      getCountry()
  1552.      * @return   array
  1553.      */
  1554.     public function getSpectacleCountryList($order true$idperson)
  1555.     {
  1556.         $idperson = (int)$idperson;
  1557.         $sql 'SELECT DISTINCT(ct.id), ct.' $GLOBALS['lng'] . '
  1558.                 FROM countries ct, spectacles s, schedules sc, contacts c, text_spectacle ts, text_traduction tt, text_author ta
  1559.                 WHERE ct.id=c.country
  1560.                 AND sc.idcontact=c.idcontact
  1561.                 AND s.idspectacle=sc.idspectacle
  1562.                 AND s.idspectacle=ts.idspectacle
  1563.                 AND ts.idtext=tt.idtexttraduction
  1564.                 AND tt.idtext=ta.idtext
  1565.                 AND ta.idperson=' $idperson '
  1566.                 ORDER BY ct.' $GLOBALS['lng'];
  1567.         $res $this->queryAll($sql, array(), nulltrue);
  1568.         $country_list $res;
  1569.         if ($order) {
  1570.             $tr $GLOBALS['tr'];
  1571.             array_unshift($country_list$tr->trans('form_def_country'));
  1572.         }
  1573.         return $country_list;
  1574.     }
  1575.     // }}}
  1576.     //  {{{ getVignetteSpectacle()
  1577.     /** Récupère la vignette d'un spectacle ou la cree si besoin
  1578.      *
  1579.      * @access   public
  1580.      * param     int idspectacle identifiant du spectacle
  1581.      * param     array format $format de la vignette
  1582.      * @return   string
  1583.      */
  1584.     public function getVignetteSpectacle($idspectacle null$format = array())
  1585.     {
  1586.         // id du spectacle
  1587.         if (empty($idspectacle)) {
  1588.             $idspectacle $this->idspectacle;
  1589.         }
  1590.         $idspectacle = (int)$idspectacle;
  1591.         // par default : image arrondie crop 100px x 100px qualite 75
  1592.         if (!empty($format)) {
  1593.             $set_format $format;
  1594.         } else {
  1595.             $set_format = array('width' => $_ENV['VIGN_SPECTACLE_WIDTH'], 'height' => $_ENV['VIGN_SPECTACLE_HEIGHT'], 'direction' => 'crop');
  1596.             // TODO: supprimé la condition et faire sauter lors de la V2
  1597.             if ($GLOBALS['module'] == 'thnet_old') {
  1598.                 $set_format['forme'] = 'round';
  1599.             }
  1600.         }
  1601.         $this->images->setVignetteFormat($set_format);
  1602.         return $this->images->getVignetteObject($idspectacle'spectacles''class_affiche_spec'null$this->publish_status);
  1603.     }
  1604.     // }}}
  1605.     //  {{{ getInfosSpectacleRow()
  1606.     /** Infos standard sur un spectacle
  1607.      *
  1608.      * Cette méthode peut-être utilisée dans les boucle while/fetch et récupère
  1609.      * la plus part des infos utiles dans les listes de résultats
  1610.      *
  1611.      * @access   public
  1612.      * @param array $format_vignette Format des vignettes
  1613.      * @return   array
  1614.      */
  1615.     public function getInfosSpectacleRow($format_vignette null$format_vignette_video null$date_debut_recherche null$params = array())
  1616.     {
  1617.         $con $this->getEntityManager();
  1618.         $spec = array();
  1619.         $idspectacle $this->idspectacle;
  1620.         $spec['idspectacle'] = $idspectacle;
  1621.         $spec['url_clean'] = (!empty($this->urlClean)) ? $this->urlClean $this->url_clean;
  1622.         if (isset($this->country)) {
  1623.             $spec['country'] = $this->country;
  1624.         } else {
  1625.             $spec['country'] = 'FR';
  1626.         }
  1627.         if (isset($this->textfictif)) {
  1628.             $spec['textfictif'] = $this->textfictif;
  1629.         }
  1630.         // lieu de création
  1631.         if (isset($this->idcontact_creation)) {
  1632.             $spec['idcontact_creation'] = $this->idcontact_creation;
  1633.         }
  1634.         // date de creation
  1635.         $creationDate = (!empty($this->creation_date)) ? $this->creation_date $this->creationDate;
  1636.         if (isset($creationDate) && $creationDate != '0000-00-00' && $creationDate != null) {
  1637.             $spec['creation_date'] = $this->getFormeDate($creationDate$GLOBALS['format_date'][$GLOBALS['lng']]);
  1638.             $spec['creation_date_us'] = $creationDate;
  1639.         }
  1640.         $spec['annee_creation'] = $this->getFormeDate($creationDate'Y');
  1641.         // statut
  1642.         $spec['statut'] = 0;
  1643.         if (isset($this->statut)) {
  1644.             $spec['statut'] = $this->statut;
  1645.         }
  1646.         // publié ou pas
  1647.         if (isset($this->publish)) {
  1648.             $spec['publish'] = $this->publish;
  1649.         }
  1650.         // date de création/modification de la fiche
  1651.         if (isset($this->dateinsert)) {
  1652.             $spec['dateinsert'] = $this->dateinsert;
  1653.             $spec['dateinsert_lng'] = $this->getFormeDate($this->dateinsert$GLOBALS['format_date'][$GLOBALS['lng']]);
  1654.             $spec['dateinsert_hour_lng'] = $this->getFormeDate($this->dateinsert'H:i');
  1655.         }
  1656.         if (isset($this->dateupdate)) {
  1657.             $spec['dateupdate_lng'] = $this->getFormeDate($this->dateupdate$GLOBALS['format_date'][$GLOBALS['lng']]);
  1658.         }
  1659.         if (isset($this->idtypespectacle)) {
  1660.             $spec['idtypespectacle'] = $this->idtypespectacle;
  1661.         }
  1662.         if (isset($this->idtypespectacle)) {
  1663.             $tps $this->getEntityManager()->getRepository(Typesspectacles::class);
  1664.             $typespectacle $tps->findOneBy(['idtypespectacle' => $this->idtypespectacle]);
  1665.             $spec['typespectacle'] = $GLOBALS['tr']->trans($typespectacle->getTypespectacle());
  1666.         } else { // si pas de type
  1667.             $spec['typespectacle'] = $GLOBALS['tr']->trans('liste_type_mes');
  1668.         }
  1669.         if (!empty($this->title)) {
  1670.             $spec['title'] = $this->title;
  1671.             $spec['shorten_title'] = $this->title;
  1672.             $spec['collage'] = true;
  1673.             // récupèrer quand même les auteurs !
  1674.             $spec['allauthors'] = $this->noPunct($this->getAuthors($this->idspectacle));
  1675.             if (empty($spec['allauthors'])) {
  1676.                 $aut $con->getRepository(Texts::class); // trouver les auteurs du texte
  1677.                 if (!empty($this->text_spectacle)) {
  1678.                     $spec['allauthors'] = $this->noPunct($aut->getAuthors($this->text_spectacle[0]['idtext'], $this->type ?? null));
  1679.                 } else {
  1680.                     $spec['allauthors'] = $this->noPunct($aut->getAuthors($this->idtext$this->type ?? null));
  1681.                 }
  1682.                 // on doit vérifier que l'un des textes du collage n'est pas une traduction car dans ce cas,
  1683.                 // les auteurs sont enregistrés sur la traduction
  1684.             }
  1685.         } else {
  1686.             if (empty($this->titletext) || !empty($this->text_spectacle)) {
  1687.                 $this->titletext $titletext $spec['title'] = $this->text_spectacle[0]['title'];
  1688.                 $type $this->text_spectacle[0]['type'];
  1689.                 $idtext $spec['idtext'] = $this->text_spectacle[0]['idtext'];
  1690.                 $spec['shorten_title'] = (strlen($titletext) >= 50) ? substr($titletext050) . " ..." $titletext;
  1691.             } else {
  1692.                 $spec['title'] = $this->titletext;
  1693.                 $spec['shorten_title'] = (strlen($this->titletext) >= 50) ? substr($this->titletext050) . " ..." $this->titletext;
  1694.                 $spec['idtext'] = $idtext $this->idtext;
  1695.             }
  1696.             $aut $con->getRepository(Texts::class); // trouver les auteurs du texte
  1697.             $x $spec['allauthors'] = $this->noPunct($aut->getAuthors($idtext$type));
  1698.             if (!is_null($x) && count($spec['allauthors']) > 4) {
  1699.                 $spec['collectifauteurs'] = count($spec['allauthors']);
  1700.             }
  1701.             // si l'auteur est celui demandé
  1702.             if (!is_null($x) && count($spec['allauthors']) == && !empty($params['param_sql']['is_author'])) {
  1703.                 $spec['is_author'] = true;
  1704.             }
  1705.             // si c'est une adaptation
  1706.             if ($type == 2) {
  1707.                 $spec['adaptation'] = true;
  1708.                 // les adaptations
  1709.                 if (!empty($this->params_sql['special']['get_adaptation_originals']) && !empty($spec['allauthors'])) {
  1710.                     foreach ($spec['allauthors'] as $k => $v) {
  1711.                         $original_texts $con->getRepository(Texts::class)->getOriginalsTexts($v['idtext'], 'text_adaptation''idtextadaptation', array('get_authors' => true));
  1712.                         $spec['adaptation'] = $original_texts;
  1713.                     }
  1714.                 }
  1715.             }
  1716.             // on veux les traducteurs ?
  1717.             if (isset($this->type_traduction) && $this->type_traduction == 1) {
  1718.                 $spec['alltranslators'] = $this->noPunct($aut->getTranslators($idtext$this->type_traduction));
  1719.                 if (count($spec['alltranslators']) > 2) {
  1720.                     $spec['collectiftranslators'] = count($spec['alltranslators']);
  1721.                 }
  1722.             }
  1723.         }
  1724.         //titre on rentre le titre du spectacle et le titre du text
  1725.         // paramètres de recherche des dsitributions
  1726.         $params_search_persons['all'] = true;
  1727.         // les élèves
  1728.         if (!empty($this->params_sql['special']['get_eleves'])) {
  1729.             $params_search_persons['eleves'] = $this->params_sql['special']['get_eleves'];
  1730.         }
  1731.         // récupèrer toutes les personnes associées au spectacle et leurs roles et classer par roles
  1732.         $distributions $this->getPersonsByRole($idspectaclenull$params_search_persons);
  1733.         // metteurs en scènes
  1734.         if (!empty($spec['textfictif']) && $spec['textfictif'] == 1) {
  1735.             $x $spec['alldirectors'] = $this->getDirectors($idspectacle);
  1736.         } else {
  1737.             if (!empty($distributions['role_director'])) {
  1738.                 // si plus de 3 metteurs en scènes
  1739.                 if (count($distributions['role_director']) > 3) {
  1740.                     $spec['collectifdirectors'] = count($distributions['role_director']);
  1741.                 }
  1742.                 $spec['alldirectors'] = $this->noPunct($distributions['role_director']);
  1743.             }
  1744.         }
  1745.         // acteurs
  1746.         if (!empty($this->params_sql['special']['get_actors'])) {
  1747.             if (!empty($distributions['role_comedien'])) {
  1748.                 $spec['allactors'] = $distributions['role_comedien'];
  1749.             }
  1750.         }
  1751.         // on souhaite récupèrer également la distribution
  1752.         if (!empty($this->params_sql['special']['get_distributions'])) {
  1753.             if (!empty($distributions['distributions'])) {
  1754.                 $spec['distributions'] = $distributions['distributions'];
  1755.             }
  1756.         }
  1757.         if (!empty($this->params_sql['special']['get_eleves'])) {
  1758.             if ($this->params_sql['special']['get_eleves'] == 'all') {
  1759.                 foreach ($distributions as $d) {
  1760.                     foreach ($d as $k => $v) {
  1761.                         if (!empty($v['ecoles'])) {
  1762.                             $spec['eleves'][$v['idperson']] = $v;
  1763.                         }
  1764.                     }
  1765.                 }
  1766.             } elseif (isset($this->params_sql['special']['get_eleves']['idcontact'])) {
  1767.                 // on doit trouver les personnes qui sont élèves du contact
  1768.                 // parcourir la distributions
  1769.                 foreach ($distributions as $d) {
  1770.                     foreach ($d as $k => $v) {
  1771.                         if (isset($v['ecoles'][$this->params_sql['special']['get_eleves']['idcontact']])) {
  1772.                             $spec['eleves'][$v['idperson']] = $v;
  1773.                         }
  1774.                     }
  1775.                 }
  1776.             }
  1777.         }
  1778.         // url du texte
  1779.         if (!empty($this->url_clean_text)) {
  1780.             $spec['url_clean_text'] = $this->url_clean_text;
  1781.         }
  1782.         if (!empty($this->idmultimedia)) {
  1783.             $spec['idmultimedia'] = $this->idmultimedia[0]['idmultimedia'];
  1784.         }
  1785.         // si vignette du spectacles
  1786.         if ($format_vignette && is_array($format_vignette)) {
  1787.             // version mobile
  1788.             if (isset($_GET['mobile'])) {
  1789.                 $format_vignette = array('width' => 115'height' => 115'direction' => 'crop');
  1790.             }
  1791.             $spec['vignette_affiche'] = $this->getVignetteSpectacle($idspectacle$format_vignette);
  1792.             $format_vignette['blur'] = true;
  1793.             $spec['vignette_affiche_flou'] = $this->getVignetteSpectacle($idspectacle$format_vignette);
  1794.         }
  1795.         // trouver la date et le lieu le plus proche
  1796.         if (!empty($this->params_sql['special']['anciens']) || !empty($this->params_sql['special']['anciens_stricts'])) {
  1797.             $periode = array('anciens' => true);
  1798.         } elseif (!empty($this->params_sql['special']['plus_proche'])) { // la date la plus proche passée ou future
  1799.             $periode = array('plus_proche' => true);
  1800.         } elseif (!empty($this->params_sql['special']['date_creation'])) {
  1801.         } else { // la premiere date future
  1802.             $periode = array('prochains' => true);
  1803.         }
  1804.         // definir un début de recherche
  1805.         if ($date_debut_recherche) {
  1806.             $periode['depuis_le'] = $date_debut_recherche;
  1807.         }
  1808.         // recherche les dates uniquement dans un lieu
  1809.         if (!empty($this->params_sql['special']['idcontact'])) {
  1810.             $idcontact $this->params_sql['special']['idcontact'];
  1811.         } else {
  1812.             $idcontact null;
  1813.         }
  1814.         // recherche les dates dans un festival
  1815.         if (!empty($this->params_sql['special']['type_contact'])) {
  1816.             $type_contact $this->params_sql['special']['type_contact'];
  1817.         } else {
  1818.             $type_contact 'idcontact';
  1819.         }
  1820.         if (!empty($this->params_sql['special']['structures_specifiques'])) {
  1821.             $periode['structures_specifiques'] = $this->params_sql['special']['structures_specifiques'];
  1822.         }
  1823.         if (!empty($this->params_sql['special']['get_schedule_ville'])) {
  1824.             $periode['area'] = $this->params_sql['special']['get_schedule_ville'];
  1825.         }
  1826.         // ajoute les infos sur les dates et lieux prochains
  1827.         $proch_dates $this->getProchDateLieu($periode$idspectacle$idcontact'idcontact'); //$type_contact
  1828.         if (empty($proch_dates) && $type_contact == 'idcontactFestival') {
  1829.             $proch_dates $this->getProchDateLieu($periode$idspectacle$idcontact$type_contact); //idcontact
  1830.         }
  1831.         if (!empty($proch_dates)) {
  1832.             $spec += $proch_dates;
  1833.         }
  1834.         // veux t'on un contenu associé  ou un contenu associé multimedia ?
  1835.         if (!empty($this->params_sql['special']['contenus_associes'])
  1836.             || !empty($this->params_sql['special']['contenus_associes_multimedias'])) {
  1837.             // chercher le dernier contenu associés
  1838.             $sql_select_from 'SELECT ct.title, ct.idcontent,MAX(ct.dateinsert) as dateinsert,cm.page,cm.parent,cm.param
  1839.                                 FROM contents ct
  1840.                                     JOIN object_content oc ON oc.idcontent=ct.idcontent
  1841.                                     JOIN content_classification cc ON oc.idcontent=cc.idcontent
  1842.                                         JOIN classifications cl ON cl.idclassification=cc.idclassification
  1843.                                             JOIN classification_module cm ON cm.idclassification=cl.idclassification ';
  1844.             $sql_where '
  1845.                     WHERE 1
  1846.                         AND oc.idobject=' . ((int)$this->idspectacle) . '
  1847.                         AND oc.object=\'spectacles\'
  1848.                         AND ct.language=\'fr\' ';
  1849.             if (!empty($this->params_sql['special']['classification_module'])) {
  1850.                 $sql_where .= ' AND cm.module=\'' $this->escape($this->params_sql['special']['classification_module']) . '\' ';
  1851.             } else {
  1852.                 $sql_where .= ' AND cm.module=\'' $this->escape($GLOBALS['module']) . '\' ';
  1853.             }
  1854.             // pour le multimedia, jointure avec multimedia via object_multimedia
  1855.             if (!empty($this->params_sql['special']['contenus_associes_multimedias'])) {
  1856.                 $sql_select_from .= '
  1857.                                     JOIN object_multimedia om ON om.idobject=ct.idcontent ';
  1858.                 $sql_where .= '
  1859.                         AND om.object=\'contents\'
  1860.                         AND ct.display_media=1';
  1861.                 // on exclu certains multimedias
  1862.                 if (isset($this->params_sql['special']['multimedias_exclude']) && is_array($this->params_sql['special']['multimedias_exclude'])) {
  1863.                     $sql_where .= ' AND om.idmultimedia NOT IN (' join(','$this->params_sql['special']['multimedias_exclude']) . ')';
  1864.                 }
  1865.                 // on met une priorité sur certains documents multimedia TODO
  1866.                 if (!empty($this->params_sql['special']['where_contenus_associes_multimedias'])) {
  1867.                     $sql_where .= $this->params_sql['special']['where_contenus_associes_multimedias'];
  1868.                 }
  1869.             }
  1870.             $sql_contenus_associes $sql_select_from $sql_where;
  1871.             try {
  1872.                 $contenus $this->queryRow($sql_contenus_associes);
  1873.                 if (!empty(contenu)) {
  1874.                     $spec['content'] = $contenus;
  1875.                     // construire l'url_clean du contenu associe
  1876.                     $spec['content']['url_clean'] = $spec['url_clean'] . '/';
  1877.                     if (!empty($contenus['parent'])) {
  1878.                         $spec['content']['url_clean'] .= $contenus['parent'] . '/';
  1879.                     }
  1880.                     if (!empty($contenus['param'])) {
  1881.                         $spec['content']['url_clean'] .= $contenus['param'] . '/';
  1882.                     }
  1883.                     $spec['content']['url_clean'] .= $contenus['page'] . '/idcontent/' $contenus['idcontent'];
  1884.                 }
  1885.             } catch (\Throwable $e) {
  1886.             }
  1887.         }
  1888.         // pour les contenus multimedias, voir si plusieurs documents multimedias associés
  1889.         if (!empty($this->params_sql['special']['contenus_associes_multimedias'])) {
  1890.             // classe multimedias
  1891.             if (!isset($this->multimedias)) {
  1892.                 $this->multimedias $this->getEntityManager()->getRepository(Multimedias::class);
  1893.             }
  1894.             // trouver le multimedia le plus récent associé au contenu associé
  1895.             $sql_multimedias 'SELECT m.idmultimedia, MAX(m.dateinsert)
  1896.                             FROM multimedias m
  1897.                                 JOIN object_multimedia om ON om.idmultimedia=m.idmultimedia
  1898.                              WHERE 1
  1899.                              AND om.idobject=' . ((int)$contenus['idcontent']) . '
  1900.                              AND om.object=\'contents\' ';
  1901.             // on met une priorité sur certains documents multimedia TODO
  1902.             if (!empty($this->params_sql['special']['where_contenus_associes_multimedias'])) {
  1903.                 $sql_multimedias .= $this->params_sql['special']['where_contenus_associes_multimedias'];
  1904.             }
  1905.             $multimedias_associes $this->queryRow($sql_multimedias);
  1906.             $spec['multimedia']['vignette'] = $this->multimedias->getVignetteMultimedia($multimedias_associes['idmultimedia'], $format_vignette_video);
  1907.             $format_vignette_video_flou $format_vignette_video;
  1908.             $format_vignette_video_flou['blur'] = true;
  1909.             $spec['multimedia']['vignette_flou'] = $this->multimedias->getVignetteMultimedia($multimedias_associes['idmultimedia'], $format_vignette_video_flou);
  1910.             $spec['multimedia']['idmultimedia'] = $multimedias_associes['idmultimedia'];
  1911.         }
  1912.         return $spec;
  1913.     }
  1914.     // }}}
  1915.     //  {{{ getProchDateLieu()
  1916.     /** Lieu et date d'un spectacle
  1917.      *
  1918.      * Pour un spectacle, la prochaine date et ville pour (au choix) :
  1919.      * - un contact donné
  1920.      * - une date passée ou future
  1921.      *
  1922.      * @access   public
  1923.      * @param string $periode futur ou passé ?
  1924.      * @param int $idspectacle identifiant du spectacle
  1925.      * @param int $idcontact date spécifiquement dans un lieu ?
  1926.      * @param string $type_contact Recherche spécifique aux dates dans un festival
  1927.      * @return   array
  1928.      */
  1929.     public function getProchDateLieu($periode = array('prochains' => true), $idspectacle$idcontact null$type_contact 'idcontact')
  1930.     {
  1931.         // trouver la date et le lieu le plus proche dans le futur ou le passé
  1932.         if (!array_key_exists('plus_proche'$periode)) {
  1933.             if (isset($this->lastdate) || array_key_exists('anciens'$periode)) {
  1934.                 $eq '<';
  1935.                 $tri 'DESC';
  1936.             } else {
  1937.                 $eq '>=';
  1938.                 $tri 'ASC';
  1939.             }
  1940.         }
  1941.         // voir si on doit partir d'une date précise pour la recherche de la date la plus proche dans le futur ou le passé
  1942.         if (array_key_exists('depuis_le'$periode)) {
  1943.             $date_debut_recherche $periode['depuis_le'];
  1944.         } else {
  1945.             $date_debut_recherche date('Y-m-d');
  1946.         }
  1947.         // le from commun pour date et periode
  1948.         $from_commun ' FROM schedules sc, contacts c
  1949.                          WHERE sc.' $type_contact '=c.idcontact
  1950.                          AND sc.idspectacle=' . ((int)$idspectacle);
  1951.         // recherche de la date la plus proche passé ou future
  1952.         $sql_prochdate 'SELECT sc.date, c.* ' $from_commun;
  1953.         $con $this->getEntityManager();
  1954.         $queryBuilder $con->getRepository(Schedules::class)->createQueryBuilder('sc');
  1955.         $queryBuilder->select('sc, contacts, MIN(sc.date) AS datestart, MAX(sc.date) AS dateend');
  1956.         $queryBuilder->leftJoin('sc.idcontact''contacts');
  1957.         $queryBuilder->andWhere('sc.idspectacle = :idspectacle');
  1958.         $queryBuilder->setParameter('idspectacle'$idspectacle);
  1959.         // init
  1960.         $sql_more null;
  1961.         // on cherche sur une date passé ou future => pas la plus proche
  1962.         if (!empty($eq)) {
  1963. //            $sql_more .= ' AND sc.date'.$eq.'\''.$date_debut_recherche.'\' ';
  1964.             $queryBuilder->andWhere('sc.date ' $eq ' :date');
  1965.             $queryBuilder->setParameter('date'$date_debut_recherche);
  1966.         }
  1967.         // uniquement dans un ou plusieurs lieux
  1968.         if ($idcontact) {
  1969.             if (is_array($idcontact)) {
  1970.                 $queryBuilder->andWhere('sc.' $type_contact ' IN (:idcontact)');
  1971.                 $queryBuilder->setParameter('idcontact'$idcontact);
  1972.             } else {
  1973.                 $queryBuilder->andWhere('sc.' $type_contact ' = :idcontact');
  1974.                 $queryBuilder->setParameter('idcontact'$idcontact);
  1975.             }
  1976.         }
  1977.         // une structure ?
  1978.         if (array_key_exists('structures_specifiques'$periode)) {
  1979.             //incertains
  1980.             if (is_array($periode['structures_specifiques'])) {
  1981. //                $sql_more .= ' AND c.idtypestructure IN ('.join(',', $periode['structures_specifiques']).')';
  1982.                 $queryBuilder->andWhere('contacts.idtypestructure IN (:idtypestructure)');
  1983.                 $queryBuilder->setParameter('idtypestructure'$periode['structures_specifiques']);
  1984.             } else {
  1985. //                $sql_more .= ' AND c.idtypestructure=\''.$periode['structures_specifiques'].'\' ';
  1986.                 $queryBuilder->andWhere('contacts.idtypestructure = :idtypestructure');
  1987.                 $queryBuilder->setParameter('idtypestructure'$periode['structures_specifiques']);
  1988.             }
  1989.         }
  1990.         // sur une zone geographique précise
  1991.         if (isset($this->zone_recherche['zip'])) {
  1992.             $zip_sql $this->zone_recherche['zip'];
  1993.             $queryBuilder->andWhere($zip_sql);
  1994.         } else if (!empty($periode['area'])) {
  1995.             $bigRegions $con->getRepository(Bigregions::class);
  1996.             $area_sql $bigRegions->getZipCode($periode['area']);
  1997.             if (empty($area_sql)) {
  1998.                 return false;
  1999.             }
  2000.             $queryBuilder->andWhere($area_sql);
  2001.         }
  2002.         // classement et limitation des résultats
  2003.         if (array_key_exists('plus_proche'$periode)) {
  2004. //            dump('revoir le order by ligne 2353');
  2005.             /* @TODO : il manque SIGN() ICI pour les spectacles plus proches */
  2006.             $queryBuilder->addSelect('DATE_DIFF(\'' $date_debut_recherche '\', sc.date) AS HIDDEN dateDiffSIGN, ABS(DATE_DIFF(\'' $date_debut_recherche '\', sc.date)) AS HIDDEN dateDiffABS');
  2007.             $queryBuilder->orderBy('dateDiffSIGN ASC, dateDiffABS');
  2008.             // plus proche =>  le but est de faire la différence entre la date actuelle et la date de l'entrée, puis de prendre la valeur absolue.'
  2009. //            $sql_prochdate_limit = ' ORDER BY SIGN(DATEDIFF(\''.$date_debut_recherche.'\', sc.`date`)) ASC, ABS (DATEDIFF(\''.$date_debut_recherche.'\', sc.`date`))';
  2010.         } else {
  2011.             // on tri par date et on ne prends que le premier pour le début de la période
  2012.             $queryBuilder->orderBy('sc.date'$tri);
  2013.         }
  2014.         $queryBuilder->groupBy('sc.' $type_contact);
  2015.         $queryBuilder->setMaxResults(1);
  2016.         $query $queryBuilder->getQuery();
  2017.         $prochedate_periode $query->getOneOrNullResult();
  2018.         if (!is_null($prochedate_periode)) {
  2019.             $prochdate $prochedate_periode[0];
  2020.             $spec = []; //TODO TEMPORAIRE
  2021.             if (!empty($prochdate->getDate())) {
  2022.                 // debut et fin de la période en timestamp
  2023.                 $prochedate_periode['datestart_std'] = $prochedate_periode['datestart'];
  2024.                 $prochedate_periode['dateend_std'] = $prochedate_periode['dateend'];
  2025. //            // début et fin de la période en français
  2026.                 $prochedate_periode['datestart'] = $this->getFormeDate($prochedate_periode['datestart'], "%a %d/%m/%y"true);
  2027.                 $prochedate_periode['dateend'] = $this->getFormeDate($prochedate_periode['dateend'], "%a %d/%m/%y"true);
  2028. //            // si date start est égale a dateend, alors on a qu'une date
  2029.                 if ($prochedate_periode['datestart_std'] === $prochedate_periode['dateend_std']) {
  2030.                     $prochedate_periode['datestart'] = null;
  2031.                 }
  2032.                 if (empty($prochedate_periode['datestart'])) {
  2033.                     $spec['prochdate'] = $prochedate_periode['dateend'];
  2034.                     $spec['prochdate_std'] = $prochedate_periode['dateend_std'];
  2035.                     $spec['country'] = $prochdate->getContact()
  2036.                         ? ($prochdate->getContact()->getCountry()
  2037.                             ? $prochdate->getContact()->getCountry()->getId()
  2038.                             : null
  2039.                         ) : null;
  2040.                 } else {
  2041.                     $spec['periode'] = $prochedate_periode;
  2042.                     $spec['prochdate'] = null;
  2043.                 }
  2044. //            // la ville et le pays de la prochaine date ou de la période
  2045.                 $spec['city'] = $prochdate->getContact()
  2046.                     ? $prochdate->getContact()->getCity()
  2047.                     : null;
  2048.                 $spec['zip'] = $prochdate->getContact()
  2049.                     ? $prochdate->getContact()->getZip()
  2050.                     : null;
  2051.                 $spec['country'] = $prochdate->getContact()
  2052.                     ? $prochdate->getContact()->getCountry()
  2053.                     : null;
  2054.                 // date standard
  2055.                 $spec['date_std'] = $prochdate->getDate();
  2056.                 // infos sur le contact
  2057.                 if ($prochdate->getContact() && !empty($prochdate->getContact()->getOrganisation())) {
  2058.                     $spec['contact'] = array(
  2059.                         'organisation' => $prochdate->getContact()->getOrganisation(),
  2060.                         'idcontact' => $prochdate->getContact()->getIdcontact(),
  2061.                         'url_clean' => $prochdate->getContact()->getUrlClean(),
  2062.                         'nom_suite' => $prochdate->getContact()->getNomSuite(),
  2063.                         'zip' => $prochdate->getContact()->getZip(),
  2064.                         'x' => $prochdate->getContact()->getX(),
  2065.                         'y' => $prochdate->getContact()->getY(),
  2066.                     );
  2067.                 }
  2068.                 return $spec;
  2069.             }
  2070.         }
  2071.         return array();
  2072.     }
  2073.     // }}}
  2074.     //  {{{ setZoneRecherche()
  2075.     /** Zone de recherche d'un spectacle
  2076.      *
  2077.      * @access   public
  2078.      * @param array $zone Zone de recherche
  2079.      * @return   array
  2080.      */
  2081.     public function setZoneRecherche($zone)
  2082.     {
  2083.         if (!$zone) {
  2084.             unset($this->zone_recherche['zip']);
  2085.         } else {
  2086.             $this->zone_recherche['zip'] = $zone;
  2087.         }
  2088.     }
  2089.     // }}}
  2090.     //  {{{ countListSpectacles()
  2091.     /** Compter la liste des spectacles
  2092.      *
  2093.      * @access   public
  2094.      * @param array $params_sql paramètre pour la requete SQL
  2095.      * @param bool $debug mode débugage
  2096.      * @return   int
  2097.      */
  2098.     public function countListSpectacles($params_sql null$debug false)
  2099.     {
  2100.         // est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
  2101.         $date_debut_recherche null;
  2102.         if (isset($params_sql['special']['depuis_le'])) {
  2103.             $date_debut_recherche $this->getFormeDate($params_sql['special']['depuis_le']);
  2104.         }
  2105.         // si pas de tableau
  2106.         if (!isset($params_sql['special'])) {
  2107.             $params_sql['special'] = array();
  2108.         }
  2109.         if (!isset($params_sql['params'])) {
  2110.             $params_sql['params'] = array();
  2111.         }
  2112.         // si pas de limite => tout
  2113.         if (empty($params_sql['params']['limit'])) {
  2114.             $params_sql['params']['limit'] = 'all';
  2115.         }
  2116.         $params_sql['special']['count_only'] = true;
  2117.         if (!empty($params_sql['dbg'])) {
  2118.             $params_sql['dbg'][0] = 'count_spectacles_' $params_sql['dbg'][0];
  2119.             $params_sql['dbg'][1] = 'Comptage : ' $params_sql['dbg'][1];
  2120.         } else {
  2121.             $params_sql['dbg'] = array('count_spectacles_' uniqid(), 'Comptage spectacles');
  2122.         }
  2123.         // construction de la requête avec le passage de paramètres
  2124.         $query $this->getSQLSpectacles($params_sql['params'], $params_sql['special']);
  2125.         $query->enableResultCache();
  2126.         $totals $query->getSingleResult(Query::HYDRATE_SCALAR);
  2127.         if (!empty($totals)) {
  2128.             return $totals['total'];
  2129.         } else {
  2130.             return 0;
  2131.         }
  2132.     }
  2133.     // }}}
  2134.     //  {{{ countListSchedules()
  2135.     /** Compter la liste des dates
  2136.      *
  2137.      * @access   public
  2138.      * @param array $params_sql paramètre pour la requete SQL
  2139.      * @param bool $debug mode débugage
  2140.      * @return   int
  2141.      */
  2142.     public function countListSchedules($params_sql null$debug false)
  2143.     {
  2144.         // est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
  2145.         if (isset($params_sql['special']['depuis_le'])) {
  2146.             $date_debut_recherche $this->getFormeDate($params_sql['special']['depuis_le']);
  2147.         } else {
  2148.             $date_debut_recherche null;
  2149.         }
  2150.         // si pas de tableau
  2151.         if (!isset($params_sql['special'])) {
  2152.             $params_sql['special'] = array();
  2153.         }
  2154.         if (!isset($params_sql['params'])) {
  2155.             $params_sql['params'] = array();
  2156.         }
  2157.         // si pas de limite => tout
  2158. //        if(empty($params_sql['params']['limit'])) {
  2159.         $params_sql['params']['limit'] = 'all';
  2160. //        }
  2161.         $params_sql['special']['count_only'] = true;
  2162.         $params_sql['special']['count_schedule'] = true;
  2163.         if (!empty($params_sql['dbg'])) {
  2164.             $params_sql['dbg'][0] = 'count_schedule_' $params_sql['dbg'][0];
  2165.             $params_sql['dbg'][1] = 'Comptage : ' $params_sql['dbg'][1];
  2166.         } else {
  2167.             $params_sql['dbg'] = array('count_schedule_' uniqid(), 'Comptage dates');
  2168.         }
  2169.         // construction de la requête avec le passage de paramètres
  2170.         $query $this->getSQLSpectacles($params_sql['params'], $params_sql['special']);
  2171.         return $query->getSingleResult(Query::HYDRATE_SCALAR)['total'];
  2172.     }
  2173.     // }}}
  2174.     /* Get recommanded spectacles according to recommandations number
  2175.         if $recommandationsNb === 1 : query all recommanded spectacles
  2176.     */
  2177.     public function getRecommandedSpectacles(int $recommandationsNb, array $limit): array
  2178.     {
  2179.         $this->em $this->getEntityManager();
  2180.         $queryBuilder $this->em->getRepository(Spectacles::class)->createQueryBuilder('s');
  2181.         $queryBuilder->select('s.idspectacle');
  2182.         if ($recommandationsNb !== 1) {
  2183.             $queryBuilder->addSelect('COUNT(sa.idaide) as HIDDEN nb');
  2184.         }
  2185.         $queryBuilder->join('s.aides''sa')
  2186.             ->join('sa.idaide''a')
  2187.             ->join('a.idaidecontact''ac')
  2188.             ->where('ac.title LIKE \'Spectacle recommandé\'');
  2189.         if ($recommandationsNb !== 1) {
  2190.             $queryBuilder
  2191.                 ->groupBy('s')
  2192.                 ->having('nb = :recommandationsNb')
  2193.                 ->setParameter(':recommandationsNb'$recommandationsNb);
  2194.         }
  2195.         $queryBuilder->setFirstResult($limit['start'])
  2196.             ->setMaxResults($limit['max']);
  2197.         $query $queryBuilder->setCacheable(true)->getQuery()->useQueryCache(true);
  2198.         return $query->getArrayResult(Query::HYDRATE_ARRAY);
  2199.     }
  2200.     //  {{{ getListSpectacles()
  2201.     /** Récupére la liste des spectacles
  2202.      *
  2203.      * Récupére les spectacles de manière standard
  2204.      *
  2205.      * @access   public
  2206.      * @param null $params_sql paramètre pour la requete SQL
  2207.      * @param null $format_vignette
  2208.      * @param bool $debug mode débugage
  2209.      * @param array $params_display
  2210.      * @return   array
  2211.      */
  2212.     public function getListSpectacles($params_sql null$format_vignette null$debug false$params_display = array())
  2213.     {
  2214.         // est-ce pour des listes de vidéos ?
  2215.         if (isset($params_sql['special']['contenus_associes_multimedias'])) {
  2216.             $video true;
  2217.         }
  2218.         // est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
  2219.         if (isset($params_sql['special']['depuis_le'])) {
  2220.             $date_debut_recherche $this->getFormeDate($params_sql['special']['depuis_le']);
  2221.         } else {
  2222.             $date_debut_recherche null;
  2223.         }
  2224.         // si pas de tableau
  2225.         if (!isset($params_sql['special'])) {
  2226.             $params_sql['special'] = array();
  2227.         }
  2228.         if (!isset($params_sql['params'])) {
  2229.             $params_sql['params'] = array();
  2230.         }
  2231.         // construction de la requête avec le passage de paramètres
  2232.         /** @var Query $query */
  2233.         $query $this->getSQLSpectacles($params_sql['params'], $params_sql['special'], $debug);
  2234.         if (!empty($format_vignette['display'])) {
  2235.             $display $format_vignette['display'];
  2236.             unset($format_vignette['display']);
  2237.         } else {
  2238.             $display = array();
  2239.         }
  2240.         if (!empty($format_vignette['stylemore'])) {
  2241.             $stylemore $format_vignette['stylemore'];
  2242.         } else {
  2243.             $stylemore = array();
  2244.         }
  2245.         if (!empty($format_vignette['vignette'])) {
  2246.             $format_vignette $format_vignette['vignette'];
  2247.         }
  2248.         $std_vignette_video = array('width' => 93'height' => 70'direction' => 'crop''fleche' => 'moyen');
  2249. //        $std_vignette = array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop');
  2250.         $std_vignette = array('width' => 100'height' => 100'direction' => 'crop');
  2251.         // aucun format de vignette défini
  2252.         if (!$format_vignette) {
  2253.             if (!empty($video)) {
  2254.                 $format_vignette $std_vignette_video;
  2255.             } else {
  2256.                 $format_vignette $std_vignette;
  2257.             }
  2258.         }
  2259.         if (!empty($format_vignette['stylemore']) && empty($format_vignette['vignette'])) {
  2260.             if (!empty($video)) {
  2261.                 $format_vignette $std_vignette_video;
  2262.             } else {
  2263.                 $format_vignette $std_vignette;
  2264.             }
  2265.         }
  2266.         // aucun style défini
  2267.         if (empty($stylemore)) {
  2268.             if (isset($video) && !empty($video)) {
  2269.                 $stylemore = array('imagep' => 'width:' $format_vignette['width'] . 'px;''descsp' => 'width:170px;');
  2270.             } else {
  2271.                 $stylemore = array('imagep' => 'width:' $format_vignette['width'] . 'px;''descsp' => 'width:100%;');
  2272.             }
  2273.         }
  2274.         // paramètre de debug
  2275.         $dbg = (empty($params_sql['dbg'])) ? array() : $dbg $params_sql['dbg'];
  2276.         // debug
  2277.         $start_boucle microtime(true);
  2278.         // pour l'API, il faut la distribution en plus
  2279.         if (!empty($params_display['api'])) {
  2280.             $this->params_sql['special']['get_actors'] = true;
  2281.             $this->params_sql['special']['get_adaptation_originals'] = true;
  2282.             $this->params_sql['special']['get_distributions'] = true;
  2283.         }
  2284.         $sp = array();
  2285.         // mettre en forme chaque reponse
  2286.         foreach ($query->getArrayResult() as $data) {
  2287.             if (!empty($data[0])) {
  2288.                 foreach ($data[0] as $k => $value) {
  2289.                     $this->$k $value;
  2290.                 }
  2291.                 unset($data[0]);
  2292.             }
  2293.             foreach ($data as $k => $value) {
  2294.                 $this->$k $value;
  2295.             }
  2296.             //On récupère quelques valeurs du texte (à revoir, pas opti)
  2297.             if (!empty($this->text_spectacle[0])) {
  2298.                 $this->type $this->text_spectacle[0]['type'];
  2299.             }
  2300.             if (!empty($video)) {
  2301.                 // on exclu les multimedias déjà passés
  2302.                 if (!empty($idmultimedia)) {
  2303.                     $this->params_sql['special']['multimedias_exclude'][] = $idmultimedia;
  2304.                 }
  2305.                 $spec $this->getInfosSpectacleRow(null$format_vignette$date_debut_recherche, array('param_sql' => $params_sql));
  2306.                 $idmultimedia $spec['multimedia']['idmultimedia'];
  2307.                 $sp[]['spectacle'] = $spec;
  2308.                 $sp[$idmultimedia]['stylemore'] = $stylemore;
  2309.                 $sp[$idmultimedia]['display'] = $display;
  2310.             } else {
  2311.                 $idspectacle $this->idspectacle;
  2312.                 // on veut juste l'identifiant
  2313.                 if (!empty($params_display['special']['return_only_id'])) {
  2314.                     $sp[$idspectacle] = $idspectacle;
  2315.                     continue;
  2316.                 }
  2317.                 $spec $this->getInfosSpectacleRow($format_vignettenull$date_debut_recherche, array('param_sql' => $params_sql));
  2318.                 $sp[$idspectacle] = $spec;
  2319.                 // ajout de idmultimedia
  2320.                 $idmultimedia $this->id_multimedia ?? null;
  2321.                 $sp[$idspectacle]['idmultimedia'] = $idmultimedia;
  2322.                 //les spectacles
  2323.                 if ($sp[$idspectacle]['idtypespectacle']['idtypespectacle'] == 4) {
  2324.                     $sp[$idspectacle]['type_spectacles'] = true;
  2325.                 } //les mises-en-espaces, les lectures.
  2326.                 else {
  2327.                     $sp[$idspectacle]['type_lectures'] = true;
  2328.                 }
  2329.                 // dans le cas ou on cherchait des spectacles qui ont des contenus spécifiques
  2330.                 if (!empty($params_sql['special']['idclassification']) && isset($this->idcontent)) {
  2331.                     $sp[$idspectacle]['idcontent'] = $this->idcontent;
  2332.                 }
  2333.                 $sp[$idspectacle]['stylemore'] = $stylemore;
  2334.                 $sp[$idspectacle]['display'] = $display;
  2335.                 // affiche le lieu et la date de créa
  2336.                 if (!empty($display['affiche_date_creation']) && !empty($spec['idcontact_creation'])) {
  2337.                     $contacts $this->getEntityManager()->getRepository(Contacts::class);
  2338.                     $sp[$idspectacle]['contact_creation'] = $contacts->getInfosContact($spec['idcontact_creation']);
  2339.                     $sp[$idspectacle]['display']['affiche_date_creation'] = true;
  2340.                 }
  2341.                 // récupèrer les infos sur le texte
  2342.                 if (!empty($data['idtext']) && !empty($this->params_sql['special']['get_text'])) {
  2343.                     $sp[$idspectacle]['text'] = $data['idtext']; //Theatre::factory('texts')->getInfosText($sp[$idspectacle]['idtext'],$this->params_sql['special']['get_text']);
  2344.                 }
  2345.                 // conversion du array pour la version API
  2346.                 if (!empty($params_display['api'])) {
  2347.                     // récupèrer les infos sur le texte
  2348.                     if (!empty($spec['idtext']) && !empty($params_sql['special']['get_texts'])) {
  2349.                         // le texte
  2350.                         $sp[$idspectacle]['text'] =  $this->getEntityManager()->getRepository(Texts::class)->getInfosText($spec['idtext']);
  2351.                         // la vignette
  2352.                         $sp[$idspectacle]['text']["vignette_object"] = $this->getEntityManager()->getRepository(Texts::class)->getVignetteText($spec['idtext']);
  2353.                         // les auteurs
  2354.                         $sp[$idspectacle]['allauthors'] = $this->getEntityManager()->getRepository(Texts::class)->getAuthors($spec['idtext']);
  2355.                     }
  2356.                     $sp['@' $idspectacle] = $this->getApiTab($sp[$idspectacle], $_ENV['URL_THNET'], $params_display['api']);
  2357.                     unset($sp[$idspectacle]);
  2358.                 }
  2359.                 if (!empty($params_display['carrer_couleurs'])) {
  2360.                     $sp[$idspectacle]['carrer'] = $this->getObjectsCarrerDetails($idspectacle);
  2361.                 }
  2362.                 // on met en un seul tableau tous les metteurs en scènes, auteurs etc.
  2363.                 if (!empty($params_display['allauthors'])) {
  2364.                     $sp[$idspectacle] = $this->clearSpectaclesAddAllPersons($sp[$idspectacle]);
  2365.                 }
  2366.             }
  2367.         }
  2368.         // libère
  2369.         $this->free();
  2370.         // debug de la boucle
  2371.         if ($this->isTraceMode('list_object')) {
  2372.             $this->setTraceInfos(array(
  2373.                 'execution_time_boucle' => (microtime(true) - $start_boucle),
  2374.                 'nb_occurence' => count($sp),
  2375.                 'dbg' => $dbg,
  2376.             ));
  2377.         }
  2378.         return $sp;
  2379.     }
  2380.     // }}}
  2381.     //  {{{ getContentSpectacleUrl()
  2382.     /** Url directe d'un contenu associé à un spectacle
  2383.      *
  2384.      * @access   public
  2385.      * @param int $classification Classification
  2386.      * @param int $idcontent Id du contenu associé
  2387.      * @param int $url_clean Url Clean du spectacle
  2388.      * @return   string
  2389.      */
  2390.     public function getContentSpectacleUrl($classification$idcontent$url_clean)
  2391.     {
  2392.         if (!empty($classification) && !empty($idcontent) && !empty($url_clean)) {
  2393.             // classe classification
  2394.             if (!isset($this->classificationObj)) {
  2395.                 $this->classificationObj $this->getEntityManager()->getRepository(Classifications::class);
  2396.             }
  2397.             $classification_page $this->classificationObj->getTypePageByClassification($classification'spectacles');
  2398.             return $url_clean '/' $classification_page '/idcontent/' $idcontent;
  2399.         } else {
  2400.             return null;
  2401.         }
  2402.     }
  2403.     // }}}
  2404.     //  {{{ setSQLParams()
  2405.     /** Les paramètres pour les requêtes
  2406.      *
  2407.      * @access   public
  2408.      * @param array $params Les paramètres pour la requete
  2409.      * @return   array
  2410.      * @see getInfosSpectacleRow
  2411.      * @see getSQLSpectacles
  2412.      */
  2413.     public function setSQLParams($params)
  2414.     {
  2415.         $this->params_sql $params;
  2416.     }
  2417.     // }}}
  2418.     //  {{{ getSQLSpectacles()
  2419.     /** Générer la requete standard pour un spectacle
  2420.      *
  2421.      * $params = array(
  2422.      *  'select' => champs en plus pour le select,
  2423.      *  'from' => champs en plus pour le from,
  2424.      *  'where' => paramètres en plus le where,
  2425.      *  'order' => classement des résultats,
  2426.      *  'limit' => limiter le nb de résultats array(debut,fin), (all pour pas de limit)
  2427.      * )
  2428.      * $special = array(
  2429.      *  'select_by_text_or_adaptation' => text et adaptation,
  2430.      *  'prochains' => true = date dans le future, un entier = fait un between
  2431.      *  'anciens' =>
  2432.      *  'join' => jointure gauche sur contacts et schedules
  2433.      * )
  2434.      *
  2435.      *
  2436.      * @access   public
  2437.      * @param array $params Les paramètres pour la requete
  2438.      * @param array $special Les paramètres supplémentaires
  2439.      * @param bool $debug afficher la requête TODO
  2440.      * @return   string
  2441.      */
  2442.     public function getSQLSpectacles($params = array(), $special = array(), $debug false)
  2443.     {
  2444.         $conn $this->getEntityManager();
  2445.         $distinct_spectacle true;
  2446.         $params_sql = array(
  2447.             'params' => $params,
  2448.             'special' => $special,
  2449.         );
  2450.         $this->setSQLParams($params_sql);
  2451.         $sql_parenthese '';
  2452.         // désactiver le cache SQL
  2453.         if (!empty($params['sql_no_cache'])) {
  2454.             $sql_no_cache 'SQL_NO_CACHE';
  2455.         } else {
  2456.             $sql_no_cache '';
  2457.         }
  2458.         // select de base
  2459.         if (!empty($params['no_group'])) {
  2460.             $distinct 's.idspectacle';
  2461.         } elseif (isset($special['contenus_associes_multimedias'])) {
  2462.             //$distinct = 'DISTINCT(om.idmultimedia), s.idspectacle, sc.date ';
  2463.             $distinct 'DISTINCT(om.idmultimedia), s.idspectacle ';
  2464.         } else {
  2465.             if (!empty($special['count_only'])) {
  2466.                 $distinct '';
  2467.                 $distinct_spectacle false;
  2468.             } else {
  2469.                 $distinct 'DISTINCT s.idspectacle ';
  2470.                 $distinct_spectacle true;
  2471.             }
  2472.         }
  2473.         // champs
  2474. //        $fields_list = array(
  2475. //            'spectacles s' => array('url_clean','idtypespectacle','creation_date','idcontact_creation','title as titlespectacle','dateinsert','dateupdate','statut','publish','textfictif'),
  2476. //            'typesspectacles ty' => array('typespectacle'),
  2477. //            'texts t' => array('title as titletext','idtext','type as type','url_clean as url_clean_text'),
  2478. //            'schedules sc' => array('date'),
  2479. //        );
  2480. //        $sql_select = '
  2481. //            SELECT '.$sql_no_cache.' '.$distinct.',
  2482. //                s.url_clean,s.idtypespectacle,s.idcontact_creation,s.title as titlespectacle,s.dateinsert,s.dateupdate,s.statut,s.publish,s.textfictif,
  2483. //                ty.typespectacle,
  2484. //                t.title as titletext, t.idtext as idtext, t.type as type, t.url_clean as url_clean_text,MIN(sc.date) as creation_date';
  2485.         $sql_select $sql_where '';
  2486.         $con $this->getEntityManager();
  2487.         $queryBuilder $con->getRepository(Spectacles::class)->createQueryBuilder('s');
  2488.         $queryBuilder->select('s, t, partial ty.{idtypespectacle}, MIN(sc.date) as creation_date, t.urlClean AS url_clean_text');
  2489.         // select de remplacement
  2490.         if (array_key_exists('select_other'$params)) {
  2491. //            dump('getSQLSpectacles, select_other');
  2492.             $sql_select .= $params['select_other'];
  2493.         }
  2494.         // compte seulement
  2495.         if (array_key_exists('count_only'$special)) {
  2496.             if (!empty($params['groupby'])) {
  2497.                 unset($params['groupby']);
  2498.             }
  2499.             if (!empty($special['count_only_distinct'])) {
  2500. //                $sql_select = 'SELECT COUNT(DISTINCT('.$special['count_only_distinct'].')) as total ';
  2501. //                $queryBuilder->select('COUNT('.$special['count_only_distinct'].') as total');
  2502. //                $queryBuilder->select('COUNT(DISTINCT s.idspectacle) AS total');
  2503.                 $queryBuilder->select($queryBuilder->expr()->countDistinct($special['count_only_distinct']) . ' AS total, MIN(sc.date) as HIDDEN creation_date');
  2504.             } else if (!empty($special['count_in_spectacle_anciens'])) {
  2505.                 dump('a faire 3896 getSQLSpectacles');
  2506.                 $sql_select 'SELECT COUNT(DISTINCT(s.idspectacle)) as total FROM spectacles s WHERE s.idspectacle IN ( SELECT sc.idspectacle ';
  2507.                 $sql_parenthese ')';
  2508.             } elseif (!empty($special['count_schedule'])) {
  2509. //                $sql_select = 'SELECT COUNT(sc.idschedule) as total ';
  2510.                 $queryBuilder->select('COUNT(DISTINCT(sc.idschedule)) as total, MIN(sc.date) as HIDDEN creation_date');
  2511.             } else {
  2512. //                $sql_select = 'SELECT COUNT(s.idspectacle) as total ';
  2513.                 $queryBuilder->select('COUNT(DISTINCT(s.idspectacle)) as total, MIN(sc.date) as HIDDEN creation_date');
  2514.             }
  2515.         }
  2516.         // select en plus
  2517.         if (array_key_exists('select'$params)) {
  2518.             $queryBuilder->addSelect($params['select']);
  2519.         }
  2520.         // table temporaire schedules
  2521.         if (array_key_exists('from_schedules'$special)) {
  2522.             $from_schedules '(' $special['from_schedules'] . ') AS';
  2523.         } else {
  2524.             $from_schedules 'schedules';
  2525.         }
  2526.         // from avec jointure entre spectacles/schedules/contacts
  2527.         if (array_key_exists('join'$special) && !array_key_exists('leftjoin_contact'$special)) {
  2528. //            $sql_from = ' FROM spectacles s
  2529. //                            LEFT JOIN '.$from_schedules.' sc
  2530. //                            LEFT JOIN contacts c ON sc.idcontact=c.idcontact
  2531. //                            ON s.idspectacle=sc.idspectacle
  2532. //                        ,typesspectacles ty, texts t, text_spectacle ts, spectacle_person sp';
  2533.             // pour récupèrer les spectacles d'un auteur avec les spectacles montés à partir de ses textes ET les spectacles
  2534.             // montés à partir de ses traductions
  2535.             $queryBuilder
  2536.                 ->leftJoin('s.text_spectacle''t')
  2537.                 ->leftJoin('s.idtypespectacle''ty')
  2538.                 ->leftJoin('s.schedules''sc')
  2539.                 ->leftJoin('s.text_spectacle''ts')
  2540.                 ->leftJoin('s.idperson''sp')
  2541. //                ->leftJoin(Contacts::class, 'c', 'with',
  2542. //                    'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
  2543. //                );
  2544.                 ->join('sc.idcontact''contacts');
  2545.         } elseif (array_key_exists('join_author'$special)) {
  2546.             $sql_from ' FROM spectacles s, ' $from_schedules ' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts
  2547.                             LEFT JOIN text_traduction tt ON tt.idtexttraduction=ts.idtext
  2548.                             LEFT JOIN text_author tb ON tt.idtext=tb.idtext
  2549.                             LEFT JOIN text_author ta ON ta.idtext=ts.idtext,
  2550.                          spectacle_person sp';
  2551.             // trouver les spectacles associés pour une direction
  2552.             dump('revoir join_author');
  2553.             $queryBuilder
  2554.                 ->leftJoin('s.text_spectacle''t')
  2555.                 ->leftJoin('s.idtypespectacle''ty')
  2556.                 ->leftJoin('s.schedules''sc')
  2557.                 ->leftJoin('s.text_spectacle''ts')
  2558.                 ->leftJoin('s.idperson''sp')
  2559. //                ->leftJoin(Contacts::class, 'c', 'with',
  2560. //                    'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
  2561. //                );
  2562.                 ->join('sc.idcontact''contacts');
  2563.         } elseif (array_key_exists('join_director'$special)) {
  2564.             $sql_from ' FROM ' $from_schedules ' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacles s
  2565.                             LEFT JOIN spectacle_person sp ON s.`idspectacle`=sp.`idspectacle`
  2566.                                 LEFT JOIN roles r ON sp.`idrole`=r.`idrole` ';
  2567.             dump('revoir join_director');
  2568.             $queryBuilder
  2569.                 ->leftJoin('s.text_spectacle''t')
  2570.                 ->leftJoin('s.idtypespectacle''ty')
  2571.                 ->leftJoin('s.schedules''sc')
  2572.                 ->leftJoin('s.text_spectacle''ts')
  2573.                 ->leftJoin('s.idperson''sp')
  2574. //                ->leftJoin(Contacts::class, 'c', 'with',
  2575. //                    'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
  2576. //                );
  2577.                 ->join('sc.idcontact''contacts');
  2578.             // trouver les spectacles associés à une personne (text ou mise en scène, ou tout autre rôle...)
  2579.         } elseif (array_key_exists('join_person'$special)) {
  2580. //            $sql_from = ' FROM '.$from_schedules.' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacles s
  2581. //                            LEFT JOIN spectacle_author sa ON s.`idspectacle`=sa.`idspectacle`
  2582. //                                LEFT JOIN persons p ON sa.`idperson`=p.`idperson`
  2583. //                            LEFT JOIN spectacle_person sp ON s.`idspectacle`=sp.`idspectacle`
  2584. //                                LEFT JOIN persons p1 ON sp.`idperson`=p1.`idperson` ';
  2585.             $queryBuilder
  2586.                 ->leftJoin('s.text_spectacle''t')
  2587.                 ->leftJoin('s.idtypespectacle''ty')
  2588.                 ->leftJoin('s.schedules''sc')
  2589.                 ->leftJoin('s.text_spectacle''ts')
  2590.                 ->leftJoin('s.idperson''sp')
  2591. //                ->leftJoin(Contacts::class, 'c', 'with',
  2592. //                    'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
  2593. //                );
  2594.                 ->join('sc.idcontact''contacts');
  2595.         } elseif (array_key_exists('recommandations'$special)) {
  2596.             $queryBuilder
  2597.                 ->leftJoin('s.text_spectacle''t')
  2598.                 ->leftJoin('s.idtypespectacle''ty')
  2599.                 ->leftJoin('s.schedules''sc')
  2600.                 ->join('sc.idcontact''contacts')
  2601.                 ->join('s.aides''sa')
  2602.                 ->join('sa.idaide''a')
  2603.                 ->join('a.idaidecontact''ac')
  2604.                 ->andWhere('ac.title LIKE \'Spectacle recommandé\'');
  2605.         } else if (array_key_exists('leftjoin_contact'$special)) {
  2606.             $queryBuilder
  2607.                 ->leftJoin('s.text_spectacle''t')
  2608.                 ->leftJoin('s.idtypespectacle''ty')
  2609.                 ->leftJoin('s.schedules''sc')
  2610.                 ->leftJoin('s.text_spectacle''ts')
  2611.                 ->leftJoin('s.idperson''sp')
  2612.                 ->leftJoin('sc.idcontact''contacts');
  2613.         } else {
  2614. //            $sql_from = ' FROM spectacles s, '.$from_schedules.' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacle_person sp';
  2615.             $queryBuilder
  2616.                 ->leftJoin('s.text_spectacle''t')
  2617.                 ->leftJoin('s.idtypespectacle''ty')
  2618.                 ->leftJoin('s.schedules''sc')
  2619.                 ->leftJoin('s.idperson''sp')
  2620. //                ->leftJoin(Contacts::class, 'c', 'with',
  2621. //                    'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
  2622. //                );
  2623.                 ->join('sc.idcontact''contacts');
  2624.         }
  2625.         // selection de table en plus
  2626.         if (array_key_exists('from'$params)) {
  2627.             if (is_array($params['from'])) {
  2628.                 foreach ($params['from'] as $key => $from_value) {
  2629.                     if (is_numeric($key)) {
  2630.                         $variable explode(' '$from_value);
  2631.                         $queryBuilder->join($variable[0], $variable[1]);
  2632.                     } else {
  2633.                         $dql_join explode(' '$key);
  2634.                         $queryBuilder->leftJoin('TheatreCore\Entity\\' $dql_join[0], $dql_join[1], 'WITH'$from_value);
  2635.                     }
  2636.                 }
  2637.             } else {
  2638.                 $variable explode(' '$params['from']);
  2639.                 $queryBuilder->join($variable[0], $variable[1]);
  2640.             }
  2641.         }
  2642.         // where standard avec jointure de base
  2643. //        $sql_where = '
  2644. //            WHERE 1
  2645. //            AND ts.idtext=t.idtext
  2646. //            AND s.idspectacle=ts.idspectacle
  2647. //            AND sp.idspectacle=s.idspectacle
  2648. //            AND ty.idtypespectacle=s.idtypespectacle';
  2649.         if (!empty($special['spectacle'])) {
  2650.             if (!empty($special['spectacle']['language_egal'])) {
  2651. //                $sql_where .= ' AND s.language = "'.$special['spectacle']['language_egal'].'"';
  2652.                 $queryBuilder->andWhere(' s.language = \'' $special['spectacle']['language_egal'] . '\'');
  2653.             }
  2654.             if (!empty($special['spectacle']['language_different'])) {
  2655. //                $sql_where .= ' AND s.language != "'.$special['spectacle']['language_different'].'"';
  2656.                 $queryBuilder->andWhere(' s.language != \'' $special['spectacle']['language_different'] . '\'');
  2657.             }
  2658.         }
  2659.         // pour un role particulier d'une person
  2660.         if (!empty($special['join_person']['idperson'])) {
  2661. //            $sql_where .= ' AND sp.idperson IN ('.$this->arrayToIn($special['join_person']['idperson']).') ';
  2662.             $queryBuilder->andWhere(' sp.idperson IN (' $this->arrayToIn($special['join_person']['idperson']) . ') ');
  2663.         }
  2664.         if (!empty($special['join_person']['idrole'])) {
  2665. //            $sql_where .= ' AND sp.idrole IN ('.$this->arrayToIn($special['join_person']['idrole']).') ';
  2666.             $queryBuilder->andWhere(' sp.idrole IN (' $this->arrayToIn($special['join_person']['idrole']) . ') ');
  2667.         }
  2668.         // pour les auteurs jointure avec spectacle_author
  2669.         if (!empty($special['join_person']['idperson_authors_roles'])) {
  2670. //            $sql_where .= ' AND (';
  2671. //            $sql_where .= ' sa.idperson IN ('.$this->arrayToIn($special['join_person']['idperson_authors_roles']).') ';
  2672. //            $sql_where .= ' OR sp.idperson IN ('.$this->arrayToIn($special['join_person']['idperson_authors_roles']).') ';
  2673. //            $sql_where .= ') ';
  2674.             $queryBuilder->andWhere('sp.idperson IN (' $this->arrayToIn($special['join_person']['idperson_authors_roles']) . ')');
  2675.         }
  2676.         // étudiants d'une école
  2677.         if (!empty($special['person_ecole'])) {
  2678.             $sql_from .= ' LEFT JOIN person_ecole pe ON p.`idperson`=pe.`idperson`
  2679.                            LEFT JOIN person_ecole pe1 ON p1.`idperson`=pe1.`idperson` ';
  2680. //            $queryBuilder->leftJoin('personEcole', 'pe', 'WITH', 'p.idperson=pe.idperson');
  2681. //            $queryBuilder->leftJoin('personEcole', 'pe1', 'WITH', 'p1.`idperson`=pe1.idperson');
  2682.             dump('person_ecole getSQLSpectacles');
  2683.             // pour un contact précis
  2684.             if (!empty($special['person_ecole']['idcontact'])) {
  2685.                 $sql_where .= ' AND (pe.`idcontact` IN (' join(','$special['person_ecole']['idcontact']) . ') OR pe1.`idcontact` IN (' join(','$special['person_ecole']['idcontact']) . ') )';
  2686.             }
  2687.         }
  2688.         if (isset($special['textfictif'])) {
  2689. //            $sql_where .= ' AND s.`textfictif`='.(int)$special['textfictif'].' ';
  2690.             $queryBuilder->andWhere('s.textfictif=' . (int)$special['textfictif'] . ' ');
  2691.         }
  2692.         // pour les texts
  2693.         if (!empty($special['text'])) {
  2694.             if (!empty($special['text']['is_published'])) {
  2695. //                $sql_where .= ' AND t.`idcontact_publisher` IS NOT NULL ';
  2696.                 $queryBuilder->andWhere('t.idcontact_publisher IS NOT NULL');
  2697.             }
  2698.             // type de texte (exemple : jeunesse)
  2699.             if (!empty($special['text']['idgenretext'])) {
  2700. //                $sql_where .= ' AND t.`idgenretext`='.(int)$special['text']['idgenretext'];
  2701.                 $queryBuilder->andWhere('t.idgenretext=' . (int)$special['text']['idgenretext']);
  2702.             }
  2703.             // uniquement des textes originaux
  2704.             if (!empty($special['text']['language'])) {
  2705.                 if (is_array($special['text']['language'])) {
  2706.                     foreach ($special['text']['language'] as $k => $v) {
  2707. //                        $sql_where .= ' AND t.language '.$k.' ('.$this->arrayToIn($v).') ';
  2708.                         $queryBuilder->andWhere(' t.language ' $k ' (' $this->arrayToIn($v) . ') ');
  2709.                     }
  2710.                 } else {
  2711. //                    $sql_where .= ' AND t.language='.$this->quote($special['text']['language']).' ';
  2712.                     $queryBuilder->andWhere(' t.language=\'' $special['text']['language'] . '\' ');
  2713.                 }
  2714.             }
  2715.             // type de texte
  2716.             if (!empty($special['text']['type'])) {
  2717. //                $sql_where .= ' AND t.`type` IN ('.join(',', $special['text']['type']).') ';
  2718.                 $queryBuilder->andWhere(' t.type IN (' join(','$special['text']['type']) . ') ');
  2719.             }
  2720.             // période de l'auteur
  2721.             if (!empty($special['text']['person']['periode'])) {
  2722.                 $date = new \DateTime("now");
  2723.                 $date->sub(new DateInterval('P70Y'));
  2724.                 if ($special['text']['person']['periode'] == 'public') {
  2725. //                    $sql_where .= ' AND (.`dateend`!=0 AND pa.`dateend`<=\''.$date->format('Y-m-d').'\') ';
  2726.                     $queryBuilder->andWhere(' (pa.dateend !=0 AND pa.dateend<=\'' $date->format('Y-m-d') . '\') ');
  2727.                 } elseif ($special['text']['person']['periode'] == 'contemporain') {
  2728. //                    $sql_where .= ' AND (pa.dateend>=\''.$date->format('Y-m-d').'\' OR pa.dateend IN (0,\'\') OR pa.dateend IS NULL ) ';
  2729.                     $queryBuilder->andWhere(' (pa.dateend IS NULL OR pa.dateend = 0 OR pa.dateend>=\'' $date->format('Y') . '\') ');
  2730.                 } else {
  2731. //                    $sql_where .= ' AND (pa.dateend IN (0,\'\') OR pa.dateend IS NULL) ';
  2732.                     $queryBuilder->andWhere(' (pa.dateend IN (0,\'\') OR pa.dateend IS NULL) ');
  2733.                 }
  2734. //                $sql_from = str_replace('texts t', 'texts t LEFT JOIN text_author ta ON t.`idtext`=ta.`idtext`
  2735. //                               LEFT JOIN persons pa ON pa.`idperson`=ta.`idperson`', $sql_from);
  2736.                 $queryBuilder->leftJoin('t.text_author''ta');
  2737.                 $queryBuilder->leftJoin(Persons::class, 'pa''with''pa.idperson = ta.idperson');
  2738.             }
  2739.         }
  2740.         // pour les playlists
  2741.         if (!empty($special['playlists'])) {
  2742. //            dump('playlists spectacles repositorys 3078');
  2743.             if (!empty($special['playlists']['text'])) {
  2744. //                $sql_from .= ' ,`playlists` ';
  2745. //                $sql_where .= ' AND `playlists`.`idtext`=ts.`idtext` ';
  2746.                 $queryBuilder->leftJoin(Playlists::class, 'playlist''with'' playlist.idtext = t.idtext');
  2747.             }
  2748.             if (!empty($special['playlists']['idclassifications'])) {
  2749. //                $sql_from .= ' ,`playlist_classification` ';
  2750. //                $sql_where .= ' AND `playlist_classification`.`idplaylist`=`playlists`.`idplaylist` ';
  2751. //                $sql_where .= ' AND `playlist_classification`.idclassification IN ('.$this->arrayToIn($special['playlists']['idclassifications']).') ';
  2752.                 $queryBuilder->join('playlist.idclassification''pc');
  2753.                 $queryBuilder->andWhere('pc.idclassification IN (' $this->arrayToIn($special['playlists']['idclassifications']) . ')');
  2754.             }
  2755.             if (!isset($special['playlists']['publish'])) {
  2756. //                $sql_where .= ' AND `playlists`.`publish`=1 ';
  2757.                 $queryBuilder->andWhere('playlist.publish=1');
  2758.             }
  2759.         }
  2760.         // pour les podcasts
  2761.         if (!empty($special['podcasts'])) {
  2762.             if (!array_key_exists('count_only'$special)) {
  2763.                 $queryBuilder->addSelect('podcasts');
  2764.             }
  2765.             $queryBuilder->join('s.idpodcast''podcasts');
  2766. //            $sql_from .= ' ,`podcasts`,`podcast_spectacle` ';
  2767. //
  2768. //            $sql_select .= ' , podcasts.idpodcast ';
  2769.             if (!empty($special['podcasts']['type_podcast'])) {
  2770.                 //franceculture
  2771.                 if ($special['podcasts']['type_podcast'] == 'franceculture') {
  2772. //                    $sql_where .= ' AND `podcasts`.`code_franceinter` IS NOT NULL ';
  2773.                     $queryBuilder->andWhere('podcasts.codeFranceinter IS NOT NULL');
  2774.                 } //culturebox
  2775.                 else {
  2776.                     $queryBuilder->andWhere('podcasts.codeFt IS NOT NULL');
  2777. //                    $sql_where .= ' AND `podcasts`.`code_ft` IS NOT NULL ';
  2778.                 }
  2779.             }
  2780.             if (array_key_exists('type_franceinter'$special)) {
  2781.                 if (is_numeric($special['type_franceinter'])) {
  2782. //                    $sql_where .= ' AND `podcasts`.type_franceinter = '.(int)$special['type_franceinter'].' ';
  2783.                     $queryBuilder->andWhere('podcasts.typeFranceinter = ' . (int)$special['type_franceinter'] . ' ');
  2784.                 } else {
  2785. //                    $sql_where .= ' AND (podcasts.type_franceinter is NULL OR podcasts.type_franceinter = 0) ';
  2786.                     $queryBuilder->andWhere('(podcasts.typeFranceinter is NULL OR podcasts.typeFranceinter = 0)');
  2787.                 }
  2788.             }
  2789.             if (!empty($special['podcasts']['emission'])) {
  2790.                 //franceculture
  2791.                 if (is_array($special['podcasts']['emission'])) {
  2792. //                    $sql_where .= ' AND `podcasts`.`name_program` IN ("'. join('","', $special['podcasts']['emission']) .'") ';
  2793.                     $queryBuilder->andWhere('podcasts.nameProgram IN (\'' join('\',\''$special['podcasts']['emission']) . '\') ');
  2794.                 } else {
  2795. //                    $sql_where .= ' AND `podcasts`.`name_program` = \''.$this->escape($special['podcasts']['emission']).'\' ';
  2796.                     $queryBuilder->andWhere('podcasts.nameProgram = \'' $special['podcasts']['emission'] . '\' ');
  2797.                 }
  2798.             }
  2799. //            $sql_where .= ' AND `podcast_spectacle`.`idspectacle`= s.`idspectacle` ';
  2800. //            $sql_where .= ' AND `podcasts`.`idpodcast`=`podcast_spectacle`.`idpodcast` ';
  2801.             if (isset($special['podcasts']['publish'])) {
  2802. //                $sql_where .= ' AND `podcasts`.`publish`=1 ';
  2803.                 $queryBuilder->andWhere('podcasts.publish= 1');
  2804.             }
  2805.         }
  2806.         // avec une aide
  2807.         if (!empty($special['spectacle_aide'])) {
  2808. //            $sql_from .= ' ,spectacle_aide sad';
  2809.             $queryBuilder->leftJoin('s.aides''sad''with''sad.idspectacle = s.idspectacle');
  2810.             /* @TODO : à réintégrer ? */
  2811. //            $sql_where .= '
  2812. //                AND sad.`idspectacle`=s.`idspectacle` ';
  2813.             if (!empty($special['aide'])) {
  2814. //                $sql_where .= ' AND sad.`idaide`=a.`idaide` ';
  2815.                 $queryBuilder->andWhere('sad.idaide = a.idaide');
  2816.             }
  2817.             if (!empty($special['spectacle_aide']['idcontact'])) {
  2818.                 if (is_array($special['spectacle_aide']['idcontact'])) {
  2819. //                    $sql_where .= ' AND a.`idcontact` IN ('. join(',', $special['spectacle_aide'] ['idcontact']) .') ';
  2820.                     $queryBuilder->andWhere('a.idcontact IN (' $this->arrayToIn(','$special['spectacle_aide']['idcontact']) . ') ');
  2821.                 } else {
  2822.                     $queryBuilder->andWhere('a.idcontact = ' $special['spectacle_aide']['idcontact'] . ' ');
  2823. //                    $sql_where .= ' AND a.`idcontact` = '. $special['spectacle_aide'] ['idcontact'] .' ';
  2824.                 }
  2825.             }
  2826.         }
  2827.         if (!empty($special['text_aide'])) {
  2828. //            dump('afaire 3161 spectaclesRepositorys');
  2829.             $queryBuilder->leftJoin('t.aides''tad');
  2830. //            $sql_from .= ' ,text_aide tad';
  2831. //            $queryBuilder->join('s.aides', 'sad');
  2832. //            $sql_where .= '
  2833. //                AND tad.`idtext`=ts.`idtext` ';
  2834. //
  2835.             if (!empty($special['aide'])) {
  2836. //                $sql_where .= ' AND tad.`idaide`=a.`idaide` ';
  2837. //                $queryBuilder->andWhere('tad.idaide = a.idaide');
  2838.             }
  2839.         }
  2840.         if (!empty($special['exclude_idspectacle']) && is_array($special['exclude_idspectacle'])) {
  2841.             $queryBuilder->andWhere('s.idspectacle NOT IN (' join(','$special['exclude_idspectacle']) . ')');
  2842.         }
  2843.         if (!empty($special['coprod'])) {
  2844.             if (strpos($sql_from'spectacle_contact') === false) {
  2845.                 $sql_from .= ' , spectacle_contact sct ';
  2846.                 $sql_where .= ' AND sct.idspectacle=s.idspectacle ';
  2847.             }
  2848.             $sql_where .= ' AND sct.idcontact ' $special['coprod']['idcontacts'][0] . ' (' join(','$special['coprod']['idcontacts'][1]) . ') ';
  2849.             $sql_where .= ' AND sct.idrole IN (17,18,19) ';
  2850.         }
  2851.         if (!empty($special['aide'])) {
  2852.             //spectacles
  2853.             if (!empty($special['spectacle_aide'])) {
  2854.                 $queryBuilder->join('sad.idaide''a');
  2855.             } //textes
  2856.             else {
  2857.                 $queryBuilder->join('tad.idaide''a');
  2858.             }
  2859. //            $sql_from .= ' , aides a ';
  2860. //
  2861.             if (!empty($special['aide']['idcontact'])) {
  2862. //                $sql_where .= ' AND a.idcontact IN ('.$this->arrayToIn($special['aide']['idcontact']).') ';
  2863.                 $queryBuilder->andWhere(' a.idcontact IN (' $this->arrayToIn($special['aide']['idcontact']) . ') ');
  2864.             }
  2865.             if (!empty($special['aide']['type_aide'])) {
  2866. //                $sql_where .= ' AND a.type_aide IN ('.$this->arrayToIn($special['aide']['type_aide']).') ';
  2867.                 $queryBuilder->andWhere(' a.typeAide IN (' $this->arrayToIn($special['aide']['type_aide']) . ') ');
  2868.             }
  2869.             if (!empty($special['aide']['idaidecontact'])) {
  2870.                 $queryBuilder->join('a.idaidecontact''aic');
  2871.                 $queryBuilder->andWhere('aic.idaidecontact IN (' $this->arrayToIn($special['aide']['idaidecontact']) . ')');
  2872. //                $sql_from .= ' , aidecontacts aic ';
  2873. //                $sql_where .= ' AND a.idaidecontact=aic.idaidecontact ';
  2874. //                $sql_where .= ' AND aic.idaidecontact IN ('.$this->arrayToIn($special['aide']['idaidecontact']).') ';
  2875. //                dump('a faire 3190 repositorys spectacles');
  2876.             }
  2877.         }
  2878.         // avec affiche
  2879.         if (!empty($special['with_affiche'])) {
  2880.             $sql_from .= ', object_file of, file_classification fc ';
  2881.             $sql_where .= '
  2882.                 AND s.idspectacle=of.idobject
  2883.                 AND of.idfile=fc.idfile
  2884.                 AND of.object=\'spectacles\'
  2885.                 AND fc.idclassification=21 ';
  2886.         }
  2887.         // par utilisateur
  2888.         if (!empty($special['idextranetuser'])) {
  2889.             $queryBuilder->andWhere('s.idextranetuser=' . (int)$special['idextranetuser'] . ' ');
  2890.         }
  2891.         // uniquement si pas de jointure
  2892.         if (!array_key_exists('join'$special)) {
  2893. //            dump('ligne 3309 join');
  2894. //            $sql_where .= ' AND sc.idspectacle=s.idspectacle ';
  2895.             $queryBuilder->andWhere('sc.idspectacle = s.idspectacle');
  2896.             /*if(!empty($special['type_contact'])) { // pour rechercher sur idcontact_festival
  2897.                 $sql_where .= ' AND sc.'.$special['type_contact'].'=c.idcontact';
  2898.             } else {
  2899.                 $sql_where .= ' AND sc.idcontact=c.idcontact';
  2900.             }*/
  2901. //            $sql_where .= ' AND (sc.idcontact=c.idcontact OR sc.idcontact_festival=c.idcontact) ';
  2902.             $queryBuilder->andWhere('sc.idcontact=contacts.idcontact OR sc.idcontactFestival=contacts.idcontact');
  2903.         }
  2904.         // recherche par école
  2905.         // recherche par classification
  2906.         if (array_key_exists('by_classification'$special)) {
  2907.             $queryBuilder->join('s.idclassification''cl2');
  2908. //            // recherche par ID ou par code (string) de la classification
  2909.             if ($this->my_is_int($special['by_classification'])) {
  2910.                 $queryBuilder->andWhere('cl2.idclassification=' . ((int)$special['by_classification']) . '');
  2911.             } elseif (is_array($special['by_classification'])) {
  2912. //                // verif si int ou string
  2913.                 foreach ($special['by_classification'] as $v) {
  2914.                     if ($this->my_is_int($v)) {
  2915.                         $queryBuilder->andWhere('cl2.idclassification IN (' join(','$special['by_classification']) . ')');
  2916.                         break;
  2917.                     } else {
  2918.                         $queryBuilder->andWhere('cl2.classification IN (' join(','$special['by_classification']) . ') ');
  2919.                         break;
  2920.                     }
  2921.                 }
  2922.             } else {
  2923.                 $queryBuilder->andWhere('cl2.idclassification=\'' $this->escape($special['by_classification']) . '\'');
  2924.             }
  2925.         }
  2926.         // recherche par classification
  2927.         if (array_key_exists('by_classification_texts'$special)) {
  2928.             dump('à faire by_classification_texts');
  2929.             $sql_from .= ' ,text_classification tcl,classifications cl2';
  2930.             $sql_where .= ' AND tcl.idtext=t.`idtext`
  2931.                             AND tcl.idclassification=cl2.idclassification';
  2932.             // recherche par ID ou par code (string) de la classification
  2933.             if ($this->my_is_int($special['by_classification_texts'])) {
  2934.                 $sql_where .= ' AND cl2.idclassification=' . ((int)$special['by_classification_texts']) . ' ';
  2935.             } elseif (is_array($special['by_classification_texts'])) {
  2936.                 // verif si int ou string
  2937.                 foreach ($special['by_classification_texts'] as $v) {
  2938.                     if ($this->my_is_int($v)) {
  2939.                         $sql_where .= ' AND cl2.idclassification IN (' join(','$special['by_classification_texts']) . ') ';
  2940.                         break;
  2941.                     } else {
  2942.                         $sql_where .= ' AND cl2.classification IN (' join(','$special['by_classification_texts']) . ') ';
  2943.                         break;
  2944.                     }
  2945.                 }
  2946.             } else {
  2947.                 $sql_where .= ' AND cl2.classification=\'' $this->escape($special['by_classification_texts']) . '\' ';
  2948.             }
  2949.         }
  2950.         // recherche auteurs (sur texte et traduction)
  2951.         if (!empty($special['idperson_author'])) {
  2952. //            dump('à faire idperson_author');
  2953.             if (!empty($special['idperson_idtexts'])) {
  2954.                 if (is_array($special['idperson_idtexts'])) {
  2955. //                    $sql_where .= ' AND ts.`idtext` IN ('.join(',', $special['idperson_idtexts']).') ';
  2956.                     $queryBuilder->andWhere(' t .idtext IN (' join(','$special['idperson_idtexts']) . ') ');
  2957.                 } else {
  2958. //                    $sql_where .= ' AND ts.idtext IN ('.$special['idperson_idtexts'].') ';
  2959.                     $queryBuilder->andWhere(' t.idtext IN (' $special['idperson_idtexts'] . ') ');
  2960.                 }
  2961.             } else {
  2962.                 if (is_array($special['idperson_author'])) {
  2963.                     $sql_where .= ' AND ( ta.`idperson` IN (' join(','$special['idperson_author']) . ') OR tb.`idperson` IN (' join(','$special['idperson_author']) . ') )';
  2964.                 } else {
  2965.                     $sql_where .= ' AND (ta.`idperson`=' . (int)$special['idperson_author'] . ' OR tb.`idperson`=' . (int)$special['idperson_author'] . ') ';
  2966.                 }
  2967.             }
  2968.         }
  2969.         // recherche metteurs en scène
  2970.         if (!empty($special['idperson_director'])) {
  2971.             if (is_array($special['idperson_director'])) {
  2972. //                $sql_where .= ' AND sp.`idperson` IN ('.join(',', $special['idperson_director']).')';exit;
  2973.                 $queryBuilder->andWhere(' sp.idperson IN (' join(','$special['idperson_director']) . ')');
  2974.             } else {
  2975. //                $sql_where .= ' AND sp.`idperson`='.(int)$special['idperson_director'];
  2976.                 $queryBuilder->andWhere('sp.idperson=' . (int)$special['idperson_director']);
  2977.             }
  2978.             if (!empty($special['join_director'])) {
  2979. //                $sql_where .= ' AND r.`type_creator`=1';
  2980.                 $queryBuilder->andWhere('r.type_creator=1');
  2981.             }
  2982.         }
  2983.         // sexe de la personne
  2984.         if (!empty($special['idperson_director_sexe'])) {
  2985.             $sexes = array(
  2986.                 'H' => 1,
  2987.                 'F' => 2,
  2988.                 'NA' => '',
  2989.             );
  2990.             if (strpos($sql_from'persons') === false) {
  2991. //                $sql_from .= ' ,persons p ';
  2992.                 $queryBuilder->join(Persons::class, 'p''with''p.idperson=sp.idperson');
  2993. //                $sql_where .= ' AND p.`idperson`=sp.`idperson` ';
  2994.             }
  2995. //            $sql_where .= ' AND p.`sexe`='.$sexes[$special['idperson_director_sexe']];
  2996.             $queryBuilder->andWhere(' p.sexe=' $sexes[$special['idperson_director_sexe']]);
  2997.         }
  2998.         if (array_key_exists('contenus_associes_critiques'$special)) {
  2999. //            dump('à faire contenus_associes_critiques');
  3000. //            $queryBuilder->join(ObjectContent::class, 'oc2', 'with', 'oc2.object=\'spectacles\'');
  3001. //            $queryBuilder->join('s.idcontent', 'ct2');
  3002. //
  3003. //            $queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
  3004. //
  3005. //            $queryBuilder->join('ct2.content_classification', 'cc2', 'with', 'cc2.idclassification = 101');
  3006.             $queryBuilder->join(ObjectContent::class, 'oc2''with''oc2.object=\'spectacles\'');
  3007.             $queryBuilder->join('s.idcontent''ct2');
  3008.             $queryBuilder->join('ct2.content_classification''cc2''with''cc2.idclassification = 101');
  3009.             $queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
  3010.             $queryBuilder->andWhere('ct2.language = \'fr\' ');
  3011.             $queryBuilder->join(Classifications::class, 'cl''with''cl.idclassification=cc2.idclassification');
  3012.             $queryBuilder->leftJoin('cl.module''cm');
  3013.             $queryBuilder->leftJoin('oc2.idcontent''ct');
  3014.             $queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
  3015. //            $queryBuilder->addSelect('oc2');
  3016. //
  3017. //            $sql_from .= ', object_content oc, content_classification cc, contents ct ';
  3018. //
  3019. //            $sql_where .= '
  3020. //                    AND sp.idspectacle=s.idspectacle
  3021. //                    AND ty.idtypespectacle=s.idtypespectacle
  3022. //                    AND sc.idspectacle=s.idspectacle
  3023. //                    AND sc.idcontact=c.idcontact
  3024. //                    AND s.idspectacle=oc.idobject
  3025. //                    AND oc.idcontent=ct.idcontent
  3026. //                    AND ct.idcontent=cc.idcontent
  3027. //                    AND ct.`publish`=1
  3028. //                    AND ct.`valid`=1
  3029. //                    AND cc.`idclassification`=101
  3030. //                ';
  3031.         }
  3032.         // compléments pour les contenus associés simple ou multimedias
  3033.         if (array_key_exists('contenus_associes'$special) || array_key_exists('contenus_associes_multimedias'$special)) {
  3034.             dump('à faire contenus_associes');
  3035.             $queryBuilder->join(ObjectContent::class, 'oc2''with''oc2.object=\'spectacles\'');
  3036.             $queryBuilder->join('s.idcontent''ct2');
  3037.             $queryBuilder->join('ct2.content_classification''cc2''with''cc2.idclassification = 101');
  3038.             $queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
  3039.             $queryBuilder->andWhere('ct2.language = \'fr\' ');
  3040. //            $queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
  3041.             $queryBuilder->join(Classifications::class, 'cl''with''cl.idclassification=cc2.idclassification');
  3042.             $queryBuilder->leftJoin('cl.module''cm');
  3043.             $queryBuilder->leftJoin('oc2.idcontent''ct');
  3044.             // table en plus
  3045.             if (!empty($special['contenus_associes_multimedias'])) {
  3046. //                $sql_from .= ', object_multimedia om ';
  3047. //                $queryBuilder->leftJoin(ObjectMultimedia::class, 'om', 'with', 'om.object=ct2.idobject');
  3048.                 // TODO Transférer condition suivante (contenus_associes_multimedias)
  3049.             }
  3050.             //$sql_from .= ', object_content oc, classifications cl, content_classification cc, contents ct ';
  3051. //            $sql_from .= ', classification_module cm, object_content oc, classifications cl, content_classification cc, contents ct ';
  3052.             // where en plus
  3053. //            $sql_where .= '
  3054. //                        AND s.idspectacle=oc.idobject
  3055. //                        AND ct.idcontent=oc.idcontent
  3056. //                        AND ct.idcontent=cc.idcontent
  3057. //                        AND cl.idclassification=cc.idclassification
  3058. //                        AND oc.object=\'spectacles\'
  3059. //                        AND ct.language=\'fr\'
  3060. //                        AND cm.idclassification=cl.idclassification ';
  3061.             if (!empty($special['classification_module'])) {
  3062. //                $sql_where .= ' AND cm.module=\''.$this->escape($special['classification_module']).'\' ';
  3063.                 $queryBuilder->andWhere('ct2.language = \'fr\' ');
  3064.             } else {
  3065. //                $sql_where .= ' AND cm.module=\''.$this->escape($GLOBALS['module']).'\' ';
  3066.                 $queryBuilder->andWhere('cm.module=\'' $this->escape($GLOBALS['module']) . '\' ');
  3067.             }
  3068.             // pour le multimedia, jointure avec multimedia via object_multimedia
  3069.             if (!empty($special['contenus_associes_multimedias'])) {
  3070.                 $queryBuilder->leftJoin(ObjectMultimedia::class, 'om''with''om.object=oc2.idobject');
  3071. //                $sql_where .= '
  3072. //                        AND om.idobject=ct.idcontent
  3073. //                        AND om.object=\'contents\'
  3074. //                        AND ct.display_media=1 ';
  3075.                 $queryBuilder->andWhere('om.object=\'contents\'');
  3076.                 $queryBuilder->andWhere('ct.displayMedia=1');
  3077.             }
  3078.         }
  3079.         // compléments pour les contenus associés simple ou multimedias
  3080.         if (array_key_exists('multimedias_videos_associes'$special)) {
  3081.             if (!array_key_exists('count_only'$special)) {
  3082.                 $queryBuilder->addSelect('m.idmultimedia AS id_multimedia');
  3083.             }
  3084.             // table en plus
  3085.             $queryBuilder->leftJoin(ObjectMultimedia::class, 'om''with''s.idspectacle = om.idobject');
  3086.             $queryBuilder->andWhere('om.object=\'spectacles\'');
  3087.             $queryBuilder->leftJoin(Multimedias::class, 'm''with''m.idmultimedia = om.idmultimedia');
  3088.             $queryBuilder->andWhere('m.publish = 1');
  3089.             /* @TODO : A revoir */
  3090.             // where en plus
  3091. //            $sql_where .= ' AND m.idmultimedia = om.idmultimedia
  3092. //                            AND sc.idspectacle = om.idobject
  3093. //                            AND om.object="spectacles"
  3094. //                            AND m.publish = 1';
  3095.             if (array_key_exists('multimedias_videos_associes_contact_festival'$special)) {
  3096. //                $sql_where .= ' AND (sc.`idcontact`= '.((int)$special['multimedias_videos_associes_contact_festival']).' || sc.`idcontact_festival`= '.((int)$special['multimedias_videos_associes_contact_festival']).') ';
  3097.                 $queryBuilder->andWhere(' (sc.idcontact= ' . ((int)$special['multimedias_videos_associes_contact_festival']) . ' AND sc.idcontactFestival= ' . ((int)$special['multimedias_videos_associes_contact_festival']) . ') ');
  3098.             } else if (array_key_exists('multimedias_videos_associes_contact'$special)) {
  3099. //                $sql_where .= ' AND sc.idcontact= '.((int)$special['multimedias_videos_associes_contact']).' ';
  3100.                 $queryBuilder->andWhere(' sc.idcontact= ' . ((int)$special['multimedias_videos_associes_contact']) . ' ');
  3101.             }
  3102.         }
  3103.         // l'aide à la création
  3104.         if (array_key_exists('aides'$special)) {
  3105.             // on veut l'aide
  3106. //            $sql_from .= ', text_aide tai, aides ai';
  3107.             $queryBuilder->leftJoin('t.aides''tai');
  3108.             $queryBuilder->join(Aides::class, 'ai''WITH''ai.idaide = tai.idaide');
  3109.             // where en plus => au moins la jointure
  3110. //            $sql_where .= ' AND tai.`idtext`=t.`idtext`
  3111. //                            AND ai.`idaide`=tai.`idaide` ';
  3112.             // ajouter le contact (exemple : CNT)
  3113.             if (!empty($special['aides']['idcontact'])) {
  3114.                 $queryBuilder->andWhere('ai.idcontact = :idcontact')->setParameter(':idcontact'$special['aides']['idaide']);
  3115. //                $sql_where .= ' AND ai.`idcontact`='.(int)$special['aides']['idaide'];
  3116.             }
  3117.             // ajouter l'aide (exemple : aide à la créa)
  3118.             if (!empty($special['aides']['idaide'])) {
  3119.                 $queryBuilder->andWhere('ai.idaide = :idaide')->setParameter(':idcontact'$special['aides']['idaide']);
  3120. //                $sql_where .= ' AND ai.`idaide`='.(int)$special['aides']['idaide'];
  3121.             }
  3122.         }
  3123.         // avec un contenu associé spécifique
  3124.         if (array_key_exists('idclassification'$special)) {
  3125.             if (!is_array($special['idclassification'])) {
  3126.                 $special['idclassification'] = (array)$special['idclassification'];
  3127.             }
  3128. ## CODE FONCTIONNEL
  3129.             $queryBuilder->leftJoin(ObjectContent::class, 'oc2''with''oc2.object=\'spectacles\'');
  3130.             $queryBuilder->leftJoin(Contents::class, 'ct2''with''ct2.idcontent=oc2.idcontent');
  3131.             $queryBuilder->leftJoin('ct2.content_classification''cc2');
  3132.             $queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
  3133.             $queryBuilder->andWhere('cc2.idclassification IN (' join(','$special['idclassification']) . ')');
  3134.             $queryBuilder->andWhere('s.idspectacle = oc2.idobject');
  3135.             $queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
  3136.             $queryBuilder->addSelect('oc2');
  3137. ## ANCIENS
  3138. //            $sql_select .= ', oc2.`idcontent`';
  3139. //            $sql_from .= ', object_content oc2, content_classification cc2, contents ct2 ';
  3140. //            $sql_where .= '
  3141. //                AND s.`idspectacle`=oc2.`idobject`
  3142. //                AND ct2.`idcontent`=oc2.`idcontent`
  3143. //                AND ct2.`idcontent`=cc2.`idcontent`
  3144. //                AND ct2.`publish`=1
  3145. //                AND ct2.`valid`=1
  3146. //                AND oc2.`object`=\'spectacles\'
  3147. //                AND cc2.`idclassification` IN ('.join(',', $special['idclassification']).') ';
  3148. //            dump('revoir le code des classifications dans SpectaclesRepository');
  3149.         }
  3150.         // pour une personne en particulier
  3151.         if (array_key_exists('idperson'$special)) {
  3152.             // contrainte en plus
  3153. //            $sql_where .= ' AND (sp.`idperson`='.(int)$special['idperson']['idperson'];
  3154.             $queryBuilder->andWhere('sp.idperson=' . (int)$special['idperson']['idperson']);
  3155.             // les textes de la personne
  3156.             if (!empty($special['idperson']['idtexts'])) {
  3157.                 if (is_array($special['idperson']['idtexts'])) {
  3158. //                    $sql_where .= ' OR ts.`idtext` IN ('.join(',', $special['idperson']['idtexts']).') ';
  3159.                     $queryBuilder->orWhere(' t.idtext IN (' join(','$special['idperson']['idtexts']) . ')');
  3160.                 } else {
  3161. //                    $sql_where .= ' OR ts.`idtext` IN ('.$special['idperson']['idtexts'].') ';
  3162.                     $queryBuilder->orWhere(' t.idtext IN (' $special['idperson']['idtexts'] . ')');
  3163.                 }
  3164.             }
  3165.             // $sql_where .= ') ';
  3166.         }
  3167.         // pour des spectacles en particulier
  3168.         if (array_key_exists('idspectacle'$special) || array_key_exists('idspectacles'$special)) {
  3169.             if (array_key_exists('idspectacles'$special)) {
  3170.                 $special['idspectacle'] = $special['idspectacles'];
  3171.             }
  3172.             if (is_array($special['idspectacle'])) {
  3173.                 if (isset($special['idspectacle'][0]) && is_string($special['idspectacle'][0]) &&
  3174.                     isset($special['idspectacle'][1]) && is_array($special['idspectacle'][1])) {
  3175. //                    $sql_where .= ' AND s.`idspectacle` '.$special['idspectacle'][0].' ('.join(',', $special['idspectacle'][1]).') ';
  3176.                     $queryBuilder->andWhere(' s.idspectacle ' $special['idspectacle'][0] . ' (' join(','$special['idspectacle'][1]) . ') ');
  3177.                     // hack pour retrocompat
  3178.                     $sql_where_idspectacles true;
  3179.                 } else {
  3180. //                    $sql_where .= ' AND s.`idspectacle` IN ('.join(',', $special['idspectacle']).') ';
  3181.                     $queryBuilder->andWhere(' s.idspectacle IN (' join(','$special['idspectacle']) . ') ');
  3182.                 }
  3183.             } else {
  3184. //                $sql_where .= ' AND s.`idspectacle` IN ('.$special['idspectacle'].') ';
  3185.                 $queryBuilder->andWhere(' s.idspectacle IN (' $special['idspectacle'] . ') ');
  3186.             }
  3187.         }
  3188.         // prochains spectacles
  3189.         if (array_key_exists('prochains'$special)) {
  3190.             if ($special['prochains'] == 'all') {
  3191. //                $sql_where .= ' AND sc.date>=\''.date('Y-m-d').'\' ';
  3192.                 $queryBuilder->andWhere(' sc.date>=\'' date('Y-m-d') . '\' ');
  3193.             } else {
  3194.                 if (is_array($special['prochains'])) {
  3195.                     $prochains $special['prochains'];
  3196. //                    $sql_where .= ' AND (sc.date BETWEEN \''.$prochains[0].'\' AND \''.$prochains[1].'\') ';
  3197.                     $queryBuilder->andWhere('(sc.date BETWEEN \'' $prochains[0] . '\' AND \'' $prochains[1] . '\') ');
  3198.                 } else {
  3199.                     // entre aujourd'hui et une date future
  3200.                     $dateend strftime('%Y-%m-%d'strtotime(date('Y-m-d')) + $special['prochains'] * 24 3600);
  3201. //                    $sql_where .= ' AND  ';
  3202.                     $queryBuilder->andWhere(' (sc.date BETWEEN \'' date('Y-m-d') . '\' AND \'' $dateend '\') ');
  3203.                 }
  3204.             }
  3205.         }
  3206.         // anciens spectacles
  3207.         if (array_key_exists('anciens'$special)) {
  3208.             if ($special['anciens'] == 'all') {
  3209. //                $sql_where .= ' AND sc.date<\''.date('Y-m-d').'\' ';
  3210.                 $queryBuilder->andWhere(' sc.date < \'' date('Y-m-d') . '\' ');
  3211.             } else {
  3212.                 // entre hier et une date passe
  3213.                 $datestart strftime('%Y-%m-%d'strtotime(date('Y-m-d')) - $special['anciens'] * 24 3600);
  3214. //                $sql_where .= ' AND (sc.date BETWEEN \''.$datestart.'\' AND \''.date('Y-m-d').'\') ';
  3215.                 $queryBuilder->andWhere(' (sc.date BETWEEN \'' $datestart '\' AND \'' date('Y-m-d') . '\') ');
  3216.             }
  3217.         }
  3218.         //on utilise having qu'à cette position
  3219.         $sql_having '';
  3220.         if (array_key_exists('anciens_stricts'$special)) {
  3221.             if (!array_key_exists('count_only'$special)) {
  3222.                 $params['groupby'] = 's.idspectacle';
  3223. //                $sql_having .= ' HAVING MAX(sc.date)<\''.date('Y-m-d').'\' ';
  3224.                 $queryBuilder->having('MAX(sc.date)<\'' date('Y-m-d') . '\'');
  3225.             }
  3226.         }
  3227.         // selection sur le texte ou adaptation
  3228.         if (array_key_exists('select_by_text_or_adaptation'$special)) {
  3229. //            $sql_where .= ' AND s.publish=1 AND (
  3230. //                           ts.idtext='.$special['select_by_text_or_adaptation'].'
  3231. //                           OR ts.idtext IN
  3232. //                                (SELECT DISTINCT(tad.idtextadaptation) FROM texts t,text_adaptation tad
  3233. //                                WHERE t.idtext=tad.idtext AND tad.idtext ='.$special['select_by_text_or_adaptation'].')
  3234. //                            )';
  3235.             $con $this->getEntityManager();
  3236.             $subQueryBuilder $con->getRepository(Texts::class)->createQueryBuilder('t');
  3237.             $subQueryBuilder->select('DISTINCT tad.idtext')
  3238.                 ->join('t.textAdaptationtext''tad')
  3239.                 ->andWhere('t.idtext= ' $special['select_by_text_or_adaptation']);
  3240.             $subQuery $subQueryBuilder->getQuery();
  3241.             $resSubQuery $subQuery->getResult();
  3242.             if (empty($resSubQuery)) {
  3243.                 $queryBuilder->andWhere('s.publish=1 AND t.idtext=' $special['select_by_text_or_adaptation'] . '  ');
  3244.             } else {
  3245.                 $idtext = array();
  3246.                 foreach ($resSubQuery as $value) {
  3247.                     $idtext[] = $value['idtext'];
  3248.                 }
  3249.                 $queryBuilder->andWhere('s.publish=1 AND ( t.idtext=' $special['select_by_text_or_adaptation'] . ' OR t.idtext IN (' implode(','$idtext) . ') ) ');
  3250.             }
  3251.         }
  3252.         // publié et validé
  3253.         if (array_key_exists('publish_valid'$special)) {
  3254. //            $sql_where .= ' AND s.`publish`=1 AND s.`valid`=1 ';
  3255.             $queryBuilder->andWhere(' s.publish= 1 AND s.valid= 1');
  3256.         }
  3257.         // publié
  3258.         if (array_key_exists('publish'$special) && $special['publish'] != 'all') {
  3259.             $queryBuilder->andWhere(' s.publish =' . (int)$special['publish'] . ' ');
  3260.         }
  3261.         // exclure/inclure
  3262.         if (array_key_exists('idspectacles'$special) && empty($sql_where_idspectacles)) {
  3263.             if (is_array($special['idspectacles'])) {
  3264. //                $sql_where .= ' AND s.`idspectacle` '.$special['idspectacles'][0].' ('.join(',', $special['idspectacles'][1]).') ';
  3265.                 $queryBuilder->andWhere(' s.idspectacle ' $special['idspectacles'][0] . ' (' join(','$special['idspectacles'][1]) . ') ');
  3266.             }
  3267.         }
  3268.         if (array_key_exists('idtext'$special)) {
  3269.             if (is_array($special['idtext'])) {
  3270. //                $sql_where .= ' AND ts.`idtext` IN ('.$this->arrayToIn($special['idtext']).') ';
  3271.                 $queryBuilder->andWhere(' t.idtext IN (' $this->arrayToIn($special['idtext']) . ') ');
  3272.             }
  3273.         }
  3274.         // exclure/inclure
  3275.         if (array_key_exists('idcontacts'$special)) {
  3276. //            $sql_where .= ' AND sc.`idcontact` '.$special['idcontacts'][0].' ('.join(',', $special['idcontacts'][1]).') ';
  3277.             $queryBuilder->andWhere(' sc.idcontact ' $special['idcontacts'][0] . ' (' join(','$special['idcontacts'][1]) . ') ');
  3278.         }
  3279.         if (!empty($special['idtypestructure'])) {
  3280. //            $sql_where .= ' AND c.`idtypestructure` IN ('.$this->arrayToIn($special['idtypestructure']).') ';
  3281.             $queryBuilder->andWhere(' contacts.idtypestructure IN (' $this->arrayToIn($special['idtypestructure']) . ') ');
  3282.         }
  3283.         // par période
  3284.         if (array_key_exists('period'$special)) {
  3285. //            $sql_where .= ' AND sc.`date` BETWEEN \''.$special['period']['start'].'\' AND \''.$special['period']['end'].'\' ';
  3286.             $queryBuilder->andWhere(' sc.date BETWEEN \'' $special['period']['start'] . '\' AND \'' $special['period']['end'] . '\' ');
  3287.         }
  3288.         // par saison
  3289.         if (array_key_exists('saison'$special)) {
  3290.             $s explode('-'$special['saison']);
  3291. //            $sql_where .= ' AND sc.`date` BETWEEN \''.$s[0].'-09-01\' AND \''.$s[1].'-08-31\' ';
  3292.             $queryBuilder->andWhere(' sc.date BETWEEN \'' $s[0] . '-09-01\' AND \'' $s[1] . '-08-31\' ');
  3293.         }
  3294.         // par année
  3295.         if (array_key_exists('year'$special)) {
  3296. //            $sql_where .= ' AND sc.`date` BETWEEN \''.$special['year'].'-01-01\' AND \''.$special['year'].'-12-31\' ';
  3297.             $queryBuilder->andWhere(' sc.date BETWEEN \'' $special['year'] . '-01-01\' AND \'' $special['year'] . '-12-31\' ');
  3298.         }
  3299.         // par lieu
  3300.         if (array_key_exists('area'$special)) {
  3301.             if ($this->my_is_int($special['area'])) {
  3302.                 if (empty($special['carte_version'])) {
  3303.                     $special['carte_version'] = 'Regions';
  3304.                 }
  3305.                 $repo_carte $conn->getRepository('TheatreCore\Entity\\' $special['carte_version']);
  3306.                 if ($repo_carte->getZipCode($special['area'])) {
  3307.                     $queryBuilder->andWhere($repo_carte->getZipCode($special['area']));
  3308.                 };
  3309.             } else {
  3310.                 $queryBuilder->andWhere(' contacts.country = \'' $this->escape($special['area']) . '\'');
  3311.             }
  3312.         }
  3313.         // paramètres en plus
  3314.         if (array_key_exists('where'$params) && ! empty($params['where'])) {
  3315.             $where $paramswhere ltrim($params['where']);
  3316.             if (substr($paramswhere03) == 'AND') {
  3317.                 $where substr($paramswhere3);
  3318.             }
  3319. //            else{
  3320. //                $where = preg_replace('/^AND/', '', $paramswhere, 1);
  3321. //            }
  3322.             $where preg_replace('/`/'''$where);
  3323.             $queryBuilder->andWhere($where);
  3324.         }
  3325.         // groupement par défaut
  3326.         if (!array_key_exists('groupby'$params)) {
  3327.             $groupby ' ';
  3328.             if (isset($distinct_spectacle) && $distinct_spectacle) {
  3329. //                $groupby = ' GROUP BY s.idspectacle ';
  3330.                 $queryBuilder->addGroupBy('s.idspectacle');
  3331.             }
  3332.         } else {
  3333.             if (empty($special['count_only'])) {
  3334. //                $groupby = ' GROUP BY ' . $params['groupby'];
  3335.                 $queryBuilder->addGroupBy($params['groupby']);
  3336.             }
  3337.         }
  3338.         // classement par défaut
  3339.         if (!array_key_exists('order'$params)) {
  3340.             // si ancien, classement DESC
  3341.             if (array_key_exists('anciens'$special) || array_key_exists('anciens_stricts'$special)) {
  3342.                 $classement 'DESC';
  3343.             } else {
  3344.                 $classement 'ASC';
  3345.             }
  3346.             if (array_key_exists('classement'$params)) {
  3347.                 $classement $params['classement'];
  3348.             }
  3349.             $queryBuilder->orderBy('sc.date'$classement);
  3350. //            $order = ' ORDER BY sc.date '.$classement;
  3351.         } else {
  3352. //            $queryBuilder->orderBy($params['order'][0], $params['order'][1]);
  3353.             $queryBuilder->orderBy($params['order'][0], $params['order'][1]);
  3354. //            $order = ' ORDER BY '.;
  3355.         }
  3356.         // classement aléatoire
  3357.         if (array_key_exists('random'$special)) {
  3358. //            $order = ' ORDER BY RAND() '.$special['random'];
  3359. //            $queryBuilder->orderBy('RAND()', $special['random']);
  3360.         }
  3361.         // plus prochess
  3362.         if (array_key_exists('tri_plus_proches'$special)) {
  3363. //            $order = ' ORDER BY SIGN(DATEDIFF(\''.date('Y-m-d').'\', sc.`date`)) ASC, ABS(DATEDIFF(\''.date('Y-m-d').'\', sc.`date`)) ';
  3364.         }
  3365.         // limite par défaut
  3366.         if (!array_key_exists('limit'$params)) {
  3367.             $limit ' LIMIT 0,10';
  3368.             $queryBuilder->setFirstResult(0)
  3369.                 ->setMaxResults(10);
  3370.         } else {
  3371.             if ($params['limit'] != 'all') {
  3372.                 if (is_array($params['limit'])) {
  3373.                     $queryBuilder->setFirstResult(abs($params['limit'][0]))
  3374.                         ->setMaxResults(abs($params['limit'][1]));
  3375.                 } else {
  3376.                     $queryBuilder->setMaxResults($params['limit']);
  3377.                 }
  3378.             } else {
  3379.                 $limit ' ';
  3380.             }
  3381.         }
  3382. //        $sql_global = $sql_select.$sql_from.$sql_where.$groupby.$sql_having.$order.$limit.$sql_parenthese;
  3383.         $sql_global '';
  3384. //        echo "<br/><br/><br/>";
  3385.         // debugage
  3386. //        if($debug) {
  3387. //
  3388. //            ob_start();
  3389. //
  3390. //            echo '<strong>Requête créé : </strong>';
  3391. //            echo '<pre>'.$sql_global.'</pre>';
  3392. //
  3393. //            echo '<strong>Liste des champs sélectionnés pour la méthode getSQLSpectacles :</strong>';
  3394. //            echo '<pre>';
  3395. //            print_r($fields_list);
  3396. //            echo '</pre>';
  3397. //
  3398. //            if(!empty($params)) {
  3399. //                echo '<strong>Liste des paramétres supplémentaires  :</strong>';
  3400. //                echo '<pre>';
  3401. //                print_r($params);
  3402. //                echo '</pre>';
  3403. //            }
  3404. //
  3405. //            if(!empty($special)) {
  3406. //                echo '<strong>Liste des options demandées :</strong>';
  3407. //                echo '<pre>';
  3408. //                print_r($special);
  3409. //                echo '</pre>';
  3410. //            }
  3411. //
  3412. //            $debug_trace = ob_get_clean();
  3413. //
  3414. //            $this->setDebugView($debug_trace,__FUNCTION__);
  3415. //        }
  3416. //        echo $sql_global;
  3417.         if ($distinct_spectacle) {
  3418.             $queryBuilder->distinct();
  3419.         }
  3420.         $query $queryBuilder->getQuery();
  3421.         $query->enableResultCache();
  3422.         return $query;
  3423.     }
  3424.     // }}}
  3425.     //  {{{ getLanguageListSpectacle()
  3426.     /** Récupére toutes les langues qui ont un spectacle
  3427.      *
  3428.      * Récupére toutes les langues pour les listes
  3429.      *
  3430.      * @access   public
  3431.      * @param bool $order Classement ou pas
  3432.      * @param int $idperson Identifiant de a personne
  3433.      * @return   array
  3434.      */
  3435.     public function getLanguageListSpectacle($order true$idperson)
  3436.     {
  3437.         $idperson = (int)$idperson;
  3438.         $sql 'SELECT DISTINCT id, ' $GLOBALS['lng'] . '
  3439.                 FROM languages, spectacles, schedules, contacts, text_spectacle
  3440.                 WHERE languages.id = spectacles.language
  3441.                 AND spectacles.idspectacle = schedules.idspectacle
  3442.                 AND schedules.idcontact = contacts.idcontact
  3443.                 AND spectacles.idspectacle = text_spectacle.idspectacle
  3444.                 AND text_spectacle.idtext IN (
  3445.                     SELECT idtext FROM text_author WHERE idperson=' $idperson '
  3446.                     UNION
  3447.                     SELECT idtexttraduction FROM text_traduction, text_author
  3448.                     WHERE text_traduction.idtext=text_author.idtext AND text_author.idperson =' $idperson '
  3449.                     )
  3450.                 AND spectacles.publish=1
  3451.                 ORDER BY orderby, ' $GLOBALS['lng'];
  3452.         $res $this->queryAll($sql, array(), nulltrue);
  3453.         $language_list $res;
  3454.         if ($order) {
  3455.             array_unshift($language_list$GLOBALS['tr']->trans('form_def_language'));
  3456.         }
  3457.         return $language_list;
  3458.     }
  3459.     // }}}
  3460.     //  {{{ getCountryListSpectacle()
  3461.     /** Récupére la liste des pays qui ont un spectacle
  3462.      *
  3463.      * Récupére tous les pays pour les listes
  3464.      *
  3465.      * @access   public
  3466.      * @param bool $order Classement ou pas
  3467.      * @param int $idperson Identifiant de a personne
  3468.      * @return   array
  3469.      */
  3470.     public function getCountryListSpectacle($order true$idperson)
  3471.     {
  3472.         $idperson = (int)$idperson;
  3473.         $sql 'SELECT DISTINCT id, ' $GLOBALS['lng'] . '
  3474.                 FROM countries, spectacles, schedules, contacts, text_spectacle, text_traduction, texts, text_author
  3475.                 WHERE countries.id = contacts.country
  3476.                 AND spectacles.idspectacle = schedules.idspectacle
  3477.                 AND schedules.idcontact = contacts.idcontact
  3478.                 AND spectacles.idspectacle = text_spectacle.idspectacle
  3479.                 AND text_spectacle.idtext = text_traduction.idtexttraduction
  3480.                 AND text_traduction.idtext = texts.idtext
  3481.                 AND texts.idtext = text_author.idtext
  3482.                 AND text_author.idperson = ' $idperson '
  3483.                 AND spectacles.publish=1
  3484.                 ORDER BY orderby, ' $GLOBALS['lng'];
  3485.         $res $this->queryAll($sql, array(), nulltrue);
  3486.         $country_list $res;
  3487.         if ($order) {
  3488.             array_unshift($country_list$GLOBALS['tr']->trans('form_def_country'));
  3489.         }
  3490.         return $country_list;
  3491.     }
  3492.     // }}}
  3493.     //  {{{ getCityListSpectacle()
  3494.     /** Récupére la liste des ville qui ont un spectacle
  3495.      *
  3496.      * Récupére tous les pays pour les listes
  3497.      *
  3498.      * @access   public
  3499.      * @param bool $order Classement ou pas
  3500.      * @param int $idperson Identifiant de a personne
  3501.      * @return   array
  3502.      */
  3503.     public function getCityListSpectacle($periode 'prochains'$duree 180$zone null)
  3504.     {
  3505.         // prochainement ou anciennement
  3506.         if ($periode == 'prochains') {
  3507.             $date_duree strftime('%Y-%m-%d'strtotime(date('Y-m-d')) + $duree 24 3600);
  3508.             $sql_duree ' sc.date BETWEEN \'' date('Y-m-d') . '\' AND \'' $date_duree '\' ';
  3509.         } else {
  3510.             $date_duree strftime('%Y-%m-%d'strtotime(date('Y-m-d')) - $duree 24 3600);
  3511.             $sql_duree ' sc.date BETWEEN \'' $date_duree '\' AND \'' date('Y-m-d') . '\' ';
  3512.         }
  3513.         // trouver les villes ou il y a un spectacle à +/-180 jours
  3514.         $sql_city 'SELECT DISTINCT(city), city as cty
  3515.                      FROM spectacles s, schedules sc, contacts
  3516.                      WHERE 1
  3517.                      AND s.idspectacle=sc.idspectacle
  3518.                      AND sc.idcontact=contacts.idcontact
  3519.                      AND ' $sql_duree;
  3520.         if ($zone) {
  3521.             $sql_city .= ' AND' $zone;
  3522.         }
  3523.         $conn $this->getEntityManager()->getConnection();
  3524.         $query $conn->executeQuery($sql_city);
  3525.         return $query->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
  3526.     }
  3527.     // }}}
  3528.     //  {{{ getRelationsArray()
  3529.     /** Tableau des relations
  3530.      *
  3531.      * @access  public
  3532.      * @param string|int $type le type de champ
  3533.      */
  3534.     public function getRelationsArray($type)
  3535.     {
  3536.         // récupérer les relations communes
  3537.         $array_types $this->getRelationsArrayTrait('all');
  3538.         $array_types += array(
  3539.             'spectacle_trailer' => array(// documents multimedia associés
  3540.                 'type_join' => 'method',
  3541.                 'method' => 'getMultimediaList',
  3542.                 'description' => 'Document(s) multimédia associé à ce spectacle',
  3543.                 'silent_delete_relation' => true,
  3544.                 'use_constraint' => false,
  3545.             ),
  3546.             // spectacle_classification idspectacle
  3547.             'spectacle_classification' => array(// classifications associées
  3548.                 'type_join' => 'multiple',
  3549.                 'dest_table' => 'classifications',
  3550.                 'join_table' => 'spectacle_classification',
  3551.                 'fields' => array('idclassification''classification''type'),
  3552.                 'description' => 'Classifications associées à ce spectacle',
  3553.                 'silent_delete_relation' => true,
  3554.             ),
  3555.             // schedules idspectacle
  3556.             'schedules' => array(// dates de spectacle
  3557.                 'type_join' => 'simple',
  3558.                 'dest_table' => 'schedules',
  3559.                 'fields' => array('idschedule''date''hour'),
  3560.                 'description' => 'Contact(s) associé(s) à ce spectacle',
  3561.                 'silent_delete_relation' => true,
  3562.             ),
  3563.             // spectacle_contact idspectacle
  3564.             'spectacle_contact' => array(// contacts associées a ce spectacle
  3565.                 'type_join' => 'multiple',
  3566.                 'dest_table' => 'contacts',
  3567.                 'join_table' => 'spectacle_contact',
  3568.                 'fields' => array('idcontact''lastname''firstname''organisation''type''url_clean''valid'),
  3569.                 'description' => 'Contact(s) associé(s) à ce spectacle',
  3570.                 'silent_delete_relation' => true,
  3571.             ),
  3572.             // spectacle_person idspectacle
  3573.             'spectacle_person' => array(// persons associées a ce spectacle
  3574.                 'type_join' => 'multiple',
  3575.                 'dest_table' => 'persons',
  3576.                 'join_table' => 'spectacle_person',
  3577.                 'fields' => array('idperson''lastname''firstname''url_clean''valid'),
  3578.                 'description' => 'Artiste(s) associé(s) à ce spectacle',
  3579.                 'silent_delete_relation' => true,
  3580.             ),
  3581.             // spectacle_reflexion idspectacle
  3582.             'idspectacle_reflexion' => array(// piste de réflexion associées a ce spectacle
  3583.                 'type_join' => 'simple',
  3584.                 'dest_table' => 'reflexions',
  3585.                 'fields' => array('idreflexion''module''title'),
  3586.                 'description' => 'Piste(s) de réflexion associée(s) à ce spectacle',
  3587.             ),
  3588.             // idextranetuser idspectacle
  3589.             'idextranetuser' => array(// utilisateur associé
  3590.                 'type_join' => 'simple',
  3591.                 'dest_table' => 'extranetusers',
  3592.                 'join_field_src' => 'idextranetuser'// jointure
  3593.                 'fields' => array('idextranetuser''login''email'),
  3594.                 'description' => 'Utilisateur associé au spectacle',
  3595.                 'silent_delete_relation' => true,
  3596.             ),
  3597.         );
  3598.         // retourne uniquement un type précis
  3599.         if ($type == 'all') {
  3600.             return $array_types;
  3601.         }
  3602.         if (!empty($array_types[$type])) {
  3603.             $array_types[$type]['type'] = $type;
  3604.             return $array_types[$type];
  3605.         } else {
  3606.             return null;
  3607.         }
  3608.     }
  3609.     // }}}
  3610.     //  {{{ getApiTab()
  3611.     /** génére la version pour la diffusion API
  3612.      *
  3613.      * @see Theatre::getApiTab
  3614.      */
  3615.     public function getApiTab($data$url null$params_options = array())
  3616.     {
  3617.         // généré à partir de getApiFields
  3618.         $data_api $this->getApiTabTrait($data$_ENV['URL_THNET']);
  3619.         // on ajoute la periode et la prochaine date
  3620.         if (!empty($data['periode'])) {
  3621.             $data_api['near_dates'] = array(
  3622.                 'start' => $data['periode']['datestart_std'],
  3623.                 'end' => $data['periode']['dateend_std']
  3624.             );
  3625.             if (!empty($data['periode'][0])) {
  3626.                 $data_api['near_dates']['city'] = $data['periode'][0]->getContact()->getCity();
  3627.                 $data_api['near_dates']['zipcode'] = $data['periode'][0]->getContact()->getZip();
  3628.                 $country $data['periode'][0]->getContact()->getCountry();
  3629.                 $data_api['near_dates']['country'] = $country $country->getId() : 'FR';
  3630.             }
  3631.         } else {
  3632.             if (!empty($data['prochdate_std'])) {
  3633.                 $data_api['near_dates'] = array(
  3634.                     'start' => $data['prochdate_std'],
  3635.                     'end' => null,
  3636.                     'city' => $data['city'],
  3637.                     'zipcode' => $data['zip'],
  3638.                     'country' => $data['country'],
  3639.                 );
  3640.                 if (!empty($data['periode'][0])) {
  3641.                     $data_api['near_dates']['city'] = $data['periode'][0]->getContact()->getCity();
  3642.                     $data_api['near_dates']['zipcode'] = $data['periode'][0]->getContact()->getZip();
  3643.                     $data_api['near_dates']['country'] = $data['periode'][0]->getContact()->getCountry()->getId();
  3644.                 }
  3645.             }
  3646.         }
  3647.         // infos sur le contact
  3648.         if (!empty($data_api['near_dates'])) {
  3649.             $data_api['near_dates']['place'] = array(
  3650.                 'name' => $data['contact']['organisation'],
  3651.                 'object' => $data['contact']['url_clean'],
  3652.                 'permanent_url' => $_ENV['URL_THNET'] . '/contacts/' $data['contact']['url_clean'] . '/',
  3653.                 'geocode' => array(
  3654.                     'x' => $data['contact']['x'],
  3655.                     'y' => $data['contact']['y'],
  3656.                 ),
  3657.             );
  3658.         }
  3659.         // infos sur le texte
  3660.         if (!empty($data['text'])) {
  3661.             $data_api['text'] = array(
  3662.                 'title' => $data['text']['title'],
  3663.                 'object' => $data['text']['url_clean'],
  3664.                 'permanent_url' => $_ENV['URL_THNET'] . '/textes/' $data['text']['url_clean'] . '/',
  3665.             );
  3666.             if (!empty($data['text']['vignette_object'])) {
  3667.                 $data_api['text']['poster'] = $data['text']['vignette_object'];
  3668.                 $data_api['text']['publisher_url'] = $data['text']['publisher_url_text'];
  3669.             }
  3670.         }
  3671.         // dans le cas de textefictif non adapaté
  3672.         if (!empty($data['textfictif']) && $data['textfictif'] == && empty($data['adaptation'])) {
  3673.             $data_api['author_is_creator'] = true;
  3674.         }
  3675.         return $data_api;
  3676.     }
  3677.     // }}}
  3678.     //  {{{ getApiFields()
  3679.     /** champs à renvoyer par l'API
  3680.      *
  3681.      * @access  public
  3682.      * @param array tableau de données
  3683.      */
  3684.     protected function getApiFields()
  3685.     {
  3686.         return array(
  3687.             'object' => 'url_clean',
  3688.             'title' => 'title',
  3689.             'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/spectacles/${1}/'// url complète
  3690.             'allauthors->authors' => array(
  3691.                 'lastname' => 'lastname',
  3692.                 'firstname' => 'firstname',
  3693.                 'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/biographies/${1}/',
  3694.             ),
  3695.             'adaptation' => array(
  3696.                 'object' => 'url_clean',
  3697.                 'title' => 'title',
  3698.                 'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/textes/${1}/',
  3699.                 'allauthors->authors' => array(
  3700.                     'lastname' => 'lastname',
  3701.                     'firstname' => 'firstname',
  3702.                     'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/biographies/${1}/',
  3703.                 ),
  3704.             ),
  3705.             'alldirectors->directors' => array(
  3706.                 'object' => 'url_clean',
  3707.                 'lastname' => 'lastname',
  3708.                 'firstname' => 'firstname',
  3709.                 'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/biographies/${1}/',
  3710.                 'ecoles->studies' => array(
  3711.                     'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/contacts/${1}/',
  3712.                     'date_start' => 'start#([0-9]{4})(.*)#$1'// ne garder que l'année
  3713.                     'date_end' => 'end#([0-9]{4})(.*)#$1',
  3714.                 ),
  3715.                 'supported' => 'supported',
  3716.             ),
  3717.             'allactors->actors' => array(
  3718.                 'lastname' => 'lastname',
  3719.                 'firstname' => 'firstname',
  3720.                 'ecoles->studies' => array(
  3721.                     'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/contacts/${1}/',
  3722.                     'date_start' => 'start#([0-9]{4})(.*)#$1'// ne garder que l'année
  3723.                     'date_end' => 'end#([0-9]{4})(.*)#$1',
  3724.                 ),
  3725.                 'supported' => 'supported',
  3726.                 'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/biographies/${1}/',
  3727.             ),
  3728.             'distributions' => array(
  3729.                 'lastname' => 'lastname',
  3730.                 'firstname' => 'firstname',
  3731.                 'ecoles->studies' => array(
  3732.                     'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/contacts/${1}/',
  3733.                     'date_start' => 'start#([0-9]{4})(.*)#$1'// ne garder que l'année
  3734.                     'date_end' => 'end#([0-9]{4})(.*)#$1',
  3735.                 ),
  3736.                 'roles' => 'all'// les roles
  3737.                 'supported' => 'supported',
  3738.                 'url_clean' => 'permanent_url#(.*)#' $_ENV['URL_THNET'] . '/biographies/${1}/',
  3739.             ),
  3740.             'vignette_affiche' => 'poster',
  3741.             'publish' => 'published',
  3742.             'dateinsert' => 'insert_date',
  3743.             'typespectacle' => 'typespectacle',
  3744.             'no_text' => 'textfictif',
  3745.         );
  3746.     }
  3747.     // }}}
  3748.     //  {{{ countSpectacles()
  3749.     /** Compter le nombre total de spectacles
  3750.      *
  3751.      * @access public
  3752.      * @return int
  3753.      */
  3754.     public function countSpectacles($params = array())
  3755.     {
  3756.         $sql 'SELECT COUNT(DISTINCT(s.`idspectacle`))
  3757.                  FROM spectacles s';
  3758.         if (!empty($params['date_start'])) {
  3759.             $sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`
  3760.                       WHERE 1
  3761.                       AND sc.`date`>\'' $params['date_start'] . '\' ';
  3762.         }
  3763.         if (!empty($params['prochains'])) {
  3764.             $dateend strftime('%Y-%m-%d'strtotime(date('Y-m-d')) + $params['prochains'] * 24 3600);
  3765.             $sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`
  3766.                       WHERE 1
  3767.                     AND (sc.date BETWEEN \'' date('Y-m-d') . '\' AND \'' $dateend '\') ';
  3768.         }
  3769.         if (!empty($params['contents'])) {
  3770.             $sql .= ' JOIN object_content oc ON oc.`idobject`=s.`idspectacle`
  3771.                       JOIN contents c ON oc.`idcontent`=c.`idcontent`
  3772.                       JOIN content_classification cc ON cc.`idcontent`=c.`idcontent`
  3773.                       JOIN classifications cl ON cl.`idclassification`=cc.`idclassification`
  3774.                       WHERE 1 ';
  3775.             $sql .= ' AND oc.`object`=\'spectacles\'
  3776.                       AND cl.`classification` IN (' $this->arrayToIn($params['contents']['classifications']) . ') ';
  3777.         }
  3778.         return $this->queryOne($sql);
  3779.     }
  3780.     // }}}
  3781.     //  {{{ countSpectaclesWithMultimedias()
  3782.     /** Compter le nombre total de spectacles avec vidéo
  3783.      *
  3784.      * @access public
  3785.      * @return int
  3786.      */
  3787.     public function countSpectaclesWithMultimedias($params = array())
  3788.     {
  3789.         $where ' WHERE 1 ';
  3790.         $sql 'SELECT COUNT(DISTINCT(s.`idspectacle`))
  3791.                 FROM spectacles s';
  3792.         if (!empty($params['prochains'])) {
  3793.             if (is_array($params['prochains'])) {
  3794.                 $datestart $params['prochains'][0];
  3795.                 $dateend $params['prochains'][0];
  3796.             } else {
  3797.                 $datestart date('Y-m-d');
  3798.                 $dateend strftime('%Y-%m-%d'strtotime(date('Y-m-d')) + $params['prochains'] * 24 3600);
  3799.             }
  3800.             $sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`';
  3801.             $where .= ' AND (sc.date BETWEEN \'' $datestart '\' AND \'' $dateend '\') ';
  3802.         }
  3803.         $sql .= ' JOIN object_multimedia om ON om.`idobject`=sc.`idspectacle`';
  3804.         $where .= ' AND om.`object`= \'spectacles\' ';
  3805.         $sql $sql $where;
  3806.         return $this->queryOne($sql);
  3807.     }
  3808.     // }}}
  3809.     //  {{{ countSpectaclesInSpecificLanguage()
  3810.     /** Compter le nombre total de spectacles ou d'adaptation dans une langue spécifique
  3811.      * @return int
  3812.      * @todo il manque des parametres, a améliorer...
  3813.      *
  3814.      * @access public
  3815.      */
  3816.     public function countSpectaclesInSpecificLanguage($params = array())
  3817.     {
  3818.         $cle_filtre_language 'language_egal';
  3819.         if (array_key_exists('keylanguage'$params) && !empty($params['keylanguage'])) {
  3820.             $cle_filtre_language $params['keylanguage'];
  3821.         }
  3822.         $query $this->getSQLSpectacles(
  3823.             array(
  3824.                 'limit' => 'all'
  3825.             ),
  3826.             array(
  3827.                 'join' => true,
  3828.                 'count_only' => true,
  3829.                 'count_only_distinct' => 's.idspectacle',
  3830.                 'select_by_text_or_adaptation' => $params['id_text'],
  3831.                 'spectacle' => array(
  3832.                     $cle_filtre_language => $params['lang']
  3833.                 )
  3834.             )
  3835.         );
  3836.         // executer la requete
  3837.         return $query->getSingleResult(Query::HYDRATE_SCALAR)['total'];
  3838.     }
  3839.     // }}}
  3840.     /** Créer un tableau unique allpersons contenant tous les auteurs et metteurs-en-scène
  3841.      *
  3842.      *  Note : on pourrait supprimer les unset... a voir
  3843.      *
  3844.      * @access public
  3845.      * @return array
  3846.      */
  3847.     public function clearSpectaclesAddAllPersons($sp)
  3848.     {
  3849.         $allauthors $alldirectors = array();
  3850.         if (empty($sp['allauthors']))
  3851.             return $sp;
  3852.         if (!empty($sp['allauthors'])) {
  3853.             $allauthors $sp['allauthors'];
  3854.         }
  3855.         if (!empty($sp['alldirectors'])) {
  3856.             $alldirectors $sp['alldirectors'];
  3857.         }
  3858.         $allpersons $allauthors $alldirectors;
  3859.         unset($sp['allauthors']);
  3860.         unset($sp['alldirectors']);
  3861.         foreach ($allpersons as $kap => $vap) {
  3862.             unset($vap['nopunct']);
  3863.             $sp['allpersons'][$vap['idperson']] = $vap;
  3864.         }
  3865.         $sp['allpersons'] = $this->noPunct($sp['allpersons']);
  3866.         return $sp;
  3867.     }
  3868.     // }}}
  3869. }