<?php
namespace TheatreCore\Repository;
use TheatreCore\Classes\Images\Images;
use TheatreCore\Entity\Aides;
use TheatreCore\Entity\Bigregions;
use TheatreCore\Entity\Classifications;
use TheatreCore\Entity\Contacts;
use TheatreCore\Entity\Contents;
use TheatreCore\Entity\Multimedias;
use TheatreCore\Entity\ObjectContent;
use TheatreCore\Entity\ObjectMultimedia;
use TheatreCore\Entity\PersonEcole;
use TheatreCore\Entity\Persons;
use TheatreCore\Entity\Playlists;
use TheatreCore\Entity\Schedules;
use TheatreCore\Entity\SpectacleAide;
use TheatreCore\Entity\Spectacles;
use TheatreCore\Entity\Texts;
use TheatreCore\Traits\TheatreTrait;
use TheatreCore\Entity\Typesspectacles;
use Theatre_Extranetusers;
use DateInterval;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\Query;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* SpectaclesRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class SpectaclesRepository extends ServiceEntityRepository
{
use TheatreTrait {
getRelationsArray as protected getRelationsArrayTrait;
getItemsList as protected getItemsListTrait;
getApiTab as protected getApiTabTrait;
}
private $em;
public $__table;
public $__table_object;
public $__idtable;
public function __construct(ManagerRegistry $registry, TranslatorInterface $translator, Images $images)
{
parent::__construct($registry, Spectacles::class);
$this->__table = $this->getClassMetadata()->getTableName();
$this->__table_object = $this->getClassMetadata()->name;
$this->__idtable = $this->getClassMetadata()->getSingleIdentifierFieldName();
$this->translator = $translator;
$this->images = $images;
}
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
// nb of recommandations for one spectacle
public function countSpectacleRecommandations(int $idSpectacle): int
{
return $this->createQueryBuilder('s')
->select('COUNT(a.idaide)')
->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->where('s.idspectacle = :idSpectacle')
->andWhere('ac.title LIKE \'Spectacle recommandé\'')
->setParameter(':idSpectacle', $idSpectacle)
->getQuery()
->getSingleScalarResult();
}
// Nb of recommanded spectacles
public function countRecommandedSpectacles(): int
{
return $this->createQueryBuilder('s')
->select('COUNT(DISTINCT s.idspectacle)')
->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->andWhere('ac.title LIKE \'Spectacle recommandé\'')
->getQuery()
->getSingleScalarResult();
}
// Get nb of recommanded spectacles by recommandations number
public function countRecommandedSpectaclesByNb(int $nb): int
{
$result = $this->createQueryBuilder('s')
->select('COUNT(DISTINCT s.idspectacle)')
->addSelect('COUNT(sa.idaide) as HIDDEN nb')
->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->andWhere('ac.title LIKE \'Spectacle recommandé\'')
->groupBy('s')
->having('nb = :recommandationsNb')
->setParameter(':recommandationsNb', $nb)
->getQuery()
->getScalarResult();
return count($result);
}
// Aide id of recommandations for one spectacle
public function getSpectacleRecommandations(int $idSpectacle)
{
return $this->createQueryBuilder('s')
->select('a.idaide')
->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->where('s.idspectacle = :idSpectacle')
->andWhere('ac.title LIKE \'Spectacle recommandé\'')
->setParameter(':idSpectacle', $idSpectacle)
->getQuery()
->getResult();
}
// {{{ findData()
/** Recherche des spectacles
*
* Permet de rechercher des spectacles selon différents critères
*
* @access public
* @see Theatre::find()
*/
public function findData($idperson = null, $idtext = null, $keywords = null, $id = null, $count = null)
{
$query = $this->createQueryBuilder('e');
// ->select('e')
// ->andWhere('e.idspectacle = :idspectacle')
// ->setParameter('idspectacle', $idspectacle)
// ->getQuery()
// ->getSingleResult();
// les spectacles d'une personne
if (isset($_REQUEST['idperson']) && is_numeric($_REQUEST['idperson'])) {
$idperson = $_REQUEST['idperson'];
}
// les mises en scene d'un texte
if (isset($_REQUEST['idtext']) && is_numeric($_REQUEST['idtext'])) {
$idtext = $_REQUEST['idtext'];
}
// recherche par id
if (isset($_REQUEST['idspectacle']) && $_REQUEST['idspectacle'] != 'ID' && !empty($_REQUEST['idspectacle'])) {
$idspectacle = $_REQUEST['idspectacle'];
}
// recherche par titre
if (isset($_REQUEST['keywords']) && $_REQUEST['keywords'] != 'titre' && !empty($_REQUEST['keywords'])) {
$keywords = filter_var(trim($_REQUEST['keywords']), FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
if ($this->my_is_int($keywords)) {
$idspectacle = (int)$keywords;
$keywords = null;
}
}
// recherche par ville
if (isset($_REQUEST['city']) && $_REQUEST['city'] != 'ville' && !empty($_REQUEST['city'])) {
$city = $_REQUEST['city'];
}
// recherche par metteur en scene
if (isset($_REQUEST['director']) && $_REQUEST['director'] != 'met. en sc.' && !empty($_REQUEST['director'])) {
$director = $_REQUEST['director'];
}
$conn = $this->getEntityManager()->getConnection();
// recherche par contraintes
// recherche stricte par id
if (!empty($idspectacle)) {
$idspectacle = (int)$idspectacle;
// $this->whereAdd('spectacles.idspectacle='.$idspectacle);
$query->andWhere('e.idspectacle = :idspectacle')->setParameter('idspectacle', $idspectacle);
} else {
//recherches par titre et/ou ville et/ou metteur en scene
if (!empty($keywords) || !empty($city) || !empty($director)
|| !empty($_REQUEST['external'])
|| !empty($_REQUEST['fc'])
|| !empty($_REQUEST['userfc'])
|| !empty($_REQUEST['idextranetuser'])
|| !empty($_REQUEST['partenaires'])) {
//realiser la jointure
// $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,
// t.title as text_title,t.idtext,t.url_clean as url_clean_text
// FROM texts t, text_spectacle ts, spectacles s
// WHERE t.idtext=ts.idtext AND ts.idspectacle=s.idspectacle';
//recherche par titre
if (!empty($keywords)) {
// $query .= ' AND ( (s.title LIKE \'%'.$this->escape($keywords).'%\') OR (t.title LIKE \'%'.$this->escape($keywords).'%\') ) ';
$query->andWhere(' ( (e.title LIKE \'%' . $this->escape($keywords) . '%\') OR (texts.title LIKE \'%' . $this->escape($keywords) . '%\') ) ');
}
//recherche par ville
if (!empty($city)) {
$queryIN = $conn->executeQuery('SELECT DISTINCT(idcontact) FROM contacts WHERE city LIKE \'' . $this->escape($city) . '%\'')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
$query->andWhere(' e.idcontactCreation IN (' . implode(',', $queryIN) . ') ');
}
//recherche par metteur en scene
if (!empty($director)) {
$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);
$query->andWhere(' e.idspectacle IN (' . implode(',', $queryIN) . ') ');
// $query .= ' AND s.idspectacle IN (
// '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).'%\'
// ) ';
}
// les utilisateur extérieurs => ceux qui ne sont pas root
if (isset($_REQUEST['external']) && $_REQUEST['external'] == 'only') {
// $query .= ' AND s.`idextranetuser` IN (SELECT idextranetuser FROM extranetusers WHERE userrights=0) ';
$queryIN = $conn->executeQuery('SELECT idextranetuser FROM extranetusers WHERE userrights=0')->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
$query->andWhere(' e.idextranetuser IN (' . implode(',', $queryIN) . ') ');
}
// les contacts partenaires = spectacles postés par des utilisateurs associés à un contact qui a la classification partenaireTODO
if (isset($_REQUEST['partenaires']) && $_REQUEST['partenaires'] == 'only') {
$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);
$query->andWhere(' e.idextranetuser IN (' . implode(',', $queryIN) . ') ');
}
// les spectacles FC
if (isset($_REQUEST['fc']) && $_REQUEST['fc'] == 'only') {
// $queryIN = $conn->executeQuery('SELECT idspectacle FROM spectacle_aide WHERE idcontact=15995')->fetchAll(\PDO::FETCH_COLUMN|\PDO::FETCH_ASSOC);
// $query->andWhere(' e.idspectacle IN ('.implode(',', $queryIN).') ');
// $query .= ' AND s.`idspectacle` IN (
// SELECT idspectacle FROM spectacle_aide WHERE idcontact=15995
// ) ';
}
// les utilisateurs FC
if (isset($_REQUEST['userfc']) && $_REQUEST['userfc'] == 'only') {
// trouver les spectacles des utilisateurs qui sont associés à une compagnie FC
// = contact qui ont la classification 122
$query .= ' AND s.`idextranetuser` IN (
SELECT idextranetuser FROM contact_extranetuser WHERE idcontact IN (
SELECT idcontact FROM contact_classification WHERE idclassification=122
)
)';
}
// les utilisateur extérieurs => ceux qui ne sont pas root
if (isset($_REQUEST['idextranetuser']) && $this->my_is_int($_REQUEST['idextranetuser'])) {
$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);
$query->andWhere('e.idextranetuser=' . (int)$_REQUEST['idextranetuser'] . '');
if (!empty($queryIN)) {
$query->orWhere('e.idspectacle IN (' . implode(',', $queryIN) . ')');
}
// $query .= ' AND (
// s.idextranetuser='.(int)$_REQUEST['idextranetuser'].'
// OR s.idspectacle IN (SELECT idobject FROM user_action WHERE 1 AND object=\'spectacles\' AND action=\'create\' AND idextranetuser='.(int)$_REQUEST['idextranetuser'].')
// ) ';
}
}
}
// on precise les champs pour le SELECT
if (empty($idtext) && empty($idperson)) {
//
//// $this->selectAdd();
//// $this->selectAdd('idspectacle,title,creation_date,idcontact_creation,idtypespectacle,language,url_clean,statut,valid,publish,idextranetuser,textfictif');
// $query->leftJoin('e.idextranetuser', 'extranetuser');
// $query->leftJoin('e.text_spectacle', 'texts');
// $query->leftJoin('texts.textAuthorperson', 'authors');
// $query->leftJoin('e.idtypespectacle', 'idtypespectacle');
$query->leftJoin('e.text_spectacle', 'text');
$query->select('e, text');
// $query->select('e, extranetuser, texts, authors, idtypespectacle');
}
// si un texte en particulier (jointure sur text_spectacle)
if (!empty($idtext)) {
$idtext = (int)$idtext;
// $ts = DB_DataObject::factory('text_spectacle')
$query->leftJoin('e.text_spectacle', 'texts');
$query->select('e, texts');
$query->andWhere('texts.idtext = ' . (int)$idtext);
// $this->joinAdd($ts);
// $this->selectAs();
// $this->selectAs($ts,'ts_%s');
// $this->whereAdd('text_spectacle.idtext='.$idtext);
}
// si aide
if (!empty($_REQUEST['idaide'])) {
$query->leftJoin('e.aides', 'aides');
$query->select('e, aides');
$query->andWhere('aides.idaide=' . (int)$_REQUEST['idaide']);
}
// si un metteur en scene (jointure sur spectacle_person)
if (!empty($idperson)) {
$idperson = (int)$idperson;
$sp = DB_DataObject::factory('spectacle_person');
$this->joinAdd($sp);
$this->selectAs();
$this->selectAs($sp, 'sp_%s');
$this->whereAdd('spectacle_person.idperson=' . $idperson);
$this->whereAdd('spectacle_person.idrole=1');
if ($_ENV['CHECK_IF_ONLINE']) {
$this->whereAdd('spectacles.publish=1');
}
}
if ($this->getCount()) {
$query->select('COUNT(e.idspectacle)');
$this->setCount(false);
return $query;
}
$query->orderBy('e.idspectacle', 'desc');
// on lance la recherche
return $query->getQuery();
}
// }}}
// {{{ setToArray()
/** Listes des spectacles dans un tableau associatif
*
* Tableau associatif notament utilisé pour lister les informations sur des spectacles
* Utile pour générer les tableaux HTML de listes de spectacles
*
* @access public
* @return array
* @see findData()
* @see getInfosSpectacle()
*/
public function setToArray($spec = true, $idperson = null, $idtext = null)
{
// recherche
if ($spec == true) {
$this->findData($idperson, $idtext);
}
$values = array();
$color = null;
$nb = 0;
while ($this->fetch()) {
// $this->getLinks();
$values[$nb] = $this->getInfosSpectacle();
$values[$nb]['id'] = $this->idspectacle;
// couleur de ligne alternative
$color = $this->colorAlternate($color);
$values[$nb]['colorline'] = $color;
$nb++;
}
return $values;
}
// }}}
// {{{ getInfosSpectacle()
/** Infos sur un spectacle
*
* Retourne un tableau associatif avec les principales
* informations sur un spectacle
*
* @access public
* @param int $idspectacle Identifiant de la fiche spectacle
* @return array
* @see findData()
*/
public function getInfosSpectacle($idspectacle = null, $params_display = array())
{
$repo = false;
$conn = $this->getEntityManager();
////////////// infos extraites de la table si on est pas dans une boucle
if (!empty($idspectacle)) {
} else {
$idspectacle = $this->idspectacle;
$infos = array();
}
$data = $this->createQueryBuilder('e')
->select('e')
->andWhere('e.idspectacle = :idspectacle')
->setParameter('idspectacle', $idspectacle)
->getQuery()
->getSingleResult();
$repo = true;
$this->idspectacle = $data->getIdspectacle();
// infos de base
$infos = array(
'idspectacle' => $data->getIdspectacle(),
'url_clean' => $data->getUrlClean(),
'idtypespectacle' => (int)$data->getIdtypespectacle()->getIdtypespectacle(),
'idspectaclegenre' => (!empty($data->getIdspectaclegenre())) ? (int)$data->getIdspectaclegenre()->getIdspectaclegenre() : null,
'duration' => $data->getDuration(),
'textfictif' => $data->getTextfictif(),
'interlude' => $data->getInterlude(),
'publish' => (int)$data->getPublish()
);
$infos['valid'] = (int)$data->getValid();
$infos['statut'] = 0;
if ($data->getStatut()) {
$infos['statut'] = (int)$data->getStatut();
// incomplet ?
if ($infos['statut'] == 1) {
$infos['validation_encours'] = true;
}
if ($infos['statut'] == 0) {
$infos['incomplet'] = true;
}
if ($infos['statut'] > 1) {
$infos['valide'] = true;
}
}
// utilisateur
$infos['idextranetuser'] = $data->getIdextranetuser();
$this->creation_date = $data->getCreationDate();
if (!is_null($this->creation_date)) {
$this->creation_date = $this->creation_date->format('Y-m-d H:i:s');
}
// date de creation
if (isset($this->creation_date) && $this->creation_date != '0000-00-00' && $this->creation_date != null) {
$infos['creation_date'] = $this->getFormeDate($this->creation_date, $GLOBALS['format_date'][$GLOBALS['lng']]);
$infos['creation_date_us'] = $this->creation_date;
} else {
$infos['creation_date'] = null;
}
// la ville de creation
if (is_object($data->getIdcontactCreation())) {
$infos['city'] = $data->getIdcontactCreation()->getCity();
if (!empty($data->getIdcontactCreation()->getCountry())) {
$infos['country'] = $this->getNameCountry($data->getIdcontactCreation()->getCountry()->getId());
}
$infos['location'] = $data->getIdcontactCreation()->getOrganisation();
$infos['url_clean_location'] = $data->getIdcontactCreation()->getUrlClean();
}
// le type de spectacle
if (!empty($infos['idtypespectacle'])) {
$typesspectacles = $conn->getRepository(Typesspectacles::class);
$infos['type'] = $typesspectacles->getTypespectacle($infos['idtypespectacle'], $GLOBALS['lng']);
}
// la langue
if ($data->getLanguage()) {
$infos['language'] = $this->getNameLanguage($data->getLanguage(), $GLOBALS['lng']);
$infos['language_src'] = $data->getLanguage();
}
// ancien spectacle ?
if ($data->getUrlPage()) {
$infos['url_page'] = $data->getUrlPage();
}
// annee de creation
$infos['annee_creation'] = $this->getYear($this->creation_date);
if (!empty($data->getTitle())) { // on a un titre pour le spectacle
$infos['title'] = $data->getTitle();
$infos['adaptation'] = true;
} else {
$texts = $this->getSpectacleText();
$infos['title'] = $texts['title'];
$infos['idtext'] = $texts['idtext'];
$infos['url_clean_text'] = $texts['url_clean'];
}
///////// le(s) auteur(s) du texte original
if (!array_key_exists('adaptation', $infos) && !empty($infos['idtext'])) {
$aut = $conn->getRepository(Texts::class);
$authors = $aut->getAuthors($infos['idtext']);
// au dela de 1 auteur, on dit que c'est un collectif
if (!empty($authors) && count($authors) > 1) {
$infos['authors'] = array(1 => array('lastname' => '(' . count($authors) . ' auteurs)',
'firstname' => 'Collectif',
'collectif' => true));
} else {
$infos['authors'] = $authors;
}
} else {
$infos['authors'] = array(1 => array('lastname' => 'Adaptation', 'collectif' => true));
}
// tous les auteurs
if (isset($authors)) {
$infos['allauthors'] = $this->noPunct($authors);
}
///////// le(s) metteur(s) en scene
$directors = $this->getDirectors($idspectacle);
// Cas avec plusieurs metteurs en scene
if (count($directors) > 1 && $infos['textfictif'] == 0) {
$infos['directors'] = array(1 => array(
'lastname' => '(' . count($directors) . ' metteurs en scene)',
'firstname' => 'Collectif',
'collectif' => true)
);
} else {
$infos['directors'] = $directors;
}
// tous les metteurs
$infos['alldirectors'] = $this->noPunct($directors);
if (empty($params_display['nocleanperson'])) {
$infos = $this->clearSpectaclesAddAllPersons($infos);
}
// recuperer l'affiche du spectacle
if (!empty($params_display['get_illustration'])) {
$illustrations = $conn->getRepository(Contents::class)->getIllustrations($this->idspectacle, 'spectacles', 'class_affiche_spec');
if (!empty($illustrations)) {
// illustrations
$infos['illustrations'] = $illustrations['illustrations'];
// vignettes
if (!empty($illustrations['vignette_object'])) {
$infos['vignette_object'] = $illustrations['vignette_object'];
}
}
}
// recuperer l'affiche du spectacle
if (!empty($params_display['get_vignette'])) {
$format_vignette = array('width' => $_ENV['VIGN_SPECTACLE_WIDTH'], 'height' => $_ENV['VIGN_SPECTACLE_HEIGHT'], 'direction' => 'crop');
$infos['vignette_affiche'] = $this->getVignetteSpectacle($idspectacle, $format_vignette);
$format_vignette['blur'] = true;
$infos['vignette_affiche_flou'] = $this->getVignetteSpectacle($idspectacle, $format_vignette);
}
// voir si il y a des aides
if (!empty($params_display['get_aides'])) {
$spectacleAide = $conn->getRepository(SpectacleAide::class);
$infos['nb_aides'] = $spectacleAide->countAides(null, $this->idspectacle);
if ($infos['nb_aides'] > 0) {
$infos['aides'] = $spectacleAide->getListSpectacleAide(array(
'idspectacle' => array($this->idspectacle),
'get_spectacles_with_aides' => true,
'dbg' => array('liste_aides', 'Liste des aides du spectaclee')
));
}
}
if (!empty($params_display['carrer_couleurs'])) {
$infos['carrer'] = $this->getObjectsCarrerDetails($this->idspectacle);
}
if (!empty($params_display['api'])) {
$infos = $this->getApiTab($infos, $_ENV['URL_THNET'], $params_display['api']);
}
// infos sur le texte avec url
return $infos;
}
// }}}
// {{{ getInfosObject()
/** Alias de getInfosSpectacle
*
* @access public
* @param int $idobject identifiant
* @return array
* @see getInfosSpectacle()
*/
public function getInfosObject($idobject = null, $params_display = array())
{
return $this->getInfosSpectacle($idobject, $params_display);
}
// }}}
// {{{ getSpectacleText()
/** les textes associé à un spectacle
*
* recupere le titre du texte associe a un spectacle
*
* @access public
* @return array
*/
public function getSpectacleText($all = false, $idspectacle = null, $k = null)
{
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
$idspectacle = (int)$idspectacle;
// on recupere les textes associes
$sql = 'SELECT t.idtext,t.title,t.type,t.url_clean, t.textfictif FROM texts t, text_spectacle ts
WHERE 1
AND ts.idspectacle=' . $idspectacle . '
AND t.idtext=ts.idtext';
if (!empty($k)) {
$texts = $this->queryAll($sql, array(), null, true);
} else {
$texts = $this->queryAll($sql);
}
if (!$all && !empty($texts)) {
$texts = $texts[0];
}
return $texts;
}
// }}}
// {{{ getPlageDate()
/** la plage de date du spectacle
*
* Récupère la plage de date du spectacle
*
* @access public
* @param int $idspectacle Identifiant du spectacle
* @param int $month On ne veux que les dates du mois
* @param int $year On ne veux que les dates de l'année
* @return array
*/
public function getPlageDate($idspectacle, $month = null, $year = null)
{
$idspectacle = (int)$idspectacle;
//annee
if (empty($year)) {
$year = date('Y');
}
//pas de recherche par mois
if (empty($month)) {
// on recuperer la plage de dates du spectacle
$sql = 'SELECT MIN(sc.date) as datestart ,MAX(sc.date) as dateend , MAX(hour) as hour FROM schedules sc
WHERE sc.idspectacle=' . $idspectacle;
} else { // recherche avec un mois precis
//premier du mois
$datestart = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
//dernier du mois
$dateend = date('Y-m-d', mktime(0, 0, 0, $month + 1, 0, $year));
// on recupere la plage de dates pour le mois indique
$sql = 'SELECT MIN(sc.date) as datestart ,MAX(sc.date) as dateend , MAX(hour) as hour FROM schedules sc
WHERE sc.idspectacle=' . $idspectacle . ' AND (sc.date BETWEEN (\'' . $datestart . '\') AND (\'' . $dateend . '\'))';
}
// executer la requete
$dates = $this->queryRow($sql);
$dates['datestart'] = $this->getFormeDate($dates['datestart'], $GLOBALS['format_date'][$GLOBALS['lng']]);
$dates['dateend'] = $this->getFormeDate($dates['dateend'], $GLOBALS['format_date'][$GLOBALS['lng']]);
//date de debut = date de fin, vider la date de fin
if ($dates['datestart'] == $dates['dateend']) {
$dates['dateend'] = '';
}
// retourner les dates
return $dates;
}
// }}}
// {{{ getTextSpectacle()
/** les spectacles associes a un texte
*
* recupere le titre du texte associe a un spectacle
*
* @access public
* @param int $idtext identifiant du texte
* @param bool $limit limiter le nombre de resultat
* @param bool $all obtenir aussi le titre et le metteur en scene du spectacle
* @return array
*/
public function getTextSpectacle($idtext, $limit = false, $all = false)
{
$idtext = (int)$idtext;
// on recupere les spectacles associes
$sql = 'SELECT s.idspectacle,s.language,s.title as titlespectacle, t.title as titletext
FROM spectacles s, text_spectacle ts, texts t
WHERE t.idtext=ts.idtext
AND ts.idspectacle=s.idspectacle
AND ts.idtext=' . $idtext;
//on veut une limite
$limit = (int)$limit;
if ($limit > 0) {
$sql .= ' LIMIT 0,' . $limit;
}
// executer la requete
$spectacles = $this->queryAll($sql);
foreach ($spectacles as $k => $v) {
$idspectacle = $v['idspectacle'];
if (!empty($idspectacle) && is_numeric($idspectacle) && $all == true) {
$infos_spectacle = array(
'idspectacle' => $idspectacle,
'title' => $v['titletext'],
'title_spectacle' => $v['titlespectacle']
);
$spectacles[$k]['title'] = $this->getObjectTitle($idspectacle, $infos_spectacle);
$spectacles[$k]['director'] = $this->getDirectorsString($idspectacle);
}
}
return $spectacles;
}
// }}}
// {{{ getTextTraductionSpectacles()
/** Les spectacles associes a aux traductions d'un texte
*
* @access public
* @param int $idtext id du texte original
* @param int $limit limiter les reponses
* @param bool $extended retourner seulement l'id ou plus d'infos
* @return array
*/
public function getTextTraductionSpectacles($idtext, $limit = false, $extended = true)
{
$idtext = (int)$idtext;
$sql = 'SELECT idspectacle,language FROM spectacles
WHERE idspectacle IN (
SELECT idspectacle FROM text_spectacle
WHERE idtext IN (
SELECT idtexttraduction FROM text_traduction
WHERE idtext=' . $idtext . '
)
)';
//on veut une limite
$limit = (int)$limit;
if ($limit > 0) {
$sql .= ' LIMIT 0,' . $limit;
}
// executer la requete
$spectacles = $this->queryAll($sql);
if ($extended) {
foreach ($spectacles as $key => $value) {
if (!empty($value['idspectacle']) && is_numeric($value['idspectacle'])) {
$spectacles[$key]['title'] = $this->getObjectTitle($value['idspectacle']);
$spectacles[$key]['director'] = $this->getDirectorsString($value['idspectacle']);
}
}
}
return $spectacles;
}
// }}}
// {{{ getContactsByRole()
/** Contacts associés à un spectacle
*
* @access public
* @param int $idspectacle identifiant du spectacle
* @param string|array $idrole role de la personne
* @return array
*/
public function getContactsByRole($idspectacle, $idrole)
{
// on a deja l'id ?
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
$idspectacle = (int)$idspectacle;
$infos = array();
$roles = array(
'spectacle_prod' => 17,
'spectacle_coprod' => 18,
'spectacle_prodel' => 19,
'spectacle_struct_diffusion' => 77,
'spectacle_partenaire' => 23,
);
// idrole ou role
if (!$this->my_is_int($idrole)) {
if (!is_array($idrole)) {
if (array_key_exists($idrole, $roles)) {
$idrole = $roles[$idrole];
}
}
} else {
$idrole = (int)$idrole;
}
$query = 'SELECT c.`idcontact`, c.`organisation`, c.`lastname`, c.`firstname`, c.`url`, c.`url_clean`, c.`valid`
FROM contacts c
JOIN spectacle_contact sc ON sc.`idcontact`=c.`idcontact`
WHERE sc.`idspectacle`=' . $idspectacle . '
AND sc.`idrole` IN (' . $this->arrayToIn($idrole) . ')
ORDER BY c.`organisation`';
// lancer la requete
$p = $this->query($query);
while ($r = $this->fetchRow()) { //$p->fetchRow()
$infos[$r['idcontact']] = array(
'lastname' => $r['lastname'],
'firstname' => $r['firstname'],
'idcontact' => $r['idcontact'],
'organisation' => $r['organisation'],
'valid' => $r['valid'],
'url_clean' => $r['url_clean'],
'url' => $r['url']
);
}
$this->free(); //$p->free()
return $infos;
}
// }}}
// {{{ getPersonsByRole()
/** Personnes associées à un spectacle
*
* @access public
* @param int $idspectacle identifiant du spectacle
* @param string|int $idrole role de la personne
* @param array $params_search paramètres supplémentaires
* @return array
*/
public function getPersonsByRole($idspectacle, $idrole, $params_search = array())
{
$conn = $this->getEntityManager();
// on a deja l'id ?
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
$idspectacle = (int)$idspectacle;
// requête classique
$query = 'SELECT p.`idperson` as id, p.`idperson` as idperson, p.`lastname`, p.`firstname`, p.`url_clean`, p.`valid`,
lt.`fr`,
r.`idrole`, r.`role`, r.`type`,
sp.`comment`,sp.`date_start`,sp.`date_end`
FROM persons p
JOIN spectacle_person sp ON sp.`idperson`=p.`idperson`
JOIN roles r ON r.`idrole`=sp.`idrole`
JOIN langterms lt ON r.`role`=lt.`id`
WHERE sp.idspectacle=' . $idspectacle . ' ';
// on ne veut pas tous le monde
if (empty($params_search['all'])) {
// les roles
$roles = array(
/*'directors' => 1,
'spectacle_director' => 1,*/
'actors' => 5,
'spectacle_actor' => 5,
);
// les types de roles
$types = array(
'distributions' => 1,
'spectacle_distrib' => 1,
'all' => 'all',
);
// les types de créateur
$types_creator = array(
'spectacle_director' => 1,
'directors' => 1,
);
// idrole ou role
if (!$this->my_is_int($idrole)) {
if (array_key_exists($idrole, $roles)) {
$idrole = $roles[$idrole];
} elseif (array_key_exists($idrole, $types)) {
$type = $types[$idrole];
} elseif (array_key_exists($idrole, $types_creator)) {
$type_creator = $types_creator[$idrole];
}
} else {
$idrole = (int)$idrole;
}
// recherche par type ou par idrole
if (empty($type) && empty($type_creator)) {
$query .= ' AND sp.idrole=' . $idrole;
} elseif (!empty($type) && $type != 'all') {
$query .= ' AND r.type=' . (int)$type;
} elseif (!empty($type_creator) && $type_creator != 'all') {
$query .= ' AND r.type_creator=' . (int)$type_creator;
}
// sélectionner les personnes d'un spectacle qui font parti de l'école
if (!empty($params_search['ecole']['idcontact'])) {
// si on a une école => on veut le début et la fin d'étude + savoir si il était "supported"
// les élèves soutenus pendant le spectacle, les élèves ayant été dans cette école
// 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
$query = 'SELECT persons.`idperson`, persons.`idperson`, persons.`lastname`, persons.`firstname`, persons.`url_clean`, persons.`valid`,
langterms.`' . $GLOBALS['lng'] . '`,
roles.`idrole`, roles.`role`, roles.`type`,
spectacle_person.`comment`,spectacle_person.`date_start`,spectacle_person.`date_end`
FROM spectacles
JOIN schedules ON spectacles.`idspectacle`=schedules.`idspectacle`
JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
JOIN roles ON spectacle_person.`idrole`=roles.`idrole`
JOIN langterms ON roles.`role`=langterms.`id`
JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
JOIN persons ON person_ecole.`idperson`=persons.`idperson`
WHERE
person_ecole.`idcontact`=' . (int)$params_search['ecole']['idcontact'] . '
AND spectacles.`idspectacle`=' . $idspectacle . ' ';
if (!empty($params_search['ecole']['strict'])) {
$query .= ' AND (schedules.`date` BETWEEN person_ecole.`date_start` AND person_ecole.`date_end`) ';
}
}
}
// classement par nom ou par classement pour les créateurs
if (!empty($type_creator)) {
$query .= ' ORDER BY sp.`classement` ';
} else {
$query .= ' ORDER BY p.`lastname` ';
}
// lancer la requete
$results = $this->queryAll($query);
if (!empty($results)) {
// trouver les écoles de chaque personnes sans exclure le JTN
if (!empty($params_search['eleves'])) {
// les clés
foreach ($results as $k => $v) {
$ids_person[] = $v['idperson'];
}
$ecoles = $conn->getRepository(PersonEcole::class)->getEcoles($ids_person, false);
// ajouter au résultats
foreach ($results as $k => $v) {
if (!empty($ecoles[$v['idperson']])) {
$results[$k]['ecoles'] = $ecoles[$v['idperson']];
}
}
}
// trouver les personnes qui ont été élvèves du contact
if (!empty($params_search['eleves']['idcontact'])) {
// 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
$query_supported = 'SELECT DISTINCT(person_ecole.`idperson`) as idperson, person_ecole.`idperson` as idpersonb
FROM spectacles
JOIN schedules ON spectacles.`idspectacle`=schedules.`idspectacle`
JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
WHERE
person_ecole.`idcontact`=' . (int)$params_search['eleves']['idcontact'] . '
AND spectacles.`idspectacle`=' . $idspectacle . ' ';
$query_supported .= ' AND (schedules.`date` BETWEEN person_ecole.`date_start` AND person_ecole.`date_end`) ';
// liste des personnes soutenues
$result_ecoles_supported = $this->queryAll($query_supported, array(), null, true);
$ecoles_supported = [];
foreach ($result_ecoles_supported as $ecole) {
$ecoles_supported[$ecole['idperson']] = $ecole;
}
if (!empty($ecoles_supported)) {
// ajouter aux résultats
foreach ($results as $k => $v) {
if (isset($ecoles_supported[$v['idperson']])) {
$results[$k]['supported'] = true;
}
}
}
}
$i = 0;
foreach ($results as $r) {
// on veut classer les gens par roles
if (!empty($params_search['all'])) {
// grouper les types de roles de distribution
if ($r['type'] == 1) {
// si déjà dans distributions
if (!isset($infos['distributions'][$r['idperson']])) {
$infos['distributions'][$r['idperson']] = $r;
}
// ajouter le role
$infos['distributions'][$r['idperson']]['role'] = $r[$GLOBALS['lng']];
$infos['distributions'][$r['idperson']]['roles'][$r['role']] = $r[$GLOBALS['lng']];
} else {
$infos[$r['role']][$r['idperson']] = $r; // ne peut pas voir 2x le mm role
$infos[$r['role']][$r['idperson']]['role'] = $r[$GLOBALS['lng']];
$infos[$r['role']][$r['idperson']]['roles'][$r['role']] = $r[$GLOBALS['lng']];
}
} else { // ne pas classer => toute la distribution qui est dans spectacle_person
// si la personne est déjà dans infos, ajouter son role et écraser l'ancien
if (empty($params_search['multiple_result_by_person'])) {
$id = $r['idperson'];
} else {
$id = $i;
}
if (!isset($infos[$id])) {
$infos[$id] = $r;
}
$infos[$id]['view_name'] = mb_strtoupper($r['lastname']) . ' ' . $r['firstname'];
$infos[$id]['role'] = $r['fr']; //$GLOBALS['lng']
if (isset($r['comment'])) {
$infos[$id]['comment'] = $r['comment'];
$infos[$id]['more_infos'] = true; // le com ou les dates
}
foreach (array('start', 'end') as $f) {
if (!empty($r['date_' . $f])) {
$infos[$id]['more_infos'] = true; // le com ou les dates
$infos[$id]['date_' . $f] = $r['date_' . $f];
$infos[$id]['date_' . $f . '_string'] = $this->getFormeDate($r['date_' . $f], 'd/m/Y');
}
}
$infos[$id]['roles'][$r['role']] = $r['fr']; //$GLOBALS['lng']
}
$i++;
}
return $infos;
}
return array();
}
// }}}
// {{{ getSoutiens()
/** Récupèrer les soutiens JTN, ENSATT...
*
* @access public
* @param array tableau de données
*/
public function getSoutiens($idspectacle, $idclassifications = array())
{
$idclassifications = (!is_array($idclassifications)) ? array($idclassifications) : $idclassifications;
// rapprochement idcontact, idclassification
$sql = 'SELECT idclassification
FROM spectacle_classification WHERE 1 ';
if (!is_null($idspectacle) && is_numeric($idspectacle)) {
$sql .= 'AND idspectacle=' . (int)$idspectacle . ' ';
}
if (!empty($idclassifications)) {
$sql .= 'AND idclassification IN (' . join(',', $idclassifications) . ') ';
}
return $sql;
}
// }}}
// {{{ getDirectors()
/** Metteurs en scene
*
* Liste des metteurs en scene
*
* @access public
* @param int $idspectacle identifiant du spectacle
* @return array
* @see getPersonsByRole()
*/
public function getDirectors($idspectacle = null)
{
// on a deja l'id ?
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
return $this->getPersonsByRole($idspectacle, 'directors');
}
// }}}
// {{{ getAuthors()
/** Auteurs (tous, même collage)
*
* @access public
* @param int $idspectacle identifiant du spectacle
* @return array
*/
public function getAuthors($idspectacle = null)
{
// pourquoi ne pas aussi récup les auteurs des textes du montage ?
$sql = 'SELECT DISTINCT(p.`idperson`),p.`lastname`,p.`firstname`,p.`url_clean`
FROM persons p
JOIN text_author ta ON ta.`idperson`=p.`idperson`
JOIN text_spectacle ts ON ts.`idtext`=ta.`idtext`
WHERE ts.`idspectacle`=' . (int)$this->idspectacle;
return $authors = $this->queryAll($sql);
}
// }}}
// {{{ getDirectorsString()
/** Metteurs en scene au format texte
*
* Liste des metteurs en scene au format string
*
* @access public
* @param int $idspectacle identifiant du spectacle
* @return string
* @see getPersonsByRole()
*/
public function getDirectorsString($idspectacle = null, $directors = array())
{
// on a deja l'id ?
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
// on déjà les metteurs dans le tableau directors
if (!empty($director)) {
$tab = $directors;
} else {
$tab = $this->getPersonsByRole($idspectacle, 'directors');
}
$string = array();
foreach ($tab as $key => $value) {
$string[] = $value['firstname'] . ' ' . $value['lastname'] . ',';
}
return join(', ', $string);
}
// }}}
// {{{ getObjectTitle()
/** Titre d'un spectacle
*
* Retourne le titre du spectacle :
* - de la table 'spectacle' si c'est une adaptation
* - de la table texte si c'est une mise en scene 'simple'
*
* @access public
* @param int $idobject Identifiant de l'item
* @param array $infos_object Informations pour construire le titre
* @param array $params Paramétres supplémentaires
* @return string|array
*/
public function getObjectTitle($idobject = null, $infos_object = array(), $params = array())
{
// si on n'a pas passé l'id a la méthode, on doit-être dans une boucle
if (!$idobject) {
$idobject = $this->idspectacle;
}
$idobject = (int)$idobject;
// champs utile et virtuels
$fields = array('idspectacle', 'title', 'title_spectacle', 'url_clean', 'valid');
$fields_exists = array('idspectacle', 'title', 'url_clean', 'valid');
// si on a les valeurs
if (!empty($infos_object)) {
foreach ($fields as $k => $v) {
if (array_key_exists($v, $infos_object)) {
$infos[$v] = $infos_object[$v];
}
}
// si on a title_spectacle, il faut l'utiliser en titre
if (!empty($infos_object['title_spectacle'])) {
$infos['title'] = $infos_object['title_spectacle'];
}
} else { // si on n'a les valeurs dans une boucle
// si on n'a pas $this->title, c'est qu'il faut les infos
if (!isset($this->title)) {
$sql = 'SELECT ' . implode(',', $fields_exists) . '
FROM ' . $this->__table . '
WHERE ' . $this->__idtable . '=' . $idobject;
$infos = $this->queryRow($sql);
} else { // sinon, dans le tableau infos
foreach ($fields as $k => $v) {
if (isset($this->$v) && $this->$v != '') {
$infos[$v] = trim($this->$v);
}
}
}
}
// si le titre est vide on le cherche dans les texts
if (empty($infos['title'])) {
if (!isset($infos['idspectacle'])) {
return false;
}
$query = 'SELECT t.title FROM texts t, text_spectacle ts
WHERE t.idtext=ts.idtext AND ts.idspectacle=' . $infos['idspectacle'];
$infos['title'] = $this->queryOne($query);
}
// title
$title_view = $infos['title'];
// ajouter les metteurs en scène en chaine si demandé
if (array_key_exists('directors', $params)) {
$title_view .= ' - ' . $this->getDirectorsString($idobject);
$infos['title_directors'] = $title_view;
}
// renvoyer un array plutôt que le titre (utile si on veux l'url)
if (array_key_exists('return_array', $params)) {
return $infos;
}
return $title_view;
}
// }}}
// {{{ getListSearch()
/** Liste des spectacles
*
* Pour les champs Ajax de relations et les recherches diverses
* permet de générer un tabelau associatif des titres des textes en
* fonction de critères de recherche alphabétique ou mots clès
*
* @access public
* @param string $lettres Pour la recherche alphabetique
* @param string $keywords Recherche par mots cles
* @return array
*/
public function getListSearch($lettre, $type = null, $keywords = null)
{
// DB_DataObject::debugLevel(1);
$tr = $this->translator;
// requete
$sql = 'SELECT DISTINCT(s.idspectacle),s.title as titlespectacle,t.title as titletext,
pd.idperson as pdidperson,pd.lastname as pdlastname, pd.firstname as pdfirstname,
s.idtypespectacle, ty.typespectacle';
// table
$sql .= ' FROM spectacles s, texts t, text_spectacle ts, persons pd, spectacle_person sp, typesspectacles ty, roles r';
// conditions
$sql .= ' WHERE t.idtext=ts.idtext
AND sp.idrole=r.idrole
AND r.type_creator=1
AND s.idspectacle=ts.idspectacle
AND (sp.idperson=pd.idperson AND s.idspectacle=sp.idspectacle)
AND s.idtypespectacle=ty.idtypespectacle';
//echo 'LETTRE : $lettre - KEYWORDS : $keywords <br/>';
// par lettre
if (!empty($lettre)) {
$sql .= ' AND (LOWER(LEFT(LTRIM(s.title),1))=\'' . $this->escape($lettre) . '\' OR LOWER(LEFT(LTRIM(t.title),1))=\'' . $this->escape($lettre) . '\')';
}
// recherche avec un mot cle
$list = $this->splitKeywords($keywords);
if ($list) {
$subsql = '';
if (!empty($list[$this->IDSTR])) {
// mots clés
$ssubsql = '';
foreach ($list[$this->IDSTR] as $s) {
if ($ssubsql) $ssubsql .= ' AND ';
$ssubsql .= 's.title LIKE \'%' . $s . '%\'';
}
$subsql .= '(' . $ssubsql . ') OR ';
$ssubsql = '';
foreach ($list[$this->IDSTR] as $s) {
if ($ssubsql) $ssubsql .= ' AND ';
$ssubsql .= 't.title LIKE \'%' . $s . '%\'';
}
$subsql .= '(' . $ssubsql . ')';
}
if (!empty($list[$this->IDNUM])) {
// recherche par numéro d'id pour les mots clés numériques
if ($subsql) $subsql .= ' OR ';
$subsql .= 's.idspectacle IN (' . implode(',', $list[$this->IDNUM]) . ')';
}
if ($subsql) $sql .= ' AND (' . $subsql . ')';
}
//echo "SQL : $sql <br/>";
// executer la requete
$p = $this->query($sql);
// mettre en forme les resultats
$r = array();
foreach ($p as $spec) {
//id + titre + metteur en scene + type
$infos_spectacle = array(
'idspectacle' => $spec['idspectacle'],
'title' => $spec['titletext'],
'title_spectacle' => $spec['titlespectacle'],
);
$r[$spec['idspectacle']] = $this->getObjectTitle($spec['idspectacle'], $infos_spectacle) . ' - ' . $spec['pdlastname'] . ' ' . $spec['pdfirstname'] . ' - ';//.$tr->trans($spec['typespectacle'])
// si trouvé par id, on l'affiche en fin de titre
if (!empty($list[$this->IDNUM]) && in_array($spec['idspectacle'], $list[$this->IDNUM])) {
$r[$spec['idspectacle']] .= ' - n°' . $spec['idspectacle'];
}
}
return $r;
}
// }}}
// {{{ getItemsList()
/** Liste des items pour les champs relationnels
*
* Retourne un tableau associatif contenant la liste des items
* d'une relation. Exemple : getItemsList(4,'text_author'); retourne les noms
* et prénom des auteurs du texte numéro 4
*
* @access public
* @param string $type Ce qu'on recherche
* @param string $idtext L'id de l'objet
* @return array
*/
public function getItemsList($idobject, $type)
{
$itemslist = array();
// contact (liaison simple)
if ($type == 'idcontact_creation' || $type == 'idcontact_production') {
$query = 'SELECT c.`idcontact`, c.`lastname`, c.`firstname`, c.`url_clean`, c.`organisation`, c.`valid`
FROM contacts c, spectacles s
WHERE s.' . $type . '=c.`idcontact`
AND s.`idspectacle`=' . $idobject . ' ORDER BY c.lastname';
$p = $this->query($query);
// generer un exception
if (empty($p)) {
return [];
}
foreach ($p as $r) {
$itemslist[$r['idcontact']] = array(
'lastname' => $r['lastname'],
'firstname' => $r['firstname'],
'valid' => $r['valid'],
'organisation' => $r['organisation'],
'url_clean' => $r['url_clean']
);
}
// $p->free();
} // extranetusers (liaison simple)
elseif ($type == 'idextranetuser') {
return $this->getItemsListTrait($idobject, $type, 'extranetusers');
} // les multimedias associés à un contenu associé
elseif ($type == 'spectacle_classification') {
return $this->getItemsListTrait($idobject, $type, 'spectacles');
} // les multimedias associés à un contenu associé
elseif ($type == 'spectacle_trailer') {
return $this->getMultimediaList($idobject, $type);
} // textes liés
elseif ($type == 'text_spectacle') {
$itemslist = $this->getSpectacleText('all', $idobject, 1);
} // tous le reste
else {
// es-ce dans contact ou dans person ?
$roles = array(
'spectacle_director' => 'persons',
'spectacle_actor' => 'persons',
'spectacle_distrib' => 'persons',
'spectacle_prod' => 'contacts',
'spectacle_coprod' => 'contacts',
'spectacle_prodel' => 'contacts',
'spectacle_struct_diffusion' => 'contacts',
'spectacle_partenaire' => 'contacts',
);
if (array_key_exists($type, $roles)) {
if ($roles[$type] == 'contacts') {
$itemslist = $this->getContactsByRole($idobject, $type);
} else {
$itemslist = $this->getPersonsByRole($idobject, $type);
}
}
}
// mise en forme
if (!empty($itemslist) && is_array($itemslist)) {
foreach ($itemslist as $key => $value) {
if ($type == 'text_spectacle') { // c'est le texte
$itemslist[$key]['view_name'] = $value['title'];
} else {
if (!empty($value['organisation'])) { // c'est un contact
$itemslist[$key]['view_name'] = $value['organisation'];
} else { // c'est une personne
$itemslist[$key]['view_name'] = mb_strtoupper($value['lastname']) . ' ' . $value['firstname'];
}
}
}
}
return $itemslist;
}
// }}}
// {{{ getTypeList()
/** Liste des types de spectacles
*
* Retourne la liste des type de spectacle : mise en scene, mise en espace ...
*
* @access public
* @return array
*/
public function getTypeList()
{
$conn = $this->getEntityManager();
$tps = $conn->getRepository(Typesspectacles::class);
$x = $tps->findAll();
$type_list = array();
foreach ($x as $val) {
$type_list[$val->getIdtypespectacle()] = $GLOBALS['tr']->trans($val->getTypespectacle());
}
return $type_list;
}
// }}}
// {{{ setRole()
/** Enregistrement dans la table des personnes liees
*
* Permet l'enregistrement multiple de valeur dans la table
* de relation des comediens lies a un spectacle
*
* @access public
* @param string $idspectacle identifiant du spectacle
* @param string $idrole role
* @param array $array_values valeurs a inserer
* @param bool $contact il s'agit d'un contact ?
* @param bool $allRights les droits de faire ça ?
* @return bool
*/
public function setRole($idspectacle, $idrole, $array_values, $contact = null, $allRights = true)
{
$idspectacle = (int)$idspectacle;
$idrole = (int)$idrole;
if ($allRights) {
$rights = array('update' => 1);
}
if ($this->setCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['update'] == 1) {
if (!empty($contact)) {
$table = 'spectacle_contact';
} else {
$table = 'spectacle_person';
}
// on supprime puis on insere (replace ne marche pas)
$del = $this->_em->getConnection()->executeQuery('DELETE FROM ' . $table . ' WHERE idspectacle=' . $idspectacle . ' AND idrole=' . $idrole . ' ');
if (!empty($array_values)) {
if (!empty($contact)) {
$sql = 'INSERT INTO ' . $table . ' (idspectacle, idcontact, idrole) VALUES ( ?, ?, ?)';
} else {
// si 5 clé = extended pour un role
foreach ($array_values as $k => $v) {
if (is_array($v) && (count($v) == 5 || count($v) == 4)) {
$sql = 'INSERT INTO ' . $table . ' (idspectacle, idperson, idrole, comment, date_start, date_end) VALUES ( ?, ?, ?, ?, ?, ?)';
$extended = true;
} else {
$sql = 'INSERT INTO ' . $table . ' (idspectacle, idperson, idrole) VALUES ( ?, ?, ?)';
}
break;
}
}
$prep = $this->_em->getConnection()->prepare($sql);
if (!empty($extended)) {
foreach ($array_values as $key => $value) {
foreach (array('start', 'end') as $f) {
if (strpos($value['date_' . $f], '/') !== false) {
$value['date_' . $f] = $this->getFormeDate($value['date_' . $f], 'Y-m-d');
}
}
if (empty($value['date_start']) && !empty($value['date_end'])) {
$value['date_start'] = $value['date_end'];
}
if (empty($value['date_end']) && !empty($value['date_start'])) {
$value['date_end'] = $value['date_start'];
}
if (empty($value['date_start'])) {
$value['date_start'] = null;
}
if (empty($value['date_end'])) {
$value['date_end'] = null;
}
$prep_values[] = array($idspectacle, $value['idperson'], $idrole, $value['comment'], $value['date_start'], $value['date_end']);
}
} else {
foreach ($array_values as $key => $idperson) {
$prep_values[] = array($idspectacle, $idperson, $idrole);
}
}
foreach ($prep_values as $value) {
$res = $prep->execute($value);
}
return true;
}
} else {
throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
}
}
// }}}
// {{{ setDistribution()
/** Enregistrement dans la table des personnes liees
*
* Permet l'enregistrement multiple de valeur dans la table
* de relation des comediens lies a un spectacle
*
* @access public
* @param string $idspectacle identifiant du spectacle
* @param array $array_values valeurs a inserer
* @param bool $allRights les droits de faire ça ?
* @return bool
*/
public function setDistribution($idspectacle, $array_values, $allRights = true, $type_creator = false)
{
$idspectacle = (int)$idspectacle;
if ($allRights) {
$rights = array('update' => 1);
}
if ($this->setCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['update'] == 1) {
$table = 'spectacle_person';
// on supprime puis on insere (replace ne marche pas)
// acteur => on supprime tout ce qui a un role avec un type egla a 1
if (!$type_creator) {
$sql = 'DELETE FROM ' . $table . ' WHERE idspectacle=' . $idspectacle . ' AND idrole NOT IN (
(SELECT idrole FROM roles WHERE type=0)
)';
// createur => on supprime avec type_creator=1
} else {
$sql = 'DELETE FROM ' . $table . ' WHERE idspectacle=' . $idspectacle . ' AND idrole NOT IN (
(SELECT idrole FROM roles WHERE type_creator=0)
)';
}
$del = $this->execute($sql);
if (!empty($array_values)) {
// pour le type creator, on va enregistrer le classement également
if (!$type_creator) {
// si 5 clé = extended pour un role
foreach ($array_values as $k => $v) {
if (count($v) == 5 || count($v) == 4) {
$sql = 'INSERT INTO ' . $table . ' (idspectacle, idperson, idrole, comment, date_start, date_end) VALUES ( ?, ?, ?, ?, ?, ?)';
$extended = true;
} else {
$sql = 'INSERT INTO ' . $table . ' (idspectacle, idperson, idrole) VALUES ( ?, ?, ?)';
}
break;
}
$prep = $this->_em->getConnection()->prepare($sql);
if (!empty($extended)) {
foreach ($array_values as $key => $value) {
foreach (array('start', 'end') as $f) {
if (strpos($value['date_' . $f], '/') !== false) {
$value['date_' . $f] = $this->getFormeDate($value['date_' . $f], 'Y-m-d');
}
}
if (empty($value['date_start']) && !empty($value['date_end'])) {
$value['date_start'] = $value['date_end'];
}
if (empty($value['date_end']) && !empty($value['date_start'])) {
$value['date_end'] = $value['date_start'];
}
if (empty($value['date_start'])) {
$value['date_start'] = null;
}
if (empty($value['date_end'])) {
$value['date_end'] = null;
}
if (empty($value['comment'])) {
$value['comment'] = '';
}
$prep_values[] = array($idspectacle, $value['idperson'], $value['role'], $value['comment'], $value['date_start'], $value['date_end']);
}
} else {
foreach ($array_values as $key => $value) {
$prep_values[] = array($idspectacle, $value['idperson'], $value['role']);
}
}
} else {
// $prep = $this->prepare('INSERT INTO '.$table.' (idspectacle, idperson, idrole, classement) VALUES ( ?, ?, ?, ?)');
$prep = $this->_em->getConnection()->prepare('INSERT INTO ' . $table . ' (idspectacle, idperson, idrole, classement) VALUES ( ?, ?, ?, ?)');
$i = 1;
foreach ($array_values as $key => $value) {
$prep_values[] = array($idspectacle, $value['idperson'], $value['role'], $i);
$i++;
}
}
foreach ($prep_values as $value) {
$res = $prep->execute($value);
}
// $res = $this->executeMultiple($prep, $prep_values);
return true;
}
} else {
throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
}
}
// }}}
// {{{ setSpectacleAuthor()
/** Liaison directe entre un spectacle et les auteurs du/des texte(s)
*
* Permet l'enregistrement multiple de valeur dans la table
* de relation
*
* @access public
* @param string $idspectacle identifiant du spectacle
* @param array $array_values valeurs a inserer
* @param bool $allRights les droits de faire ça ?
* @return bool
*/
public function setSpectacleAuthor($idspectacle, $allRights = true)
{
$idspectacle = (int)$idspectacle;
if ($allRights) {
$rights = array('update' => 1);
}
if ($this->setCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['update'] == 1) {
// récupèrer les auteurs des textes associés au spectacle
$texts = $this->getSpectacleText(true, $idspectacle);
if (empty($texts)) {
return false;
}
foreach ($texts as $text) {
// $authors = Theatre::factory('texts')->getAuthors($text['idtext'],$text['type']);
// if(!empty($authors)) {
// foreach($authors as $k=>$v) {
// $idpersons[$v['idperson']] = $v['idperson'];
// }
// }
}
$table = 'spectacle_author';
// on supprime puis on insere (replace ne marche pas)
$sql = 'DELETE FROM ' . $table . ' WHERE idspectacle=' . $idspectacle;
$del = $this->query($sql);
if (!empty($authors)) {
$prep = $this->prepare('INSERT INTO ' . $table . ' (idspectacle, idperson) VALUES ( ?, ?)');
foreach ($authors as $key => $value) {
$prep_values[] = array($idspectacle, $value['idperson']);
}
$res = $this->executeMultiple($prep, $prep_values);
return true;
}
} else {
throw new \Exception($GLOBALS['tr']->trans('no_rights') . ' setData-update');
}
}
// }}}
// {{{ orderByDefaut()
/** Classement par défaut
*
* Défini le tri par défaut pour les requêtes de type SELECT
*
* @access public
* @return string
*/
public function orderByDefaut($order = null)
{
// tri par défaut
if (empty($order)) {
$order = 'idspectacle';
}
return $order;
}
// }}}
// {{{ getTranslateTitle()
/** Titre du spectacle traduit
*
* Donne le titre d'un spectacle dans une langue donné
* @access public
* @return string
*/
public function getTranslateTitle($idspectacle = null, $lng = null)
{
$idspectacle = (int)$idspectacle;
// il faut d'abord trouver l'identifiant du texte li矡u spectacle
$idtext = $this->queryOne('SELECT idtext FROM text_spectacle WHERE idspectacle=' . $idspectacle);
//Ensuite on va cherche le titre dans la langue
$sql = 'SELECT texts.title
FROM texts, text_traduction
WHERE texts.idtext=text_traduction.idtexttraduction
AND texts.language=\'' . $lng . '\' AND text_traduction.idtext=' . ((int)$idtext);
$res = $this->query($sql);
if ($res->numRows() > 0) {
while ($row = $res->fetchRow()) {
$result = $row['title'];
}
} else { // aucun titre pour ce spectacle
$result = '';
}
// et voila l'travail!
return $result;
}
// }}}
// {{{ getSpectacleCountryList()
/** Récupère la liste des pays dans lesquels sont répertorié des spectacles pour un auteur donné
*
* @access public
* @param int idperson - identifiant de l'auteur
* @see getCountry()
* @return array
*/
public function getSpectacleCountryList($order = true, $idperson)
{
$idperson = (int)$idperson;
$sql = 'SELECT DISTINCT(ct.id), ct.' . $GLOBALS['lng'] . '
FROM countries ct, spectacles s, schedules sc, contacts c, text_spectacle ts, text_traduction tt, text_author ta
WHERE ct.id=c.country
AND sc.idcontact=c.idcontact
AND s.idspectacle=sc.idspectacle
AND s.idspectacle=ts.idspectacle
AND ts.idtext=tt.idtexttraduction
AND tt.idtext=ta.idtext
AND ta.idperson=' . $idperson . '
ORDER BY ct.' . $GLOBALS['lng'];
$res = $this->queryAll($sql, array(), null, true);
$country_list = $res;
if ($order) {
$tr = $GLOBALS['tr'];
array_unshift($country_list, $tr->trans('form_def_country'));
}
return $country_list;
}
// }}}
// {{{ getVignetteSpectacle()
/** Récupère la vignette d'un spectacle ou la cree si besoin
*
* @access public
* param int idspectacle identifiant du spectacle
* param array format $format de la vignette
* @return string
*/
public function getVignetteSpectacle($idspectacle = null, $format = array())
{
// id du spectacle
if (empty($idspectacle)) {
$idspectacle = $this->idspectacle;
}
$idspectacle = (int)$idspectacle;
// par default : image arrondie crop 100px x 100px qualite 75
if (!empty($format)) {
$set_format = $format;
} else {
$set_format = array('width' => $_ENV['VIGN_SPECTACLE_WIDTH'], 'height' => $_ENV['VIGN_SPECTACLE_HEIGHT'], 'direction' => 'crop');
// TODO: supprimé la condition et faire sauter lors de la V2
if ($GLOBALS['module'] == 'thnet_old') {
$set_format['forme'] = 'round';
}
}
$this->images->setVignetteFormat($set_format);
return $this->images->getVignetteObject($idspectacle, 'spectacles', 'class_affiche_spec', null, $this->publish_status);
}
// }}}
// {{{ getInfosSpectacleRow()
/** Infos standard sur un spectacle
*
* Cette méthode peut-être utilisée dans les boucle while/fetch et récupère
* la plus part des infos utiles dans les listes de résultats
*
* @access public
* @param array $format_vignette Format des vignettes
* @return array
*/
public function getInfosSpectacleRow($format_vignette = null, $format_vignette_video = null, $date_debut_recherche = null, $params = array())
{
$con = $this->getEntityManager();
$spec = array();
$idspectacle = $this->idspectacle;
$spec['idspectacle'] = $idspectacle;
$spec['url_clean'] = (!empty($this->urlClean)) ? $this->urlClean : $this->url_clean;
if (isset($this->country)) {
$spec['country'] = $this->country;
} else {
$spec['country'] = 'FR';
}
if (isset($this->textfictif)) {
$spec['textfictif'] = $this->textfictif;
}
// lieu de création
if (isset($this->idcontact_creation)) {
$spec['idcontact_creation'] = $this->idcontact_creation;
}
// date de creation
$creationDate = (!empty($this->creation_date)) ? $this->creation_date : $this->creationDate;
if (isset($creationDate) && $creationDate != '0000-00-00' && $creationDate != null) {
$spec['creation_date'] = $this->getFormeDate($creationDate, $GLOBALS['format_date'][$GLOBALS['lng']]);
$spec['creation_date_us'] = $creationDate;
}
$spec['annee_creation'] = $this->getFormeDate($creationDate, 'Y');
// statut
$spec['statut'] = 0;
if (isset($this->statut)) {
$spec['statut'] = $this->statut;
}
// publié ou pas
if (isset($this->publish)) {
$spec['publish'] = $this->publish;
}
// date de création/modification de la fiche
if (isset($this->dateinsert)) {
$spec['dateinsert'] = $this->dateinsert;
$spec['dateinsert_lng'] = $this->getFormeDate($this->dateinsert, $GLOBALS['format_date'][$GLOBALS['lng']]);
$spec['dateinsert_hour_lng'] = $this->getFormeDate($this->dateinsert, 'H:i');
}
if (isset($this->dateupdate)) {
$spec['dateupdate_lng'] = $this->getFormeDate($this->dateupdate, $GLOBALS['format_date'][$GLOBALS['lng']]);
}
if (isset($this->idtypespectacle)) {
$spec['idtypespectacle'] = $this->idtypespectacle;
}
if (isset($this->idtypespectacle)) {
$tps = $this->getEntityManager()->getRepository(Typesspectacles::class);
$typespectacle = $tps->findOneBy(['idtypespectacle' => $this->idtypespectacle]);
$spec['typespectacle'] = $GLOBALS['tr']->trans($typespectacle->getTypespectacle());
} else { // si pas de type
$spec['typespectacle'] = $GLOBALS['tr']->trans('liste_type_mes');
}
if (!empty($this->title)) {
$spec['title'] = $this->title;
$spec['shorten_title'] = $this->title;
$spec['collage'] = true;
// récupèrer quand même les auteurs !
$spec['allauthors'] = $this->noPunct($this->getAuthors($this->idspectacle));
if (empty($spec['allauthors'])) {
$aut = $con->getRepository(Texts::class); // trouver les auteurs du texte
if (!empty($this->text_spectacle)) {
$spec['allauthors'] = $this->noPunct($aut->getAuthors($this->text_spectacle[0]['idtext'], $this->type ?? null));
} else {
$spec['allauthors'] = $this->noPunct($aut->getAuthors($this->idtext, $this->type ?? null));
}
// on doit vérifier que l'un des textes du collage n'est pas une traduction car dans ce cas,
// les auteurs sont enregistrés sur la traduction
}
} else {
if (empty($this->titletext) || !empty($this->text_spectacle)) {
$this->titletext = $titletext = $spec['title'] = $this->text_spectacle[0]['title'];
$type = $this->text_spectacle[0]['type'];
$idtext = $spec['idtext'] = $this->text_spectacle[0]['idtext'];
$spec['shorten_title'] = (strlen($titletext) >= 50) ? substr($titletext, 0, 50) . " ..." : $titletext;
} else {
$spec['title'] = $this->titletext;
$spec['shorten_title'] = (strlen($this->titletext) >= 50) ? substr($this->titletext, 0, 50) . " ..." : $this->titletext;
$spec['idtext'] = $idtext = $this->idtext;
}
$aut = $con->getRepository(Texts::class); // trouver les auteurs du texte
$x = $spec['allauthors'] = $this->noPunct($aut->getAuthors($idtext, $type));
if (!is_null($x) && count($spec['allauthors']) > 4) {
$spec['collectifauteurs'] = count($spec['allauthors']);
}
// si l'auteur est celui demandé
if (!is_null($x) && count($spec['allauthors']) == 1 && !empty($params['param_sql']['is_author'])) {
$spec['is_author'] = true;
}
// si c'est une adaptation
if ($type == 2) {
$spec['adaptation'] = true;
// les adaptations
if (!empty($this->params_sql['special']['get_adaptation_originals']) && !empty($spec['allauthors'])) {
foreach ($spec['allauthors'] as $k => $v) {
$original_texts = $con->getRepository(Texts::class)->getOriginalsTexts($v['idtext'], 'text_adaptation', 'idtextadaptation', array('get_authors' => true));
$spec['adaptation'] = $original_texts;
}
}
}
// on veux les traducteurs ?
if (isset($this->type_traduction) && $this->type_traduction == 1) {
$spec['alltranslators'] = $this->noPunct($aut->getTranslators($idtext, $this->type_traduction));
if (count($spec['alltranslators']) > 2) {
$spec['collectiftranslators'] = count($spec['alltranslators']);
}
}
}
//titre on rentre le titre du spectacle et le titre du text
// paramètres de recherche des dsitributions
$params_search_persons['all'] = true;
// les élèves
if (!empty($this->params_sql['special']['get_eleves'])) {
$params_search_persons['eleves'] = $this->params_sql['special']['get_eleves'];
}
// récupèrer toutes les personnes associées au spectacle et leurs roles et classer par roles
$distributions = $this->getPersonsByRole($idspectacle, null, $params_search_persons);
// metteurs en scènes
if (!empty($spec['textfictif']) && $spec['textfictif'] == 1) {
$x = $spec['alldirectors'] = $this->getDirectors($idspectacle);
} else {
if (!empty($distributions['role_director'])) {
// si plus de 3 metteurs en scènes
if (count($distributions['role_director']) > 3) {
$spec['collectifdirectors'] = count($distributions['role_director']);
}
$spec['alldirectors'] = $this->noPunct($distributions['role_director']);
}
}
// acteurs
if (!empty($this->params_sql['special']['get_actors'])) {
if (!empty($distributions['role_comedien'])) {
$spec['allactors'] = $distributions['role_comedien'];
}
}
// on souhaite récupèrer également la distribution
if (!empty($this->params_sql['special']['get_distributions'])) {
if (!empty($distributions['distributions'])) {
$spec['distributions'] = $distributions['distributions'];
}
}
if (!empty($this->params_sql['special']['get_eleves'])) {
if ($this->params_sql['special']['get_eleves'] == 'all') {
foreach ($distributions as $d) {
foreach ($d as $k => $v) {
if (!empty($v['ecoles'])) {
$spec['eleves'][$v['idperson']] = $v;
}
}
}
} elseif (isset($this->params_sql['special']['get_eleves']['idcontact'])) {
// on doit trouver les personnes qui sont élèves du contact
// parcourir la distributions
foreach ($distributions as $d) {
foreach ($d as $k => $v) {
if (isset($v['ecoles'][$this->params_sql['special']['get_eleves']['idcontact']])) {
$spec['eleves'][$v['idperson']] = $v;
}
}
}
}
}
// url du texte
if (!empty($this->url_clean_text)) {
$spec['url_clean_text'] = $this->url_clean_text;
}
if (!empty($this->idmultimedia)) {
$spec['idmultimedia'] = $this->idmultimedia[0]['idmultimedia'];
}
// si vignette du spectacles
if ($format_vignette && is_array($format_vignette)) {
// version mobile
if (isset($_GET['mobile'])) {
$format_vignette = array('width' => 115, 'height' => 115, 'direction' => 'crop');
}
$spec['vignette_affiche'] = $this->getVignetteSpectacle($idspectacle, $format_vignette);
$format_vignette['blur'] = true;
$spec['vignette_affiche_flou'] = $this->getVignetteSpectacle($idspectacle, $format_vignette);
}
// trouver la date et le lieu le plus proche
if (!empty($this->params_sql['special']['anciens']) || !empty($this->params_sql['special']['anciens_stricts'])) {
$periode = array('anciens' => true);
} elseif (!empty($this->params_sql['special']['plus_proche'])) { // la date la plus proche passée ou future
$periode = array('plus_proche' => true);
} elseif (!empty($this->params_sql['special']['date_creation'])) {
} else { // la premiere date future
$periode = array('prochains' => true);
}
// definir un début de recherche
if ($date_debut_recherche) {
$periode['depuis_le'] = $date_debut_recherche;
}
// recherche les dates uniquement dans un lieu
if (!empty($this->params_sql['special']['idcontact'])) {
$idcontact = $this->params_sql['special']['idcontact'];
} else {
$idcontact = null;
}
// recherche les dates dans un festival
if (!empty($this->params_sql['special']['type_contact'])) {
$type_contact = $this->params_sql['special']['type_contact'];
} else {
$type_contact = 'idcontact';
}
if (!empty($this->params_sql['special']['structures_specifiques'])) {
$periode['structures_specifiques'] = $this->params_sql['special']['structures_specifiques'];
}
if (!empty($this->params_sql['special']['get_schedule_ville'])) {
$periode['area'] = $this->params_sql['special']['get_schedule_ville'];
}
// ajoute les infos sur les dates et lieux prochains
$proch_dates = $this->getProchDateLieu($periode, $idspectacle, $idcontact, 'idcontact'); //$type_contact
if (empty($proch_dates) && $type_contact == 'idcontactFestival') {
$proch_dates = $this->getProchDateLieu($periode, $idspectacle, $idcontact, $type_contact); //idcontact
}
if (!empty($proch_dates)) {
$spec += $proch_dates;
}
// veux t'on un contenu associé ou un contenu associé multimedia ?
if (!empty($this->params_sql['special']['contenus_associes'])
|| !empty($this->params_sql['special']['contenus_associes_multimedias'])) {
// chercher le dernier contenu associés
$sql_select_from = 'SELECT ct.title, ct.idcontent,MAX(ct.dateinsert) as dateinsert,cm.page,cm.parent,cm.param
FROM contents ct
JOIN object_content oc ON oc.idcontent=ct.idcontent
JOIN content_classification cc ON oc.idcontent=cc.idcontent
JOIN classifications cl ON cl.idclassification=cc.idclassification
JOIN classification_module cm ON cm.idclassification=cl.idclassification ';
$sql_where = '
WHERE 1
AND oc.idobject=' . ((int)$this->idspectacle) . '
AND oc.object=\'spectacles\'
AND ct.language=\'fr\' ';
if (!empty($this->params_sql['special']['classification_module'])) {
$sql_where .= ' AND cm.module=\'' . $this->escape($this->params_sql['special']['classification_module']) . '\' ';
} else {
$sql_where .= ' AND cm.module=\'' . $this->escape($GLOBALS['module']) . '\' ';
}
// pour le multimedia, jointure avec multimedia via object_multimedia
if (!empty($this->params_sql['special']['contenus_associes_multimedias'])) {
$sql_select_from .= '
JOIN object_multimedia om ON om.idobject=ct.idcontent ';
$sql_where .= '
AND om.object=\'contents\'
AND ct.display_media=1';
// on exclu certains multimedias
if (isset($this->params_sql['special']['multimedias_exclude']) && is_array($this->params_sql['special']['multimedias_exclude'])) {
$sql_where .= ' AND om.idmultimedia NOT IN (' . join(',', $this->params_sql['special']['multimedias_exclude']) . ')';
}
// on met une priorité sur certains documents multimedia TODO
if (!empty($this->params_sql['special']['where_contenus_associes_multimedias'])) {
$sql_where .= $this->params_sql['special']['where_contenus_associes_multimedias'];
}
}
$sql_contenus_associes = $sql_select_from . $sql_where;
try {
$contenus = $this->queryRow($sql_contenus_associes);
if (!empty(contenu)) {
$spec['content'] = $contenus;
// construire l'url_clean du contenu associe
$spec['content']['url_clean'] = $spec['url_clean'] . '/';
if (!empty($contenus['parent'])) {
$spec['content']['url_clean'] .= $contenus['parent'] . '/';
}
if (!empty($contenus['param'])) {
$spec['content']['url_clean'] .= $contenus['param'] . '/';
}
$spec['content']['url_clean'] .= $contenus['page'] . '/idcontent/' . $contenus['idcontent'];
}
} catch (\Throwable $e) {
}
}
// pour les contenus multimedias, voir si plusieurs documents multimedias associés
if (!empty($this->params_sql['special']['contenus_associes_multimedias'])) {
// classe multimedias
if (!isset($this->multimedias)) {
$this->multimedias = $this->getEntityManager()->getRepository(Multimedias::class);
}
// trouver le multimedia le plus récent associé au contenu associé
$sql_multimedias = 'SELECT m.idmultimedia, MAX(m.dateinsert)
FROM multimedias m
JOIN object_multimedia om ON om.idmultimedia=m.idmultimedia
WHERE 1
AND om.idobject=' . ((int)$contenus['idcontent']) . '
AND om.object=\'contents\' ';
// on met une priorité sur certains documents multimedia TODO
if (!empty($this->params_sql['special']['where_contenus_associes_multimedias'])) {
$sql_multimedias .= $this->params_sql['special']['where_contenus_associes_multimedias'];
}
$multimedias_associes = $this->queryRow($sql_multimedias);
$spec['multimedia']['vignette'] = $this->multimedias->getVignetteMultimedia($multimedias_associes['idmultimedia'], $format_vignette_video);
$format_vignette_video_flou = $format_vignette_video;
$format_vignette_video_flou['blur'] = true;
$spec['multimedia']['vignette_flou'] = $this->multimedias->getVignetteMultimedia($multimedias_associes['idmultimedia'], $format_vignette_video_flou);
$spec['multimedia']['idmultimedia'] = $multimedias_associes['idmultimedia'];
}
return $spec;
}
// }}}
// {{{ getProchDateLieu()
/** Lieu et date d'un spectacle
*
* Pour un spectacle, la prochaine date et ville pour (au choix) :
* - un contact donné
* - une date passée ou future
*
* @access public
* @param string $periode futur ou passé ?
* @param int $idspectacle identifiant du spectacle
* @param int $idcontact date spécifiquement dans un lieu ?
* @param string $type_contact Recherche spécifique aux dates dans un festival
* @return array
*/
public function getProchDateLieu($periode = array('prochains' => true), $idspectacle, $idcontact = null, $type_contact = 'idcontact')
{
// trouver la date et le lieu le plus proche dans le futur ou le passé
if (!array_key_exists('plus_proche', $periode)) {
if (isset($this->lastdate) || array_key_exists('anciens', $periode)) {
$eq = '<';
$tri = 'DESC';
} else {
$eq = '>=';
$tri = 'ASC';
}
}
// 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é
if (array_key_exists('depuis_le', $periode)) {
$date_debut_recherche = $periode['depuis_le'];
} else {
$date_debut_recherche = date('Y-m-d');
}
// le from commun pour date et periode
$from_commun = ' FROM schedules sc, contacts c
WHERE sc.' . $type_contact . '=c.idcontact
AND sc.idspectacle=' . ((int)$idspectacle);
// recherche de la date la plus proche passé ou future
$sql_prochdate = 'SELECT sc.date, c.* ' . $from_commun;
$con = $this->getEntityManager();
$queryBuilder = $con->getRepository(Schedules::class)->createQueryBuilder('sc');
$queryBuilder->select('sc, contacts, MIN(sc.date) AS datestart, MAX(sc.date) AS dateend');
$queryBuilder->leftJoin('sc.idcontact', 'contacts');
$queryBuilder->andWhere('sc.idspectacle = :idspectacle');
$queryBuilder->setParameter('idspectacle', $idspectacle);
// init
$sql_more = null;
// on cherche sur une date passé ou future => pas la plus proche
if (!empty($eq)) {
// $sql_more .= ' AND sc.date'.$eq.'\''.$date_debut_recherche.'\' ';
$queryBuilder->andWhere('sc.date ' . $eq . ' :date');
$queryBuilder->setParameter('date', $date_debut_recherche);
}
// uniquement dans un ou plusieurs lieux
if ($idcontact) {
if (is_array($idcontact)) {
$queryBuilder->andWhere('sc.' . $type_contact . ' IN (:idcontact)');
$queryBuilder->setParameter('idcontact', $idcontact);
} else {
$queryBuilder->andWhere('sc.' . $type_contact . ' = :idcontact');
$queryBuilder->setParameter('idcontact', $idcontact);
}
}
// une structure ?
if (array_key_exists('structures_specifiques', $periode)) {
//incertains
if (is_array($periode['structures_specifiques'])) {
// $sql_more .= ' AND c.idtypestructure IN ('.join(',', $periode['structures_specifiques']).')';
$queryBuilder->andWhere('contacts.idtypestructure IN (:idtypestructure)');
$queryBuilder->setParameter('idtypestructure', $periode['structures_specifiques']);
} else {
// $sql_more .= ' AND c.idtypestructure=\''.$periode['structures_specifiques'].'\' ';
$queryBuilder->andWhere('contacts.idtypestructure = :idtypestructure');
$queryBuilder->setParameter('idtypestructure', $periode['structures_specifiques']);
}
}
// sur une zone geographique précise
if (isset($this->zone_recherche['zip'])) {
$zip_sql = $this->zone_recherche['zip'];
$queryBuilder->andWhere($zip_sql);
} else if (!empty($periode['area'])) {
$bigRegions = $con->getRepository(Bigregions::class);
$area_sql = $bigRegions->getZipCode($periode['area']);
if (empty($area_sql)) {
return false;
}
$queryBuilder->andWhere($area_sql);
}
// classement et limitation des résultats
if (array_key_exists('plus_proche', $periode)) {
// dump('revoir le order by ligne 2353');
/* @TODO : il manque SIGN() ICI pour les spectacles plus proches */
$queryBuilder->addSelect('DATE_DIFF(\'' . $date_debut_recherche . '\', sc.date) AS HIDDEN dateDiffSIGN, ABS(DATE_DIFF(\'' . $date_debut_recherche . '\', sc.date)) AS HIDDEN dateDiffABS');
$queryBuilder->orderBy('dateDiffSIGN ASC, dateDiffABS');
// 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.'
// $sql_prochdate_limit = ' ORDER BY SIGN(DATEDIFF(\''.$date_debut_recherche.'\', sc.`date`)) ASC, ABS (DATEDIFF(\''.$date_debut_recherche.'\', sc.`date`))';
} else {
// on tri par date et on ne prends que le premier pour le début de la période
$queryBuilder->orderBy('sc.date', $tri);
}
$queryBuilder->groupBy('sc.' . $type_contact);
$queryBuilder->setMaxResults(1);
$query = $queryBuilder->getQuery();
$prochedate_periode = $query->getOneOrNullResult();
if (!is_null($prochedate_periode)) {
$prochdate = $prochedate_periode[0];
$spec = []; //TODO TEMPORAIRE
if (!empty($prochdate->getDate())) {
// debut et fin de la période en timestamp
$prochedate_periode['datestart_std'] = $prochedate_periode['datestart'];
$prochedate_periode['dateend_std'] = $prochedate_periode['dateend'];
// // début et fin de la période en français
$prochedate_periode['datestart'] = $this->getFormeDate($prochedate_periode['datestart'], "%a %d/%m/%y", true);
$prochedate_periode['dateend'] = $this->getFormeDate($prochedate_periode['dateend'], "%a %d/%m/%y", true);
// // si date start est égale a dateend, alors on a qu'une date
if ($prochedate_periode['datestart_std'] === $prochedate_periode['dateend_std']) {
$prochedate_periode['datestart'] = null;
}
if (empty($prochedate_periode['datestart'])) {
$spec['prochdate'] = $prochedate_periode['dateend'];
$spec['prochdate_std'] = $prochedate_periode['dateend_std'];
$spec['country'] = $prochdate->getContact()
? ($prochdate->getContact()->getCountry()
? $prochdate->getContact()->getCountry()->getId()
: null
) : null;
} else {
$spec['periode'] = $prochedate_periode;
$spec['prochdate'] = null;
}
// // la ville et le pays de la prochaine date ou de la période
$spec['city'] = $prochdate->getContact()
? $prochdate->getContact()->getCity()
: null;
$spec['zip'] = $prochdate->getContact()
? $prochdate->getContact()->getZip()
: null;
$spec['country'] = $prochdate->getContact()
? $prochdate->getContact()->getCountry()
: null;
// date standard
$spec['date_std'] = $prochdate->getDate();
// infos sur le contact
if ($prochdate->getContact() && !empty($prochdate->getContact()->getOrganisation())) {
$spec['contact'] = array(
'organisation' => $prochdate->getContact()->getOrganisation(),
'idcontact' => $prochdate->getContact()->getIdcontact(),
'url_clean' => $prochdate->getContact()->getUrlClean(),
'nom_suite' => $prochdate->getContact()->getNomSuite(),
'zip' => $prochdate->getContact()->getZip(),
'x' => $prochdate->getContact()->getX(),
'y' => $prochdate->getContact()->getY(),
);
}
return $spec;
}
}
return array();
}
// }}}
// {{{ setZoneRecherche()
/** Zone de recherche d'un spectacle
*
* @access public
* @param array $zone Zone de recherche
* @return array
*/
public function setZoneRecherche($zone)
{
if (!$zone) {
unset($this->zone_recherche['zip']);
} else {
$this->zone_recherche['zip'] = $zone;
}
}
// }}}
// {{{ countListSpectacles()
/** Compter la liste des spectacles
*
* @access public
* @param array $params_sql paramètre pour la requete SQL
* @param bool $debug mode débugage
* @return int
*/
public function countListSpectacles($params_sql = null, $debug = false)
{
// est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
$date_debut_recherche = null;
if (isset($params_sql['special']['depuis_le'])) {
$date_debut_recherche = $this->getFormeDate($params_sql['special']['depuis_le']);
}
// si pas de tableau
if (!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if (!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// si pas de limite => tout
if (empty($params_sql['params']['limit'])) {
$params_sql['params']['limit'] = 'all';
}
$params_sql['special']['count_only'] = true;
if (!empty($params_sql['dbg'])) {
$params_sql['dbg'][0] = 'count_spectacles_' . $params_sql['dbg'][0];
$params_sql['dbg'][1] = 'Comptage : ' . $params_sql['dbg'][1];
} else {
$params_sql['dbg'] = array('count_spectacles_' . uniqid(), 'Comptage spectacles');
}
// construction de la requête avec le passage de paramètres
$query = $this->getSQLSpectacles($params_sql['params'], $params_sql['special']);
$query->enableResultCache();
$totals = $query->getSingleResult(Query::HYDRATE_SCALAR);
if (!empty($totals)) {
return $totals['total'];
} else {
return 0;
}
}
// }}}
// {{{ countListSchedules()
/** Compter la liste des dates
*
* @access public
* @param array $params_sql paramètre pour la requete SQL
* @param bool $debug mode débugage
* @return int
*/
public function countListSchedules($params_sql = null, $debug = false)
{
// est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
if (isset($params_sql['special']['depuis_le'])) {
$date_debut_recherche = $this->getFormeDate($params_sql['special']['depuis_le']);
} else {
$date_debut_recherche = null;
}
// si pas de tableau
if (!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if (!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// si pas de limite => tout
// if(empty($params_sql['params']['limit'])) {
$params_sql['params']['limit'] = 'all';
// }
$params_sql['special']['count_only'] = true;
$params_sql['special']['count_schedule'] = true;
if (!empty($params_sql['dbg'])) {
$params_sql['dbg'][0] = 'count_schedule_' . $params_sql['dbg'][0];
$params_sql['dbg'][1] = 'Comptage : ' . $params_sql['dbg'][1];
} else {
$params_sql['dbg'] = array('count_schedule_' . uniqid(), 'Comptage dates');
}
// construction de la requête avec le passage de paramètres
$query = $this->getSQLSpectacles($params_sql['params'], $params_sql['special']);
return $query->getSingleResult(Query::HYDRATE_SCALAR)['total'];
}
// }}}
/* Get recommanded spectacles according to recommandations number
if $recommandationsNb === 1 : query all recommanded spectacles
*/
public function getRecommandedSpectacles(int $recommandationsNb, array $limit): array
{
$this->em = $this->getEntityManager();
$queryBuilder = $this->em->getRepository(Spectacles::class)->createQueryBuilder('s');
$queryBuilder->select('s.idspectacle');
if ($recommandationsNb !== 1) {
$queryBuilder->addSelect('COUNT(sa.idaide) as HIDDEN nb');
}
$queryBuilder->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->where('ac.title LIKE \'Spectacle recommandé\'');
if ($recommandationsNb !== 1) {
$queryBuilder
->groupBy('s')
->having('nb = :recommandationsNb')
->setParameter(':recommandationsNb', $recommandationsNb);
}
$queryBuilder->setFirstResult($limit['start'])
->setMaxResults($limit['max']);
$query = $queryBuilder->setCacheable(true)->getQuery()->useQueryCache(true);
return $query->getArrayResult(Query::HYDRATE_ARRAY);
}
// {{{ getListSpectacles()
/** Récupére la liste des spectacles
*
* Récupére les spectacles de manière standard
*
* @access public
* @param null $params_sql paramètre pour la requete SQL
* @param null $format_vignette
* @param bool $debug mode débugage
* @param array $params_display
* @return array
*/
public function getListSpectacles($params_sql = null, $format_vignette = null, $debug = false, $params_display = array())
{
// est-ce pour des listes de vidéos ?
if (isset($params_sql['special']['contenus_associes_multimedias'])) {
$video = true;
}
// est-ce qu'il faut rechercher la prochaine date à partir d'une date donnée (datestart) ?
if (isset($params_sql['special']['depuis_le'])) {
$date_debut_recherche = $this->getFormeDate($params_sql['special']['depuis_le']);
} else {
$date_debut_recherche = null;
}
// si pas de tableau
if (!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if (!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// construction de la requête avec le passage de paramètres
/** @var Query $query */
$query = $this->getSQLSpectacles($params_sql['params'], $params_sql['special'], $debug);
if (!empty($format_vignette['display'])) {
$display = $format_vignette['display'];
unset($format_vignette['display']);
} else {
$display = array();
}
if (!empty($format_vignette['stylemore'])) {
$stylemore = $format_vignette['stylemore'];
} else {
$stylemore = array();
}
if (!empty($format_vignette['vignette'])) {
$format_vignette = $format_vignette['vignette'];
}
$std_vignette_video = array('width' => 93, 'height' => 70, 'direction' => 'crop', 'fleche' => 'moyen');
// $std_vignette = array('width'=>$_ENV['VIGN_SPECTACLE_WIDTH'],'height'=>$_ENV['VIGN_SPECTACLE_HEIGHT'],'direction'=>'crop');
$std_vignette = array('width' => 100, 'height' => 100, 'direction' => 'crop');
// aucun format de vignette défini
if (!$format_vignette) {
if (!empty($video)) {
$format_vignette = $std_vignette_video;
} else {
$format_vignette = $std_vignette;
}
}
if (!empty($format_vignette['stylemore']) && empty($format_vignette['vignette'])) {
if (!empty($video)) {
$format_vignette = $std_vignette_video;
} else {
$format_vignette = $std_vignette;
}
}
// aucun style défini
if (empty($stylemore)) {
if (isset($video) && !empty($video)) {
$stylemore = array('imagep' => 'width:' . $format_vignette['width'] . 'px;', 'descsp' => 'width:170px;');
} else {
$stylemore = array('imagep' => 'width:' . $format_vignette['width'] . 'px;', 'descsp' => 'width:100%;');
}
}
// paramètre de debug
$dbg = (empty($params_sql['dbg'])) ? array() : $dbg = $params_sql['dbg'];
// debug
$start_boucle = microtime(true);
// pour l'API, il faut la distribution en plus
if (!empty($params_display['api'])) {
$this->params_sql['special']['get_actors'] = true;
$this->params_sql['special']['get_adaptation_originals'] = true;
$this->params_sql['special']['get_distributions'] = true;
}
$sp = array();
// mettre en forme chaque reponse
foreach ($query->getArrayResult() as $data) {
if (!empty($data[0])) {
foreach ($data[0] as $k => $value) {
$this->$k = $value;
}
unset($data[0]);
}
foreach ($data as $k => $value) {
$this->$k = $value;
}
//On récupère quelques valeurs du texte (à revoir, pas opti)
if (!empty($this->text_spectacle[0])) {
$this->type = $this->text_spectacle[0]['type'];
}
if (!empty($video)) {
// on exclu les multimedias déjà passés
if (!empty($idmultimedia)) {
$this->params_sql['special']['multimedias_exclude'][] = $idmultimedia;
}
$spec = $this->getInfosSpectacleRow(null, $format_vignette, $date_debut_recherche, array('param_sql' => $params_sql));
$idmultimedia = $spec['multimedia']['idmultimedia'];
$sp[]['spectacle'] = $spec;
$sp[$idmultimedia]['stylemore'] = $stylemore;
$sp[$idmultimedia]['display'] = $display;
} else {
$idspectacle = $this->idspectacle;
// on veut juste l'identifiant
if (!empty($params_display['special']['return_only_id'])) {
$sp[$idspectacle] = $idspectacle;
continue;
}
$spec = $this->getInfosSpectacleRow($format_vignette, null, $date_debut_recherche, array('param_sql' => $params_sql));
$sp[$idspectacle] = $spec;
// ajout de idmultimedia
$idmultimedia = $this->id_multimedia ?? null;
$sp[$idspectacle]['idmultimedia'] = $idmultimedia;
//les spectacles
if ($sp[$idspectacle]['idtypespectacle']['idtypespectacle'] == 4) {
$sp[$idspectacle]['type_spectacles'] = true;
} //les mises-en-espaces, les lectures.
else {
$sp[$idspectacle]['type_lectures'] = true;
}
// dans le cas ou on cherchait des spectacles qui ont des contenus spécifiques
if (!empty($params_sql['special']['idclassification']) && isset($this->idcontent)) {
$sp[$idspectacle]['idcontent'] = $this->idcontent;
}
$sp[$idspectacle]['stylemore'] = $stylemore;
$sp[$idspectacle]['display'] = $display;
// affiche le lieu et la date de créa
if (!empty($display['affiche_date_creation']) && !empty($spec['idcontact_creation'])) {
$contacts = $this->getEntityManager()->getRepository(Contacts::class);
$sp[$idspectacle]['contact_creation'] = $contacts->getInfosContact($spec['idcontact_creation']);
$sp[$idspectacle]['display']['affiche_date_creation'] = true;
}
// récupèrer les infos sur le texte
if (!empty($data['idtext']) && !empty($this->params_sql['special']['get_text'])) {
$sp[$idspectacle]['text'] = $data['idtext']; //Theatre::factory('texts')->getInfosText($sp[$idspectacle]['idtext'],$this->params_sql['special']['get_text']);
}
// conversion du array pour la version API
if (!empty($params_display['api'])) {
// récupèrer les infos sur le texte
if (!empty($spec['idtext']) && !empty($params_sql['special']['get_texts'])) {
// le texte
$sp[$idspectacle]['text'] = $this->getEntityManager()->getRepository(Texts::class)->getInfosText($spec['idtext']);
// la vignette
$sp[$idspectacle]['text']["vignette_object"] = $this->getEntityManager()->getRepository(Texts::class)->getVignetteText($spec['idtext']);
// les auteurs
$sp[$idspectacle]['allauthors'] = $this->getEntityManager()->getRepository(Texts::class)->getAuthors($spec['idtext']);
}
$sp['@' . $idspectacle] = $this->getApiTab($sp[$idspectacle], $_ENV['URL_THNET'], $params_display['api']);
unset($sp[$idspectacle]);
}
if (!empty($params_display['carrer_couleurs'])) {
$sp[$idspectacle]['carrer'] = $this->getObjectsCarrerDetails($idspectacle);
}
// on met en un seul tableau tous les metteurs en scènes, auteurs etc.
if (!empty($params_display['allauthors'])) {
$sp[$idspectacle] = $this->clearSpectaclesAddAllPersons($sp[$idspectacle]);
}
}
}
// libère
$this->free();
// debug de la boucle
if ($this->isTraceMode('list_object')) {
$this->setTraceInfos(array(
'execution_time_boucle' => (microtime(true) - $start_boucle),
'nb_occurence' => count($sp),
'dbg' => $dbg,
));
}
return $sp;
}
// }}}
// {{{ getContentSpectacleUrl()
/** Url directe d'un contenu associé à un spectacle
*
* @access public
* @param int $classification Classification
* @param int $idcontent Id du contenu associé
* @param int $url_clean Url Clean du spectacle
* @return string
*/
public function getContentSpectacleUrl($classification, $idcontent, $url_clean)
{
if (!empty($classification) && !empty($idcontent) && !empty($url_clean)) {
// classe classification
if (!isset($this->classificationObj)) {
$this->classificationObj = $this->getEntityManager()->getRepository(Classifications::class);
}
$classification_page = $this->classificationObj->getTypePageByClassification($classification, 'spectacles');
return $url_clean . '/' . $classification_page . '/idcontent/' . $idcontent;
} else {
return null;
}
}
// }}}
// {{{ setSQLParams()
/** Les paramètres pour les requêtes
*
* @access public
* @param array $params Les paramètres pour la requete
* @return array
* @see getInfosSpectacleRow
* @see getSQLSpectacles
*/
public function setSQLParams($params)
{
$this->params_sql = $params;
}
// }}}
// {{{ getSQLSpectacles()
/** Générer la requete standard pour un spectacle
*
* $params = array(
* 'select' => champs en plus pour le select,
* 'from' => champs en plus pour le from,
* 'where' => paramètres en plus le where,
* 'order' => classement des résultats,
* 'limit' => limiter le nb de résultats array(debut,fin), (all pour pas de limit)
* )
* $special = array(
* 'select_by_text_or_adaptation' => text et adaptation,
* 'prochains' => true = date dans le future, un entier = fait un between
* 'anciens' =>
* 'join' => jointure gauche sur contacts et schedules
* )
*
*
* @access public
* @param array $params Les paramètres pour la requete
* @param array $special Les paramètres supplémentaires
* @param bool $debug afficher la requête TODO
* @return string
*/
public function getSQLSpectacles($params = array(), $special = array(), $debug = false)
{
$conn = $this->getEntityManager();
$distinct_spectacle = true;
$params_sql = array(
'params' => $params,
'special' => $special,
);
$this->setSQLParams($params_sql);
$sql_parenthese = '';
// désactiver le cache SQL
if (!empty($params['sql_no_cache'])) {
$sql_no_cache = 'SQL_NO_CACHE';
} else {
$sql_no_cache = '';
}
// select de base
if (!empty($params['no_group'])) {
$distinct = 's.idspectacle';
} elseif (isset($special['contenus_associes_multimedias'])) {
//$distinct = 'DISTINCT(om.idmultimedia), s.idspectacle, sc.date ';
$distinct = 'DISTINCT(om.idmultimedia), s.idspectacle ';
} else {
if (!empty($special['count_only'])) {
$distinct = '';
$distinct_spectacle = false;
} else {
$distinct = 'DISTINCT s.idspectacle ';
$distinct_spectacle = true;
}
}
// champs
// $fields_list = array(
// 'spectacles s' => array('url_clean','idtypespectacle','creation_date','idcontact_creation','title as titlespectacle','dateinsert','dateupdate','statut','publish','textfictif'),
// 'typesspectacles ty' => array('typespectacle'),
// 'texts t' => array('title as titletext','idtext','type as type','url_clean as url_clean_text'),
// 'schedules sc' => array('date'),
// );
// $sql_select = '
// SELECT '.$sql_no_cache.' '.$distinct.',
// s.url_clean,s.idtypespectacle,s.idcontact_creation,s.title as titlespectacle,s.dateinsert,s.dateupdate,s.statut,s.publish,s.textfictif,
// ty.typespectacle,
// 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';
$sql_select = $sql_where = '';
$con = $this->getEntityManager();
$queryBuilder = $con->getRepository(Spectacles::class)->createQueryBuilder('s');
$queryBuilder->select('s, t, partial ty.{idtypespectacle}, MIN(sc.date) as creation_date, t.urlClean AS url_clean_text');
// select de remplacement
if (array_key_exists('select_other', $params)) {
// dump('getSQLSpectacles, select_other');
$sql_select .= $params['select_other'];
}
// compte seulement
if (array_key_exists('count_only', $special)) {
if (!empty($params['groupby'])) {
unset($params['groupby']);
}
if (!empty($special['count_only_distinct'])) {
// $sql_select = 'SELECT COUNT(DISTINCT('.$special['count_only_distinct'].')) as total ';
// $queryBuilder->select('COUNT('.$special['count_only_distinct'].') as total');
// $queryBuilder->select('COUNT(DISTINCT s.idspectacle) AS total');
$queryBuilder->select($queryBuilder->expr()->countDistinct($special['count_only_distinct']) . ' AS total, MIN(sc.date) as HIDDEN creation_date');
} else if (!empty($special['count_in_spectacle_anciens'])) {
dump('a faire 3896 getSQLSpectacles');
$sql_select = 'SELECT COUNT(DISTINCT(s.idspectacle)) as total FROM spectacles s WHERE s.idspectacle IN ( SELECT sc.idspectacle ';
$sql_parenthese = ')';
} elseif (!empty($special['count_schedule'])) {
// $sql_select = 'SELECT COUNT(sc.idschedule) as total ';
$queryBuilder->select('COUNT(DISTINCT(sc.idschedule)) as total, MIN(sc.date) as HIDDEN creation_date');
} else {
// $sql_select = 'SELECT COUNT(s.idspectacle) as total ';
$queryBuilder->select('COUNT(DISTINCT(s.idspectacle)) as total, MIN(sc.date) as HIDDEN creation_date');
}
}
// select en plus
if (array_key_exists('select', $params)) {
$queryBuilder->addSelect($params['select']);
}
// table temporaire schedules
if (array_key_exists('from_schedules', $special)) {
$from_schedules = '(' . $special['from_schedules'] . ') AS';
} else {
$from_schedules = 'schedules';
}
// from avec jointure entre spectacles/schedules/contacts
if (array_key_exists('join', $special) && !array_key_exists('leftjoin_contact', $special)) {
// $sql_from = ' FROM spectacles s
// LEFT JOIN '.$from_schedules.' sc
// LEFT JOIN contacts c ON sc.idcontact=c.idcontact
// ON s.idspectacle=sc.idspectacle
// ,typesspectacles ty, texts t, text_spectacle ts, spectacle_person sp';
// pour récupèrer les spectacles d'un auteur avec les spectacles montés à partir de ses textes ET les spectacles
// montés à partir de ses traductions
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.text_spectacle', 'ts')
->leftJoin('s.idperson', 'sp')
// ->leftJoin(Contacts::class, 'c', 'with',
// 'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
// );
->join('sc.idcontact', 'contacts');
} elseif (array_key_exists('join_author', $special)) {
$sql_from = ' FROM spectacles s, ' . $from_schedules . ' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts
LEFT JOIN text_traduction tt ON tt.idtexttraduction=ts.idtext
LEFT JOIN text_author tb ON tt.idtext=tb.idtext
LEFT JOIN text_author ta ON ta.idtext=ts.idtext,
spectacle_person sp';
// trouver les spectacles associés pour une direction
dump('revoir join_author');
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.text_spectacle', 'ts')
->leftJoin('s.idperson', 'sp')
// ->leftJoin(Contacts::class, 'c', 'with',
// 'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
// );
->join('sc.idcontact', 'contacts');
} elseif (array_key_exists('join_director', $special)) {
$sql_from = ' FROM ' . $from_schedules . ' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacles s
LEFT JOIN spectacle_person sp ON s.`idspectacle`=sp.`idspectacle`
LEFT JOIN roles r ON sp.`idrole`=r.`idrole` ';
dump('revoir join_director');
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.text_spectacle', 'ts')
->leftJoin('s.idperson', 'sp')
// ->leftJoin(Contacts::class, 'c', 'with',
// 'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
// );
->join('sc.idcontact', 'contacts');
// trouver les spectacles associés à une personne (text ou mise en scène, ou tout autre rôle...)
} elseif (array_key_exists('join_person', $special)) {
// $sql_from = ' FROM '.$from_schedules.' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacles s
// LEFT JOIN spectacle_author sa ON s.`idspectacle`=sa.`idspectacle`
// LEFT JOIN persons p ON sa.`idperson`=p.`idperson`
// LEFT JOIN spectacle_person sp ON s.`idspectacle`=sp.`idspectacle`
// LEFT JOIN persons p1 ON sp.`idperson`=p1.`idperson` ';
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.text_spectacle', 'ts')
->leftJoin('s.idperson', 'sp')
// ->leftJoin(Contacts::class, 'c', 'with',
// 'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
// );
->join('sc.idcontact', 'contacts');
} elseif (array_key_exists('recommandations', $special)) {
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->join('sc.idcontact', 'contacts')
->join('s.aides', 'sa')
->join('sa.idaide', 'a')
->join('a.idaidecontact', 'ac')
->andWhere('ac.title LIKE \'Spectacle recommandé\'');
} else if (array_key_exists('leftjoin_contact', $special)) {
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.text_spectacle', 'ts')
->leftJoin('s.idperson', 'sp')
->leftJoin('sc.idcontact', 'contacts');
} else {
// $sql_from = ' FROM spectacles s, '.$from_schedules.' sc, contacts c, typesspectacles ty, texts t, text_spectacle ts, spectacle_person sp';
$queryBuilder
->leftJoin('s.text_spectacle', 't')
->leftJoin('s.idtypespectacle', 'ty')
->leftJoin('s.schedules', 'sc')
->leftJoin('s.idperson', 'sp')
// ->leftJoin(Contacts::class, 'c', 'with',
// 'sc.idcontact = c.idcontact OR sc.idcontactFestival = sc.idcontact'
// );
->join('sc.idcontact', 'contacts');
}
// selection de table en plus
if (array_key_exists('from', $params)) {
if (is_array($params['from'])) {
foreach ($params['from'] as $key => $from_value) {
if (is_numeric($key)) {
$variable = explode(' ', $from_value);
$queryBuilder->join($variable[0], $variable[1]);
} else {
$dql_join = explode(' ', $key);
$queryBuilder->leftJoin('TheatreCore\Entity\\' . $dql_join[0], $dql_join[1], 'WITH', $from_value);
}
}
} else {
$variable = explode(' ', $params['from']);
$queryBuilder->join($variable[0], $variable[1]);
}
}
// where standard avec jointure de base
// $sql_where = '
// WHERE 1
// AND ts.idtext=t.idtext
// AND s.idspectacle=ts.idspectacle
// AND sp.idspectacle=s.idspectacle
// AND ty.idtypespectacle=s.idtypespectacle';
if (!empty($special['spectacle'])) {
if (!empty($special['spectacle']['language_egal'])) {
// $sql_where .= ' AND s.language = "'.$special['spectacle']['language_egal'].'"';
$queryBuilder->andWhere(' s.language = \'' . $special['spectacle']['language_egal'] . '\'');
}
if (!empty($special['spectacle']['language_different'])) {
// $sql_where .= ' AND s.language != "'.$special['spectacle']['language_different'].'"';
$queryBuilder->andWhere(' s.language != \'' . $special['spectacle']['language_different'] . '\'');
}
}
// pour un role particulier d'une person
if (!empty($special['join_person']['idperson'])) {
// $sql_where .= ' AND sp.idperson IN ('.$this->arrayToIn($special['join_person']['idperson']).') ';
$queryBuilder->andWhere(' sp.idperson IN (' . $this->arrayToIn($special['join_person']['idperson']) . ') ');
}
if (!empty($special['join_person']['idrole'])) {
// $sql_where .= ' AND sp.idrole IN ('.$this->arrayToIn($special['join_person']['idrole']).') ';
$queryBuilder->andWhere(' sp.idrole IN (' . $this->arrayToIn($special['join_person']['idrole']) . ') ');
}
// pour les auteurs jointure avec spectacle_author
if (!empty($special['join_person']['idperson_authors_roles'])) {
// $sql_where .= ' AND (';
// $sql_where .= ' sa.idperson IN ('.$this->arrayToIn($special['join_person']['idperson_authors_roles']).') ';
// $sql_where .= ' OR sp.idperson IN ('.$this->arrayToIn($special['join_person']['idperson_authors_roles']).') ';
// $sql_where .= ') ';
$queryBuilder->andWhere('sp.idperson IN (' . $this->arrayToIn($special['join_person']['idperson_authors_roles']) . ')');
}
// étudiants d'une école
if (!empty($special['person_ecole'])) {
$sql_from .= ' LEFT JOIN person_ecole pe ON p.`idperson`=pe.`idperson`
LEFT JOIN person_ecole pe1 ON p1.`idperson`=pe1.`idperson` ';
// $queryBuilder->leftJoin('personEcole', 'pe', 'WITH', 'p.idperson=pe.idperson');
// $queryBuilder->leftJoin('personEcole', 'pe1', 'WITH', 'p1.`idperson`=pe1.idperson');
dump('person_ecole getSQLSpectacles');
// pour un contact précis
if (!empty($special['person_ecole']['idcontact'])) {
$sql_where .= ' AND (pe.`idcontact` IN (' . join(',', $special['person_ecole']['idcontact']) . ') OR pe1.`idcontact` IN (' . join(',', $special['person_ecole']['idcontact']) . ') )';
}
}
if (isset($special['textfictif'])) {
// $sql_where .= ' AND s.`textfictif`='.(int)$special['textfictif'].' ';
$queryBuilder->andWhere('s.textfictif=' . (int)$special['textfictif'] . ' ');
}
// pour les texts
if (!empty($special['text'])) {
if (!empty($special['text']['is_published'])) {
// $sql_where .= ' AND t.`idcontact_publisher` IS NOT NULL ';
$queryBuilder->andWhere('t.idcontact_publisher IS NOT NULL');
}
// type de texte (exemple : jeunesse)
if (!empty($special['text']['idgenretext'])) {
// $sql_where .= ' AND t.`idgenretext`='.(int)$special['text']['idgenretext'];
$queryBuilder->andWhere('t.idgenretext=' . (int)$special['text']['idgenretext']);
}
// uniquement des textes originaux
if (!empty($special['text']['language'])) {
if (is_array($special['text']['language'])) {
foreach ($special['text']['language'] as $k => $v) {
// $sql_where .= ' AND t.language '.$k.' ('.$this->arrayToIn($v).') ';
$queryBuilder->andWhere(' t.language ' . $k . ' (' . $this->arrayToIn($v) . ') ');
}
} else {
// $sql_where .= ' AND t.language='.$this->quote($special['text']['language']).' ';
$queryBuilder->andWhere(' t.language=\'' . $special['text']['language'] . '\' ');
}
}
// type de texte
if (!empty($special['text']['type'])) {
// $sql_where .= ' AND t.`type` IN ('.join(',', $special['text']['type']).') ';
$queryBuilder->andWhere(' t.type IN (' . join(',', $special['text']['type']) . ') ');
}
// période de l'auteur
if (!empty($special['text']['person']['periode'])) {
$date = new \DateTime("now");
$date->sub(new DateInterval('P70Y'));
if ($special['text']['person']['periode'] == 'public') {
// $sql_where .= ' AND (.`dateend`!=0 AND pa.`dateend`<=\''.$date->format('Y-m-d').'\') ';
$queryBuilder->andWhere(' (pa.dateend !=0 AND pa.dateend<=\'' . $date->format('Y-m-d') . '\') ');
} elseif ($special['text']['person']['periode'] == 'contemporain') {
// $sql_where .= ' AND (pa.dateend>=\''.$date->format('Y-m-d').'\' OR pa.dateend IN (0,\'\') OR pa.dateend IS NULL ) ';
$queryBuilder->andWhere(' (pa.dateend IS NULL OR pa.dateend = 0 OR pa.dateend>=\'' . $date->format('Y') . '\') ');
} else {
// $sql_where .= ' AND (pa.dateend IN (0,\'\') OR pa.dateend IS NULL) ';
$queryBuilder->andWhere(' (pa.dateend IN (0,\'\') OR pa.dateend IS NULL) ');
}
// $sql_from = str_replace('texts t', 'texts t LEFT JOIN text_author ta ON t.`idtext`=ta.`idtext`
// LEFT JOIN persons pa ON pa.`idperson`=ta.`idperson`', $sql_from);
$queryBuilder->leftJoin('t.text_author', 'ta');
$queryBuilder->leftJoin(Persons::class, 'pa', 'with', 'pa.idperson = ta.idperson');
}
}
// pour les playlists
if (!empty($special['playlists'])) {
// dump('playlists spectacles repositorys 3078');
if (!empty($special['playlists']['text'])) {
// $sql_from .= ' ,`playlists` ';
// $sql_where .= ' AND `playlists`.`idtext`=ts.`idtext` ';
$queryBuilder->leftJoin(Playlists::class, 'playlist', 'with', ' playlist.idtext = t.idtext');
}
if (!empty($special['playlists']['idclassifications'])) {
// $sql_from .= ' ,`playlist_classification` ';
// $sql_where .= ' AND `playlist_classification`.`idplaylist`=`playlists`.`idplaylist` ';
// $sql_where .= ' AND `playlist_classification`.idclassification IN ('.$this->arrayToIn($special['playlists']['idclassifications']).') ';
$queryBuilder->join('playlist.idclassification', 'pc');
$queryBuilder->andWhere('pc.idclassification IN (' . $this->arrayToIn($special['playlists']['idclassifications']) . ')');
}
if (!isset($special['playlists']['publish'])) {
// $sql_where .= ' AND `playlists`.`publish`=1 ';
$queryBuilder->andWhere('playlist.publish=1');
}
}
// pour les podcasts
if (!empty($special['podcasts'])) {
if (!array_key_exists('count_only', $special)) {
$queryBuilder->addSelect('podcasts');
}
$queryBuilder->join('s.idpodcast', 'podcasts');
// $sql_from .= ' ,`podcasts`,`podcast_spectacle` ';
//
// $sql_select .= ' , podcasts.idpodcast ';
if (!empty($special['podcasts']['type_podcast'])) {
//franceculture
if ($special['podcasts']['type_podcast'] == 'franceculture') {
// $sql_where .= ' AND `podcasts`.`code_franceinter` IS NOT NULL ';
$queryBuilder->andWhere('podcasts.codeFranceinter IS NOT NULL');
} //culturebox
else {
$queryBuilder->andWhere('podcasts.codeFt IS NOT NULL');
// $sql_where .= ' AND `podcasts`.`code_ft` IS NOT NULL ';
}
}
if (array_key_exists('type_franceinter', $special)) {
if (is_numeric($special['type_franceinter'])) {
// $sql_where .= ' AND `podcasts`.type_franceinter = '.(int)$special['type_franceinter'].' ';
$queryBuilder->andWhere('podcasts.typeFranceinter = ' . (int)$special['type_franceinter'] . ' ');
} else {
// $sql_where .= ' AND (podcasts.type_franceinter is NULL OR podcasts.type_franceinter = 0) ';
$queryBuilder->andWhere('(podcasts.typeFranceinter is NULL OR podcasts.typeFranceinter = 0)');
}
}
if (!empty($special['podcasts']['emission'])) {
//franceculture
if (is_array($special['podcasts']['emission'])) {
// $sql_where .= ' AND `podcasts`.`name_program` IN ("'. join('","', $special['podcasts']['emission']) .'") ';
$queryBuilder->andWhere('podcasts.nameProgram IN (\'' . join('\',\'', $special['podcasts']['emission']) . '\') ');
} else {
// $sql_where .= ' AND `podcasts`.`name_program` = \''.$this->escape($special['podcasts']['emission']).'\' ';
$queryBuilder->andWhere('podcasts.nameProgram = \'' . $special['podcasts']['emission'] . '\' ');
}
}
// $sql_where .= ' AND `podcast_spectacle`.`idspectacle`= s.`idspectacle` ';
// $sql_where .= ' AND `podcasts`.`idpodcast`=`podcast_spectacle`.`idpodcast` ';
if (isset($special['podcasts']['publish'])) {
// $sql_where .= ' AND `podcasts`.`publish`=1 ';
$queryBuilder->andWhere('podcasts.publish= 1');
}
}
// avec une aide
if (!empty($special['spectacle_aide'])) {
// $sql_from .= ' ,spectacle_aide sad';
$queryBuilder->leftJoin('s.aides', 'sad', 'with', 'sad.idspectacle = s.idspectacle');
/* @TODO : à réintégrer ? */
// $sql_where .= '
// AND sad.`idspectacle`=s.`idspectacle` ';
if (!empty($special['aide'])) {
// $sql_where .= ' AND sad.`idaide`=a.`idaide` ';
$queryBuilder->andWhere('sad.idaide = a.idaide');
}
if (!empty($special['spectacle_aide']['idcontact'])) {
if (is_array($special['spectacle_aide']['idcontact'])) {
// $sql_where .= ' AND a.`idcontact` IN ('. join(',', $special['spectacle_aide'] ['idcontact']) .') ';
$queryBuilder->andWhere('a.idcontact IN (' . $this->arrayToIn(',', $special['spectacle_aide']['idcontact']) . ') ');
} else {
$queryBuilder->andWhere('a.idcontact = ' . $special['spectacle_aide']['idcontact'] . ' ');
// $sql_where .= ' AND a.`idcontact` = '. $special['spectacle_aide'] ['idcontact'] .' ';
}
}
}
if (!empty($special['text_aide'])) {
// dump('afaire 3161 spectaclesRepositorys');
$queryBuilder->leftJoin('t.aides', 'tad');
// $sql_from .= ' ,text_aide tad';
// $queryBuilder->join('s.aides', 'sad');
// $sql_where .= '
// AND tad.`idtext`=ts.`idtext` ';
//
if (!empty($special['aide'])) {
// $sql_where .= ' AND tad.`idaide`=a.`idaide` ';
// $queryBuilder->andWhere('tad.idaide = a.idaide');
}
}
if (!empty($special['exclude_idspectacle']) && is_array($special['exclude_idspectacle'])) {
$queryBuilder->andWhere('s.idspectacle NOT IN (' . join(',', $special['exclude_idspectacle']) . ')');
}
if (!empty($special['coprod'])) {
if (strpos($sql_from, 'spectacle_contact') === false) {
$sql_from .= ' , spectacle_contact sct ';
$sql_where .= ' AND sct.idspectacle=s.idspectacle ';
}
$sql_where .= ' AND sct.idcontact ' . $special['coprod']['idcontacts'][0] . ' (' . join(',', $special['coprod']['idcontacts'][1]) . ') ';
$sql_where .= ' AND sct.idrole IN (17,18,19) ';
}
if (!empty($special['aide'])) {
//spectacles
if (!empty($special['spectacle_aide'])) {
$queryBuilder->join('sad.idaide', 'a');
} //textes
else {
$queryBuilder->join('tad.idaide', 'a');
}
// $sql_from .= ' , aides a ';
//
if (!empty($special['aide']['idcontact'])) {
// $sql_where .= ' AND a.idcontact IN ('.$this->arrayToIn($special['aide']['idcontact']).') ';
$queryBuilder->andWhere(' a.idcontact IN (' . $this->arrayToIn($special['aide']['idcontact']) . ') ');
}
if (!empty($special['aide']['type_aide'])) {
// $sql_where .= ' AND a.type_aide IN ('.$this->arrayToIn($special['aide']['type_aide']).') ';
$queryBuilder->andWhere(' a.typeAide IN (' . $this->arrayToIn($special['aide']['type_aide']) . ') ');
}
if (!empty($special['aide']['idaidecontact'])) {
$queryBuilder->join('a.idaidecontact', 'aic');
$queryBuilder->andWhere('aic.idaidecontact IN (' . $this->arrayToIn($special['aide']['idaidecontact']) . ')');
// $sql_from .= ' , aidecontacts aic ';
// $sql_where .= ' AND a.idaidecontact=aic.idaidecontact ';
// $sql_where .= ' AND aic.idaidecontact IN ('.$this->arrayToIn($special['aide']['idaidecontact']).') ';
// dump('a faire 3190 repositorys spectacles');
}
}
// avec affiche
if (!empty($special['with_affiche'])) {
$sql_from .= ', object_file of, file_classification fc ';
$sql_where .= '
AND s.idspectacle=of.idobject
AND of.idfile=fc.idfile
AND of.object=\'spectacles\'
AND fc.idclassification=21 ';
}
// par utilisateur
if (!empty($special['idextranetuser'])) {
$queryBuilder->andWhere('s.idextranetuser=' . (int)$special['idextranetuser'] . ' ');
}
// uniquement si pas de jointure
if (!array_key_exists('join', $special)) {
// dump('ligne 3309 join');
// $sql_where .= ' AND sc.idspectacle=s.idspectacle ';
$queryBuilder->andWhere('sc.idspectacle = s.idspectacle');
/*if(!empty($special['type_contact'])) { // pour rechercher sur idcontact_festival
$sql_where .= ' AND sc.'.$special['type_contact'].'=c.idcontact';
} else {
$sql_where .= ' AND sc.idcontact=c.idcontact';
}*/
// $sql_where .= ' AND (sc.idcontact=c.idcontact OR sc.idcontact_festival=c.idcontact) ';
$queryBuilder->andWhere('sc.idcontact=contacts.idcontact OR sc.idcontactFestival=contacts.idcontact');
}
// recherche par école
// recherche par classification
if (array_key_exists('by_classification', $special)) {
$queryBuilder->join('s.idclassification', 'cl2');
// // recherche par ID ou par code (string) de la classification
if ($this->my_is_int($special['by_classification'])) {
$queryBuilder->andWhere('cl2.idclassification=' . ((int)$special['by_classification']) . '');
} elseif (is_array($special['by_classification'])) {
// // verif si int ou string
foreach ($special['by_classification'] as $v) {
if ($this->my_is_int($v)) {
$queryBuilder->andWhere('cl2.idclassification IN (' . join(',', $special['by_classification']) . ')');
break;
} else {
$queryBuilder->andWhere('cl2.classification IN (' . join(',', $special['by_classification']) . ') ');
break;
}
}
} else {
$queryBuilder->andWhere('cl2.idclassification=\'' . $this->escape($special['by_classification']) . '\'');
}
}
// recherche par classification
if (array_key_exists('by_classification_texts', $special)) {
dump('à faire by_classification_texts');
$sql_from .= ' ,text_classification tcl,classifications cl2';
$sql_where .= ' AND tcl.idtext=t.`idtext`
AND tcl.idclassification=cl2.idclassification';
// recherche par ID ou par code (string) de la classification
if ($this->my_is_int($special['by_classification_texts'])) {
$sql_where .= ' AND cl2.idclassification=' . ((int)$special['by_classification_texts']) . ' ';
} elseif (is_array($special['by_classification_texts'])) {
// verif si int ou string
foreach ($special['by_classification_texts'] as $v) {
if ($this->my_is_int($v)) {
$sql_where .= ' AND cl2.idclassification IN (' . join(',', $special['by_classification_texts']) . ') ';
break;
} else {
$sql_where .= ' AND cl2.classification IN (' . join(',', $special['by_classification_texts']) . ') ';
break;
}
}
} else {
$sql_where .= ' AND cl2.classification=\'' . $this->escape($special['by_classification_texts']) . '\' ';
}
}
// recherche auteurs (sur texte et traduction)
if (!empty($special['idperson_author'])) {
// dump('à faire idperson_author');
if (!empty($special['idperson_idtexts'])) {
if (is_array($special['idperson_idtexts'])) {
// $sql_where .= ' AND ts.`idtext` IN ('.join(',', $special['idperson_idtexts']).') ';
$queryBuilder->andWhere(' t .idtext IN (' . join(',', $special['idperson_idtexts']) . ') ');
} else {
// $sql_where .= ' AND ts.idtext IN ('.$special['idperson_idtexts'].') ';
$queryBuilder->andWhere(' t.idtext IN (' . $special['idperson_idtexts'] . ') ');
}
} else {
if (is_array($special['idperson_author'])) {
$sql_where .= ' AND ( ta.`idperson` IN (' . join(',', $special['idperson_author']) . ') OR tb.`idperson` IN (' . join(',', $special['idperson_author']) . ') )';
} else {
$sql_where .= ' AND (ta.`idperson`=' . (int)$special['idperson_author'] . ' OR tb.`idperson`=' . (int)$special['idperson_author'] . ') ';
}
}
}
// recherche metteurs en scène
if (!empty($special['idperson_director'])) {
if (is_array($special['idperson_director'])) {
// $sql_where .= ' AND sp.`idperson` IN ('.join(',', $special['idperson_director']).')';exit;
$queryBuilder->andWhere(' sp.idperson IN (' . join(',', $special['idperson_director']) . ')');
} else {
// $sql_where .= ' AND sp.`idperson`='.(int)$special['idperson_director'];
$queryBuilder->andWhere('sp.idperson=' . (int)$special['idperson_director']);
}
if (!empty($special['join_director'])) {
// $sql_where .= ' AND r.`type_creator`=1';
$queryBuilder->andWhere('r.type_creator=1');
}
}
// sexe de la personne
if (!empty($special['idperson_director_sexe'])) {
$sexes = array(
'H' => 1,
'F' => 2,
'NA' => '',
);
if (strpos($sql_from, 'persons') === false) {
// $sql_from .= ' ,persons p ';
$queryBuilder->join(Persons::class, 'p', 'with', 'p.idperson=sp.idperson');
// $sql_where .= ' AND p.`idperson`=sp.`idperson` ';
}
// $sql_where .= ' AND p.`sexe`='.$sexes[$special['idperson_director_sexe']];
$queryBuilder->andWhere(' p.sexe=' . $sexes[$special['idperson_director_sexe']]);
}
if (array_key_exists('contenus_associes_critiques', $special)) {
// dump('à faire contenus_associes_critiques');
// $queryBuilder->join(ObjectContent::class, 'oc2', 'with', 'oc2.object=\'spectacles\'');
// $queryBuilder->join('s.idcontent', 'ct2');
//
// $queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
//
// $queryBuilder->join('ct2.content_classification', 'cc2', 'with', 'cc2.idclassification = 101');
$queryBuilder->join(ObjectContent::class, 'oc2', 'with', 'oc2.object=\'spectacles\'');
$queryBuilder->join('s.idcontent', 'ct2');
$queryBuilder->join('ct2.content_classification', 'cc2', 'with', 'cc2.idclassification = 101');
$queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
$queryBuilder->andWhere('ct2.language = \'fr\' ');
$queryBuilder->join(Classifications::class, 'cl', 'with', 'cl.idclassification=cc2.idclassification');
$queryBuilder->leftJoin('cl.module', 'cm');
$queryBuilder->leftJoin('oc2.idcontent', 'ct');
$queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
// $queryBuilder->addSelect('oc2');
//
// $sql_from .= ', object_content oc, content_classification cc, contents ct ';
//
// $sql_where .= '
// AND sp.idspectacle=s.idspectacle
// AND ty.idtypespectacle=s.idtypespectacle
// AND sc.idspectacle=s.idspectacle
// AND sc.idcontact=c.idcontact
// AND s.idspectacle=oc.idobject
// AND oc.idcontent=ct.idcontent
// AND ct.idcontent=cc.idcontent
// AND ct.`publish`=1
// AND ct.`valid`=1
// AND cc.`idclassification`=101
// ';
}
// compléments pour les contenus associés simple ou multimedias
if (array_key_exists('contenus_associes', $special) || array_key_exists('contenus_associes_multimedias', $special)) {
dump('à faire contenus_associes');
$queryBuilder->join(ObjectContent::class, 'oc2', 'with', 'oc2.object=\'spectacles\'');
$queryBuilder->join('s.idcontent', 'ct2');
$queryBuilder->join('ct2.content_classification', 'cc2', 'with', 'cc2.idclassification = 101');
$queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
$queryBuilder->andWhere('ct2.language = \'fr\' ');
// $queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
$queryBuilder->join(Classifications::class, 'cl', 'with', 'cl.idclassification=cc2.idclassification');
$queryBuilder->leftJoin('cl.module', 'cm');
$queryBuilder->leftJoin('oc2.idcontent', 'ct');
// table en plus
if (!empty($special['contenus_associes_multimedias'])) {
// $sql_from .= ', object_multimedia om ';
// $queryBuilder->leftJoin(ObjectMultimedia::class, 'om', 'with', 'om.object=ct2.idobject');
// TODO Transférer condition suivante (contenus_associes_multimedias)
}
//$sql_from .= ', object_content oc, classifications cl, content_classification cc, contents ct ';
// $sql_from .= ', classification_module cm, object_content oc, classifications cl, content_classification cc, contents ct ';
// where en plus
// $sql_where .= '
// AND s.idspectacle=oc.idobject
// AND ct.idcontent=oc.idcontent
// AND ct.idcontent=cc.idcontent
// AND cl.idclassification=cc.idclassification
// AND oc.object=\'spectacles\'
// AND ct.language=\'fr\'
// AND cm.idclassification=cl.idclassification ';
if (!empty($special['classification_module'])) {
// $sql_where .= ' AND cm.module=\''.$this->escape($special['classification_module']).'\' ';
$queryBuilder->andWhere('ct2.language = \'fr\' ');
} else {
// $sql_where .= ' AND cm.module=\''.$this->escape($GLOBALS['module']).'\' ';
$queryBuilder->andWhere('cm.module=\'' . $this->escape($GLOBALS['module']) . '\' ');
}
// pour le multimedia, jointure avec multimedia via object_multimedia
if (!empty($special['contenus_associes_multimedias'])) {
$queryBuilder->leftJoin(ObjectMultimedia::class, 'om', 'with', 'om.object=oc2.idobject');
// $sql_where .= '
// AND om.idobject=ct.idcontent
// AND om.object=\'contents\'
// AND ct.display_media=1 ';
$queryBuilder->andWhere('om.object=\'contents\'');
$queryBuilder->andWhere('ct.displayMedia=1');
}
}
// compléments pour les contenus associés simple ou multimedias
if (array_key_exists('multimedias_videos_associes', $special)) {
if (!array_key_exists('count_only', $special)) {
$queryBuilder->addSelect('m.idmultimedia AS id_multimedia');
}
// table en plus
$queryBuilder->leftJoin(ObjectMultimedia::class, 'om', 'with', 's.idspectacle = om.idobject');
$queryBuilder->andWhere('om.object=\'spectacles\'');
$queryBuilder->leftJoin(Multimedias::class, 'm', 'with', 'm.idmultimedia = om.idmultimedia');
$queryBuilder->andWhere('m.publish = 1');
/* @TODO : A revoir */
// where en plus
// $sql_where .= ' AND m.idmultimedia = om.idmultimedia
// AND sc.idspectacle = om.idobject
// AND om.object="spectacles"
// AND m.publish = 1';
if (array_key_exists('multimedias_videos_associes_contact_festival', $special)) {
// $sql_where .= ' AND (sc.`idcontact`= '.((int)$special['multimedias_videos_associes_contact_festival']).' || sc.`idcontact_festival`= '.((int)$special['multimedias_videos_associes_contact_festival']).') ';
$queryBuilder->andWhere(' (sc.idcontact= ' . ((int)$special['multimedias_videos_associes_contact_festival']) . ' AND sc.idcontactFestival= ' . ((int)$special['multimedias_videos_associes_contact_festival']) . ') ');
} else if (array_key_exists('multimedias_videos_associes_contact', $special)) {
// $sql_where .= ' AND sc.idcontact= '.((int)$special['multimedias_videos_associes_contact']).' ';
$queryBuilder->andWhere(' sc.idcontact= ' . ((int)$special['multimedias_videos_associes_contact']) . ' ');
}
}
// l'aide à la création
if (array_key_exists('aides', $special)) {
// on veut l'aide
// $sql_from .= ', text_aide tai, aides ai';
$queryBuilder->leftJoin('t.aides', 'tai');
$queryBuilder->join(Aides::class, 'ai', 'WITH', 'ai.idaide = tai.idaide');
// where en plus => au moins la jointure
// $sql_where .= ' AND tai.`idtext`=t.`idtext`
// AND ai.`idaide`=tai.`idaide` ';
// ajouter le contact (exemple : CNT)
if (!empty($special['aides']['idcontact'])) {
$queryBuilder->andWhere('ai.idcontact = :idcontact')->setParameter(':idcontact', $special['aides']['idaide']);
// $sql_where .= ' AND ai.`idcontact`='.(int)$special['aides']['idaide'];
}
// ajouter l'aide (exemple : aide à la créa)
if (!empty($special['aides']['idaide'])) {
$queryBuilder->andWhere('ai.idaide = :idaide')->setParameter(':idcontact', $special['aides']['idaide']);
// $sql_where .= ' AND ai.`idaide`='.(int)$special['aides']['idaide'];
}
}
// avec un contenu associé spécifique
if (array_key_exists('idclassification', $special)) {
if (!is_array($special['idclassification'])) {
$special['idclassification'] = (array)$special['idclassification'];
}
## CODE FONCTIONNEL
$queryBuilder->leftJoin(ObjectContent::class, 'oc2', 'with', 'oc2.object=\'spectacles\'');
$queryBuilder->leftJoin(Contents::class, 'ct2', 'with', 'ct2.idcontent=oc2.idcontent');
$queryBuilder->leftJoin('ct2.content_classification', 'cc2');
$queryBuilder->andWhere('ct2.valid =1 AND ct2.publish = 1');
$queryBuilder->andWhere('cc2.idclassification IN (' . join(',', $special['idclassification']) . ')');
$queryBuilder->andWhere('s.idspectacle = oc2.idobject');
$queryBuilder->andWhere('ct2.idcontent = oc2.idcontent');
$queryBuilder->addSelect('oc2');
## ANCIENS
// $sql_select .= ', oc2.`idcontent`';
// $sql_from .= ', object_content oc2, content_classification cc2, contents ct2 ';
// $sql_where .= '
// AND s.`idspectacle`=oc2.`idobject`
// AND ct2.`idcontent`=oc2.`idcontent`
// AND ct2.`idcontent`=cc2.`idcontent`
// AND ct2.`publish`=1
// AND ct2.`valid`=1
// AND oc2.`object`=\'spectacles\'
// AND cc2.`idclassification` IN ('.join(',', $special['idclassification']).') ';
// dump('revoir le code des classifications dans SpectaclesRepository');
}
// pour une personne en particulier
if (array_key_exists('idperson', $special)) {
// contrainte en plus
// $sql_where .= ' AND (sp.`idperson`='.(int)$special['idperson']['idperson'];
$queryBuilder->andWhere('sp.idperson=' . (int)$special['idperson']['idperson']);
// les textes de la personne
if (!empty($special['idperson']['idtexts'])) {
if (is_array($special['idperson']['idtexts'])) {
// $sql_where .= ' OR ts.`idtext` IN ('.join(',', $special['idperson']['idtexts']).') ';
$queryBuilder->orWhere(' t.idtext IN (' . join(',', $special['idperson']['idtexts']) . ')');
} else {
// $sql_where .= ' OR ts.`idtext` IN ('.$special['idperson']['idtexts'].') ';
$queryBuilder->orWhere(' t.idtext IN (' . $special['idperson']['idtexts'] . ')');
}
}
// $sql_where .= ') ';
}
// pour des spectacles en particulier
if (array_key_exists('idspectacle', $special) || array_key_exists('idspectacles', $special)) {
if (array_key_exists('idspectacles', $special)) {
$special['idspectacle'] = $special['idspectacles'];
}
if (is_array($special['idspectacle'])) {
if (isset($special['idspectacle'][0]) && is_string($special['idspectacle'][0]) &&
isset($special['idspectacle'][1]) && is_array($special['idspectacle'][1])) {
// $sql_where .= ' AND s.`idspectacle` '.$special['idspectacle'][0].' ('.join(',', $special['idspectacle'][1]).') ';
$queryBuilder->andWhere(' s.idspectacle ' . $special['idspectacle'][0] . ' (' . join(',', $special['idspectacle'][1]) . ') ');
// hack pour retrocompat
$sql_where_idspectacles = true;
} else {
// $sql_where .= ' AND s.`idspectacle` IN ('.join(',', $special['idspectacle']).') ';
$queryBuilder->andWhere(' s.idspectacle IN (' . join(',', $special['idspectacle']) . ') ');
}
} else {
// $sql_where .= ' AND s.`idspectacle` IN ('.$special['idspectacle'].') ';
$queryBuilder->andWhere(' s.idspectacle IN (' . $special['idspectacle'] . ') ');
}
}
// prochains spectacles
if (array_key_exists('prochains', $special)) {
if ($special['prochains'] == 'all') {
// $sql_where .= ' AND sc.date>=\''.date('Y-m-d').'\' ';
$queryBuilder->andWhere(' sc.date>=\'' . date('Y-m-d') . '\' ');
} else {
if (is_array($special['prochains'])) {
$prochains = $special['prochains'];
// $sql_where .= ' AND (sc.date BETWEEN \''.$prochains[0].'\' AND \''.$prochains[1].'\') ';
$queryBuilder->andWhere('(sc.date BETWEEN \'' . $prochains[0] . '\' AND \'' . $prochains[1] . '\') ');
} else {
// entre aujourd'hui et une date future
$dateend = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) + $special['prochains'] * 24 * 3600);
// $sql_where .= ' AND ';
$queryBuilder->andWhere(' (sc.date BETWEEN \'' . date('Y-m-d') . '\' AND \'' . $dateend . '\') ');
}
}
}
// anciens spectacles
if (array_key_exists('anciens', $special)) {
if ($special['anciens'] == 'all') {
// $sql_where .= ' AND sc.date<\''.date('Y-m-d').'\' ';
$queryBuilder->andWhere(' sc.date < \'' . date('Y-m-d') . '\' ');
} else {
// entre hier et une date passe
$datestart = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) - $special['anciens'] * 24 * 3600);
// $sql_where .= ' AND (sc.date BETWEEN \''.$datestart.'\' AND \''.date('Y-m-d').'\') ';
$queryBuilder->andWhere(' (sc.date BETWEEN \'' . $datestart . '\' AND \'' . date('Y-m-d') . '\') ');
}
}
//on utilise having qu'à cette position
$sql_having = '';
if (array_key_exists('anciens_stricts', $special)) {
if (!array_key_exists('count_only', $special)) {
$params['groupby'] = 's.idspectacle';
// $sql_having .= ' HAVING MAX(sc.date)<\''.date('Y-m-d').'\' ';
$queryBuilder->having('MAX(sc.date)<\'' . date('Y-m-d') . '\'');
}
}
// selection sur le texte ou adaptation
if (array_key_exists('select_by_text_or_adaptation', $special)) {
// $sql_where .= ' AND s.publish=1 AND (
// ts.idtext='.$special['select_by_text_or_adaptation'].'
// OR ts.idtext IN
// (SELECT DISTINCT(tad.idtextadaptation) FROM texts t,text_adaptation tad
// WHERE t.idtext=tad.idtext AND tad.idtext ='.$special['select_by_text_or_adaptation'].')
// )';
$con = $this->getEntityManager();
$subQueryBuilder = $con->getRepository(Texts::class)->createQueryBuilder('t');
$subQueryBuilder->select('DISTINCT tad.idtext')
->join('t.textAdaptationtext', 'tad')
->andWhere('t.idtext= ' . $special['select_by_text_or_adaptation']);
$subQuery = $subQueryBuilder->getQuery();
$resSubQuery = $subQuery->getResult();
if (empty($resSubQuery)) {
$queryBuilder->andWhere('s.publish=1 AND t.idtext=' . $special['select_by_text_or_adaptation'] . ' ');
} else {
$idtext = array();
foreach ($resSubQuery as $value) {
$idtext[] = $value['idtext'];
}
$queryBuilder->andWhere('s.publish=1 AND ( t.idtext=' . $special['select_by_text_or_adaptation'] . ' OR t.idtext IN (' . implode(',', $idtext) . ') ) ');
}
}
// publié et validé
if (array_key_exists('publish_valid', $special)) {
// $sql_where .= ' AND s.`publish`=1 AND s.`valid`=1 ';
$queryBuilder->andWhere(' s.publish= 1 AND s.valid= 1');
}
// publié
if (array_key_exists('publish', $special) && $special['publish'] != 'all') {
$queryBuilder->andWhere(' s.publish =' . (int)$special['publish'] . ' ');
}
// exclure/inclure
if (array_key_exists('idspectacles', $special) && empty($sql_where_idspectacles)) {
if (is_array($special['idspectacles'])) {
// $sql_where .= ' AND s.`idspectacle` '.$special['idspectacles'][0].' ('.join(',', $special['idspectacles'][1]).') ';
$queryBuilder->andWhere(' s.idspectacle ' . $special['idspectacles'][0] . ' (' . join(',', $special['idspectacles'][1]) . ') ');
}
}
if (array_key_exists('idtext', $special)) {
if (is_array($special['idtext'])) {
// $sql_where .= ' AND ts.`idtext` IN ('.$this->arrayToIn($special['idtext']).') ';
$queryBuilder->andWhere(' t.idtext IN (' . $this->arrayToIn($special['idtext']) . ') ');
}
}
// exclure/inclure
if (array_key_exists('idcontacts', $special)) {
// $sql_where .= ' AND sc.`idcontact` '.$special['idcontacts'][0].' ('.join(',', $special['idcontacts'][1]).') ';
$queryBuilder->andWhere(' sc.idcontact ' . $special['idcontacts'][0] . ' (' . join(',', $special['idcontacts'][1]) . ') ');
}
if (!empty($special['idtypestructure'])) {
// $sql_where .= ' AND c.`idtypestructure` IN ('.$this->arrayToIn($special['idtypestructure']).') ';
$queryBuilder->andWhere(' contacts.idtypestructure IN (' . $this->arrayToIn($special['idtypestructure']) . ') ');
}
// par période
if (array_key_exists('period', $special)) {
// $sql_where .= ' AND sc.`date` BETWEEN \''.$special['period']['start'].'\' AND \''.$special['period']['end'].'\' ';
$queryBuilder->andWhere(' sc.date BETWEEN \'' . $special['period']['start'] . '\' AND \'' . $special['period']['end'] . '\' ');
}
// par saison
if (array_key_exists('saison', $special)) {
$s = explode('-', $special['saison']);
// $sql_where .= ' AND sc.`date` BETWEEN \''.$s[0].'-09-01\' AND \''.$s[1].'-08-31\' ';
$queryBuilder->andWhere(' sc.date BETWEEN \'' . $s[0] . '-09-01\' AND \'' . $s[1] . '-08-31\' ');
}
// par année
if (array_key_exists('year', $special)) {
// $sql_where .= ' AND sc.`date` BETWEEN \''.$special['year'].'-01-01\' AND \''.$special['year'].'-12-31\' ';
$queryBuilder->andWhere(' sc.date BETWEEN \'' . $special['year'] . '-01-01\' AND \'' . $special['year'] . '-12-31\' ');
}
// par lieu
if (array_key_exists('area', $special)) {
if ($this->my_is_int($special['area'])) {
if (empty($special['carte_version'])) {
$special['carte_version'] = 'Regions';
}
$repo_carte = $conn->getRepository('TheatreCore\Entity\\' . $special['carte_version']);
if ($repo_carte->getZipCode($special['area'])) {
$queryBuilder->andWhere($repo_carte->getZipCode($special['area']));
};
} else {
$queryBuilder->andWhere(' contacts.country = \'' . $this->escape($special['area']) . '\'');
}
}
// paramètres en plus
if (array_key_exists('where', $params) && ! empty($params['where'])) {
$where = $paramswhere = ltrim($params['where']);
if (substr($paramswhere, 0, 3) == 'AND') {
$where = substr($paramswhere, 3);
}
// else{
// $where = preg_replace('/^AND/', '', $paramswhere, 1);
// }
$where = preg_replace('/`/', '', $where);
$queryBuilder->andWhere($where);
}
// groupement par défaut
if (!array_key_exists('groupby', $params)) {
$groupby = ' ';
if (isset($distinct_spectacle) && $distinct_spectacle) {
// $groupby = ' GROUP BY s.idspectacle ';
$queryBuilder->addGroupBy('s.idspectacle');
}
} else {
if (empty($special['count_only'])) {
// $groupby = ' GROUP BY ' . $params['groupby'];
$queryBuilder->addGroupBy($params['groupby']);
}
}
// classement par défaut
if (!array_key_exists('order', $params)) {
// si ancien, classement DESC
if (array_key_exists('anciens', $special) || array_key_exists('anciens_stricts', $special)) {
$classement = 'DESC';
} else {
$classement = 'ASC';
}
if (array_key_exists('classement', $params)) {
$classement = $params['classement'];
}
$queryBuilder->orderBy('sc.date', $classement);
// $order = ' ORDER BY sc.date '.$classement;
} else {
// $queryBuilder->orderBy($params['order'][0], $params['order'][1]);
$queryBuilder->orderBy($params['order'][0], $params['order'][1]);
// $order = ' ORDER BY '.;
}
// classement aléatoire
if (array_key_exists('random', $special)) {
// $order = ' ORDER BY RAND() '.$special['random'];
// $queryBuilder->orderBy('RAND()', $special['random']);
}
// plus prochess
if (array_key_exists('tri_plus_proches', $special)) {
// $order = ' ORDER BY SIGN(DATEDIFF(\''.date('Y-m-d').'\', sc.`date`)) ASC, ABS(DATEDIFF(\''.date('Y-m-d').'\', sc.`date`)) ';
}
// limite par défaut
if (!array_key_exists('limit', $params)) {
$limit = ' LIMIT 0,10';
$queryBuilder->setFirstResult(0)
->setMaxResults(10);
} else {
if ($params['limit'] != 'all') {
if (is_array($params['limit'])) {
$queryBuilder->setFirstResult(abs($params['limit'][0]))
->setMaxResults(abs($params['limit'][1]));
} else {
$queryBuilder->setMaxResults($params['limit']);
}
} else {
$limit = ' ';
}
}
// $sql_global = $sql_select.$sql_from.$sql_where.$groupby.$sql_having.$order.$limit.$sql_parenthese;
$sql_global = '';
// echo "<br/><br/><br/>";
// debugage
// if($debug) {
//
// ob_start();
//
// echo '<strong>Requête créé : </strong>';
// echo '<pre>'.$sql_global.'</pre>';
//
// echo '<strong>Liste des champs sélectionnés pour la méthode getSQLSpectacles :</strong>';
// echo '<pre>';
// print_r($fields_list);
// echo '</pre>';
//
// if(!empty($params)) {
// echo '<strong>Liste des paramétres supplémentaires :</strong>';
// echo '<pre>';
// print_r($params);
// echo '</pre>';
// }
//
// if(!empty($special)) {
// echo '<strong>Liste des options demandées :</strong>';
// echo '<pre>';
// print_r($special);
// echo '</pre>';
// }
//
// $debug_trace = ob_get_clean();
//
// $this->setDebugView($debug_trace,__FUNCTION__);
// }
// echo $sql_global;
if ($distinct_spectacle) {
$queryBuilder->distinct();
}
$query = $queryBuilder->getQuery();
$query->enableResultCache();
return $query;
}
// }}}
// {{{ getLanguageListSpectacle()
/** Récupére toutes les langues qui ont un spectacle
*
* Récupére toutes les langues pour les listes
*
* @access public
* @param bool $order Classement ou pas
* @param int $idperson Identifiant de a personne
* @return array
*/
public function getLanguageListSpectacle($order = true, $idperson)
{
$idperson = (int)$idperson;
$sql = 'SELECT DISTINCT id, ' . $GLOBALS['lng'] . '
FROM languages, spectacles, schedules, contacts, text_spectacle
WHERE languages.id = spectacles.language
AND spectacles.idspectacle = schedules.idspectacle
AND schedules.idcontact = contacts.idcontact
AND spectacles.idspectacle = text_spectacle.idspectacle
AND text_spectacle.idtext IN (
SELECT idtext FROM text_author WHERE idperson=' . $idperson . '
UNION
SELECT idtexttraduction FROM text_traduction, text_author
WHERE text_traduction.idtext=text_author.idtext AND text_author.idperson =' . $idperson . '
)
AND spectacles.publish=1
ORDER BY orderby, ' . $GLOBALS['lng'];
$res = $this->queryAll($sql, array(), null, true);
$language_list = $res;
if ($order) {
array_unshift($language_list, $GLOBALS['tr']->trans('form_def_language'));
}
return $language_list;
}
// }}}
// {{{ getCountryListSpectacle()
/** Récupére la liste des pays qui ont un spectacle
*
* Récupére tous les pays pour les listes
*
* @access public
* @param bool $order Classement ou pas
* @param int $idperson Identifiant de a personne
* @return array
*/
public function getCountryListSpectacle($order = true, $idperson)
{
$idperson = (int)$idperson;
$sql = 'SELECT DISTINCT id, ' . $GLOBALS['lng'] . '
FROM countries, spectacles, schedules, contacts, text_spectacle, text_traduction, texts, text_author
WHERE countries.id = contacts.country
AND spectacles.idspectacle = schedules.idspectacle
AND schedules.idcontact = contacts.idcontact
AND spectacles.idspectacle = text_spectacle.idspectacle
AND text_spectacle.idtext = text_traduction.idtexttraduction
AND text_traduction.idtext = texts.idtext
AND texts.idtext = text_author.idtext
AND text_author.idperson = ' . $idperson . '
AND spectacles.publish=1
ORDER BY orderby, ' . $GLOBALS['lng'];
$res = $this->queryAll($sql, array(), null, true);
$country_list = $res;
if ($order) {
array_unshift($country_list, $GLOBALS['tr']->trans('form_def_country'));
}
return $country_list;
}
// }}}
// {{{ getCityListSpectacle()
/** Récupére la liste des ville qui ont un spectacle
*
* Récupére tous les pays pour les listes
*
* @access public
* @param bool $order Classement ou pas
* @param int $idperson Identifiant de a personne
* @return array
*/
public function getCityListSpectacle($periode = 'prochains', $duree = 180, $zone = null)
{
// prochainement ou anciennement
if ($periode == 'prochains') {
$date_duree = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) + $duree * 24 * 3600);
$sql_duree = ' sc.date BETWEEN \'' . date('Y-m-d') . '\' AND \'' . $date_duree . '\' ';
} else {
$date_duree = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) - $duree * 24 * 3600);
$sql_duree = ' sc.date BETWEEN \'' . $date_duree . '\' AND \'' . date('Y-m-d') . '\' ';
}
// trouver les villes ou il y a un spectacle à +/-180 jours
$sql_city = 'SELECT DISTINCT(city), city as cty
FROM spectacles s, schedules sc, contacts
WHERE 1
AND s.idspectacle=sc.idspectacle
AND sc.idcontact=contacts.idcontact
AND ' . $sql_duree;
if ($zone) {
$sql_city .= ' AND' . $zone;
}
$conn = $this->getEntityManager()->getConnection();
$query = $conn->executeQuery($sql_city);
return $query->fetchAll(\PDO::FETCH_COLUMN | \PDO::FETCH_ASSOC);
}
// }}}
// {{{ getRelationsArray()
/** Tableau des relations
*
* @access public
* @param string|int $type le type de champ
*/
public function getRelationsArray($type)
{
// récupérer les relations communes
$array_types = $this->getRelationsArrayTrait('all');
$array_types += array(
'spectacle_trailer' => array(// documents multimedia associés
'type_join' => 'method',
'method' => 'getMultimediaList',
'description' => 'Document(s) multimédia associé à ce spectacle',
'silent_delete_relation' => true,
'use_constraint' => false,
),
// spectacle_classification idspectacle
'spectacle_classification' => array(// classifications associées
'type_join' => 'multiple',
'dest_table' => 'classifications',
'join_table' => 'spectacle_classification',
'fields' => array('idclassification', 'classification', 'type'),
'description' => 'Classifications associées à ce spectacle',
'silent_delete_relation' => true,
),
// schedules idspectacle
'schedules' => array(// dates de spectacle
'type_join' => 'simple',
'dest_table' => 'schedules',
'fields' => array('idschedule', 'date', 'hour'),
'description' => 'Contact(s) associé(s) à ce spectacle',
'silent_delete_relation' => true,
),
// spectacle_contact idspectacle
'spectacle_contact' => array(// contacts associées a ce spectacle
'type_join' => 'multiple',
'dest_table' => 'contacts',
'join_table' => 'spectacle_contact',
'fields' => array('idcontact', 'lastname', 'firstname', 'organisation', 'type', 'url_clean', 'valid'),
'description' => 'Contact(s) associé(s) à ce spectacle',
'silent_delete_relation' => true,
),
// spectacle_person idspectacle
'spectacle_person' => array(// persons associées a ce spectacle
'type_join' => 'multiple',
'dest_table' => 'persons',
'join_table' => 'spectacle_person',
'fields' => array('idperson', 'lastname', 'firstname', 'url_clean', 'valid'),
'description' => 'Artiste(s) associé(s) à ce spectacle',
'silent_delete_relation' => true,
),
// spectacle_reflexion idspectacle
'idspectacle_reflexion' => array(// piste de réflexion associées a ce spectacle
'type_join' => 'simple',
'dest_table' => 'reflexions',
'fields' => array('idreflexion', 'module', 'title'),
'description' => 'Piste(s) de réflexion associée(s) à ce spectacle',
),
// idextranetuser idspectacle
'idextranetuser' => array(// utilisateur associé
'type_join' => 'simple',
'dest_table' => 'extranetusers',
'join_field_src' => 'idextranetuser', // jointure
'fields' => array('idextranetuser', 'login', 'email'),
'description' => 'Utilisateur associé au spectacle',
'silent_delete_relation' => true,
),
);
// retourne uniquement un type précis
if ($type == 'all') {
return $array_types;
}
if (!empty($array_types[$type])) {
$array_types[$type]['type'] = $type;
return $array_types[$type];
} else {
return null;
}
}
// }}}
// {{{ getApiTab()
/** génére la version pour la diffusion API
*
* @see Theatre::getApiTab
*/
public function getApiTab($data, $url = null, $params_options = array())
{
// généré à partir de getApiFields
$data_api = $this->getApiTabTrait($data, $_ENV['URL_THNET']);
// on ajoute la periode et la prochaine date
if (!empty($data['periode'])) {
$data_api['near_dates'] = array(
'start' => $data['periode']['datestart_std'],
'end' => $data['periode']['dateend_std']
);
if (!empty($data['periode'][0])) {
$data_api['near_dates']['city'] = $data['periode'][0]->getContact()->getCity();
$data_api['near_dates']['zipcode'] = $data['periode'][0]->getContact()->getZip();
$country = $data['periode'][0]->getContact()->getCountry();
$data_api['near_dates']['country'] = $country ? $country->getId() : 'FR';
}
} else {
if (!empty($data['prochdate_std'])) {
$data_api['near_dates'] = array(
'start' => $data['prochdate_std'],
'end' => null,
'city' => $data['city'],
'zipcode' => $data['zip'],
'country' => $data['country'],
);
if (!empty($data['periode'][0])) {
$data_api['near_dates']['city'] = $data['periode'][0]->getContact()->getCity();
$data_api['near_dates']['zipcode'] = $data['periode'][0]->getContact()->getZip();
$data_api['near_dates']['country'] = $data['periode'][0]->getContact()->getCountry()->getId();
}
}
}
// infos sur le contact
if (!empty($data_api['near_dates'])) {
$data_api['near_dates']['place'] = array(
'name' => $data['contact']['organisation'],
'object' => $data['contact']['url_clean'],
'permanent_url' => $_ENV['URL_THNET'] . '/contacts/' . $data['contact']['url_clean'] . '/',
'geocode' => array(
'x' => $data['contact']['x'],
'y' => $data['contact']['y'],
),
);
}
// infos sur le texte
if (!empty($data['text'])) {
$data_api['text'] = array(
'title' => $data['text']['title'],
'object' => $data['text']['url_clean'],
'permanent_url' => $_ENV['URL_THNET'] . '/textes/' . $data['text']['url_clean'] . '/',
);
if (!empty($data['text']['vignette_object'])) {
$data_api['text']['poster'] = $data['text']['vignette_object'];
$data_api['text']['publisher_url'] = $data['text']['publisher_url_text'];
}
}
// dans le cas de textefictif non adapaté
if (!empty($data['textfictif']) && $data['textfictif'] == 1 && empty($data['adaptation'])) {
$data_api['author_is_creator'] = true;
}
return $data_api;
}
// }}}
// {{{ getApiFields()
/** champs à renvoyer par l'API
*
* @access public
* @param array tableau de données
*/
protected function getApiFields()
{
return array(
'object' => 'url_clean',
'title' => 'title',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/spectacles/${1}/', // url complète
'allauthors->authors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/biographies/${1}/',
),
'adaptation' => array(
'object' => 'url_clean',
'title' => 'title',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/textes/${1}/',
'allauthors->authors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/biographies/${1}/',
),
),
'alldirectors->directors' => array(
'object' => 'url_clean',
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/biographies/${1}/',
'ecoles->studies' => array(
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/contacts/${1}/',
'date_start' => 'start#([0-9]{4})(.*)#$1', // ne garder que l'année
'date_end' => 'end#([0-9]{4})(.*)#$1',
),
'supported' => 'supported',
),
'allactors->actors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'ecoles->studies' => array(
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/contacts/${1}/',
'date_start' => 'start#([0-9]{4})(.*)#$1', // ne garder que l'année
'date_end' => 'end#([0-9]{4})(.*)#$1',
),
'supported' => 'supported',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/biographies/${1}/',
),
'distributions' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'ecoles->studies' => array(
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/contacts/${1}/',
'date_start' => 'start#([0-9]{4})(.*)#$1', // ne garder que l'année
'date_end' => 'end#([0-9]{4})(.*)#$1',
),
'roles' => 'all', // les roles
'supported' => 'supported',
'url_clean' => 'permanent_url#(.*)#' . $_ENV['URL_THNET'] . '/biographies/${1}/',
),
'vignette_affiche' => 'poster',
'publish' => 'published',
'dateinsert' => 'insert_date',
'typespectacle' => 'typespectacle',
'no_text' => 'textfictif',
);
}
// }}}
// {{{ countSpectacles()
/** Compter le nombre total de spectacles
*
* @access public
* @return int
*/
public function countSpectacles($params = array())
{
$sql = 'SELECT COUNT(DISTINCT(s.`idspectacle`))
FROM spectacles s';
if (!empty($params['date_start'])) {
$sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`
WHERE 1
AND sc.`date`>\'' . $params['date_start'] . '\' ';
}
if (!empty($params['prochains'])) {
$dateend = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) + $params['prochains'] * 24 * 3600);
$sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`
WHERE 1
AND (sc.date BETWEEN \'' . date('Y-m-d') . '\' AND \'' . $dateend . '\') ';
}
if (!empty($params['contents'])) {
$sql .= ' JOIN object_content oc ON oc.`idobject`=s.`idspectacle`
JOIN contents c ON oc.`idcontent`=c.`idcontent`
JOIN content_classification cc ON cc.`idcontent`=c.`idcontent`
JOIN classifications cl ON cl.`idclassification`=cc.`idclassification`
WHERE 1 ';
$sql .= ' AND oc.`object`=\'spectacles\'
AND cl.`classification` IN (' . $this->arrayToIn($params['contents']['classifications']) . ') ';
}
return $this->queryOne($sql);
}
// }}}
// {{{ countSpectaclesWithMultimedias()
/** Compter le nombre total de spectacles avec vidéo
*
* @access public
* @return int
*/
public function countSpectaclesWithMultimedias($params = array())
{
$where = ' WHERE 1 ';
$sql = 'SELECT COUNT(DISTINCT(s.`idspectacle`))
FROM spectacles s';
if (!empty($params['prochains'])) {
if (is_array($params['prochains'])) {
$datestart = $params['prochains'][0];
$dateend = $params['prochains'][0];
} else {
$datestart = date('Y-m-d');
$dateend = strftime('%Y-%m-%d', strtotime(date('Y-m-d')) + $params['prochains'] * 24 * 3600);
}
$sql .= ' JOIN schedules sc ON sc.`idspectacle`=s.`idspectacle`';
$where .= ' AND (sc.date BETWEEN \'' . $datestart . '\' AND \'' . $dateend . '\') ';
}
$sql .= ' JOIN object_multimedia om ON om.`idobject`=sc.`idspectacle`';
$where .= ' AND om.`object`= \'spectacles\' ';
$sql = $sql . $where;
return $this->queryOne($sql);
}
// }}}
// {{{ countSpectaclesInSpecificLanguage()
/** Compter le nombre total de spectacles ou d'adaptation dans une langue spécifique
* @return int
* @todo il manque des parametres, a améliorer...
*
* @access public
*/
public function countSpectaclesInSpecificLanguage($params = array())
{
$cle_filtre_language = 'language_egal';
if (array_key_exists('keylanguage', $params) && !empty($params['keylanguage'])) {
$cle_filtre_language = $params['keylanguage'];
}
$query = $this->getSQLSpectacles(
array(
'limit' => 'all'
),
array(
'join' => true,
'count_only' => true,
'count_only_distinct' => 's.idspectacle',
'select_by_text_or_adaptation' => $params['id_text'],
'spectacle' => array(
$cle_filtre_language => $params['lang']
)
)
);
// executer la requete
return $query->getSingleResult(Query::HYDRATE_SCALAR)['total'];
}
// }}}
/** Créer un tableau unique allpersons contenant tous les auteurs et metteurs-en-scène
*
* Note : on pourrait supprimer les unset... a voir
*
* @access public
* @return array
*/
public function clearSpectaclesAddAllPersons($sp)
{
$allauthors = $alldirectors = array();
if (empty($sp['allauthors']))
return $sp;
if (!empty($sp['allauthors'])) {
$allauthors = $sp['allauthors'];
}
if (!empty($sp['alldirectors'])) {
$alldirectors = $sp['alldirectors'];
}
$allpersons = $allauthors + $alldirectors;
unset($sp['allauthors']);
unset($sp['alldirectors']);
foreach ($allpersons as $kap => $vap) {
unset($vap['nopunct']);
$sp['allpersons'][$vap['idperson']] = $vap;
}
$sp['allpersons'] = $this->noPunct($sp['allpersons']);
return $sp;
}
// }}}
}