<?php
namespace App\Controller;
use App\ClassTheatre\asides;
use App\ClassTheatre\TheatreController;
use App\Service\Abonnements\Abonnements;
use App\Service\Ajoutaides;
use App\Service\EditUtils;
use App\Service\Functions;
use App\Service\Opengraph\OpenGraph;
use App\Service\TheatreMail\TheatreMail;
use App\Service\UploadUtils;
use App\Service\wiki2xhtml\wiki2xhtml;
use App\Validator\CheckWebsite;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Exception\RedirectException;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Type;
use TheatreCore\Classes\UtilsEdit;
use TheatreCore\Classes\Stats\Stats as GlobalStats;
use TheatreCore\Entity\Aides;
use TheatreCore\Entity\BookmarkExtranetuser;
use TheatreCore\Entity\Classifications;
use TheatreCore\Entity\Contents;
use TheatreCore\Entity\Dvds;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Files;
use TheatreCore\Entity\Multimedias;
use TheatreCore\Entity\News;
use TheatreCore\Entity\Persons;
use TheatreCore\Entity\Playlists;
use TheatreCore\Entity\Podcasts;
use TheatreCore\Entity\Schedules;
use TheatreCore\Entity\SpectacleAide;
use TheatreCore\Entity\Spectacles;
use TheatreCore\Entity\Stats;
use TheatreCore\Entity\Texts;
use TheatreCore\Entity\Typesspectacles;
use TheatreCore\Entity\UserAction;
use TheatreCore\Repository\ContentsRepository;
use TheatreCore\Repository\FilesRepository;
class SpectacleController extends TheatreController
{
// id du spectacle
protected $idspectacle = null;
// object spectacles
protected $spectacles;
// object contents
protected $contents;
// contenu du spectacles
protected $data_spectacles = array();
// précision fil d'arianne
protected $locate = null;
// titre de la page
protected $title_page = null;
// nombre de com sur le spectacle
protected $nb_comments = 0;
// paramètres pour les commentaires
protected $params_comments = array();
// meta keywords et meta description
protected $meta_keywords = '';
protected $meta_description = '';
// taille maxi des vidéos
protected $other_dimensions = array();
// infos pour mon théâtre
protected $mtinfos = array();
// pour la navigation
protected $extra_title = '';
protected $extra_locate = '';
// les textes
protected $ids_texts = array();
// style
protected $styles_folder = array();
// asides
protected $asides = "";
// par page
protected $perPage = 7;
protected $serviceAbonnements;
protected ?AdapterInterface $cache = null;
// {{{ InitController()
public function InitController($slug = null, $action = null, $params = [])
{
// surbrillance du menu principal (thnet)
$GLOBALS['rub_courante'] = 'spectacles';
$this->view->action = $this->context['action'] = $action;
$this->RouterOptions($slug, $action, $GLOBALS['rub_courante']);
$this->view->controller = $GLOBALS['rub_courante'];
// charger swfobject
$this->view->jquery_flash = true;
if (!empty($params['idspectacle'])) {
$this->idobject = $this->id = (int)$params['idspectacle'];
} else {
$params['idspectacle'] = $this->idobject = (int)$this->id;
}
$this->context['params']['idspectacle'] = $params['idspectacle'] = $this->idspectacle = $this->id;
// si id spectacle n'existe pas, on renvoi sur une page d'erreur (a faire !!!)
if (empty($params['idspectacle'])) {
throw new NotFoundHttpException();
}
// spécial lagarce
// if($this->context['module']=='lagarce') {
// $id_exclude = 3;
// } else {
$id_exclude = null;
// }
// identifiant du spectacle
$this->idspectacle = $params['idspectacle'];
// instancier un objet spectacles
$this->spectacles = $this->em->getRepository(Spectacles::class);
$this->data_spectacles = $this->spectacles->createQueryBuilder('e')
->leftJoin('e.idtypespectacle', 'a')
->leftJoin('e.idcontactCreation', 'cc')
->leftJoin('e.idcontactProduction', 'cp')
->leftJoin('e.idextranetuser', 'u')
->andWhere('e.idspectacle = :idspectacle')
->setParameter('idspectacle', $params['idspectacle'])
->select('e, partial a.{idtypespectacle}, cc, cp, partial u.{idextranetuser}')
->getQuery()
->getSingleResult(Query::HYDRATE_ARRAY);
// si nous ne sommes pas dans l'API && vérifier que le spectacle appartient à l'utilisateur connecté ou que root est connecté
if (empty($params['api']) && $this->getUser() instanceof Extranetusers && $this->data_spectacles['idextranetuser'] == $this->getUser()->getIdExtranetuser()) {
$this->data_spectacles['my_spectacle'] = true;
}
// pour les lectures
if ($this->data_spectacles['idtypespectacle']['idtypespectacle'] == 1) {
$this->data_spectacles['is_lecture'] = true;
}
// pour les travail d'atelier
if ($this->data_spectacles['idtypespectacle']['idtypespectacle'] == 5) {
$this->data_spectacles['is_travail_atelier'] = true;
}
// si le spectacle a le statut supprimé
if ($this->data_spectacles['statut'] == 4) {
// on est root => affiché avec un message
if ($this->isGranted('ROLE_ISROOT')) {
$this->data_spectacles['supprime'] = true;
} else {
throw new RedirectException('/spectacles/statut/non-accessible?from=' . $this->data_spectacles['urlClean']);
}
}
// si le spectacle est hors ligne
if ($this->data_spectacles['publish'] == 0) {
// on est root => affiche "ce spectacle est hors ligne"
if ($this->isGranted('ROLE_ISROOT')) {
$this->data_spectacles['hors_ligne'] = true;
// on est pas root mais on est l'extranetuser du spectacle => "ce spectacle est actuellement hors ligne."
} elseif (!empty($this->data_spectacles['my_spectacle'])) {
// si le spectacle n'est pas validé (statut 1) => "votre spectacle est en cours de validation"
// si statut supérieur à 1 et inférieur à 4 => "rien"
if ($this->data_spectacles['statut'] == 1) {
$this->data_spectacles['validation_encours'] = true;
} elseif ($this->data_spectacles['statut'] == 0) {
$this->data_spectacles['incomplet'] = true;
} else {
$this->data_spectacles['hors_ligne'] = true;
// pour lien mise hors ligne
$this->func->tokenCsrf('ajoutspectacles', $this->context);
}
} else {
// on est "rien" => page d'erreur
throw new RedirectException('/spectacles/statut/non-accessible?from=' . $this->data_spectacles['urlClean'] . '&publish=false');
}
}
// statut du spectacle => 1 = proposé / 2 = validé / 3 = modifié / 4 = supprimé. On affiche quand c'est un
// recuperer le titre du spectacle
$this->data_spectacles['title'] = $this->spectacles->getObjectTitle($this->idspectacle, array('idspectacle' => $this->idspectacle, 'title' => $this->data_spectacles['title']));
// type de spectacle (chaine traduite)
$typesspectacles = $this->em->getRepository(Typesspectacles::class);
$this->data_spectacles['typespectacle'] = $typesspectacles->getTypespectacle($this->data_spectacles['idtypespectacle']['idtypespectacle'], $this->context['lng']);
// si pas de titre = collage
if ($this->data_spectacles['title'] != '') {
$this->view->data_spectacles['collage'] = true;
}
// date de creation
if (!empty($this->data_spectacles['creationDate'])) {
$this->data_spectacles['annee_creation'] = $this->spectacles->getYear($this->data_spectacles['creationDate']->format('Y'));
}
// recuperer le ou les metteurs en scene
$this->data_spectacles['alldirectors'] = $this->spectacles->noPunct($this->spectacles->getDirectors($this->idspectacle));
// metteur en scene separe par des virgules
if (!empty($this->data_spectacles['alldirectors'])) {
$this->data_spectacles['directorstring'] = $this->spectacles->getDirectorsString($this->idspectacle, $this->data_spectacles['alldirectors']);
}
// recuperer la liste des textes du spectacle
$this->data_spectacles['texts'] = $this->spectacles->noPunct($this->spectacles->getSpectacleText(true, $this->data_spectacles['idspectacle']));
// compter les textes
if (count($this->data_spectacles['texts']) > 1) {
$this->data_spectacles['texts_multiple'] = true;
}
if ($this->data_spectacles['textfictif'] == 0 && count($this->data_spectacles['texts']) > 0) {
foreach ($this->data_spectacles['texts'] as $t) {
$this->ids_texts[$t['idtext']] = $t['idtext'];
}
}
// liste des auteurs des texts qui dépendent de ce spectacle
$textauthor = $this->em->getRepository(Texts::class);
$this->data_spectacles['otherauthor'] = array();
$this->data_spectacles['authorstring'] = null;
// nombre de textes
$nbtexts = 0;
$month = array(
1 => 'Janvier',
2 => 'Février',
3 => 'Mars',
4 => 'Avril',
5 => 'Mai',
6 => 'Juin',
7 => 'Juillet',
8 => 'Août',
9 => 'Septembre',
10 => 'Octobre',
11 => 'Novembre',
12 => 'Decembre',
);
if (isset($this->data_spectacles['texts'])) {
foreach ($this->data_spectacles['texts'] as $k => $v) {
if ($v['textfictif'] != 1) {
$nbtexts++;
// tous les auteurs d'un texte
$this->data_spectacles['texts'][$k]['authors'] = $this->spectacles->noPunct($textauthor->getAuthors($v['idtext'], $v['type']));
foreach ($this->em->getRepository(Texts::class)->getInfosText($v['idtext']) as $kdetail => $vdetail) {
$this->data_spectacles['texts'][$k][$kdetail] = $vdetail;
if ($kdetail == 'publication_year') {
$this->data_spectacles['texts'][$k]['publication_year'] = $vdetail;
}
if ($kdetail == 'publication_month' && !empty($vdetail)) {
if (strlen($vdetail) == 1) {
$this->data_spectacles['texts'][$k]['publication_month'] = '0' . $vdetail;
} else {
$this->data_spectacles['texts'][$k]['publication_month'] = $vdetail;
}
$this->data_spectacles['texts'][$k]['publication_month_caractere'] = $month[$vdetail];
}
}
if (key($this->data_spectacles['texts'][$k]['authors']) != $id_exclude /* id lagarce */) {
$this->data_spectacles['otherauthor'] = $this->spectacles->noPunct($this->data_spectacles['texts'][$k]['authors']);
}
// auteurs separe par des virgules
foreach ($this->data_spectacles['texts'][$k]['authors'] as $kauthor => $vauthor) {
$this->data_spectacles['authorstring'] .= $vauthor['firstname'] . ' ' . $vauthor['lastname'];
if (!array_key_exists('nopunct', $vauthor)) {
$this->data_spectacles['authorstring'] .= ', ';
}
}
if ($this->data_spectacles['texts'][$k]['typetxt'] == 'translate') {
// les textes originaux
$txtorig = $this->em->getRepository(Texts::class);
$this->data_spectacles['texts'][$k] = $txtorig->getInfosText($this->data_spectacles['texts'][$k]['idtext']);
// pas de virgule sur le dernier translator
if (array_key_exists('alltranslators', $this->data_spectacles['texts'][$k])) {
$this->data_spectacles['texts'][$k]['alltranslators'] = $this->spectacles->noPunct($this->data_spectacles['texts'][$k]['alltranslators']);
}
}
}
}
}
if ($nbtexts == 1) { // si un seul texte on cherche l'auteur autre que lagarce
// url
//on récupère la vignette associé au texte
$this->data_spectacles['vignette_text'] = $this->em->getRepository(Texts::class)->getVignetteText($this->data_spectacles['texts'][0]['idtext']);
$this->data_spectacles['textunique'] = true;
$this->data_spectacles['idtext'] = $this->data_spectacles['texts'][0]['idtext'];
$this->data_spectacles['url_clean_text'] = $this->data_spectacles['texts'][0]['url_clean'];
$text_publisher = $this->em->getRepository(Texts::class);
$text_details = $text_publisher->getInfosText($this->data_spectacles['texts'][0]['idtext']);
if (!empty($text_details['idcontact_publisher'])) {
// $pub = $text_publisher->getLink('idcontact_publisher');
$this->data_spectacles['publisher'] = $text_details['idcontact_publisher'];
if (!empty($pub->country)) {
$pub_country = $pub->getLink('country');
$this->data_spectacles['publisher']['country'] = $pub_country->fr;
} else {
unset($this->data_spectacles['publisher']['country']);
}
}
} else {
$this->data_spectacles['otherauthor'] = array();
}
$this->data_spectacles['texts'] = $this->spectacles->noPunct($this->data_spectacles['texts']);
// voir si le spectacle est dans educ
if ($nbtexts == 1 && $this->isTheduc()) {
$this->data_spectacles['theduc'] = true;
$this->data_spectacles['url_clean_theduc'] = $_ENV['URL_THEDUC'] . '/pieces/' . $this->data_spectacles['texts'][0]['url_clean'] . '/spectacles/' . $this->data_spectacles['urlClean'] . '/';
}
// Génération de la liste des biographies (avec filtrage si auteur=metteur)
if (!empty($this->data_spectacles['otherauthor'])) {
foreach ($this->data_spectacles['otherauthor'] as $k => $v) {
$this->data_spectacles['biographies'][$k] = $v;
}
}
if (!empty($this->data_spectacles['alldirectors'])) {
foreach ($this->data_spectacles['alldirectors'] as $k => $v) {
if (!isset($this->data_spectacles['biographies'][$k])) {
$this->data_spectacles['biographies'][$k] = $v;
}
}
}
// si le texte est une adaptation a partir des textes, il faut trouver aussi les textes originaux
if ($nbtexts == 1 && !empty($this->data_spectacles['texts'][0]['type']) && $this->data_spectacles['texts'][0]['type'] == 2) {
// retrouver les textes de l'adaptation
$texts_adaptation = $this->em->getRepository(Texts::class);
$adaptations = $texts_adaptation->getOriginalsTexts($this->data_spectacles['texts'][0]['idtext'], 'text_adaptation', 'idtextadaptation');
foreach ($adaptations as $k => $v) {
$texts_from_adaptations = $this->em->getRepository(Texts::class);
$adaptations[$k] = $texts_from_adaptations->getInfosText($k);
}
$this->data_spectacles['texts_adaptation'] = $this->spectacles->noPunct($adaptations);
$this->data_spectacles['adaptation'] = true;
}
// recuperer l'affiche du spectacle
$this->contents = $this->em->getRepository(Contents::class);
$illustrations = $this->contents->getIllustrations($this->idspectacle, 'spectacles', 'class_affiche_spec');
if (!empty($illustrations)) {
// illustrations
$this->data_spectacles['illustrations'] = $illustrations['illustrations'];
$this->data_spectacles['vignette_object'] = $this->spectacles->getVignetteSpectacle($this->idspectacle, array('width' => 101, 'height' => 101, 'direction' => 'crop'));
$this->data_spectacles['vignette_object_blur'] = $this->spectacles->getVignetteSpectacle($this->idspectacle, array('width' => 102, 'height' => 102, 'direction' => 'crop', 'blur' => true));
}
// titre de la page (auteur + metteur + spectacle)
$this->title_page = $this->data_spectacles['title']
. ' - ' . $this->data_spectacles['authorstring']
. ' - ' . $this->data_spectacles['idtypespectacle']['idtypespectacle'];
if (!empty($this->data_spectacles['directorstring'])) {
$this->title_page .= ' ' . $this->data_spectacles['directorstring'];
}
$this->view->data_object = $this->data_spectacles;
// fin infos sur le spectacle
// flux rss des commentaires du spectacle
/*$this->view->flux_rss = array(
'name' => 'Commentaires sur le spectacle '.$this->data_spectacles['title'],
'url' => $this->context['url_module'].'/spectacles/'.$this->data_spectacles['urlClean'].'/rss-commentaires/',
);*/
// style des spectacles
$this->style_more = array('dossier', 'spectacle',);
// fil d'arianne
$this->locate = array(
'/spectacles/' => 'Spectacles',
'/spectacles/' . $this->data_spectacles['urlClean'] . '/' => $this->data_spectacles['title']
);
// pour les liens dans le template
$this->view->url_folder = '/spectacles/' . $this->data_spectacles['urlClean'];
$this->view->data_object['url_folder'] = '/spectacles/' . $this->data_spectacles['urlClean'];
}
// {{{ __construct
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
Functions $func,
Abonnements $abonnements,
AdapterInterface $cache
)
{
parent::__construct($translator, $tokenStorage);
$this->em = $em;
$this->cache = $cache;
$this->func = $func;
$this->serviceAbonnements = $abonnements;
$this->view->include_header = 'spectacles/spectacle_entete.inc.html.twig';
$this->asides = new asides();
}
// {{{ finalizeAction()
/** Code exécuté après chaque action
*
*
* @access protected
* @return void
*/
protected function finalizeAction()
{
// titre de la page
if ($this->extra_title) {
$this->title_page = $this->extra_title . ' - ' . $this->title_page;
}
// complément fil d'arianne
if ($this->extra_locate) {
$this->locate[0] = $this->extra_locate;
}
$this->view->data_spectacles = $this->data_spectacles;
$this->buildMenu();
// voir si l'objet est bookmarke
$bookmark = $this->em->getRepository(BookmarkExtranetuser::class);
if ($this->getUser() instanceof Extranetusers
&& $bookmark->isBookmark($this->idspectacle, 'spectacles', $this->getUser()->getIdextranetuser())) {
$this->view->is_bookmark = true;
}
// action pour add/delete bookmark
if (isset($_GET['bookmark'])) {
$this->view->bookmark = true;
$do_action = $_GET['do_action'];
$this->view->$do_action = true;
}
// statistiques (sauf pour la page des com's) TODO url différente pour lagarce
if (empty($this->current['idcontent'])) {
$this->current['idcontent'] = null;
}
// statistiques
if (!empty($this->idspectacle) && !$this->no_stats) {
$statsinfos = array(
'type' => 'article',
'module' => $this->context['module'],
'url' => $_SERVER['REQUEST_URI'],
'idcontent' => (int)$this->current['idcontent'],
'object' => 'spectacles',
'idobject' => $this->idspectacle,
'video' => (int)(!empty($this->view->detailarticle['display_media']))
);
$stats = $this->em->getRepository(Stats::class);
$stats->setStats($statsinfos, __FILE__ . ':' . __LINE__);
}
// autres infos pour montheatre
$this->mtinfos = array(
'object' => 'spectacles',
'idobject' => $this->idspectacle,
'urifrom' => $this->view->url_folder ?? $this->url_folder ?? null,
'info_rub' => 'ce spectacle',
'idcontent' => (int)$this->current['idcontent'],
);
// a la vue
$this->view->mtinfos = $this->mtinfos;
// aside
$this->view->aside = $this->asides->view($this->view);
// Copier/coller de l'ancien version du site en php 5.6
// ------------------------
// retour en XML ou JSON ou version mobile
if (isset($_GET['xml_version'])) {
$this->context['view']->xml_version = true;
$this->view->ajaxreponse = true;
header('Content-Type: application/xml');
}
if (isset($_GET['json'])) {
$this->view->ajax = true;
$this->view->ajaxreponse = true;
$this->context['view']->json = json_encode($this->context['view']->data_spectacles);
$this->context['action'] = 'json';
header('Content-Type: application/json');
}
// fil d'arianne
$this->view->locate = $this->getLocate();
// titre meta
$this->view->title_page = $this->getTitlePage();
// style et js en plus
$this->view->style_more = $this->getStyleMore();
$this->view->js_more = $this->getJsMore();
// js en plus pour le calendrier
if (!empty($this->context['view']->schedule_detail)) {
$this->view->js_more[] = 'jquery.qtip.min.js';
}
// template de tete
$this->view->include_header = 'spectacles/spectacle_entete.inc.html';
// keywords et description
$this->view->meta_keywords = $this->getMetaKeywords();
$this->view->meta_description = $this->getMetaDescription();
// infos monthéâtre
$this->view->mtinfos = $this->getMtinfos();
if (empty($this->view->reseaux['fb']) && !isset($this->view->meta_video)) {
$social = array(
'type' => 'website',
'title' => $this->getTitlePage(),
'description' => '',
'image' => (isset($this->context['view']->profilepicture)) ? $this->context['view']->profilepicture : '',
'url' => $_ENV['URL_THNET'] . '/contacts/' . $this->context['view']->data_object['urlClean'] . '/' . $this->context['action']
);
$this->setSocialCustomContent($social, 'fb');
}
$this->addPubliciteGoogle();
}
// }}}
// {{{ buildMenu()
/** Construit le menu
*
*
* @access protected
* @return void
*/
protected function buildMenu($params = [])
{
$mark_active = 'on';
// le nombre de critiques
$nb_critiques = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles', $this->idspectacle, 'class_critique', array('publish_valid' => 1));
// le menu du spectacle
$menu_spectacle = array(
array('url' => '', 'name' => $this->context['tr']->trans('menu_accueil'), 'id' => 'home', 'img' => '/images/menu/icones/toolbar_home.png'),
//array('url'=>'detail-spectacle','name'=> $this->context['tr']->trans('menu_accueil'),'id'=>'home'),
array('url' => 'ensavoirplus', 'name' => 'En savoir +', 'idclassification' => '6', 'id' => 'splus'),
array('url' => 'biographies', 'name' => 'Bios', 'id' => 'splus'),
array('url' => 'enimages', 'name' => 'Photos', 'idclassification' => '1', 'id' => 'imga'),
'videos' => array('url' => 'videos', 'name' => 'Vidéo(s)', 'id' => 'ent'),
'podcasts' => array('name' => html_entity_decode('Écouter'), 'title' => 'Écouter', 'url' => 'podcasts'),
// array('url'=>'extraits','name'=>$this->context['tr']->trans('extraits'),'idclassification'=>'31','id'=>'ext'),
// array('url'=>'entretiens','name'=>$this->context['tr']->trans('entretiens'),'idclassification'=>'8','id'=>'ent'),
//array('url'=>'presse','name'=>$this->context['tr']->trans('dans_la_presse'),'idclassification'=>'10', 'id'=>'presse'),
array('url' => 'lesdates', 'name' => 'Dates', 'idclassification' => '0', 'id' => 'cal'),
array('url' => 'critiques', 'name' => 'Critiques (' . $nb_critiques . ')', 'idclassification' => '101', 'id' => 'critiques'),
'evenements' => array('url' => ''),
);
$evenements_params_commun = array(
'special' => array(
'publish_valid' => true,
'no_schedule_contact' => true,
'by_object' => array('idspectacle' => $this->idspectacle),
)
);
if ($counts_events = $this->em->getRepository(News::class)->countNews($evenements_params_commun)) {
$menu_spectacle['evenements'] = array('url' => 'evenements', 'name' => 'Evenements (' . $counts_events . ')');
}
// toutes les vidéos
$nb_multimedias = $this->em->getRepository(Multimedias::class)->getMultimediasBy('spectacles', $this->idspectacle, null, 'count');
// vérifier également que pour un texte non fictif il n'y a pas un texte par l'auteur
if (!empty($this->ids_texts)) {
$nb_playlists_texts = $this->em->getRepository(Playlists::class)->countPlaylists('texts', $this->ids_texts, 'class_texte_parauteur');
$nb_playlists_texts_traducteurs = $this->em->getRepository(Playlists::class)->countPlaylists('texts', $this->ids_texts, 'class_texte_par_traducteur');
$nb_multimedias = $nb_multimedias + $nb_playlists_texts + $nb_playlists_texts_traducteurs;
}
if ($nb_multimedias > 0) {
$menu_spectacle['videos']['name'] = 'Vidéo(s)';
} else {
unset($menu_spectacle['videos']);
}
$countecouter = $this->em->getRepository(Podcasts::class)->countPodcasts('spectacles', $this->idspectacle, 'franceinter');
if ($countecouter == 0) {
unset($menu_spectacle['podcasts']);
}
$menu_spectacle[] = array('url' => 'contenus-pedagogiques', 'name' => 'Éduc', 'idclassification' => '125', 'id' => 'educ');
$this->view->nb_files = $this->countTelechargements();
if ($this->view->nb_files > 0) {
$menu_spectacle[] = array('url' => 'telechargements', 'name' => 'Doc. numérisés', 'id' => 'telechargements');
}
$this->current = array();
$this->current['idcontent'] = 0;
$this->current['menu_name'] = '';
$menuitems = array();
foreach ($menu_spectacle as $key => $value) {
// notation que je ne comprends pas
$has_classification = (isset($value['idclassification']) && $value['idclassification'] != '');
//compter le nombre de contenus associes
if ($has_classification) {
if ($value['idclassification'] == 0) {
// y a t'il un calendrier ?
if ($value['url'] == 'lesdates') {
$sql = 'SELECT COUNT(sc.idspectacle)
FROM schedules sc
WHERE sc.idspectacle=' . $this->idspectacle;
$menuitems[$value['idclassification']]['count'] = $this->spectacles->queryOne($sql);
}
if ($value['url'] == 'dvd' && ($count_dvds = $this->getDvds(true)) > 0) {
$menuitems['dvd']['count'] = $count_dvds;
}
} else {
// y a t'il au moins un contenu PUBLIE ?
$sql = 'SELECT oc.idcontent
FROM object_content oc, contents c, content_classification cc
WHERE oc.idcontent=c.idcontent
AND cc.idcontent=c.idcontent
AND c.publish=1
AND oc.object=\'spectacles\'
AND oc.idobject=' . $this->idspectacle;
// pour les soutiens
if ($value['idclassification'] == 11) {
$sql .= ' AND cc.idclassification IN (11,26)';
} else {
$sql .= ' AND cc.idclassification=' . $value['idclassification'];
}
$sql .= ' LIMIT 1';
$res = $this->spectacles->queryRow($sql);
if (!empty($res)) {
$menuitems[$value['idclassification']]['idcontent'] = $res['idcontent'];
$menuitems[$value['idclassification']]['count'] = 1; // au moins un
}
// pour les contenus pédagogiques, si le texte à un contenu, on affiche le menu, sinon on continue
if ($value['idclassification'] == 125 && empty($menuitems[$value['idclassification']]) && !empty($this->data_spectacles['texts'])) {
$nb_contenus_pedagogiques_text = 0;
foreach ($this->data_spectacles['texts'] as $t) {
$nb_contenus_pedagogiques_text = $nb_contenus_pedagogiques_text + $this->contents->countAssociateContent('texts', $t['idtext'], 125, array('publish_status' => 1));
}
if ($nb_contenus_pedagogiques_text > 0) {
$menuitems[$value['idclassification']]['count'] = $nb_contenus_pedagogiques_text;
}
}
}
//compter
$idcont[$value['idclassification']] = $this->spectacles->queryOne($sql);
}
//pas de contenu, enlever l'item du menu
if ($has_classification && empty($menuitems[$value['idclassification']]['count'])) {
unset($menu_spectacle[$key]);
} elseif ((empty($value['url']) && $this->context['action'] == 'detail-spectacle') || $value['url'] == $this->context['action']) {
// marquer la page courante
$menu_spectacle[$key]['active'] = $mark_active;
if (!empty($menu_spectacle[$key]['name'])) {
$this->current['menu_name'] = $menu_spectacle[$key]['name'];
}
if ($has_classification && !empty($menuitems[$value['idclassification']]['idcontent'])) {
$this->current['idcontent'] = $menuitems[$value['idclassification']]['idcontent'];
}
}
}
if ($this->context['action'] == 'entretiens' || $this->context['action'] == 'extraits' || $this->context['action'] == 'videos' || $this->context['action'] == 'culturebox') {
$menu_spectacle['videos']['active'] = 'on';
}
if (!empty($params['remove'])) {
foreach ($params['remove'] as $value) {
unset($menu_spectacle[$value]);
}
}
$this->view->menu_spectacle = $menu_spectacle;
// id du contenu associé si demandé
if (isset($this->context['params']) && array_key_exists('idcontent', $this->context['params'])) {
$idcontent = $this->context['params']['idcontent'];
$this->current['idcontent'] = $idcontent;
} else if (empty($this->current['idcontent'])) {
$this->current['idcontent'] = 0;
}
}
// }}}
// {{{ action_detail_spectacle()
/**
* @Route("/spectacles/{slug}/", name="spectacle_index")
*
* Détail du spectacle (première page)
*
*/
public function action_detail_spectacle($slug = null)
{
$this->InitController($slug, 'detail-spectacle');
// indique que l'on est sur la page d'acceuil
$this->view->is_accueil = true;
// pour culturebox, masquer le spectacle lié puisqu'on y est
$this->view->hide_podcast_related = true;
// fil arianne
$this->locate[0] = 'Accueil';
// est-ce un dossier converti avec spip_accueil ?
$contents = $this->em->getRepository(Contents::class);
$spip_accueil = $contents->getAssociateContent($this->idspectacle, 'spectacles', 'class_spip_accueil');
// autre soutien
$other_soutien = $contents->getAssociateContent($this->idspectacle, 'spectacles', 'class_production');
if (!empty($other_soutien)) {
$other_soutien['text'] = $contents->wikiTransform($other_soutien['text']);
$this->data_spectacles['autre_soutien'] = $other_soutien;
}
if (!empty($spip_accueil)) {
// conversion en wiki
foreach (array('deck', 'text') as $v) {
if (empty($spip_accueil[$v])) continue;
$spip_accueil[$v] = $contents->wikiTransform($spip_accueil[$v]);
}
$this->data_spectacles['spip_accueil'] = $spip_accueil;
// mots-clés et description
$to_description = array();
foreach (array('deck', 'text') as $v) {
if (empty($spip_accueil[$v])) continue;
$to_description[] = $spip_accueil[$v];
}
$this->func->makeMetaFromHtml($to_description, $this->meta_description, $this->meta_keywords);
}
// recuperer la liste des comediens (idrole=5)
$this->data_spectacles['personnages'] = $this->spectacles->getPersonsByRole($this->idspectacle, 'actors');
$this->data_spectacles['personnages'] = $this->spectacles->noPunct($this->data_spectacles['personnages']);
// ajout des mots-clés
foreach ($this->data_spectacles['personnages'] as $v) {
$this->meta_keywords .= ' ' . $v['lastname']; // nom des acteurs
}
// recuperer les prochaines dates de ce spectacle
// recuperer le tableau des dates pour les lieux à J+1 et LIMIT
$schedules = $this->em->getRepository(Schedules::class);
$version = 'new';
$schedule_detail = $schedules->getDateLieuDemain($this->idspectacle, 3, null, $version);
if (!empty($schedule_detail)) {
$this->view->calendrier['futurs'][] = $schedule_detail;
} else {
$this->view->calendrier['anciens'][] = $x = $schedules->getDateLieuCommon('old', $this->idspectacle, 1, 'DESC', 'old');
}
//Première date de représentation
//1 - 3 = on ne veut pas des lectures et des mises-en-espace et des travail d'atelier
if (!in_array($this->data_spectacles['idtypespectacle']['idtypespectacle'], [1, 3, 5])) {
$this->view->calendrier['premiere'][] = $schedules->getDateLieuCommon('tous', $this->idspectacle, 1, null, 'old', ['premiere_representation' => true], $this->em);
}
// recuperer le contenu associe pour le court texte de presentation
// soit presentation courte, soit en savoir plus
// recuperer les presentations courtes
$presentations_spectacle = $this->contents instanceof ContentsRepository
? $this->contents->getMoreAssociateContent(
$this->idspectacle,
'spectacles',
'class_presentation_spectacle'
) : null;
// si pas de presentation courte
if (empty($presentations_spectacle)) {
/* class_article = 6 */
// si pas de presentation, recuperer le premier contenu de en savoir plus
$sql = 'SELECT c.title,c.idcontent,c.language,c.deck,c.text,c.display_media, c.markdown
FROM object_content oc, contents c, content_classification cc
WHERE oc.idcontent=c.idcontent
AND cc.idcontent=c.idcontent
AND cc.idclassification=6
AND oc.idobject=\'' . $this->idspectacle . '\'
AND oc.object=\'spectacles\'
ORDER BY c.`range`,c.dateinsert ASC LIMIT 0,1';
$presentations_spectacle = $this->em->getConnection()->prepare($sql)->executeQuery()->fetchAllAssociative();
if (!empty($presentations_spectacle)) {
$savoir_plus_present = true;
}
}
// prendre soit la langue en cours, soit une autre
foreach ($presentations_spectacle as $k => $v) {
if ($v['language'] == $this->context['lng']) {
$presentation_key = $k;
$presentation_ol = false;
$presentation_olterm = false;
break;
}
$presentation_key = $k;
$presentation_ol = $v['language'];
$presentation_olterm = $this->spectacles->getNameLanguage($v['language']);
}
$this->data_spectacles['presentation_spectacle'] = $presentations_spectacle[$presentation_key];
$this->data_spectacles['presentation_spectacle']['ol'] = $presentation_ol;
$this->data_spectacles['presentation_spectacle']['olterm'] = $presentation_olterm;
if (isset($savoir_plus_present)) {
$this->data_spectacles['presentation_spectacle']['text'] = $this->contents->cutSentence($this->data_spectacles['presentation_spectacle']['text'], 600);
$this->data_spectacles['presentation_spectacle']['lire_suite'] = true;
}
// mise en forme des champs wiki
foreach (array('deck', 'text') as $v) {
if (empty($this->data_spectacles['presentation_spectacle'][$v])) continue;
$markdown = $this->data_spectacles['presentation_spectacle']['markdown'];
$this->data_spectacles['presentation_spectacle'][$v] = $this->contents->wikiTransform($this->data_spectacles['presentation_spectacle'][$v], $markdown);
}
// mots-clés et description
$to_description = array();
foreach (array('deck', 'text') as $v) {
if (empty($this->data_spectacles['presentation_spectacle'][$v])) continue;
$to_description[] = $this->data_spectacles['presentation_spectacle'][$v];
}
$this->func->makeMetaFromHtml($to_description, $this->meta_description, $this->meta_keywords);
// recuperer la liste des producteurs/co-producteur/producteur delegue/diffuseurs
// (idrole=17/18/19,77, pas de type et recherche dans contacts)
$this->data_spectacles['producteurs'] = $this->spectacles->getContactsByRole($this->idspectacle, 17);
$this->data_spectacles['producteurs'] = $this->spectacles->noPunct($this->data_spectacles['producteurs']);
$this->data_spectacles['coproducteurs'] = $this->spectacles->getContactsByRole($this->idspectacle, 18);
$this->data_spectacles['coproducteurs'] = $this->spectacles->noPunct($this->data_spectacles['coproducteurs']);
$this->data_spectacles['producteurs_delegues'] = $this->spectacles->getContactsByRole($this->idspectacle, 19);
$this->data_spectacles['producteurs_delegues'] = $this->spectacles->noPunct($this->data_spectacles['producteurs_delegues']);
$this->data_spectacles['bureau_production'] = $this->spectacles->getContactsByRole($this->idspectacle, 77);
$this->data_spectacles['bureau_production'] = $this->spectacles->noPunct($this->data_spectacles['bureau_production']);
$this->data_spectacles['structure_diffusion'] = $this->spectacles->getContactsByRole($this->idspectacle, 77);
$this->data_spectacles['structure_diffusion'] = $this->spectacles->noPunct($this->data_spectacles['structure_diffusion']);
// récupèrer soutien JTN, ENSATT...
$this->data_spectacles['soutiens'] = $this->spectacles->getSoutiens($this->idspectacle);
// recuperer la liste des autres postes (idrole=0 et type=1)
$this->data_spectacles['others'] = $this->spectacles->getPersonsByRole($this->idspectacle, 'distributions');
$this->data_spectacles['others'] = $this->spectacles->noPunct($this->data_spectacles['others']);
// autres roles
$others_distrib = $this->contents->getAssociateContent($this->idspectacle, 'spectacles', 'class_distribution');
if (!empty($others_distrib)) {
$others_distrib['text'] = $this->contents->wikiTransform($others_distrib['text']);
$others_distrib['text'] = preg_replace('#</?p>#i', '', $others_distrib['text']);
$this->data_spectacles['others_distrib'] = $others_distrib;
}
// ajouter la virgule
if (!empty($this->data_spectacles['others_distrib']['text']) && !empty($this->data_spectacles['others'])) {
$this->data_spectacles['others_punct'] = true;
}
// si ni spip_accueil, ni presentation
if (empty($this->data_spectacles['my_spectacle']) && !$this->isGranted('ROLE_ISROOT')) { //@todo à réintégrer ici : && !$this->context['session']->is_set('isroot')
if (empty($this->data_spectacles['presentation_spectacle']['text']) && empty($spip_accueil)) {
$this->view->is_ancien = true;
if (!empty($this->data_spectacles['urlPage'])) {
// mais url_page = ancien dossier en HTML
// TODO vérifier url_page dans la BDD
if (strpos($this->data_spectacles['urlPage'], 'dossiers_de_presse')) {
$this->view->is_fichier = true;
} else {
$this->view->is_old = $this->data_spectacles['urlPage'];
}
} else {
// si rien du tout
$this->view->spectacle_vide = true;
}
}
}
// lien calendrier
$this->view->see_all_dates = true;
//contenus vidéo sur index
$this->contenus_spectacles('class_extrait_spec', 'extraits');
if (isset($this->view->detailarticle)) {
$this->view->accueil_video = $this->view->detailarticle;
}
//Si nous avons un extrait
if (!empty($this->view->accueil_video['media'])) {
if ($total = count($this->view->accueil_video['media']) > 1) {
$aleatoire = rand(0, ($total - 1));
$videos = $this->view->accueil_video['media'];
unset($this->view->accueil_video['media']);
$this->view->accueil_video['media'][$aleatoire] = $videos[$aleatoire];
}
foreach ($this->view->accueil_video['media'] as $key_media => $value_media) {
if (!empty($this->view->accueil_video['media'][$key_media]['image_media'])) {
$this->view->accueil_video['media'][$key_media]['vignette'] = $this->view->accueil_video['media'][$key_media]['image_media'];
}
}
} //Si nous n'avons pas d'extrait, nous prenons la première vidéo qui nous vient.
else {
$multimedias = $this->em->getRepository(Multimedias::class);
$params_sql = array(
'limit' => array(0, 1),
'object' => array('spectacles' => $this->idspectacle),
'novod' => true,
'dbg' => array('videos_spectacle', 'Une vidéo du spectacle'),
);
$list_multimedias = $multimedias->getListMultimedias(
$params_sql,
array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none', 'ratio' => '169'),
array('format_vignette' => true)
);
$this->view->accueil_video['media'] = $list_multimedias;
}
if (empty($this->view->accueil_video['media'])) {
unset($this->view->accueil_video);
}
// contenus critiques sur index
$this->contenus_spectacles('class_critique', 'critiques');
$x = $this->view->accueil_critiques = $this->view->articles;
if (!empty($this->view->accueil_critiques['fr']['content'])) {
if (count($this->view->accueil_critiques['fr']['content']) > 2) {
$this->view->accueil_critiques = array_slice($this->view->accueil_critiques['fr']['content'], 0, 2);
} else {
$this->view->accueil_critiques = $this->view->accueil_critiques['fr']['content'];
}
}
// des aides pour ce spectacle ?
$this->view->aides = $this->spectacles->noPunct($this->em->getRepository(Aides::class)->getListAides(
array(
'special' => array(
'idspectacles' => $this->idspectacle,
)
),
null,
array(
'groupe_by_type' => true,
)));
//Les évènements
$evenements_params = array(
'params' => array(
'limit' => array(0, 5)
),
'special' => array(
'publish_valid' => true,
'no_schedule_contact' => true,
'by_object' => array('idspectacle' => $this->idspectacle),
'prochains' => true
),
);
$nb_evenements = 0;
//Les futurs évènements
$list_evenements = $this->view->news_list_news['prochains'] = $this->em->getRepository(News::class)->getListNews($evenements_params);
if (!empty($list_evenements) && $nb_evenements = count($list_evenements) <= 5) {
$this->view->is_news_list_news = true;
foreach ($list_evenements as $k => $v) {
$exclude_news[$k] = $v['idnew'];
}
if (!empty($exclude_news)) {
$evenements_params['params']['where'] = ' AND T1.idnew NOT IN (' . join(',', $exclude_news) . ') ';
}
}
//Les anciens évènements
$evenements_params['params']['limit'] = array(0, 5 - $nb_evenements);
unset($evenements_params['special']['prochains']);
$evenements_params['special']['anciens'] = true;
$this->view->news_list_news['anciens'] = $this->em->getRepository(News::class)->getListNews($evenements_params);
if (!empty($this->view->news_list_news['anciens'])) {
$this->view->is_news_list_news = true;
}
//Récupérer tous les spectacles avec soutiens d'un même texte
// voir si ce spectacle à un replay culturebox
$culturebox_params = array(
'limit' => array(0, 1),
'special' => array(
'idspectacles' => array('idspectacle' => $this->idspectacle),
'type_podcast' => 'culturebox',
'current' => true
),
'dbg' => array('derniers_culturebox', 'Les derniers replay culturebox référencés'),
);
$format_vignette = array('width' => 680, 'direction' => 'thumb');
$this->view->derniers_culturebox = $this->em->getRepository(Podcasts::class)->getListPodcasts($culturebox_params, $format_vignette);
// récupérer les VOD du spectacle
$culturebox_params['special']['type_diffusion'] = 1;
$culturebox_params['dbg'] = array('derniers_culturebox', 'Les derniers replay culturebox référencés');
$this->context['view']->dernieres_vod = $this->em->getRepository(Podcasts::class)->getListPodcasts($culturebox_params, $format_vignette);
//Récupérer le podcast disponible
$culturebox_params = array(
'direction' => 'DESC',
'limit' => array(0, 1),
'special' => array(
'idspectacles' => $this->idspectacle,
'type_podcast' => ['franceinter', 'soundcloud'],
// 'is_integrale' => true,
),
'dbg' => array('derniers_culturebox_current', 'Les replay France Culture référencés'),
);
$podcasts = $this->em->getRepository(Podcasts::class);
$this->view->derniers_franceculture = $podcasts->getListPodcasts($culturebox_params, ['width' => 480, 'direction' => 'thumb']);
$this->view->nb_derniers_franceculture = $podcasts->countListPodcasts($culturebox_params);
// on rajoute la fiche du dvd à la page détail pour l'affiche
$this->view->vignette_dvd = $this->getDvds(false, ['limit' => array(0, 1)]);
//Récupration des prix et distinctions
$this->view->type_aides = array(
'prix' => array(
'type_aides' => array(2, 3),
'label' => 'Prix et distinctions',
),
// 'soutiens' => array(
// 'type_aides' => array(1),
// 'label' => 'Aide(s) et soutien(s)',
// ),
'selections' => array(
'type_aides' => array(4),
'label' => 'Sélection(s)',
),
);
$spectacle_aide = $this->em->getRepository(SpectacleAide::class);
foreach ($this->view->type_aides as $k => $v) {
$params_sql_aide = array(
'where' => array(
array('spectacle_aide', 'publish', 1)
),
'idspectacle' => $this->idspectacle,
'special' => array(
'aides' => array(
'type_aides' => $v['type_aides']
)
),
'dbg' => array('spectacle_' . $k, $v['label']),
);
$this->view->type_aides[$k]['aides'] = $spectacle_aide->getListSpectacleAide($params_sql_aide);
if (empty($this->view->type_aides[$k]['aides'])) {
unset($this->view->type_aides[$k]);
}
}
if (!empty($this->view->type_aides['prix'])) {
// $this->view->laureats_nominations = $this->view->type_aides['prix']['aides'];
// unset($this->view->type_aides['prix']);
}
//Spectacles devant être exclus
$idspectacles_exclude[] = $this->idspectacle;
//Si ce n'est pas un collage nous effectuons ce code là'
if (empty($this->data_spectacles['collage']) || !$this->data_spectacles['collage']) {
$idspectacles = $this->GetListSpectaclesFromSpecificLanguageFromTexts(['prochains' => true, 'limit' => [0, 4], 'exclude_idspectacle' => $idspectacles_exclude]);
if (!empty($idspectacles)) {
foreach ($idspectacles as $k => $v) {
$idspectacles[$k]['footer_contact'] = true;
$idspectacles_exclude[] = $k;
}
$this->view->autresmisesenscene_prochains = $idspectacles;
}
$idspectacles = $this->GetListSpectaclesFromSpecificLanguageFromTexts(['limit' => [0, 6], 'exclude_idspectacle' => $idspectacles_exclude]);
if (!empty($idspectacles)) {
foreach ($idspectacles as $k => $v) {
$idspectacles[$k]['display']['affiche_date_creation'] = true;
$idspectacles[$k]['annee_creation'] = $this->spectacles->getFormeDate($idspectacles[$k]['creation_date'], '%Y', true); //%a %d/%m/%Y
}
$this->view->autresmisesenscene_tous = $idspectacles;
}
}
//Les textes par l'auteur
$playlists = $this->em->getRepository(Playlists::class);
if ($this->em->getRepository(Playlists::class)->countPlaylists('texts', $this->data_spectacles['texts'][0]['idtext'], 'class_texte_parauteur') > 0) {
$playlist = $this->em->getRepository(Playlists::class)->getByClassification('texts', $this->data_spectacles['texts'][0]['idtext'], 'class_texte_parauteur');
$url_clean_playlist = filter_var($playlist['urlClean'], FILTER_SANITIZE_STRING);
$idplaylist = $playlists->getIdByUrl($url_clean_playlist);
$playlist = $playlists->getInfosPlaylist(
$idplaylist,
array(
'all' => true,
'multimedias' => true
)
);
foreach ($playlist['multimedias'] as $k => $v) {
$this->view->video_par_auteur = $v;
break;
}
$this->view->video_par_auteur['url_clean_more'] = 'playlist/id/' . $playlist['urlClean'];
}
$idspectacles = array();
$idspectacles = $this->GetListSpectaclesFromSpecificLanguageFromTexts(['limit' => [0, 4], 'aide' => ['idcontact' => 28366], 'spectacle_aide' => true]);
$aides = $this->em->getRepository(SpectacleAide::class);
$aides_tabeaux = array();
if (!empty($idspectacles)) {
foreach ($idspectacles as $k => $v) {
$idspectacles[$k]['display']['affiche_date_creation'] = true;
$idspectacles[$k]['annee_creation'] = $this->spectacles->getFormeDate($idspectacles[$k]['creation_date'], '%Y', true); //%a %d/%m/%Y
$aides_spectacle = $aides->getListSpectacleAide(['idspectacle' => $k, 'special' => ['aides' => ['idcontacts' => 28366]]]);
unset($aides_spectacle['spectacles']);
$idspectacles[$k]['aide'] = reset($aides_spectacle);
}
$this->view->avoirsur_theatreneacte = $idspectacles;
}
//On récupère trois contenus en savoir plus associés à ce spectacle
$this->contenus_spectacles('class_article', 'ensavoirplus', [], ['limit' => 3]);
$nb_presentation = $this->contenus_spectacles('class_article', 'ensavoirplus', [], ['count_only' => true]);
// style en plus pour le calendrier
$this->style_more[] = 'calendrier_spectacle';
$this->extra_title = '';
// aside
$this->asides->load('spectacles_thumbnail');
$this->asides->load('spectacles_distribution');
// en savoir plus
$this->asides->load(['textes_menu_educ' => array(
'exec' => array(
'alone' => true,
'color' => 'context',
'border' => true
),
'footer' => true,
'nb_presentation' => $nb_presentation,
'title' => 'en savoir plus'
)]);
$this->asides->load(['common_prochain_evenement' => array(
'url_custom' => '/spectacles/' . $this->data_spectacles['urlClean'] . '/evenements'
)]);
$this->getAsideSelections();
$this->asides->load('common_participer_spectacles');
if (!array_key_exists('collage', $this->data_spectacles) && array_key_exists('textunique', $this->data_spectacles)) {
$this->asides->load('spectacles_voir_texte');
}
$this->asides->load('dvd_vignette');
$this->addPubliciteGoogle();
return $this->view('spectacles/detail-spectacle.html.twig', [
'data_spectacles' => $this->data_spectacles
]);
}
// }}}
// {{{ contenus()
/** Les articles associés aux spectacles
*
*/
public function contenus_spectacles($type_class, $type_class_view, $other_dimensions = array('width' => 150, 'grow' => false), $params = array())
{
$valeur = parent::contenus('spectacles', $this->idspectacle, $type_class, $type_class_view, $other_dimensions, $params);
if (!empty($params['count_only']) || !empty($params['return_content'])) {
return $valeur;
}
}
// }}}
/** Etape 1 sélection du type d'aide
* @Route("/spectacles/{slug}/aides-etape", name="spectacle_aides_etape")
*/
public function action_aides_etape(
$slug = null,
Request $request,
\App\Service\UtilsEdit $utilsEdit,
FormFactoryInterface $formFactory,
SessionInterface $session
)
{
$this->InitController($slug, 'aides_etape');
$text = $this->getAjoutAideObject(1, 'aides', null, $utilsEdit, $formFactory, $session);
$text->getFormTypeAides($request);
if ($text->validateAidesForm()) {
$text->saveAides();
return $this->redirectToRoute('spectacle_aides_etape1', ['slug' => $this->data_spectacles['urlClean']]);
}
$this->asides->load('ajoutaides_informations_aides_spectacles');
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/aides-etape.html.twig', [
'form' => $this->context['form']->createView()
]);
}
/** Etape 1 sélection du contact
* @Route("/spectacles/{slug}/aides-etape1/", name="spectacle_aides_etape1")
*/
public function action_aides_etape1(
$slug = null,
Request $request,
\App\Service\UtilsEdit $utilsEdit,
FormFactoryInterface $formFactory,
SessionInterface $session
)
{
$this->InitController($slug, 'aides_etape');
$text = $this->getAjoutAideObject(1, 'aides', 1, $utilsEdit, $formFactory, $session);
$text->getSteps('test', 1);
if ($text->getFormContacts($request)) {
if ($text->validateContactsForm()) {
$text->saveContacts();
return $this->redirectToRoute('spectacle_aides_etape2', ['slug' => $this->data_spectacles['urlClean']]);
}
} else {
return $this->redirectToRoute('spectacle_aides_etape', ['slug' => $this->data_spectacles['urlClean']]);
}
$this->asides->load('ajoutaides_informations_aides_spectacles');
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/aides-etape1.html.twig', [
'form' => $this->context['form']->createView()
]);
}
// {{{ action_aides_etape2()
/** Etape 2 sélection de l'aide en lien avec le contact
*
* @Route("/spectacles/{slug}/aides-etape2/", name="spectacle_aides_etape2")
*
*/
public function action_aides_etape2(
$slug = null,
Request $request,
\App\Service\UtilsEdit $utilsEdit,
FormFactoryInterface $formFactory,
SessionInterface $session
)
{
$this->InitController($slug, 'aides_etape');
$text = $this->getAjoutAideObject(1, 'aides', 2, $utilsEdit, $formFactory, $session);
$text->getSteps('test', 2);
if ($text->getFormAides($request)) {
if ($text->getValidAides()) {
$text->getSaveAides();
return $this->redirectToRoute('spectacle_aides_etape3', ['slug' => $this->data_spectacles['urlClean']]);
}
} else {
return $this->redirectToRoute('spectacle_aides_etape', ['slug' => $this->data_spectacles['urlClean']]);
}
$this->asides->load('ajoutaides_informations_aides_spectacles');
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/aides-etape2.html.twig', [
'form' => $this->context['form']->createView()
]);
}
// }}}
/** Etape 3 message de validation
* @Route("/spectacles/{slug}/aides-etape3", name="spectacle_aides_etape3")
*/
public function action_aides_etape3(
$slug = null,
\App\Service\UtilsEdit $utilsEdit,
FormFactoryInterface $formFactory,
SessionInterface $session
)
{
$this->InitController($slug, 'aides_etape');
$text = $this->getAjoutAideObject(1, 'aides', 3, $utilsEdit, $formFactory, $session);
$text->getSteps('test', 3);
$text->getValidation();
$this->asides->load('ajoutaides_informations_aides_spectacles');
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/aides-etape3.html.twig');
}
/** Appel du constructeur d'aide des objets */
public function getAjoutAideObject(
$typeaide = 1,
$type = 'aides',
$num = null,
$utilsEdit = null,
FormFactoryInterface $formFactory,
SessionInterface $session
)
{
$params_object = array(
'object' => [
'type' => 'spectacle',
'value' => $this->idspectacle
],
'aides' => array(
'typeaide' => 1
),
'url' => '/spectacles/' . $this->view->url_clean . '/' . $type . '-etape' . $num
);
$this->context['formFactory'] = $formFactory->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
return new Ajoutaides(
$this->em,
$utilsEdit,
$session,
$this->context,
$params_object
);
}
// {{{ action_evenements()
/**
*
* @Route("/spectacles/{slug}/evenements", name="spectacle_evenements")
*
* Les évènements associés aux spectacles
*
*/
public function action_evenements($slug = null)
{
$this->InitController($slug, 'evenements');
$object = $this->em->getRepository(News::class);
//Pour afficher la description tiny
$this->view->is_description = true;
//Les évènements
$evenements_params_commun = array(
'params' => array(
'limit' => array(0, 100)
),
'special' => array(
'publish_valid' => true,
// 'no_schedule_contact' => true,
'by_object' => array('idspectacle' => $this->idspectacle),
)
);
foreach (['prochains', 'anciens'] as $value) {
$evenements_params = $evenements_params_commun;
$evenements_params['special'][$value] = true;
if (!empty($exclude_news)) {
$evenements_params['params']['where'] = ' AND T1.idnew NOT IN (' . join(',', $exclude_news) . ') ';
}
$news_list[$value] = $object->getListNews($evenements_params);
if (!empty($news_list[$value])) {
// liste d'exclusion => pas de en cours dans les anciens
foreach ($news_list[$value] as $k => $v) {
$exclude_news[$k] = $v['idnew'];
}
}
}
$this->view->news_list_news = $news_list;
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/evenements.html.twig');
}
// }}}
// {{{ action_ensavoirplus()
/**
* @Route("/spectacles/{slug}/ensavoirplus/", name="spectacle_ensavoirplus")
* @Route("/spectacles/{slug}/ensavoirplus/idcontent/{p_idcontent}", name="spectacle_ensavoirplus_idcontent")
* @Route("/spectacles/{slug}/ensavoirplus/idcontent/{p_idcontent}/pdf/{p_pdf}", name="spectacle_ensavoirplus_idcontent_pdf")
* @Route("/spectacles/{slug}/ensavoirplus/idcontent/{p_idcontent}/pdf/{p_pdf}/download/{p_download}", name="spectacle_ensavoirplus_idcontent_pdf_download")
*
* Les articles associés aux spectacles de type ensavoirplus
*
*/
public function action_ensavoirplus($slug = null, $p_idcontent = null, $p_pdf = null, $p_download = null)
{
$this->InitController($slug, 'ensavoirplus');
$this->setParamsPDF($p_pdf, $p_download);
$this->context['params']['idcontent'] = $p_idcontent;
$this->context['action'] = 'ensavoirplus';
$this->view->idcontentCurrent = $p_idcontent;
$this->contenus_spectacles('class_article', 'ensavoirplus');
if ($this->getUser() instanceof Extranetusers) {
$params_sql = [
'return_content' => true,
'specif_sql' => ' AND c.valid = 0 AND c.idextranetuser = 99'
];
$this->view->mes_articles = $this->contenus_spectacles('class_article', 'ensavoirplus', array('width' => 150, 'grow' => false), $params_sql);
}
$this->view->page_ensavoirplus = true;
//retrouver les infos sur les user
$this->view->alone_main = false;
// aside
// $this->asides->load('spectacles_sous_menu');
//aside
$this->asides->load(['textes_menu_educ' => array(
'exec' => array(
'alone' => true,
'color' => 'context'
),
)]);
if ($this->getUser() instanceof Extranetusers) {
$this->asides->load(['textes_menu_educ,custom_articles' => array(
'exec' => array(
'alone' => true,
'color' => 'context'
),
'title' => 'Mes articles',
'subtitle' => 'en attente de validation',
'custom_articles' => $this->view->mes_articles
)]);
}
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleAsides($this->asides, $this->serviceAbonnements);
$this->asides->load('common_participer_spectacles');
$this->checkConditionsPDF();
return $this->view('spectacles/ensavoirplus.html.twig');
}
// }}}
// {{{ action_contenus_pedagogiques()
/**
* @Route("/spectacles/{slug}/contenus-pedagogiques/", name="spectacle_contenus_pedagogiques")
* @Route("/spectacles/{slug}/contenus-pedagogiques/idcontent/{p_idcontent}", name="spectacle_contenus_pedagogiques_idcontent")
* @Route("/spectacles/{slug}/contenus-pedagogiques/idcontent/{p_idcontent}/pdf/{p_pdf}", name="spectacle_contenus_pedagogiques_idcontent_pdf")
* @Route("/spectacles/{slug}/contenus-pedagogiques/idcontent/{p_idcontent}/pdf/{p_pdf}/download/{p_download}", name="spectacle_contenus_pedagogiques_idcontent_pdf_download")
*
* Les articles associés aux spectacles de type contenu education
*
*/
public function action_contenus_pedagogiques($slug = null, $p_idcontent = null, $p_pdf = null, $p_download = null)
{
$this->InitController($slug, 'contenus-pedagogiques');
$this->setParamsPDF($p_pdf, $p_download);
$this->context['params']['idcontent'] = $p_idcontent;
$this->view->idcontentCurrent = $p_idcontent;
$this->view->is_educ = true;
$params_sql_specific = array();
//on récupère le contenu theatre-en-acte
$theatre_en_acte = $this->contents->getAssociateContents($this->idspectacle, 'spectacles', 'class_theatre_en_acte');
if ($theatre_en_acte) {
$theatre_en_acte = reset($theatre_en_acte);
//On prépare les liens pour les asides
foreach ($theatre_en_acte as $k => $v) {
$id_contents_exclude[] = $v['idcontent'];
$urls_theatrenacte[$v['idcontent']] = array(
'url' => '/spectacles/{v_url_clean}/contenus-pedagogiques/idcontent/key_content',
'name' => $v['title'],
'key_content' => $v['idcontent']
);
}
$urls_theatrenacte['allspectacles'] = array(
'url' => '/contacts/Theatre-en-Acte',
'name' => 'Tous les spectacles'
);
//on indique quel contenus ne devant pas être récupérés avec les contenus-pedagogiques
if ($id_contents_exclude) {
$params_sql_specific = array(
'where' => ' oc.idobject=' . (int)$this->idspectacle . ' AND c.idcontent NOT IN (' . implode(',', $id_contents_exclude) . ')'
);
}
}
$params_sql_specific['setGroupByClassification'] = true;
$params_sql_specific['limit'] = 'all';
//on récupère le contenu-pedagogique en supprimant les contenus theatre-en-acte qui pourrait être récupérés
$this->contenus_spectacles('class_contenu_educ', 'contenus-pedagogiques', array('width' => 150, 'grow' => false), $params_sql_specific);
// trouver les autres mises en scène de ce texte qui ont des contenus educ
if (!empty($this->ids_texts)) {
$sql = 'SELECT s.`idspectacle` FROM spectacles s
JOIN text_spectacle ts ON ts.`idspectacle`=s.`idspectacle`
JOIN object_content oc ON oc.`idobject`=s.`idspectacle`
JOIN contents c ON c.`idcontent`=oc.`idcontent`
JOIN content_classification cc ON cc.`idcontent`=c.`idcontent`
WHERE c.publish=1
AND oc.object=\'spectacles\'
AND cc.idclassification=125
AND ts.idtext IN (' . join(',', $this->ids_texts) . ')
AND s.idspectacle!=' . $this->idspectacle . '
AND s.`publish`=1 AND s.`valid`=1';
$idspectacles = $this->spectacles->queryCol($sql);
if (!empty($idspectacles)) {
$this->view->autres_spectacles = $this->spectacles->getListSpectacles(array(
'special' => array(
'idspectacle' => $idspectacles,
),
'params' => array(
'limit' => array(0, 200)
),
'dbg' => array('list_others_spectacles', 'Liste des autres mes avec un contenus éduc'),
));
if (!empty($this->view->autres_spectacles)) {
foreach ($this->view->autres_spectacles as $k => $v) {
$this->view->autres_spectacles[$k]['url_clean_more'] = 'contenus-pedagogiques/';
}
}
}
// voir si le texte à un contenu pédagogique
$this->context['view']->list_texts = $this->em->getRepository(Texts::class)->getListTexts(array(
'special' => array(
'idclassification' => array(125), // classification educ
'idtext' => $this->ids_texts, // textes de la personne
'join' => true, // texte pas forcément publié
),
'dbg' => array('list_texts', 'Liste des textes à contenus pédagogiques')
));
if (!empty($this->context['view']->list_texts)) {
foreach ($this->context['view']->list_texts as $k => $v) {
$this->context['view']->list_texts[$k]['url_clean_more'] = 'contenus-pedagogiques/';
}
}
}
//redirection si aucun article n'est chargé par défault et qu'il existe du contenu theatre-en-acte
if (isset($this->view->detailarticle) && !$this->view->detailarticle && count(reset($theatre_en_acte)) > 0) {
$idcontent = reset($theatre_en_acte)['idcontent'];
return $this->redirectToRoute('spectacle_contenus_pedagogiques_idcontent', ['slug' => $this->view->url_clean, 'p_idcontent' => $idcontent]);
}
//aside
//on force l'affichage du menu
$this->view->morearticle = true;
if (!empty($theatre_en_acte)) {
$this->asides->load(['url_lists_alone' => array(
'exec' => array('color' => 'educ'),
'php' => array(
'method' => 'asidesUrlLists',
'urls' => $urls_theatrenacte,
'params' => array(
'activate' => (!empty($this->context['params']['idcontent'])) ? $this->context['params']['idcontent'] : null
)
),
'title' => 'Théâtre-en-acte'
)]);
}
$this->asides->load('spectacles_educ');
$this->checkConditionsPDF();
return $this->view('spectacles/contenus-pedagogiques.html.twig');
}
// }}}
// {{{ action_extraits()
/** Les articles associés aux spectacles de type extraits
*
* @Route("/spectacles/{slug}/extraits/", name="spectacle_extrait")
*
*/
public function action_extraits($slug = null)
{
$this->InitController($slug, 'videos');
$this->contenus_spectacles('class_extrait_spec', 'extraits');
$this->view->alone_main = false;
// aside
$this->asides->load('spectacles_sous_menu');
return $this->view('spectacles/extraits.html.twig');
}
// }}}
// {{{ action_presse()
/** Les articles associés aux spectacles de type presse
*
*/
public function action_presse()
{
$this->contenus_spectacles('class_presse', 'presse');
}
// }}}
// {{{ action_enimages_spectacles()
/** Les diaporamas du spectacle
*
* @Route("/spectacles/{slug}/enimages/", name="spectacle_enimages")
* @Route("/spectacles/{slug}/enimages/idcontent/{p_idcontent}", name="spectacle_enimages_idcontent")
*
*/
public function action_enimages_spectacles($slug = null, $p_idcontent = null)
{
$this->InitController($slug, 'enimages');
$this->context['params']['idcontent'] = $p_idcontent;
parent::action_enimages($this->idspectacle, 'spectacles');
return $this->view('spectacles/enimages.html.twig');
}
// }}}
// {{{ action_gadget_calendrier()
/** Gadget caelendrier
*
* @Route("/spectacles/{slug}/gadget-calendrier", name="spectacle_gadget_calendrier")
*
* @access public
* @return void
*
*/
public function action_gadget_calendrier($slug = null, Request $request)
{
$this->InitController($slug, 'gadget-calendrier');
$params = array();
// nombre d'items maxi
$max_nbitems = 50;
if (!empty($_POST['nbitems']) && $this->func->my_is_int($_POST['nbitems']) && $_POST['nbitems'] <= $max_nbitems) {
$params[] = 'nbitems=' . $_POST['nbitems'];
$nbitems = $_POST['nbitems'];
if ($nbitems > 5) {
$nbitems = 5;
}
} else {
$nbitems = 3;
}
if (!empty($params) || !empty($preview)) {
$params_string = join('&', $params);
} else {
$params_string = null;
}
// formulaire
for ($i = 1; $i < 50; $i++) {
$val[$i] = $i;
}
$this->context['form'] = $this->get('form.factory')->createNamedBuilder('', FormType::class, null, [
'validation_groups' => false,
]);
$this->context['form']->add('nbitems', ChoiceType::class, [
'label' => 'Nombre à afficher',
'choices' => $val
]);
$this->context['form']->add('colsize', TextType::class, [
'label' => 'Largeur de la colonne (en pixels)',
'constraints' => [
new Type([
'type' => 'numeric',
'message' => 'La largeur doit-être un nombre'
])
],
'attr' => [
'size' => 3
]
]);
$this->context['form']->add('heightcol', TextType::class, [
'label' => 'Hauteur de la colonne (en pixels)',
'constraints' => [
new Type([
'type' => 'numeric',
'message' => 'La hauteur doit-être un nombre'
])
],
'attr' => [
'size' => 3
]
]);
$this->context['form'] = $this->context['form']->getForm();
$this->context['form']->handleRequest($request);
// largeur, nbitems et hauteur par défaut
if (empty($_POST['colsize'])) {
// $this->context['form']->get('colsize')->setData(s+10);
}
if (empty($_POST['heightcol'])) {
// $this->context['form']->get('heightcol')->setData($hauteur_widget);
}
if (empty($_POST['nbitems'])) {
// $this->context['form']->get('nbitems')->setData($nbitems);
}
$url_widget = $_ENV['URL_THNET'] . '/spectacles/' . $this->data_spectacles['urlClean'] . '/widget-calendrier/';
$url_widget_iframe = $url_widget . '?' . $params_string;
$iframe_code = '<iframe src="' . $url_widget_iframe . '" style="width:100%;border:none;" onload="this.style.height=this.contentDocument.body.scrollHeight + 30 +\'px\';"></iframe>';
$this->view->iframe_code_html = $iframe_code;
$this->view->iframe_code = htmlentities($iframe_code);
$url_widget_ajax = $url_widget . '?v=ajax&' . $params_string;
$rtl = "\n";
$ajax_code = '<script type="text/javascript" src="' . $_ENV['URL_THNET'] . '/navigation/js/widget_thnet.js"></script>' . $rtl;
$ajax_code .= '<div class="widget_thnet_content" data-content="' . $url_widget_ajax . '"></div>';
$this->view->ajax_code_html = trim($ajax_code);
$this->view->ajax_code = htmlentities(trim($ajax_code));
$this->extra_title = 'Widget';
$this->extra_locate = 'Widget';
return $this->view('spectacles/gadget-calendrier.html.twig', [
'form' => $this->context['form']->createView()
]);
}
// }}}
// {{{ action_lesdates()
/**
* @Route("/spectacles/{slug}/lesdates/", name="spectacle_lesdates")
*
* Page des calendrier
*
*/
public function action_lesdates($slug = null)
{
$this->InitController($slug, 'lesdates');
$this->context['action'] = 'lesdates';
$version = 'new';
// affichage sour forme de liste
if (isset($_GET['viewlist'])) {
$this->view->viewlist = true;
}
// on recupere le calendrier
$schedules = $this->em->getRepository(Schedules::class);
// recuperer les dates futurs si il y en a
$schedule_futur = $schedules->getDateLieuDemain($this->idspectacle, null, null, $version);
if (!empty($schedule_futur)) {
// date dans le futur
$this->view->futurdate = true;
// ajout des mots clés basés sur les lieux et dates de représentation futurs
$this->meta_keywords .= ' ' . $schedules->ScheduleToKeywords($schedule_futur, 20);
}
// recuperer les dates anciennes si il y en a
$schedule_old = $schedules->getDateLieuHier($this->idspectacle, null, null, $version);
if (!empty($schedule_old)) {
// date dans le passe
$this->view->olddate = true;
// ajout des mots clés basés sur les lieux et dates de représentation récentes
$this->meta_keywords .= ' ' . $schedules->ScheduleToKeywords($schedule_old, 10);
}
// si date futur et ancienne
if (isset($_GET['viewold']) || count($schedule_futur) == 0) {
$this->view->viewold = true;
$this->view->schedule_detail = $schedule_old;
$this->view->param_date_link = '&viewold';
} else {
$this->view->schedule_detail = $schedule_futur;
$this->view->param_date_link = '&viewnow';
}
// Si pas de style, utiliser le style de thnet
$this->style_more[] = 'calendrier_spectacle';
// titre de la page et fil d'arianne
$this->extra_locate = $this->extra_title = 'Les dates';
// pas de stats
$this->no_stats = true;
$nav_date_proch_ancien = array(
array(
'name' => 'les prochaines dates',
'url' => '/spectacles/{v_url_clean}/lesdates/',
'key' => (!isset($_GET['viewold'])) ? true : false,
'count' => count($schedule_futur)
),
array(
'name' => 'les anciennes dates',
'url' => '/spectacles/{v_url_clean}/lesdates/?viewold',
'key' => (isset($_GET['viewold']) || (isset($this->view->viewold))) ? true : false,
),
);
//asides
$this->asides->load(['url_lists' => array(
'exec' => array(
'htmlstart' => true
),
'php' => array(
'method' => 'asidesUrlLists',
'urls' => $nav_date_proch_ancien,
'params' => array(
'activate' => 'key'
)
),
'title' => 'Voir'
)]);
$this->asides->load(['spectacles_lesdates_nav' => array(
'exec' => array(
'htmlend' => true,
),
'title' => 'Affichage'
)]);
$this->asides->load('spectacles_gadget_calendrier');
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleAsides($this->asides, $this->serviceAbonnements);
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/lesdates.html.twig');
}
// }}}
// {{{ action_biographies()
/**
* @Route("/spectacles/{slug}/biographies/", name="spectacle_biographies")
*
* Page des biographies du spectacle
*
*/
public function action_biographies($slug = null)
{
$this->InitController($slug, 'biographies');
$this->context['action'] = 'biographies';
$persons = $this->em->getRepository(Persons::class);
$format_photo = array('width' => $_ENV['VIGN_PERSONS_WIDTH'], 'height' => $_ENV['VIGN_PERSONS_HEIGHT'], 'direction' => 'crop');
// Metteurs en scènes
$alldirectors_authors = $this->spectacles->getDirectors($this->idspectacle);
foreach ($this->data_spectacles['texts'] as $text) {
if ($text['textfictif'] != 1) {
$alldirectors_authors = array_merge($alldirectors_authors, $text['allauthors']);
$alldirectors_authors = array_merge($alldirectors_authors, $text['authors']);
}
if (!empty($text['alltranslators'])) {
$alldirectors_authors = array_merge($alldirectors_authors, $text['alltranslators']);
}
}
if (!empty($this->data_spectacles['texts_adaptation'])) {
foreach ($this->data_spectacles['texts_adaptation'] as $text) {
$alldirectors_authors = array_merge($alldirectors_authors, $text['allauthors']);
$alldirectors_authors = array_merge($alldirectors_authors, $text['authors']);
}
}
$auteurs_liste = [];
foreach ($alldirectors_authors as $key => $value) {
if (empty($auteurs_liste[$value['idperson']])) {
$auteurs_liste[$value['idperson']] = $value;
$auteurs_liste[$value['idperson']]['photo'] = $persons->getVignettePerson($value['idperson'], $format_photo);
$auteurs_liste[$value['idperson']]['carrer'] = $persons->getObjectsCarrerDetails($value['idperson'], 'persons', $this->cache);
}
}
$this->view->alldirectors_authors = $auteurs_liste;
//Les acteurs
$acteurs = $this->spectacles->getPersonsByRole($this->idspectacle, 'actors');
foreach ($acteurs as $key => $value) {
$acteurs[$key]['photo'] = $persons->getVignettePerson($value['idperson'], $format_photo);
$acteurs[$value['idperson']]['carrer'] = $persons->getObjectsCarrerDetails($value['idperson'], 'persons', $this->cache);
}
$this->view->acteurs = $acteurs;
//La distribution suite
$distribution_suite = $this->spectacles->getPersonsByRole($this->idspectacle, 'distributions');
foreach ($distribution_suite as $key => $value) {
$distribution_suite[$key]['photo'] = $persons->getVignettePerson($value['idperson'], $format_photo);
$distribution_suite[$value['idperson']]['carrer'] = $persons->getObjectsCarrerDetails($value['idperson'], 'persons');
$distribution_suite[$key]['label_role'] = true;
}
$this->view->distribution_suite = $distribution_suite;
$this->asides->load(['biographies_carrer_informations' => [
'exec' => [
'color' => 'biographies'
]
]]);
$this->asides->load('bio_maj_v2');
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleAsides($this->asides, $this->serviceAbonnements);
$this->extra_locate = $this->extra_title = 'Les biographies';
return $this->view('spectacles/biographies.html.twig');
}
// }}}
// {{{ action_videos()
/**
* Page des videos du spectacle
*
* @Route("/spectacles/{slug}/videos/", name="spectacle_videos")
* @Route("/spectacles/{slug}/videos/{p_inutile}", name="spectacle_videos_p_inutile")
* @Route("/spectacles/{slug}/videos/media/{params_media}", name="spectacle_videos_media")
*/
public function action_videos(Request $request, $slug = null, $params_media = null, GlobalStats $globalstats, $p_inutile = null)
{
$this->context['params']['media'] = $params_media;
$this->InitController($slug, 'videos');
$multimedias = $this->em->getRepository(Multimedias::class);
// Vidéos associées au spectacle directement
$params_sql = array(
'limit' => array(0, 1000),
'object' => array('spectacles' => $this->idspectacle),
'dbg' => array('videos_spectacle', 'Les vidéos du spectacle'),
);
$vignette_size = array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none', 'ratio' => '169');
$vignette = array('format_vignette' => true);
$list_multimedias = $multimedias->getListMultimedias(
$params_sql,
$vignette_size,
$vignette
);
// nombre
$this->view->nb_multimedias = count($list_multimedias);
foreach ($list_multimedias as $k => $v) {
// si une vidéo est demandée
if (!empty($this->context['params']['media']) && $v['url_clean'] == $this->context['params']['media']) {
$idmultimedia = $v['idmultimedia'];
}
}
// choisir une vidéo au hasard
if (empty($idmultimedia) && !empty($list_multimedias)) {
$idmultimedia = array_rand($list_multimedias);
}
// vidéo de tête
if (!empty($idmultimedia)) {
$video = $this->em->getRepository(Multimedias::class)->getInfosMultimedia($idmultimedia, false, true, array('tableau' => true));
if (!empty($video)) {
$width_video = 560;
$height_video = round(($width_video * $video['flv_height']) / $video['flv_width']);
$multimedias->setDimensions(array('width' => $width_video, 'height' => $height_video));
$video['player'] = $multimedias->getPlayer($video);
$video['partenaires'] = $list_multimedias[$idmultimedia]['partenaires'];
// couper la description
$taille_description = 350;
$video['description'] = $this->contents->wikiTransform($video['description_wiki'], $video['markdown']);
if (mb_strlen($video['description'], 'utf8') > $taille_description) {
$video['description_courte'] = $multimedias->cutSentence(html_entity_decode($video['description']), $taille_description, true);
$video['cut_description'] = true;
}
$video['share'] = true;
$this->view->video = $video;
}
if (isset($this->view->video)) {
$request->getSession()->set('currentVideo', md5($this->view->video['idmultimedia']));
}
unset($list_multimedias[$idmultimedia]);
}
$this->view->list_multimedias = $list_multimedias;
$this->view->first_spectacles = true;
// vérifier également que pour un texte non fictif il n'y a pas un texte par l'auteur
if (!empty($this->ids_texts)) {
$nb_playlists_texts = $this->em->getRepository(Playlists::class)->countPlaylists('texts', $this->ids_texts, 'class_texte_parauteur');
// voir s'il y a des textes par l'auteur
$this->view->list_playlists = $this->em->getRepository(Playlists::class)->getListPlaylists(
array(
'special' => array(
'idclassifications' => 144, // class_texte_parauteur //
'idtext' => $this->ids_texts, // les texts du spectacle
),
'dbg' => array('list_playlists', 'Playlist texte par l\'auteur'),
),
array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none', 'ratio' => '169'),
array('other_url_clean' => true, 'format_vignette' => true)
);
$nb_playlists_texts_traducteurs = $this->em->getRepository(Playlists::class)->countPlaylists('texts', $this->ids_texts, 'class_texte_par_traducteur');
// voir s'il y a des textes par leurs traducteurs
$this->view->list_playlists_traducteurs = $this->em->getRepository(Playlists::class)->getListPlaylists(
array(
'special' => array(
'idclassifications' => 178, // class_texte_par_traducteur //
'idtext' => $this->ids_texts, // les texts du spectacle
),
'dbg' => array('list_playlists', 'Playlist texte par traducteur'),
),
array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none', 'ratio' => '169'),
array('other_url_clean' => true, 'format_vignette' => true)
);
$this->view->nb_multimedias = $this->view->nb_multimedias + $nb_playlists_texts + $nb_playlists_texts_traducteurs;
}
$this->context['view']->plusvues_videos = $this->video_populaire($globalstats);
//Liste des vidéos en suggestions
if (isset($this->context['view']->video)) {
$liste_related_videos = $multimedias->getAssociateMultimedias($this->context['view']->video['idmultimedia'], 6, 'AND m.mp3=0');
if (!empty($liste_related_videos)) {
// trouver les videos en fonction du type
$sql = 'SELECT * FROM ' . $multimedias->__table . '
WHERE idmultimedia IN (' . implode(',', $liste_related_videos) . ')';
//echo $sql;
$multimedias->query($sql);
$set_format = (array('width' => 130, 'height' => 110, 'direction' => 'crop', 'fleche' => 'moyen'));
while ($data = $multimedias->fetch()) {
$multimedias->loadResult($data);
$idm = $multimedias->idmultimedia;
$videos[$idm] = $multimedias->getInfosMultimedia($idm, false, false, array('vignette' => $set_format, 'tableau' => true));
$videos[$idm]['description_courte'] = $multimedias->cutSentence($videos[$idm]['description'], 100);
}
$this->context['view']->videos = $videos;
$this->context['view']->first_spectacles = true;
if (!empty($json)) {
$video['related'] = $videos;
}
}
}
// titre de la page et fil d'arianne
$this->extra_locate = $this->extra_title = 'Les vidéos';
// pas de stats
$this->no_stats = true;
//Opengraph pour les vidéos
$this->view->meta_video = true;
$this->setAsideDVDVOD('videos');
$this->asides->load(['common_participer_spectacles' => array(
'exec' => array(
'color' => 'videos'
)
)]);
$this->asides->load('videos_suggestions');
$asides_publicite = new asides();
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleCorrespondantImageVideo($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite_footer = $asides_publicite->view($this->context['view']);
return $this->view('spectacles/videos.html.twig');
}
// }}}
// {{{ action_podcasts()
/**
*
* @Route("/spectacles/{slug}/podcasts", name="spectacle_podcasts")
* @Route("/spectacles/{slug}/podcasts/emission/{pemission}", name="spectacle_podcasts_p_emission")
* @Route("/spectacles/{slug}/podcasts/type/{ptype}", name="spectacle_podcasts_p_type")
* @Route("/spectacles/{slug}/podcasts/podcast/{ppodcast}", name="spectacle_podcasts_p_podcast")
*
* Détail du spectacle (première page)
*
*/
public function action_podcasts($slug = null, $pemission = null, $ptype = null, $ppodcast = null)
{
$this->context['params']['emission'] = $pemission;
$this->context['params']['type'] = $ptype;
$this->context['params']['podcast'] = $ppodcast;
$this->InitController($slug, 'podcasts');
$podcasts = $this->em->getRepository(Podcasts::class);
$format_vignette = array('width' => 480, 'direction' => 'thumb');
// Culturebox => les derniers référencés
$culturebox_params = array(
'direction' => 'DESC',
'limit' => array(0, 200),
'special' => array(
'idspectacles' => $this->idspectacle,
'type_podcast' => ['franceinter'],
),
'dbg' => array('derniers_culturebox_current', 'Les replay France Culture référencés'),
);
$culturebox_params['special']['type_franceinter'] = null; //Pour France Culture
$countFranceCulture = $podcasts->countListPodcasts($culturebox_params);
$culturebox_params['special']['type_franceinter'] = 1;
$countFranceInter = $podcasts->countListPodcasts($culturebox_params);
$culturebox_params['special']['type_podcast'] = 'soundcloud';
unset($culturebox_params['special']['type_franceinter']);
$countSoundcloud = $podcasts->countListPodcasts($culturebox_params);
$filtres_emissions = [
'franceculture' => [
'name' => 'France Culture',
'count' => $countFranceCulture,
'params' => null,
'type' => 'franceculture'
],
'franceinter' => [
'name' => 'France Inter',
'count' => $countFranceInter,
'params' => 1,
'type' => 'franceinter'
],
'soundcloud' => [
'name' => 'Soundcloud',
'count' => $countSoundcloud,
'url' => '/spectacles/{v_url_clean}/podcasts/podcast/key_type',
'type' => 'soundcloud'
]
];
$curseur = null;
if (!empty($this->context['params']['emission']) && array_key_exists($this->context['params']['emission'], $filtres_emissions)) {
$curseur = $this->context['params']['emission'];
$culturebox_params['special']['type_franceinter'] = $filtres_emissions[$curseur]['params'];
$culturebox_params['special']['type_podcast'] = $filtres_emissions[$curseur]['type'];
} else if (!empty($this->context['params']['podcast']) && array_key_exists($this->context['params']['podcast'], $filtres_emissions)) {
$curseur = $this->context['params']['podcast'];
$culturebox_params['special']['type_podcast'] = $filtres_emissions[$curseur]['type'];
} else {
$culturebox_params['special']['type_podcast'] = ['franceinter', 'soundcloud'];
unset($culturebox_params['special']['type_franceinter']);
}
$this->view->list_captations = $podcasts->getListPodcasts($culturebox_params, $format_vignette);
$this->asides->load(['url_lists' => array(
'exec' => [
'htmlstart' => true,
'alone' => false
],
'php' => array(
'method' => 'asidesUrlLists',
'urls' => [
[
'name' => 'Toutes les émissions'
]
],
'url' => '/spectacles/{v_url_clean}/podcasts/',
'params' => array(
'activate' => (is_null($curseur)) ? true : false
)
),
'title' => 'écouter'
)]);
$this->asides->load(['url_lists,tst' => array(
'exec' => [
'htmlend' => true,
'alone' => false
],
'php' => array(
'method' => 'asidesUrlLists',
'urls' => $filtres_emissions,
'url' => '/spectacles/{v_url_clean}/podcasts/emission/key_type',
'params' => array(
'key_type' => 'auto_key',
'activate' => $curseur
)
),
'title' => 'Trier'
)]);
if ($countFranceCulture) {
$this->asides->load(['bio_franceculture' => ['noactive' => true]]);
}
//Pour France Inter
if ($countFranceInter) {
$this->asides->load([
'contact_franceculture_menu,franceinter' => [
'custom_url_clean' => 'France-Inter',
'title_custom' => 'France Inter',
'logo_custom' => 'france-inter'
]
]);
}
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleAsides($this->asides, $this->serviceAbonnements);
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/podcasts.html.twig');
}
// }}}
// {{{ action_article_edit()
/** Modifier un article
*
* @Route("/spectacles/{slug}/edit-article", name="spectacle_edit_article")
*
* @access public
* @return void
*/
public function action_edit_article($slug = null, Request $request, TheatreMail $TheatreMail, EditUtils $editUtils)
{
$this->InitController($slug, 'edit_article');
$idspectacle = $this->idspectacle;
$abs_directory = $_ENV['PATH_DIRECTORYUPLOAD'] . 'preview/';
// si connecté, instancier la classe utilitaires d'édition
if ($this->context['session'] instanceof Extranetusers) {
// déclare les variables
$edit = false;
$idcontent = null;
$idfile = null;
// jquery
$this->context['view']->jquery_cal = 'datepicker';
$contents = $this->em->getRepository(Contents::class);
$data_content = null;
// mode édition ?
if (isset($_GET['edit']) && $contents->my_is_int($_GET['idcontent'])) {
$edit = true;
$idcontent = (int)$_GET['idcontent'];
// vérifier si l'idcontent est valable sans tenir compte du status
$data_content = $contents->getInfosContent($idcontent, array('get_files' => true));
// ce contenu n'est pas disponible => erreur 404
/*if(empty($data_content) || $data_content['idextranetuser']!=$session->getValue('idextranetuser')) { }*/
// récupèrer le contenu
$this->view->data_content = $data_content;
// vérifier s'il y a un fichier/idfile
if (!empty($data_content['files'][0])) {
$idfile = $data_content['files'][0]['idfile'];
}
}
// on cherche un lien
if (!empty($request->request->get('link_article')) && preg_match('|^http(s)?://|ui', $request->request->get('link_article'))) {
$type_article = 'link';
// on cherche avec opengraph si besoin
if (empty($request->request->get('link'))) {
$graph = OpenGraph::fetch(strip_tags($request->request->get('link_article')));
}
$this->context['view']->link_article = strip_tags($_POST['link_article']);
} elseif (!empty($_GET['is_article'])) {
$type_article = 'article';
} else {
$type_article = null;
$this->context['view']->choice_type_article = true;
}
// paramètre d'instanciation
$params_edit = array(
'idobject' => $this->idspectacle,
'object' => 'spectacles',
);
$url_redirect = '/spectacles/' . $this->context['view']->url_clean . '/';
// controlleur pour l'edition
$edit_utils = new UtilsEdit($this->context, $params_edit);
$wiki = new wiki2xhtml();
// afficher aide wiki
$this->view->aide_wiki = utf8_encode($wiki->help());
$this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, $data_content, [
'attr' => [
'id' => 'masterform',
'novalidate' => true
]
]);
// formulaire simple
$this->context['formFactory']->add('title', TextType::class, [
'label' => 'Titre',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Titre : veuillez préciser le titre de votre article'
])
],
'attr' => [
'id' => 'title',
'size' => '45'
]
]);
$this->context['formFactory']->add('preview', SubmitType::class, [
'label' => 'Prévisualiser les informations avant d\'enregistrer',
'attr' => [
'class' => 'tc-btn-classic boutform boutbig',
'id' => 'preview'
]
]);
if ($request->query->get('preview')) {
$label_validation = 'Prévisualiser';
$this->context['formFactory']->add('validation', SubmitType::class, [
'label' => $label_validation,
'attr' => [
'class' => 'boutform boutbig'
]
]); // validation
}
// c'est un lien
if ($type_article == 'link') {
$fields = array('title', 'deck', 'link', 'writer_group', 'writer_group_url', 'writer', 'date_article');
$this->context['formFactory']->add('deck', TextareaType::class, [
'label' => 'Description, introduction',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Description, introduction : veuillez préciser une introduction ou une description de l\'article'
]),
new Length([
'max' => 450,
'maxMessage' => 'La description ne doit pas faire plus de 450 caractères'
])
],
'attr' => [
'id' => 'deck',
'cols' => '90',
'rows' => '5'
],
]);
$this->context['formFactory']->add('link', TextType::class, [
'label' => 'Lien vers l\'article',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Lien vers l\article : le lien est obligatoire'
])
],
'attr' => [
'id' => 'link',
'size' => '60'
]
]);
// le site et son lien
$this->context['formFactory']->add('writer_group', TextType::class, [
'label' => 'Nom du site',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Veuillez préciser le média ou le site source'
])
],
'attr' => [
'id' => 'writer_group',
'size' => '45'
]
]);
// le journaliste
$this->context['formFactory']->add('writer', TextType::class, [
'label' => 'Journaliste ou rédacteur',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Veuillez préciser le journaliste'
])
],
'attr' => [
'id' => 'writer',
'size' => '45'
]
]);
// la date de parution
$this->context['formFactory']->add('date_article', TextType::class, [
'label' => 'Date de parution',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Veuillez préciser la date de parution de l\'article'
])
],
'attr' => [
'size' => '10',
'maxlength' => '10',
'id' => 'date_article'
]
]);
$this->context['formFactory']->add('date_article_us', HiddenType::class, [
'attr' => [
'id' => 'date_article_us'
]
]); // date de création US
// remplir le form si besoin
if (!empty($graph)) {
$fields_og = array(
'deck' => 'description',
'title' => 'title',
'link' => 'url',
'writer_group' => 'site_name',
);
foreach ($fields_og as $k => $v) {
if (!empty($graph->$v)) {
$this->context['formFactory']->get($k)->setData($graph->$v);
}
}
// on récupère le site si on a le site_name et l'url
if (!empty($graph->site_name) && !empty($graph->url)) {
$url_scheme = parse_url($graph->url);
// $this->context['formFactory']->setData(array('writer_group_url' => $url_scheme['scheme'] . '://' . $url_scheme['host']));
}
// il y a une image
if (!empty($graph->image)) {
$this->context['view']->proposed_thumbnail['vignette'] = $graph->image;
}
}
$this->context['view']->is_link = true;
// c'est un article
} else {
$fields = array('title', 'subtitle', 'deck', 'text', 'writer', 'writer_group', 'writer_group_url');
$this->context['formFactory']->add('subtitle', TextType::class, [
'label' => 'Sous-titre',
'attr' => [
'id' => 'title',
'size' => '45'
]
]);
$this->context['formFactory']->add('deck', TextareaType::class, [
'label' => 'Chapeau',
'attr' => [
'id' => 'deck',
'cols' => '80',
'rows' => '5',
'class' => 'markitup'
]
]);
$this->context['formFactory']->add('text', TextareaType::class, [
'label' => 'Texte',
'constraints' => [
new NotBlank([
'message' => 'Texte : veuillez préciser le texte de votre article'
])
],
'attr' => [
'id' => 'text',
'cols' => '130',
'rows' => '20',
'class' => 'markitup'
]
]);
$this->context['formFactory']->add('writer', TextType::class, [
'label' => 'Signature de l\'article',
'attr' => [
'id' => 'writer',
'size' => '45'
]
]);
$this->context['formFactory']->add('writer_group', TextType::class, [
'label' => 'Nom du groupe',
'attr' => [
'id' => 'writer_group',
'size' => '45'
]
]);
$this->context['formFactory']->add('writer_group_url', TextType::class, [
'label' => 'Site du groupe',
'constraints' => [
new CheckWebsite([
'message' => 'Site du groupe : le site Internet que vous avez précisé ne semble pas disponible ! Vérifiez qu\'il s\'agit bien de la bonne adresse qui commence par http://\''
])
],
'attr' => [
'id' => 'writer_group_url',
'size' => '45'
]
]);
// copyright et titre du fichier
$this->context['formFactory']->add('legend', TextType::class, [
'label' => 'Légende',
'attr' => [
'size' => '45',
'id' => 'legend'
]
]);
$this->context['formFactory']->add('copyright', TextType::class, [
'label' => 'Copyright',
'attr' => [
'size' => '45',
'id' => 'copyright'
]
]);
$this->context['view']->is_article = true;
}
$this->context['form'] = $this->context['formFactory']->getForm();
$this->context['form']->handleRequest($request);
if (!empty($this->context['form']->get('preview')) and $this->context['form']->get('preview')->isClicked()) {
$preview = true;
} else {
$preview = false;
}
// on valide uniquement si on sait déjà le type d'article posté
if (!empty($type_article) && $this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
// on regarde s'il y a une image en préview
if (!empty($_POST['photo_preview'])
&& preg_match('/^[0-9,a-z,A-Z,\-]+\.jpg$/', $_POST['photo_preview'])
&& file_exists($abs_directory . $_POST['photo_preview'])) {
// récupère => sera ecrasé si nouvel upload
$photo_preview = $_POST['photo_preview'];
$photo_normal_preview = str_replace('thumb-', '', $photo_preview);
$this->view->photo_preview = $photo_preview;
}
// infos statiques
$values = array(
'idspectacle' => $this->idspectacle,
'idextranetuser' => $this->getUser()->getIdextranetuser(),
'language' => 'fr',
);
// si c'est une édition, on laisse le contenu en ligne => modération à postériori
if (empty($edit)) {
$values['publish'] = 0;
}
// les champs classiques
foreach ($fields as $f) {
if ($this->context['form']->has($f)) {
$values[$f] = $this->context['form']->get($f)->getData();
}
}
// un lien ?
if ($type_article == 'link') {
$values['is_link'] = 1;
$values['text'] = 'Lien vers un article';
$values['deck'] = $values['deck'] . '...';
}
// date de parution
$date_article_us = $this->context['form']->get('date_article_us')->getData();
if (!empty($date_article_us)) {
$values['date_article'] = $date_article_us;
}
// un copyright pour l'image ?
$copyright = null;
$legend = null;
if ($this->context['form']->has('copyright')) {
$copyright = $this->context['form']->get('copyright')->getData();
$legend = $this->context['form']->get('legend')->getData();
}
// date d'insertion si nouveau
if (empty($idcontent)) {
$values['dateinsert'] = $this->func->now();
// si pas de date de parution, date de parution = date d'insertion
if (empty($values['date_article'])) {
$values['date_article'] = $values['dateinsert'];
}
}
// on insère le draft
if (!$preview) {
$contents = $this->em->getRepository(Contents::class);
$contents->setUpdateFields($values);
if ($res = $contents->addContent('spectacles', $idspectacle, $idcontent, 0, array('101' => '101'))) {
// idcontent
if (empty($idcontent)) {
$idcontent = $idcontent_new = $res;
} else {
$this->view->edit = true;
}
// on confirme
$this->view->enregistrement = true;
// logguer l'action
$log = $this->em->getRepository(UserAction::class);
// l'identifiant de la nouvelle fiche (mode creation)
// envoyer un mail à l'admin
$editUtils->setParams($this->context, [
'idobject' => $idcontent,
'object' => 'contents',
'em' => $this->em
]);
if (!empty($idcontent_new)) {
$log->setAction('contents', $idcontent_new, 'create', $this->getUser()->getIdextranetuser());
$editUtils->sendAlerte($idspectacle, 'update', 'Ajout d\'une critique [contents][' . $idcontent_new . ']', $TheatreMail);
} else {
$log->setAction('contents', $idcontent, 'update', $this->getUser()->getIdextranetuser());
$editUtils->sendAlerte($idspectacle, 'update', 'Modification d\'une critique [contents][' . $idcontent . ']', $TheatreMail);
}
$this->view->extranetuser_email = $this->getUser()->getEmail();
}
// on copie l'image qui est en preview dans son répertoire final et on l'associe à la fiche du spectacle
if (!empty($photo_normal_preview)) {
$files = $this->em->getRepository(FilesRepository::class);
// data pour le fichier
$filedata = array(
'range' => 'NULL',
'title' => $legend,
'description' => '',
'language' => 'fr',
'idextranetuser' => $this->getUser()->getIdExtranetuser(),
'idcontent' => $idcontent, // retourne l'idcontent
'copyright' => $copyright,
'publish' => 1,
'valid' => 1
);
// si c'est une édition, on laisse le contenu en ligne => modération à postériori
if (empty($edit)) {
$filedata['publish'] = 0;
} else {
if (!empty($data_content['publish'])) {
$filedata['publish'] = $data_content['publish'];
}
}
// associée en temps que photos associées
$files->uploadObjectFile(array('file' => $abs_directory . $photo_normal_preview), 22, 'contents', $idcontent, $filedata, $idfile);
// supprimer le fichier de preview et la vignette
@unlink($abs_directory . $photo_normal_preview);
@unlink($abs_directory . $photo_preview);
} else {
// voir s'il faut mettre à jour uniquement le copyright ou la légende
if (!empty($idfile)) {
if ((!empty($copyright) && $copyright != $data_content['files'][0]['copyright'])
|| (!empty($legend) && $legend != $data_content['files'][0]['title'])) {
$files = $this->em->getRepository(Files::class);
$files->setUpdateFields(array('copyright' => $copyright, 'title' => $legend));
$files->setData($idfile);
}
}
}
// on prévisualise
} else {
// conversion en wiki du chapeau et du texte
if (!empty($values['text'])) {
$values['text'] = $wiki->transform($values['text']);
}
// pas de texte en prévisu de lien
if (!empty($values['is_link'])) {
$values['text'] = null;
}
$values['deck'] = $wiki->transform($values['deck']);
}
// upload d'un fichier
// if($objfile->isUploadedFile()) {
// // check la validité
// if($extension = $edit_utils->checkFile($objfile)) {
//
// // nom du fichier = url_clean coupé + identifiant
// $nomfichier = $edit_utils->getFileName($this->context['view']->data_spectacles['urlClean'],$extension);
//
// // nom de la vignette
// $nomvignette = 'thumb-'.$nomfichier;
//
// // upload en mode preview dans le dossier preview
// if($preview) {
//
// // si deja un fichier preview pour ce contenu, on le supprime
// if(!empty($photo_preview)) {
// @unlink($abs_directory.$photo_preview);
// @unlink($abs_directory.str_replace('thumb-','', $photo_preview));
// }
//
// if(!$objfile->moveUploadedFile($abs_directory,$nomfichier)) {
// $error['dl'] = 'Il y a eu un problème pendant le téléchargement de votre fichier.
// Merci de réessayer ou de contacter l\'assistance technique.';
// } else {
//
// // réduire la preview
// require_once PATH_LIBS.'Images/Images.php';
// $images = new Images();
// $images->setVignetteFormat(array('width'=>220,'height'=>'180','direction'=>'L'));
// $images->setThumbnail($abs_directory.$nomfichier,$abs_directory.$nomvignette,220);
//
// // URL du fichier pour la vue
// $this->view->photo_preview = $nomvignette;
//
// }
// }
//
// } else {
// $preview = false;
// }
//
// // on a une vignette a récupèrer
// }
if (!empty($_POST['vignette_url'])) {
$extension = 'jpg';
// nom du fichier = url_clean coupé + identifiant
$nomfichier = $edit_utils->getFileName($this->context['view']->data_spectacles['urlClean'], $extension);
// nom de la vignette
$nomvignette = 'thumb-' . $nomfichier;
// upload en mode preview dans le dossier preview
if ($preview) {
// si deja un fichier preview pour ce contenu, on le supprime
if (!empty($photo_preview)) {
@unlink($abs_directory . $photo_preview);
@unlink($abs_directory . str_replace('thumb-', '', $photo_preview));
}
// récupèrer le fichier
$url = $_POST['vignette_url'];
$path = $abs_directory . $nomfichier;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if (!file_put_contents($path, $data)) {
$error['dl'] = 'Il y a eu un problème pendant le téléchargement de votre fichier.
Merci de réessayer ou de contacter l\'assistance technique.';
} else {
// réduire la preview
require_once PATH_LIBS . 'Images/Images.php';
$images = new Images();
$images->setVignetteFormat(array('width' => 220, 'height' => '180', 'direction' => 'L'));
$images->setThumbnail($abs_directory . $nomfichier, $abs_directory . $nomvignette, 220);
// URL du fichier pour la vue
$this->view->photo_preview = $nomvignette;
}
}
}
// ajouter le copyright pour le renvoyer à la vue
// $values['copyright'] = $copyright;
// $values['legend'] = $legend;
// la date de p FR pour la vue
if (!empty($_REQUEST['date_article'])) {
$values['date_article'] = filter_var($_REQUEST['date_article'], FILTER_SANITIZE_URL);
}
// envoyer les infos au template
$this->view->detailarticle = $values;
// réduire la taille du lien
$this->view->detailarticle['link_cut'] = substr($values['link'], 0, 60) . '...';
// précier le mode (preview ou pas)
$this->view->preview = $preview;
}
// récupérer les infos
if (empty($idcontent_new) && !empty($data_content)) {
$this->context['formFactory']->add('idcontent', HiddenType::class); // $idcontent
$this->context['formFactory']->setData($data_content);
//setDebug($data_content);
// voir s'il y a aussi une image proposée ?
if (empty($this->view->photo_preview) && !empty($data_content['files'][0])) {
if (!empty($data_content['files'][0]['copyright'])) {
$this->context['formFactory']->setData(array('copyright' => $data_content['files'][0]['copyright']));
}
if (!empty($data_content['files'][0]['title'])) {
$this->context['formFactory']->setData(array('legend' => $data_content['files'][0]['title']));
}
// réduire la preview
require_once PATH_LIBS . 'Images/Images.php';
$images = new Images();
$images->setVignetteFormat(array('width' => 220, 'height' => '180', 'direction' => 'L'));
$data_content['files'][0]['vignette_moy'] = $contents->getThumbnail($data_content['files'][0]['file'], 270, 'thumb');
$data_content['files'][0]['vignette'] = $contents->getThumbnail($data_content['files'][0]['file'], 100, 'thumb');
$this->view->proposed_file = $data_content['files'][0];
$this->view->remplace_file = true;
}
}
// compter les caractères (450 max)
$this->context['view']->js_more_final[] = '/navigation/js/textcounter/textcounter.min.js';
} else { // l'internaute n'est pas logué
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'] . '/edit-article/', 'entete_connexion' => 'spectacles']);
}
$this->extra_locate = $this->extra_title = 'Proposer un ajout/une modification';
$this->style_more[] = array(
'/navigation/css/style_montheatre.css',
'/navigation/js/markitup/skins/markitup/style.css',
'/navigation/js/markitup/sets/dotclear/style.css'
);
$this->js_more[] = 'markitup/jquery.markitup.js';
$this->js_more[] = 'markitup/sets/dotclear/set.js';
//aside
$this->asides->load('common_participer_spectacles');
return $this->view('spectacles/edit-article.html.twig', [
'form' => $this->context['form']->createView()
]);
}
// }}}
// {{{ action_article()
/** Présentation
*
*
* @access public
* @return void
*/
public function action_article()
{
// presentation "bio_txt"
$biotxt = $this->contents->getAssociateContent($this->idperson, 'persons', 'class_biotxt', array('wiki_convert' => true));
if (!empty($biotxt['text'])) {
$this->view->biotxt = $biotxt;
// mots-clés et description
$this->func->makeMetaFromHtml($biotxt['text'], $this->meta_description, $this->meta_keywords);
}
// il faut également la photo associé et le site web
$files = $this->em->getRepository(Files::class);
$files->setPublishStatus($this->publish_status);
$photos_person = $files->getObjectFiles($this->idperson, 'persons', 'class_photo_person');
$format_vignette_person = array('width' => 220, 'height' => '180', 'direction' => 'L');
if (!empty($photos_person)) {
// creation d'une vignette
foreach ($photos_person as $k => $v) {
$photos_person[$k]['vignette'] = $this->persons->getVignettePerson($this->idperson, $format_vignette_person);
}
$this->view->photos = $photos_person;
}
// si il manque quelques choses, on le précise
//$fields = array('text','link','facebook','twitter');
// javascript prettyphoto
$this->style_more[] = 'prettyphoto';
$this->js_more[] = 'jquery.prettyPhoto.js';
}
// }}}
// {{{ action_critiques()
/**
*
* @Route("/spectacles/{slug}/critiques", name="spectacle_critiques")
*
* Les articles associés aux spectacles de type critique
*
*/
public function action_critiques($slug, AdapterInterface $cache)
{
$this->InitController($slug, 'critiques');
//afficher les infos sur l'utilisateur qui a ajouté l'article
$this->view->display_extranetuser = true;
$this->view->top_menu_articles = true;
//on compte le nombre de critiques
$nombre_critiques = $this->contenus_spectacles('class_critique', 'critiques', array(), ['count_only' => true]);
//on limite le nombre de critiques à 10 par pages
$this->perPage = 10;
//on récupère les critiques
$this->contenus_spectacles('class_critique', 'critiques', array('width' => 500), ['limit' => array($this->getLimitStart(), $this->perPage)]);
$this->view->pagination = $this->getPagination($nombre_critiques, 10);
$this->view->pagination['totalItems'] = $nombre_critiques;
$this->view->pagination['custom'] = true;
$this->view->pagination['custom_name'] = 'critiques';
if (!empty($this->view->articles['fr']['content'])) {
$this->view->nb_articles = $nombre_critiques;
}
// ne pas afficher l'article s'il n'y a pas d'ID content dans l'URL
if (!empty($this->context['params']['idcontent'])) {
if (!empty($this->view->articles['fr']['content'])) {
foreach ($this->view->articles['fr']['content'] as $k => $v) {
if ($v['idcontent'] == $this->context['params']['idcontent']) {
unset($this->view->articles['fr']['content'][$k]);
}
}
$this->view->nb_articles = count($this->view->articles['fr']['content']);
}
$this->view->is_article = true;
} else {
// titre de la page et fil d'arianne
$this->extra_locate = $this->extra_title = 'Espace critiques';
// description
$this->meta_description = 'Toutes les références vers les pages critiques de
' . $this->data_spectacles['title'] . ', les articles de presse, les blogs...
Et vous pouvez aussi ajouter vos propres critiques ou référencer les articles de vos blogs';
}
$this->getAsideSelections();
//aside
$this->asides->load(['common_participer_spectacles' => array(
'exec' => ['color' => 'critiques']
)]);
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleCritiques($this->asides, $this->serviceAbonnements);
$this->asides->load(['spectacles_gadget_calendrier' => array(
'exec' => ['color' => 'critiques']
)]);
$this->asides->load('spectacles_proposez_critiques');
//On affiche la publicité google
$asides_publicite = new asides();
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleCorrespondant($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite_footer = $asides_publicite->view($this->context['view']);
$item = $cache->getItem('recommanded_spectacles_all_infos');
if (! $item->isHit()) {
$spectacles = $this->em->getRepository(Spectacles::class);
$recommandedSpectacles = $spectacles->getListSpectacles([
"params" => [
"limit" => [0, 4]
],
"special" => [
"prochains" => "30",
"recommandations" => true,
"publish_valid" => true
]
]);
$paramsVignette = [
'vignette' => [
'width' => 100,
'height' => 100,
'direction' => 'crop',
'fleche' => 'moyen'
],
'get_vignette' => true
];
$recommandedSpectaclesAllInfos = [];
// Toutes les infos des prochains spectacles avec recommandations
foreach ($recommandedSpectacles as $spectacle) {
$spectacle = $spectacles->getInfosSpectacle($spectacle['idspectacle'], $paramsVignette);
$spectacle['carrer'] = $spectacles->getObjectsCarrerDetails($spectacle['idspectacle']);
if ($dates = $spectacles->getProchDateLieu(array('prochains' => true), $spectacle['idspectacle'])) {
$spectacle = array_merge($spectacle, $dates);
}
if (! isset($spectacle['affcontact'])
&& (isset($spectacle['contact']) && isset($spectacle['contact']['organisation']) && ! empty($spectacle['contact']['organisation']))
) {
$spectacle['affcontact'] = true;
}
$spectacle['footer_critique'] = true;
$spectacle['nombre_critique'] = $this->em->getRepository(Contents::class)->countAssociateContent('spectacles', $spectacle['idspectacle'], 'class_critique', array('publish_valid' => 1));
$spectacle['url_clean_more'] = 'critiques/';
$spectacle['nbRecommandations'] = $spectacles->countSpectacleRecommandations($spectacle['idspectacle']);
$spectacle = $spectacles->clearSpectaclesAddAllPersons($spectacle);
$recommandedSpectaclesAllInfos[] = $spectacle;
}
$item->set($recommandedSpectaclesAllInfos)
->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
$cache->save($item);
}
$this->context['view']->recommandedSpectaclesAllInfos = $item->get();
return $this->view('spectacles/critiques.html.twig');
}
// }}}
// {{{ action_dvd()
/** Les dvds associées à ce spectacle
*
* @route("/spectacles/{slug}/dvd", name="spectacle_dvd")
*
*/
public function action_dvd($slug = null)
{
$this->InitController($slug, 'videos');
$this->view->list_dvds = $this->getDvds();
$this->setAsideDVDVOD('dvd', 'videos');
return $this->view('spectacles/dvd.html.twig');
}
// }}}
// {{{ action_qrcode()
/** retourner l'url du qrcode du spectacle
*
*
* @route("/spectacles/{slug}/qrcode", name="spectacle_qrcode")
*
*/
public function action_qrcode($slug = null)
{
$this->InitController($slug, 'qurcode');
$this->view->qrcode_url = $this->func->generateQRcode($GLOBALS['url_module'] . '/spectacles/' . $this->data_spectacles['urlClean'] . '/', 400);
$this->asides->load('qrcode');
return $this->view('spectacles/qrcode.html.twig');
}
// }}}
// {{{ action_widget()
/** widget du spectacle
*
* @Route("/spectacles/{slug}/widget", name="spectacle_widget")
*
* @access public
* @return void
*/
public function action_widget($slug = null)
{
$this->InitController($slug, 'widget');
$this->style_more[] = 'widget_thnet';
// renvoyer en json ou en html ?
if (!empty($_GET['v']) && $_GET['v'] == 'ajax') {
$this->context['json_response'] = true;
} else {
$this->view->iframe_style = true;
}
// avec ou sans image (null,small,medium)
$preview_sizes = array(
'none' => 0,
'small' => 55,
'bigsmall' => 80,
'large' => 100,
);
if (!empty($_GET['preview']) && array_key_exists($_GET['preview'], $preview_sizes)) {
$vignette_size = $preview_sizes[$_GET['preview']];
} else {
$vignette_size = 100;
}
// largeur de la colonne du texte
$max_colsize = 10000;
if (!empty($_GET['colsize']) && $this->func->my_is_int($_GET['colsize']) && $_GET['colsize'] <= $max_colsize) {
$colsize = $_GET['colsize'];
} else {
$colsize = 200 + $vignette_size;
}
$colsize = $colsize - $vignette_size;
// nombre d'items maxi
$max_nbitems = 50;
if (!empty($_GET['nbitems']) && $this->func->my_is_int($_GET['nbitems']) && $_GET['nbitems'] <= $max_nbitems) {
$nbitems = $_GET['nbitems'];
} else {
$nbitems = 2;
}
// format vignette
if (!empty($vignette_size)) {
$format = array('width' => $vignette_size, 'height' => $vignette_size, 'forme' => 'round', 'direction' => 'crop', 'valround' => 7);
} else {
$format = false;
$vignette_size = 0;
}
// selection des spectacles aujourd'hui et demain
$params_sql_spectacle = array(
'params' => array(
'where' => ' AND s.idspectacle=' . $this->idspectacle,
),
'special' => array(
'plus_proche' => true
),
'dbg' => array('widget', 'Le spectacle')
);
$params_display = array(
'stylemore' => array('imagep' => 'width:' . $vignette_size . 'px', 'descsp' => 'width:' . $colsize . 'px'),
'vignette' => $format,
);
$list_spectacle = $this->spectacles->getListSpectacles($params_sql_spectacle, $params_display);
// largeur de la colonne = vignette_size + colsize + les marges
$this->view->widget_width = $vignette_size + $colsize + 10;
$this->view->li_fleche_width = $vignette_size + $colsize + 5;
$this->view->spec = $list_spectacle;
return $this->view('spectacles/widget.html.twig');
}
// }}}
// {{{ action_widget_calendrier()
/** widget calendrier du spectacle
*
* @Route("/spectacles/{slug}/widget-calendrier", name="spectacle_widget_calendrier")
*
* @access public
* @return void
*/
public function action_widget_calendrier($slug = null)
{
$this->InitController($slug, 'widget-calendrier');
$this->view->page_nobody = true;
$version = 'new';
// renvoyer en json ou en html ?
if (!empty($_GET['v']) && $_GET['v'] == 'ajax') {
$this->context['json_response'] = true;
} else {
$this->view->iframe_style = true;
}
// nombre d'items maxi
$max_nbitems = 50;
if (!empty($_GET['nbitems']) && $this->func->my_is_int($_GET['nbitems']) && $_GET['nbitems'] <= $max_nbitems) {
$nbitems = $_GET['nbitems'];
} else {
$nbitems = 3;
}
// on recupere le calendrier
$schedules = $this->em->getRepository(Schedules::class);
//Si aucune date n'existe on affiche un mesage d'erreur
$this->view->date_exists = true;
// recuperer les dates futurs si il y en a
$schedule_futur = $schedules->getDateLieuDemain($this->idspectacle, $nbitems, null, $version);
if (!empty($schedule_futur)) {
$this->view->schedule_detail_futur = $schedule_futur;
//Si une date existe on l'affiche
$this->view->date_exists = true;
// date dans le futur
$this->view->futurdate = true;
// ajout des mots clés basés sur les lieux et dates de représentation futurs
$this->meta_keywords .= ' ' . $schedules->ScheduleToKeywords($schedule_futur, 20);
}
// recuperer les dates anciennes si il y en a
$schedule_old = $schedules->getDateLieuHier($this->idspectacle, $nbitems, null, $version);
if (!empty($schedule_old)) {
$this->view->schedule_detail_old = $schedule_old;
//Si une date existe on l'affiche
$this->view->date_exists = true;
// date dans le passe
$this->view->olddate = true;
// ajout des mots clés basés sur les lieux et dates de représentation récentes
$this->meta_keywords .= ' ' . $schedules->ScheduleToKeywords($schedule_old, 10);
}
return $this->view('spectacles/widget-calendrier.html.twig');
}
// }}}
// {{{ action_api()
/** Informations sur le spectacle
*
*
* @access public
* @return void
*/
public function action_api($api_data = true)
{
// calendrier du spectacle
if (array_key_exists('schedules', $this->context['params'])) {
$datas = array(
array(
'title' => $this->data_spectacles['title'],
'permanent_url' => $_ENV['URL_THNET'] . '/spectacles/' . $this->data_spectacles['urlClean'] . '/',
'dates' => $this->em->getRepository(Schedules::class)->getSchedule($this->idspectacle, true),
)
);
} else {
$datas = array(
array(
'title' => $this->data_spectacles['title'],
'permanent_url' => $_ENV['URL_THNET'] . '/spectacles/' . $this->data_spectacles['urlClean'] . '/',
)
);
$infos = $this->spectacles->getListSpectacles(array(
'special' => array(
'idspectacle' => $this->idspectacle,
),
'dbg' => array('infos', 'infos sur le spectacle'),
), null, false, array('api' => true));
foreach ($infos as $k => $v) {
$datas = array($v);
break;
}
// ajouter les infos complémentaires
if (!empty($GLOBALS['api']['data']) && $GLOBALS['api']['data'] == 'extended') {
/*
A ajouter
Extrait video
Images*/
$datas[0]['creation_date'] = $this->data_spectacles['creation_date']; // date de création
$datas[0]['poster_big']['file'] = $this->data_spectacles['illustrations'][0]['url_file_path']; // affiche
$datas[0]['poster_big']['copyright'] = $this->data_spectacles['illustrations'][0]['copyright']; // copyright
$datas[0]['duration'] = $this->data_spectacles['duration']; // durée
$datas[0]['abstract'] = $this->getAbstract(); // résumé
$datas[0]['contents'] = $this->contents->getAssociateContents($this->idspectacle, 'spectacles', 'class_article', array('get_texts' => true, 'api' => true));
}
}
return $datas;
}
// }}}
// {{{ action_documents_edit()
/** Ajouter des documents à la structure
*
* @Route("/spectacles/{slug}/documents-edit", name="spectacle_documents_edit")
* @Route("/spectacles/{slug}/documents-edit/idfile/{p_idfile}", name="spectacle_documents_edit_idfile")
*
* @access public
* @return void
*/
public function action_documents_edit($slug = null, $p_idfile = null, FilesController $files_utils, Request $request, EditUtils $editUtils)
{
$this->InitController($slug, 'documents-edit');
$this->context['params']['idfile'] = $p_idfile;
/* géré par Files_edit */
$this->extra_locate = $this->extra_title = 'Ajouter/modifier un document';
$this->context['view']->object_rights['update'] = true;
// paramètre d'instanciation
$params_edit = array(
'idobject' => $this->idspectacle,
'object' => 'spectacles',
);
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => $this->context['view']->data_object['url_folder'] . '/documents', 'entete_connexion' => $params_edit['object']]);
}
// pour la gestion des fichiers
$files_utils->InitFilesController($this->context, $params_edit);
$response = $files_utils->documents_edit($request, $editUtils);
if ($response instanceof RedirectResponse) {
return $response;
}
$this->js_more[] = 'upload/jquery.fineuploader-3.0.min.js';
$this->js_more[] = 'ajax.relation.js';
$this->getAsidesDocuments();
return $this->view('spectacles/documents-edit.html.twig', [
'form' => $files_utils->context['form']->createView()
]);
}
// }}}
// {{{ action_documents_delete()
/** Supprimer un document associé au spectacle
*
* @Route("/spectacles/{slug}/documents-delete/idfile/{idfile}", name="spectacle_documents_delete_idfile")
*
* @access public
* @return void
*/
public function action_documents_delete($idfile = null, $slug = null, UploadUtils $edit_utils, FilesController $files_utils, Request $request)
{
$this->InitController($slug, 'documents');
$this->context['params']['idfile'] = $idfile;
$this->extra_locate = $this->extra_title = 'Supprimer un document';
// paramètre d'instanciation
$params_edit = array(
'idobject' => $this->idspectacle,
'object' => 'spectacles',
);
// si connecté, instancier la classe utilitaires d'édition
if ($this->getUser() instanceof Extranetusers) {
// controlleur pour l'edition
$edit_utils->load($this->context, $params_edit);
// les droits
// $object_rights = $edit_utils->checkObjectRights();
// @TODO besoin de créer un nouvelle table pour les droits?
$this->context['view']->object_rights = [
"delete" => true,
"update" => true,
"insert" => true,
"select" => true,
"isroot" => false,
"isadmin" => true,
"rights" => "15"
];
// pour la gestion des fichiers
$files_utils->InitFilesController($this->context, $params_edit);
$this->context['view']->data_object = $this->data_spectacles;
$this->context['view']->data_object['url_folder'] = '/spectacles/' . $this->data_spectacles['urlClean'];
$response = $files_utils->documents_delete($request);
if ($response instanceof RedirectResponse) {
return $response;
}
// } else { // la personne n'a pas les droits => renvoi sur le formulaire de demande
// actionRedirect($context['view']->data_object['url_folder'].'/autorisation/');
// }
} else { // personne non loguée
// rediriger vers montheatre/connexion
return $this->redirectToRoute('app_login', ['urifrom' => $this->context['view']->data_object['url_folder'] . '/documents-edit', 'entete_connexion' => $params_edit['object']]);
}
$this->extra_locate = $this->extra_title = 'Ajouter/modifier un document';
return $this->view('spectacles/documents-delete.html.twig', [
]);
}
// }}}
// {{{ action_documents()
/** Les documents lié à la structure
*
* @Route("/spectacles/{slug}/documents", name="spectacle_documents")
*
* @access public
* @return void
*/
public function action_documents($slug = null, FilesController $files_utils, Request $request)
{
$this->InitController($slug, 'documents');
// paramètre d'instanciation
$params_edit = array(
'idobject' => $this->idspectacle,
'object' => 'spectacles',
);
// si connecté, instancier la classe utilitaires d'édition
if ($this->getUser() instanceof Extranetusers) {
$this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
// pour la gestion des fichiers
$files_utils->InitFilesController($this->context, $params_edit);
$files_utils->documents($request);
// $this->view = (object) array_merge((array) $this->view, (array) $ecoles_folder->view);
$this->context['view'] = (object)array_merge((array)$this->context['view'], (array)$files_utils->context['view']);
} else { // personne non loguée
// rediriger vers montheatre/connexion
return $this->redirectToRoute('app_login', ['urifrom' => $this->context['view']->data_object['url_folder'] . '/documents', 'entete_connexion' => $params_edit['object']]);
}
/* géré par Files_edit */
$this->extra_locate = $this->extra_title = 'Documents associés';
foreach (array('rubrique', 'dossier', 'auteur', 'pageregion', 'montheatre') as $s) {
$this->view->style_more[] = $s;
}
$this->getAsidesDocuments();
return $this->view('spectacles/documents.html.twig');
}
// }}}
// {{{ action_telechargements()
/** Les documents lié au spectacle
*
*
* @Route("/spectacles/{slug}/telechargements", name="spectacle_telechargements")
*
* @access public
* @return void
*/
public function action_telechargements($slug = null)
{
$this->InitController($slug, 'telechargements');
$files = $this->em->getRepository(Files::class);
$classifications = $this->em->getRepository(Classifications::class);
// classifications des spectacles
$classifications_list = $classifications->getClassificationList('files', 'spectacles', null, array(1), 'get_value');
// liste des fichiers
$params_object_files = array(
'valid' => 1,
'publish' => 1,
'force_mode' => 'file',
'vignette_width' => 250,
'debug_sql_associate' => false
);
$object_files = $files->getObjectFiles($this->idspectacle, 'spectacles', $classifications_list, $params_object_files);
if (!empty($object_files)) {
foreach ($object_files as $k => $v) {
if (!empty($v['saison'])) {
$saisons[$v['saison']] = $v['saison'];
// trouver kles autres associations
$v['objects'] = $files->getObjects($v['idfile'], array('object' => 'spectacles', 'idobject' => $this->idspectacle));
if (!empty($v['objects'])) {
foreach ($v['objects'] as $kb => $vb) {
$v['objects'][$vb['object']][$vb['idobject']] = $vb;
}
}
$this->context['view']->files['general'][$k] = $v;
}
}
$this->context['view']->is_file = true;
if (!empty($saisons)) {
//setDebug($saisons);
}
}
/* géré par Files_edit */
$this->extra_locate = $this->extra_title = 'Documents associés';
foreach (array('rubrique', 'dossier', 'auteur', 'pageregion', 'montheatre') as $s) {
$this->style_more[] = $s;
}
$this->js_more[] = 'jquery.matchHeight-min.js';
//aside
$this->asides->load('spectacles_telecharge_doc');
return $this->view('spectacles/telechargements.html.twig');
}
// }}}
// {{{ action_modifier_dates()
/** L'interface de modification des dates associés aux spectacles
*
* @Route("/spectacles/{slug}/modifier-dates", name="spectacle_modifier_dates")
* @Route("/spectacles/{slug}/modifier-dates/idspectacle/{idspectacle}/idcontact/{idcontact}", name="spectacle_modifier_dates_idspectacle")
*
*/
public function action_modifier_dates($slug, $idspectacle = null, $idcontact = null, AjoutSpectacleController $ajoutspectacle, Request $request)
{
$this->InitController($slug, 'presentation');
$this->context['params']['idspectacle'] = $idspectacle;
$this->context['params']['idcontact'] = $idcontact;
// rediriger vers montheatre/connexion
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'] . '/ajoutdates/', 'entete_connexion' => 'spectacles', 'special' => 'dates']);
}
// envoi idspectacle à la vue
$this->view->idspectacle = $this->idspectacle;
// idcontact => mode édition
if (!empty($this->context['params']['idcontact']) && $this->func->my_is_int($this->context['params']['idcontact'])) {
$idcontact = $this->context['params']['idcontact'];
} else {
$idcontact = null;
}
$ajoutspectacle_params = array(
'idspectacle' => $this->idspectacle,
'path' => 'spectacles/' . $this->data_spectacles['urlClean'],
'idcontact' => $idcontact,
'no_check_extranetuser' => true, // n'importe quel utilisateur peut ajouter des dates
'send_to_owner' => true, // prévenir l'utilisateur que quelqu'un a modifié son spectacle
'possible_do' => array('edit_schedule', 'delete_schedule', 'active_representation', 'disable_representation')
);
$ajoutspectacle->InitAjoutSpectacle($ajoutspectacle_params);
$ajoutspectacle->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
$ajoutspectacle->getScheduleForm($this->idspectacle, $idcontact);
$ajoutspectacle->context['form'] = $ajoutspectacle->context['formFactory']->getForm();
$ajoutspectacle->context['form']->handleRequest($request);
if ($ajoutspectacle->validateScheduleForm() || !empty($_POST['dates'])) {
if (empty($_POST['dates'])) {
$this->context['error']['precise_date'] = 'Vous devez préciser au moins une date de représentation';
} elseif (empty($ajoutspectacle->context['form']->get('idcontact'))) {
//$this->context['error']['precise_contact'] = 'Vous devez choisir un lieu de représentation';
} else {
return $ajoutspectacle->saveSchedule($this->idspectacle, $idcontact);
}
}
$ajoutspectacle->getAjoutspectacleCommon();
foreach ($ajoutspectacle->view as $key => $value) {
$this->view->$key = $value;
}
$this->view->style_more[] = array(
'/navigation/js/multidate/multidatepicker.css',
);
// js en plus
// style css
$jqueryui_theme = 'themes_2018';
$jqueryui_version = '1.12-1';
$this->js_more[] = 'ajax.relation.js';
$this->js_more[] = 'jquery-ui/jquery-ui-' . $jqueryui_version . '.min.js';
$this->js_more[] = 'multidate/jquery-ui.multidatespicker.js';
$this->js_more[] = 'jquery-ui/jquery.ui.datepicker-fr.js';
return $this->view('spectacles/modifier-dates.html.twig', [
'form' => $ajoutspectacle->context['form']->createView()
]);
}
// }}}
// {{{ action_dates()
/** Les dates associés aux spectacles
*
* @Route("/spectacles/{slug}/dates", name="spectacle_dates")
* @Route("/spectacles/{slug}/dates/idspectacle/{p_idspectacle}", name="spectacle_dates_idspectacle")
* @Route("/spectacles/{slug}/ajoutdates", name="spectacle_ajout_dates")
*
*/
public function action_dates($slug = null, $p_idspectacle = null, AjoutSpectacleController $ajoutspectacle)
{
$this->InitController($slug, 'dates');
$this->context['params']['idspectacle'] = $p_idspectacle;
// rediriger vers montheatre/connexion
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'] . '/ajoutdates/', 'entete_connexion' => 'spectacles', 'special' => 'dates']);
}
// créer un token pour anti-csrf
$this->func->tokenCsrf('ajoutdate', $this->context);
// instancie
$ajoutspectacle_params = array(
'idspectacle' => $this->idspectacle,
'no_check_extranetuser' => true, // n'importe quel utilisateur peut ajouter des dates
'path' => 'spectacles/' . $this->data_spectacles['urlClean'],
'send_to_owner' => true, // prévenir l'utilisateur que quelqu'un a modifié son spectacle
'do' => array('edit', 'delete')
);
$ajoutspectacle->InitAjoutSpectacle($ajoutspectacle_params);
foreach (['active_representation', 'disable_representation'] as $value) {
if (!empty($_GET[$value])) {
$this->context['view']->returnDo = true;
$this->context['view']->$value = true;
}
}
// formulaire
$ajoutspectacle->getSchedule($this->idspectacle);
// élèments commun (css, js, barre d'outils)
$ajoutspectacle->getAjoutspectacleCommon();
// les horaires
$this->js_more[] = 'jquery.qtip.min.js';
$this->view->schedule_detail = $ajoutspectacle->view->schedule_detail;
$this->view->page_courante = 'spectacles/' . $this->data_spectacles['urlClean'];
$this->view->idspectacle = $this->id;
return $this->view('spectacles/dates.html.twig');
}
// }}}
// {{{ action_validation()
/** La page de validation des spectacles (lesdates; ajout de contenu etc.)
*
* @Route("/spectacles/{slug}/validation/idspectacle/{p_idspectacle}", name="spectacle_validation_idspectacle")
* @Route("/spectacles/{slug}/validation/", name="spectacle_validation")
*
*/
public function action_validation($slug = null)
{
$this->InitController($slug, 'validation');
return $this->redirectToRoute('spectacle_lesdates', ['slug' => $this->data_spectacles['urlClean']]);
}
// }}}
/**
*
* @Route("/spectacles/{slug}/article/signer/idcontent/{idcontent}", name="spectacle_article_signer")
*
**/
public function action_articles_signer($slug, $idcontent = null, AjoutArticleController $ajoutArticle, Request $request)
{
$this->context['params']['idcontent'] = $idcontent;
$this->InitController($slug, 'article');
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'] . '/ajoutdates/', 'entete_connexion' => 'spectacles']);
}
$url_path = 'spectacles';
$ajoutArticle->InitAjoutArticle($this->context, ['path' => $url_path]);
$ajoutArticle->setObject($this->data_spectacles);
// print_r($this->spectacles);
$ajoutArticle->action_signer($request);
$this->context['view']->formulaire_css = true;
$this->contenus_spectacles('class_article', 'ensavoirplus');
$this->asides->load(['textes_menu_educ_edit' => array(
'exec' => array(
'alone' => true,
'color' => 'context'
),
)]);
$this->asides->load('textes_menu_educ_edit_current');
return $this->view('spectacles/article-signer.html.twig', [
'form' => $this->context['form']->createView()
]);
}
/**
*
* @Route("/spectacles/{slug}/article/ecritures", name="spectacle_article_ecritures")
* @Route("/spectacles/{slug}/article/ecritures/idcontent/{idcontent}", name="spectacle_article_ecritures_idcontent")
*
**/
public function action_articles_ecritures($slug, $idcontent = null, AjoutArticleController $ajoutArticle, Request $request)
{
$this->InitController($slug, 'article');
$this->context['params']['idcontent'] = $idcontent;
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'], 'entete_connexion' => 'spectacles']);
}
$url_path = 'spectacles';
$ajoutArticle->InitAjoutArticle($this->context, ['path' => $url_path]);
$ajoutArticle->setObject($this->data_spectacles);
// print_r($this->spectacles);
$ajoutArticle->action_ecriture($request);
$this->context['view']->formulaire_css = true;
$this->contenus_spectacles('class_article', 'ensavoirplus');
$this->asides->load(['textes_menu_educ_edit' => array(
'exec' => array(
'alone' => true,
'color' => 'context'
),
)]);
$this->asides->load('textes_menu_educ_edit_current');
return $this->view('spectacles/article-ecritures.html.twig', [
'form' => $this->context['form']->createView()
]);
}
/**
*
* @Route("/spectacles/{slug}/article/licence", name="spectacle_article_licence")
*
**/
public function action_articles_licence($slug, AjoutArticleController $ajoutArticle, Request $request)
{
return $this->redirect('/');
$this->InitController($slug, 'article');
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'], 'entete_connexion' => 'spectacles']);
}
$url_path = 'spectacles';
$ajoutArticle->InitAjoutArticle($this->context, ['path' => $url_path]);
$ajoutArticle->setObject($this->data_spectacles);
// print_r($this->spectacles);
$ajoutArticle->action_licence($request);
return $this->view('spectacles/article-licence.html.twig', [
'form' => $this->context['form']->createView()
]);
}
/**
*
* @Route("/spectacles/{slug}/article/previsualisation/idcontent/{idcontent}", name="spectacle_article_previsualisation")
*
**/
public function action_article_previsualisation($slug, $idcontent = null, AjoutArticleController $ajoutArticle, Request $request)
{
$this->context['params']['idcontent'] = $idcontent;
$this->InitController($slug, 'article');
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirectToRoute('app_login', ['urifrom' => '/spectacles/' . $this->data_spectacles['urlClean'], 'entete_connexion' => 'spectacles']);
}
$url_path = 'spectacles';
$ajoutArticle->InitAjoutArticle($this->context, ['path' => $url_path]);
$ajoutArticle->setObject($this->data_spectacles);
// print_r($this->spectacles);
$ajoutArticle->action_previsualisation($request);
$this->contenus_spectacles('class_article', 'ensavoirplus');
$this->asides->load(['textes_menu_educ_edit' => array(
'exec' => array(
'alone' => true,
'color' => 'context'
),
)]);
$this->asides->load('textes_menu_educ_edit_current');
return $this->view('spectacles/article-previsualisation.html.twig');
}
// }}}
// {{{ GetListSpectaclesFromSpecificLanguageFromTexts()
/**
* Récupération des textes en scènes dans la langue original ou dans les langues de traductions
*
*/
public function GetListSpectaclesFromSpecificLanguageFromTexts($params = array(), $params_display = ['allauthors' => true, 'carrer_couleurs' => true])
{
$spectacle = $this->em->getRepository(Spectacles::class);
$person = $this->em->getRepository(Persons::class);
if (empty($this->data_spectacles['texts'][0])) {
return null;
}
$this->view->data_text = $this->data_spectacles['texts'][0];
//si nous sommes sur un texte traduit basé sur un texte original
$original = true;
if (isset($this->view->data_text['typetxt'])) {
if ($this->view->data_text['typetxt'] == 'translate') {
$original = false;
}
}
//language_egal
//language_different
if (!empty($this->view->data_text['idtext'])) {
// translation
// adaptation_by_language_spectacle
//si c'est un texte oiginal nous voulons les textes traduits
if ($original) {
if (isset ($this->view->data_text['language_src'])) {
$language_original = $this->view->data_text['language_src'];
}
$this->view->traduc = $person->getTextsPerson($this->idspectacle, 'translation', 'publish', null, $this->view->data_text['idtext']);
foreach ($this->view->traduc as $t) {
$idtexts[] = $t['idtext'];
}
$idtexts_original = array($this->view->data_text['idtext']);
} else {
// $language_original = $this->view->data_text['originaltext']['language_src'];
$language_original = 'fr';
$langue_traduction = $this->view->data_text['language_src'];
$this->view->traduc = array($this->view->data_text['idtext'] => $this->view->data_text);
$idtexts = array($this->view->data_text['idtext']);
$idtexts_original = array($this->view->data_text['idtextoriginal']);
}
}
// parcourir les traductions et trouver les mises en scènes
$params_request = array(
'params' => array(
'order' => ['creation_date', 'DESC'],
'limit' => array(0, 500),
),
'dbg' => array('list_traductions_mise_en_scene', 'Liste des mises en scène à partir des traductions'),
);
if (!empty($params['prochains'])) {
unset($params_request['params']['order']);
$params_request['special']['prochains'] = true;
}
if (!empty($params['limit'])) {
$params_request['params']['limit'] = $params['limit'];
}
if (!empty($params['exclude_idspectacle'])) {
$params_request['special']['exclude_idspectacle'] = $params['exclude_idspectacle'];
}
//Si nous sélections un type de spectacle spécifique
if (!empty($params['idtypespectacle'])) {
$params_request['params']['where'] = 'AND s.idtypespectacle = 4 ';
}
//Si nous sélections un type d'aide
if (!empty($params['aide'])) {
$params_request['special']['aide'] = $params['aide'];
}
if (!empty($params['spectacle_aide'])) {
$params_request['special']['spectacle_aide'] = true;
}
//Si nous voulons une limite aux spectacles
if (!empty($params['limit'])) {
if (!is_array($params['limit'])) {
$params['limit'] = explode(',', $params['limit']);
if (count($params['limit']) == 1) {
array_unshift($params['limit'], 0);
}
}
$params_request['params']['limit'] = $params['limit'];
}
if (!empty($params['traduction'])) {
if (isset($idtexts)) {
$params_request['special']['idtext'] = $idtexts;
} else {
$params_request['special']['idtext'] = $idtexts_original;
}
if ($original) {
$params_request['special']['spectacle']['language_different'] = $language_original;
} else {
$params_request['special']['spectacle']['language_egal'] = $langue_traduction;
}
// print_r($params_request);
// 'language_different' => $language_original
} else {
$params_request['special']['join'] = true;
$params_request['special']['select_by_text_or_adaptation'] = $this->view->data_text['idtext'];
if (isset($language_original)) {
$params_request['special']['spectacle'] = array(
'language_egal' => $language_original
);
}
}
if (!empty($params['count'])) {
$params_request['params']['cout_only'] = true;
return count($spectacle->getListSpectacles($params_request));
} else {
return $spectacle->getListSpectacles($params_request, null, false, $params_display);
}
}
// }}}
// {{{ getDataSpectacles()
/** Les infos sur spectacle
*
*/
public function getDataSpectacles()
{
return $this->data_spectacles;
}
// }}}
// {{{ getLocate()
/** Ou se trouve t'on (getter)
*
*/
public function getLocate()
{
return $this->locate;
}
// }}}
// {{{ getAsidesDocuments()
/** Ou se trouve t'on (getter)
*
*/
public function getAsidesDocuments()
{
$menu_admin = array(
'documents' => array(
'name' => 'Liste de mes documents',
'key' => 'documents'
),
'documents-edit' => array(
'name' => 'Ajouter un document',
'key' => 'documents-edit'
)
);
$this->asides->load(['url_lists_alone' => array(
'php' => array(
'method' => 'asidesUrlLists',
'urls' => $menu_admin,
'url' => '/spectacles/{v_url_clean}/key',
'params' => array(
'activate' => $this->context['action']
)
),
'title' => 'Modifier'
)
]);
}
// }}}
// {{{ getAsideSelections()
public function getAsideSelections()
{
$this->view->type_aides = array(
'prix' => array(
'type_aides' => array(2, 3),
'label' => 'Prix et distinctions',
),
// 'soutiens' => array(
// 'type_aides' => array(1),
// 'label' => 'Aide(s) et soutien(s)',
// ),
'selections' => array(
'type_aides' => array(4),
'label' => 'Sélection(s)',
),
);
$spectacle_aide = $this->em->getRepository(SpectacleAide::class);
foreach ($this->view->type_aides as $k => $v) {
$params_sql_aide = array(
'where' => array(
array('spectacle_aide', 'publish', 1)
),
'idspectacle' => $this->idspectacle,
'special' => array(
'aides' => array(
'type_aides' => $v['type_aides']
)
),
'dbg' => array('spectacle_' . $k, $v['label']),
);
$this->view->type_aides[$k]['aides'] = $spectacle_aide->getListSpectacleAide($params_sql_aide);
if (empty($this->view->type_aides[$k]['aides'])) {
unset($this->view->type_aides[$k]);
}
}
$this->asides->load('common_aside_selections');
}
// }}}
// {{{ getTitlePage()
/** Titre de la page (getter)
*
*/
public function getTitlePage()
{
return $this->title_page;
}
// }}}
// {{{ getStyleMore()
/** Style en plus (getter)
*
*/
public function getStyleMore()
{
return $this->style_more;
}
// }}}
// {{{ getMetaKeywords()
/** Keywords (getter)
*
*/
public function getMetaKeywords()
{
return $this->meta_keywords;
}
// }}}
// {{{ getMetaDescription()
/** Description (getter)
*
*/
public function getMetaDescription()
{
return $this->meta_description;
}
// }}}
// {{{ getMtinfos()
/** Infos mon théâtre
*
*/
public function getMtinfos()
{
return $this->mtinfos;
}
// }}}
// {{{ setOtherDimensions()
/** Taille maxi des vidéos
*
*/
public function setOtherDimensions($other_dimensions)
{
$this->other_dimensions = $other_dimensions;
}
// }}}
// {{{ setParamsComments()
/** Paramètre des commentaires
*
*/
public function setParamsComments($params_comments)
{
$this->params_comments = $params_comments;
}
// }}}
// {{{ isTheduc()
/** texter si le spectacle est de theduc
*
*/
public function isTheduc($idspectacle = null)
{
$sql = 'SELECT COUNT(idspectacle)
FROM spectacle_classification
WHERE idspectacle=' . $this->idspectacle . '
AND idclassification=60';
return $this->spectacles->queryOne($sql);
}
// }}}
// {{{ getDvds()
/** Les dvds et la VOD associées à ce spectacle
*
* @param bool $count_only Compter seulement
* @return array|int
*
*/
public function getDvds($count_only = false, $params = array())
{
$params_sql = array(
'dbg' => array('dvds_spectacle', 'Les dvds associés au spectacle'),
'special' => array(
'dvd' => true,
'idspectacles' => array($this->data_spectacles['idspectacle'])
)
);
if ($count_only) {
$params_sql['count_only'] = true;
$params_sql['limit'] = array('all');
} else {
if (!empty($params['limit'])) {
$params_sql['limit'] = $params['limit'];
} else {
$params_sql['limit'] = array(0, 100);
}
}
$format_vignette = array('vignette_format' => array('width' => 300, 'height' => 300, 'direction' => 'thumb')); // taille de la vignette
return $this->em->getRepository(Dvds::class)->getListDvds($params_sql, $format_vignette);
}
// {{{ getVods()
/** Les VOD associées à ce spectacle
*
* @param bool $count_only Compter seulement
* @return array|int
*
*/
public function getVods()
{
$params_sql = array(
'dbg' => array('dvds_spectacle', 'Les dvds associés au spectacle'),
'special' => array(
'vods' => true,
'idspectacles' => array($this->data_spectacles['idspectacle']),
)
);
$params_sql['limit'] = array(0, 100);
return $this->em->getRepository(Dvds::class)->getListDvds($params_sql);
}
// }}}
// {{{ getAbstract()
/** récupèrer la présentation du spectacle
*
* @return array|int
*
*/
public function getAbstract()
{
// si pas de presentation, recuperer le premier contenu de en savoir plus
$sql = 'SELECT c.title,c.idcontent,c.language,c.deck,c.text,c.display_media
FROM object_content oc, contents c, content_classification cc
WHERE oc.idcontent=c.idcontent
AND cc.idcontent=c.idcontent
AND cc.idclassification=6
AND oc.idobject=\'' . $this->idspectacle . '\'
AND oc.object=\'spectacles\'
ORDER BY c.`range`,c.dateinsert ASC LIMIT 0,1';
$presentations_spectacle = $this->contents->queryAll($sql);
if (!empty($presentations_spectacle)) {
foreach ($presentations_spectacle as $k => $v) {
return array(
'text' => $this->contents->wikiTransform($v['text']),
'title' => $v['title'],
);
}
} else {
return null;
}
}
// }}}
// {{{ countTelechargements()
/** compter les fichiers
*
* @return int
*
*/
public function countTelechargements()
{
return $this->em->getRepository(Files::class)->countObjectFiles(
$this->idspectacle, 'spectacles',
$this->em->getRepository(Classifications::class)->getClassificationList('files', 'spectacles', null, array(1), 'get_value'),
array(
'valid' => 1,
'publish' => 1,
'force_mode' => 'file',
)
);
}
// }}}
public function setAsideDVDVOD($activate = 'videos', $bg_color = "videos")
{
$menu_video_dvd = array();
$menu_video_dvd[] = array(
'name' => 'Vidéos',
'key_type' => 'videos'
);
if ($x = $this->getDvds(true) > 0) {
$menu_video_dvd[] = array(
'name' => 'DVD',
'key_type' => 'dvd'
);
}
//aside
$this->asides->load(['url_lists_alone' => array(
'exec' => array(
'color' => $bg_color,
),
'php' => array(
'method' => 'asidesUrlLists',
'urls' => $menu_video_dvd,
'url' => '/spectacles/{v_url_clean}/key_type',
'params' => array(
'activate' => $activate
)
),
'title' => 'Voir'
)]);
$this->asides->load(['common_participer_spectacles' => array(
'exec' => ['color' => $bg_color]
)]);
}
// {{{ getBuildMenu()
public function getBuildMenu($params = [])
{
$this->buildMenu($params);
}
// }}}
}