<?php
namespace App\Controller;
use App\ClassTheatre\TheatreController;
use App\Service\Date_time;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use TheatreCore\Entity\Contents;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Multimedias;
class ArticlesController extends TheatreController
{
// objet contents
public $contents;
// les articles
public $articles = array();
// le détail d'un article
public $detailarticle;
// id du contenu associé demandé
public $idcontent = null;
// taille maxi des vidéos
public $other_dimensions = array();
// taille image dans le contenu
public $other_img_size = array('thumb_size' => 150, 'direction' => 'thumb');
// grouper par classification
public $group_by_classification = false;
// articles publiés uniquement
public $publish_status = 1;
// {{{ _construct()
/** constructeur hérité
*
*/
public function __construct(EntityManagerInterface $em, TokenStorageInterface $tokenStorage, array $context = [])
{
// surbrillance du menu principal (thnet)
$GLOBALS['rub_courante'] = 'spectacles';
// parent::__construct($translator, $tokenStorage);
$this->context = $context;
$this->em = $em;
// instancier un objet contents
$this->contents = $em->getRepository(Contents::class);
// publie ou pas
if(!empty($params['publish_status'])) {
$this->publish_status = $params['publish_status'];
}
// préciser à la classe = contenu publié
$this->contents->setPublishStatus($this->publish_status);
// idcontent
if(array_key_exists('idcontent', $this->context['params'])) {
$this->idcontent = $this->context['params']['idcontent'];
}
}
// }}}
// {{{ exec()
/** Récupère les articles et l'article
*
*/
public function execQuery($sql)
{
$articles = $this->contents->queryAll($sql);
if (is_null($articles)) {
// débogage
//error_log($_SERVER['REQUEST_URI']."\n".$articles->getDebugInfo());
$articles = array();
}
// nombre d'articles si + de 1
$count_articles = count($articles);
if($count_articles>1) {
$this->context['view']->morearticle = $count_articles;
}
// recuperer chaque fichier associe a chaque ensavoirplus
foreach($articles as $key=>$value) {
// voir si c'est l'article en cours
if($value['idcontent']==$this->idcontent) {
$articles[$key]['active'] = 'active';
} else {
$articles[$key]['active'] = 'noactive';
}
// la date de parution
if(!empty($value['date_article']) && $value['date_article']!='0000-00-00') {
$articles[$key]['date_article'] = $this->contents->getFormeDate($value['date_article'],"%A %d %B %Y",true);
}
// date d'insertion
if(!empty($value['dateinsert'])) {
$articles[$key]['dateinsert'] = $this->contents->getFormeDate($value['dateinsert'],"%A %d %B %Y",true);
}
// voir si c'est de la video et Titre plus court pour l'icone media
if($value['display_media']==1) {
$articles[$key]['media'] = ' media';
$articles[$key]['titre_court'] = $this->contents->cutSentence($articles[$key]['title'], 30);
} else {
// faire un titre court
$articles[$key]['titre_court'] = $this->contents->cutSentence($articles[$key]['title'], 35);
}
// selectionne aussi la/les classification(s)
$classifications_list = $this->contents->getClassifications($value['idcontent']);
if(!empty($classifications_list)) {
$articles[$key]['classifications'] = $classifications_list;
$articles[$key]['classification_code'] = $articles[$key]['classification'];
$articles[$key]['classification'] = $GLOBALS['tr']->trans($articles[$key]['classification']);
}
// recuperer les fichiers associes a ce contenu
$datafile = $this->em->getRepository(Contents::class)->getAssociateFileContent($value['idcontent']);
if(!empty($datafile)) {
foreach($datafile as $k=>$v) {
if(!empty($v['is_image'])) {
$articles[$key]['vignette'] = $this->contents->getThumbnail($v['file'], 350, 'thumb');
}
}
}
}
// init
$articles_by_cl = array();
$articles_by_lng = array();
// il faut grouper par classification !
// trier le tableau par classification
foreach($articles as $key=>$value) {
$idcontents[] = $value['idcontent'];
$cl = $value['classification'];
$menu_custom = false;
//On prends en compte les classifications supplémentaires sur l'article contenant un "idgroupclassification" à 100
foreach($value['classifications'] AS $kc => $vc){
//On applique cette classification au valeur du tableau
if($vc['idgroupclassification'] == 100){
$cl = $vc['classification'];
$menu_custom = true;
break;
}
}
// $cl = $value['classification'];
$articles_by_cl[$cl]['classification'] = $cl;
$articles_by_cl[$cl]['menu_custom'] = $menu_custom;
$articles_by_cl[$cl]['multiples_menu'] = true;
$articles_by_cl[$cl]['classification_string'] = $this->context['tr']->trans($cl);
$articles_by_cl[$cl]['articles'][$key] = $value;
}
// compter le nombre de classification
$nb_cl = count($articles_by_cl);
// trier le tableau des classifications par langue
foreach($articles_by_cl as $c=>$class_tab) {
$articles_by_lng = array();
foreach($class_tab['articles'] as $key=>$value) {
$lg = $value['language'];
$articles_by_lng[$lg]['term'] = $this->contents->getNameLanguage($lg);
// le bloc d'articles est dans la langue courante
if($lg==$this->context['lng']) {
$articles_by_lng[$lg]['current_lng'] = true;
}
foreach($class_tab['articles'] as $k=>$v) {
$lg_art = $v['language'];
if($lg_art==$lg) {
// si le contenu est different de la langue courante
if($lg_art!=$this->context['lng']) {
$articles_by_lng[$lg]['content'][$k]['ol'] = true;
} else {
$articles_by_lng[$lg]['content'][$k]['current_lng'] = true;
}
$articles_by_lng[$lg]['content'][$k] = $v;
}
}
// parcourir pour grouper
foreach($articles_by_lng[$lg]['content'] as $kb=>$vb) {
// le nom du groupe
if(!empty($vb['group_classification'])) {
$articles_by_lng[$lg]['group'][$vb['group_idclassification']]['classification'] = $this->context['tr']->trans($vb['group_classification']);
}
$articles_by_lng[$lg]['group'][$vb['group_idclassification']]['content'][$kb] = $vb;
}
}
uksort($articles_by_lng, array($this,'compare_lng'));
$articles_by_cl[$c]['articles_by_lng'] = $articles_by_lng;
unset($articles_by_cl[$c]['articles']);
}
// il y a ici un tableau groupé
$articles = $articles_by_cl;
// si premier affichage prendre le premier article de la liste
// et si possible dans la langue d'interface
if(!empty($articles)) {
foreach($articles as $c=>$class_tab) {
foreach($class_tab['articles_by_lng'] as $k => $v) {
foreach($v['content'] as $key=>$value) {
// marquage du premier element pour les liens
if(empty($article_first)) {
$articles[$c]['articles_by_lng'][$k]['content'][$key]['first'] = true;
$article_first = true;
}
// pas d'idcontent ? on utilise le premier venu
if (empty($this->idcontent)) {
$this->idcontent = $value['idcontent'];
// c'est l'article en cours
$articles[$c]['articles_by_lng'][$k]['content'][$key]['active'] = 'active';
if(!empty($articles[$c]['articles_by_lng'][$k]['group'])){
foreach($articles[$c]['articles_by_lng'][$k]['group'] AS $kgroup => $vgroup) {
if (!empty($vgroup['content'][$key])) {
$articles[$c]['articles_by_lng'][$k]['group'][$kgroup]['content'][$key]['active'] = 'active';
break;
}
}
}
}
// si l'article est l'article en court, marquer la langue correspondante
if(empty($articles[$c]['articles_by_lng'][$k]['current_content_lng'])
|| $articles[$c]['articles_by_lng'][$k]['current_content_lng'] == 'hidden'
) {
if($articles[$c]['articles_by_lng'][$k]['content'][$key]['active'] == 'active') {
$articles[$c]['articles_by_lng'][$k]['current_content_lng'] = 'sactive';
} else {
$articles[$c]['articles_by_lng'][$k]['current_content_lng'] = 'hidden';
}
}
//break;
}
//break;
}
}
}
// trouver les classifications définie dans object_content pour créer des sous groupe de menu
/*print_r($idcontents);
$sql_groupement = 'SELECT * FROM object_content WHERE idcontent IN ('.join(',', $idcontents).')';
$groupements = $this->contents->queryAll($sql_groupement);
print_r($groupements);
exit;*/
// si classification unique, faire un tableau simple
if($nb_cl==1 && $this->group_by_classification==false) {
for($i=0;$i<1;$i++) {
$articles = current($articles);
$articles = $articles['articles_by_lng'];
}
} else {
$this->context['view']->moreclassifications = $nb_cl;
}
// liste des articles
$this->articles = $articles;
//////////////////////////////////////////////////////////////////////////////////////
// detail d'un article
//////////////////////////////////////////////////////////////////////////////////////
// selection des contents avec la classification "class_article"
$this->contents->setCheckLanguage(false);
$detailarticle = $this->contents->getInfosContent($this->idcontent);
//direction du texte en arabe
if(!empty($detailarticle['language']) && $detailarticle['language']=='ar') {
$this->context['view']->txtdir = 'rtl';
} else {
$this->context['view']->txtdir = 'ltr';
}
if(empty($detailarticle)) {
return null;
}
// reformater les dates
if(isset($detailarticle['date']) && $detailarticle['date']=='0000-00-00 00:00:00') {
$detailarticle['date'] = null;
}
if(!empty($detailarticle['date'])) {
$detailarticle['date'] = Date_time::ymdDate($detailarticle['date'],$this->context['lng']);
}
// voir si même langue que interface
if($detailarticle['language']!=$this->context['lng']) {
$detailarticle['ol'] = $this->contents->getNameLanguage($detailarticle['language']);
}
// recuperer les fichiers associes a ce contenu
$datafile = $this->contents->getAssociateFileContent($detailarticle['idcontent']);
if(!empty($datafile)) {
foreach($datafile as $key=>$value) {
if(!empty($value['is_image'])) {
// vignette
$datafile[$key]['vignette'] = $this->contents->getThumbnail($datafile[$key]['file'], $this->other_img_size['thumb_size'], $this->other_img_size['direction']);
// image de taille moyenne et grande
$datafile[$key]['vignette_grd'] = $this->contents->getThumbnail($datafile[$key]['file'],600,'thumb');
$datafile[$key]['vignette_moy'] = $this->contents->getThumbnail($datafile[$key]['file'],270,'thumb');
}
}
$detailarticle['files'] = $datafile;
}
if ($detailarticle['display_media']==1) {
// voir si il y a une video dans le contenu
$multimedias = $this->em->getRepository(Multimedias::class);
// l'afficher dans une autre dimension
if (!empty($this->other_dimensions)) {
$multimedias->setDimensions($this->other_dimensions);
}
// parmètres des statistiques de la vidéo intégrées
$multimedias->setStatsParameters();
$datamedia = $multimedias->getMultimediaContent($detailarticle['idcontent'],'contents',array('share' => true));
if(!empty($datamedia)) {
$detailarticle['media'] = $datamedia;
}
}
// convertir les champs wiki
foreach(array('deck','text') as $v) {
if (empty($detailarticle[$v])) continue;
$detailarticle[$v] = $this->contents->wikiTransform($detailarticle[$v], $detailarticle['markdown']);
}
// si l'idextranetuser est celui connecté on le note
if(!empty($detailarticle['login']) && ($this->context['session'] instanceof Extranetusers && $detailarticle['login'] == $this->context['session']->getIdExtranetuser())) {
$detailarticle['is_extranetuser'] = true;
}
// si le groupe est l'insensé
if(!empty($detailarticle['writer_group_url']) && strpos($detailarticle['writer_group_url'],'insense-scenes.net')!==false) {
$detailarticle['image_groupe'] = '/images/bannieres/insense.png';
}
// source du document
if(!empty($detailarticle['source_link']) || !empty($detailarticle['source_description'])) {
$detailarticle['source'] = true;
$detailarticle['source_link_short'] = substr($detailarticle['source_link'], 0, 50).'...';
}
// URL canonique
if(!empty($detailarticle['canonical_url'])) {
$this->context['view']->link_more[] = array(
'type' => 'canonical',
'href' => $detailarticle['canonical_url'],
);
}
// detail de l'article
$this->detailarticle = $detailarticle;
}
// }}}
// {{{ compare_lng()
/** callback pour le tri par langue des articles
*
*
* @param mixed $a
* @param mixed $b
* @access protected
* @return boolean
*/
protected function compare_lng($a,$b) { return ($b==$this->context['lng']); }
// }}}
// {{{ getArticles()
/** Liste des articles
*
*/
public function getArticles() { return $this->articles; }
// }}}
// {{{ getDetailArticle()
/** Detail de l'article en cours
*
*/
public function getDetailarticle() { return $this->detailarticle; }
// }}}
// {{{ setOtherDimensions()
/** Taille maxi des vidéos
*
*/
public function setOtherDimensions($other_dimensions) { $this->other_dimensions = $other_dimensions; }
// }}}
// {{{ setImgSize()
/** Taille des images
*
*/
public function setImageSize($other_img_size) { $this->other_img_size = $other_img_size; }
// }}}
// {{{ setPublishStatus()
/** Précise si on veux les articles publiés, pas publiés ou tous
*
* Par défaut : uniquement les publiés
*
*/
public function setPublishStatus($publish_status=1) { $this->publish_status = $publish_status; }
// }}}
/** Précise si on ignore le groupement par classification s'il n'y a qu'une seule classification block d'article
*
* Par défaut : on ignore par défault
*
*/
public function setGroupByClassification($group_by_classification=1) { $this->group_by_classification = $group_by_classification; }
// }}}
}