src/Controller/ArticlesController.php line 290

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\TheatreController;
  4. use App\Service\Date_time;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  8. use TheatreCore\Entity\Contents;
  9. use TheatreCore\Entity\Extranetusers;
  10. use TheatreCore\Entity\Multimedias;
  11. class ArticlesController extends TheatreController
  12. {
  13.     // objet contents
  14.     public $contents;
  15.     // les articles
  16.     public $articles = array();
  17.     // le détail d'un article
  18.     public $detailarticle;
  19.     // id du contenu associé demandé
  20.     public $idcontent null;
  21.     // taille maxi des vidéos
  22.     public $other_dimensions = array();
  23.     // taille image dans le contenu
  24.     public $other_img_size = array('thumb_size' => 150'direction' => 'thumb');
  25.     // grouper par classification
  26.     public $group_by_classification false;
  27.     // articles publiés uniquement
  28.     public $publish_status 1;
  29.     // {{{ _construct()
  30.     /** constructeur hérité
  31.      *
  32.      */
  33.     public function __construct(EntityManagerInterface $emTokenStorageInterface $tokenStorage, array $context = [])
  34.     {
  35.         // surbrillance du menu principal (thnet)
  36.         $GLOBALS['rub_courante'] = 'spectacles';
  37. //        parent::__construct($translator, $tokenStorage);
  38.         $this->context $context;
  39.         $this->em $em;
  40.         // instancier un objet contents
  41.         $this->contents $em->getRepository(Contents::class);
  42.         // publie ou pas
  43.         if(!empty($params['publish_status'])) {
  44.             $this->publish_status $params['publish_status'];
  45.         }
  46.         // préciser à la classe = contenu publié
  47.         $this->contents->setPublishStatus($this->publish_status);
  48.         // idcontent
  49.         if(array_key_exists('idcontent'$this->context['params'])) {
  50.             $this->idcontent $this->context['params']['idcontent'];
  51.         }
  52.     }
  53.     // }}}
  54.     // {{{ exec()
  55.     /** Récupère les articles et l'article
  56.      *
  57.      */
  58.     public function execQuery($sql)
  59.     {
  60.         $articles $this->contents->queryAll($sql);
  61.         if (is_null($articles)) {
  62.             // débogage
  63.             //error_log($_SERVER['REQUEST_URI']."\n".$articles->getDebugInfo());
  64.             $articles = array();
  65.         }
  66.         // nombre d'articles si + de 1
  67.         $count_articles count($articles);
  68.         if($count_articles>1) {
  69.             $this->context['view']->morearticle $count_articles;
  70.         }
  71.         // recuperer chaque fichier associe a chaque ensavoirplus
  72.         foreach($articles as $key=>$value) {
  73.             // voir si c'est l'article en cours
  74.             if($value['idcontent']==$this->idcontent) {
  75.                 $articles[$key]['active'] = 'active';
  76.             } else {
  77.                 $articles[$key]['active'] = 'noactive';
  78.             }
  79.             // la date de parution
  80.             if(!empty($value['date_article']) && $value['date_article']!='0000-00-00') {
  81.                 $articles[$key]['date_article'] = $this->contents->getFormeDate($value['date_article'],"%A %d %B %Y",true);
  82.             }
  83.             // date d'insertion
  84.             if(!empty($value['dateinsert'])) {
  85.                 $articles[$key]['dateinsert'] = $this->contents->getFormeDate($value['dateinsert'],"%A %d %B %Y",true);
  86.             }
  87.             // voir si c'est de la video et Titre plus court pour l'icone media
  88.             if($value['display_media']==1) {
  89.                 $articles[$key]['media'] = ' media';
  90.                 $articles[$key]['titre_court'] = $this->contents->cutSentence($articles[$key]['title'], 30);
  91.             } else {
  92.                 // faire un titre court
  93.                 $articles[$key]['titre_court'] = $this->contents->cutSentence($articles[$key]['title'], 35);
  94.             }
  95.             // selectionne aussi la/les classification(s)
  96.             $classifications_list $this->contents->getClassifications($value['idcontent']);
  97.             if(!empty($classifications_list)) {
  98.                 $articles[$key]['classifications'] = $classifications_list;
  99.                 $articles[$key]['classification_code'] = $articles[$key]['classification'];
  100.                 $articles[$key]['classification'] = $GLOBALS['tr']->trans($articles[$key]['classification']);
  101.             }
  102.             // recuperer les fichiers associes a ce contenu
  103.             $datafile $this->em->getRepository(Contents::class)->getAssociateFileContent($value['idcontent']);
  104.             if(!empty($datafile)) {
  105.                 foreach($datafile as $k=>$v) {
  106.                     if(!empty($v['is_image']))  {
  107.                         $articles[$key]['vignette'] = $this->contents->getThumbnail($v['file'], 350'thumb');
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.         // init
  113.         $articles_by_cl = array();
  114.         $articles_by_lng = array();
  115.         // il faut grouper par classification !
  116.         // trier le tableau par classification
  117.         foreach($articles as $key=>$value) {
  118.             $idcontents[] = $value['idcontent'];
  119.             $cl $value['classification'];
  120.             $menu_custom false;
  121.             //On prends en compte les classifications supplémentaires sur l'article contenant un "idgroupclassification" à 100
  122.             foreach($value['classifications'] AS $kc => $vc){
  123.                 //On applique cette classification au valeur du tableau
  124.                 if($vc['idgroupclassification'] == 100){
  125.                     $cl $vc['classification'];
  126.                     $menu_custom true;
  127.                     break;
  128.                 }
  129.             }
  130. //            $cl = $value['classification'];
  131.             $articles_by_cl[$cl]['classification'] = $cl;
  132.             $articles_by_cl[$cl]['menu_custom'] = $menu_custom;
  133.             $articles_by_cl[$cl]['multiples_menu'] = true;
  134.             $articles_by_cl[$cl]['classification_string'] = $this->context['tr']->trans($cl);
  135.             $articles_by_cl[$cl]['articles'][$key] = $value;
  136.         }
  137.         // compter le nombre de classification
  138.         $nb_cl count($articles_by_cl);
  139.         // trier le tableau des classifications par langue
  140.         foreach($articles_by_cl as $c=>$class_tab) {
  141.             $articles_by_lng = array();
  142.             foreach($class_tab['articles'] as $key=>$value) {
  143.                 $lg $value['language'];
  144.                 $articles_by_lng[$lg]['term'] = $this->contents->getNameLanguage($lg);
  145.                 // le bloc d'articles est dans la langue courante
  146.                 if($lg==$this->context['lng']) {
  147.                     $articles_by_lng[$lg]['current_lng'] = true;
  148.                 }
  149.                 foreach($class_tab['articles'] as $k=>$v) {
  150.                     $lg_art $v['language'];
  151.                     if($lg_art==$lg) {
  152.                         // si le contenu est different de la langue courante
  153.                         if($lg_art!=$this->context['lng']) {
  154.                             $articles_by_lng[$lg]['content'][$k]['ol'] = true;
  155.                         } else {
  156.                             $articles_by_lng[$lg]['content'][$k]['current_lng'] = true;
  157.                         }
  158.                         $articles_by_lng[$lg]['content'][$k] = $v;
  159.                     }
  160.                 }
  161.                 // parcourir pour grouper
  162.                 foreach($articles_by_lng[$lg]['content'] as $kb=>$vb) {
  163.                     // le nom du groupe
  164.                     if(!empty($vb['group_classification'])) {
  165.                         $articles_by_lng[$lg]['group'][$vb['group_idclassification']]['classification'] = $this->context['tr']->trans($vb['group_classification']);
  166.                     }
  167.                     $articles_by_lng[$lg]['group'][$vb['group_idclassification']]['content'][$kb] = $vb;
  168.                 }
  169.             }
  170.             uksort($articles_by_lng, array($this,'compare_lng'));
  171.             $articles_by_cl[$c]['articles_by_lng'] = $articles_by_lng;
  172.             unset($articles_by_cl[$c]['articles']);
  173.         }
  174.         // il y a ici un tableau groupé
  175.         $articles $articles_by_cl;
  176.         // si premier affichage prendre le premier article de la liste
  177.         // et si possible dans la langue d'interface
  178.         if(!empty($articles)) {
  179.             foreach($articles as $c=>$class_tab) {
  180.                 foreach($class_tab['articles_by_lng'] as $k => $v) {
  181.                     foreach($v['content'] as $key=>$value) {
  182.                         // marquage du premier element pour les liens
  183.                         if(empty($article_first)) {
  184.                             $articles[$c]['articles_by_lng'][$k]['content'][$key]['first'] = true;
  185.                             $article_first true;
  186.                         }
  187.                         // pas d'idcontent ? on utilise le premier venu
  188.                         if (empty($this->idcontent)) {
  189.                             $this->idcontent $value['idcontent'];
  190.                             // c'est l'article en cours
  191.                             $articles[$c]['articles_by_lng'][$k]['content'][$key]['active'] = 'active';
  192.                             if(!empty($articles[$c]['articles_by_lng'][$k]['group'])){
  193.                                 foreach($articles[$c]['articles_by_lng'][$k]['group'] AS $kgroup => $vgroup) {
  194.                                     if (!empty($vgroup['content'][$key])) {
  195.                                         $articles[$c]['articles_by_lng'][$k]['group'][$kgroup]['content'][$key]['active'] = 'active';
  196.                                         break;
  197.                                     }
  198.                                 }
  199.                             }
  200.                         }
  201.                         // si l'article est l'article en court, marquer la langue correspondante
  202.                         if(empty($articles[$c]['articles_by_lng'][$k]['current_content_lng'])
  203.                             || $articles[$c]['articles_by_lng'][$k]['current_content_lng'] == 'hidden'
  204.                         ) {
  205.                             if($articles[$c]['articles_by_lng'][$k]['content'][$key]['active'] == 'active') {
  206.                                 $articles[$c]['articles_by_lng'][$k]['current_content_lng'] = 'sactive';
  207.                             } else {
  208.                                 $articles[$c]['articles_by_lng'][$k]['current_content_lng'] = 'hidden';
  209.                             }
  210.                         }
  211.                         //break;
  212.                     }
  213.                     //break;
  214.                 }
  215.             }
  216.         }
  217.         // trouver les classifications définie dans object_content pour créer des sous groupe de menu
  218.         /*print_r($idcontents);
  219.         $sql_groupement = 'SELECT * FROM object_content WHERE idcontent IN ('.join(',', $idcontents).')';
  220.         $groupements = $this->contents->queryAll($sql_groupement);
  221.         print_r($groupements);
  222.         exit;*/
  223.         // si classification unique, faire un tableau simple
  224.         if($nb_cl==&& $this->group_by_classification==false) {
  225.             for($i=0;$i<1;$i++) {
  226.                 $articles current($articles);
  227.                 $articles $articles['articles_by_lng'];
  228.             }
  229.         } else {
  230.             $this->context['view']->moreclassifications $nb_cl;
  231.         }
  232.         // liste des articles
  233.         $this->articles $articles;
  234.         //////////////////////////////////////////////////////////////////////////////////////
  235.         // detail d'un article
  236.         //////////////////////////////////////////////////////////////////////////////////////
  237.         // selection des contents avec la classification "class_article"
  238.         $this->contents->setCheckLanguage(false);
  239.         $detailarticle $this->contents->getInfosContent($this->idcontent);
  240.         //direction du texte en arabe
  241.         if(!empty($detailarticle['language']) && $detailarticle['language']=='ar') {
  242.             $this->context['view']->txtdir 'rtl';
  243.         } else {
  244.             $this->context['view']->txtdir 'ltr';
  245.         }
  246.         if(empty($detailarticle)) {
  247.             return null;
  248.         }
  249.         // reformater les dates
  250.         if(isset($detailarticle['date']) && $detailarticle['date']=='0000-00-00 00:00:00') {
  251.             $detailarticle['date'] = null;
  252.         }
  253.         if(!empty($detailarticle['date'])) {
  254.             $detailarticle['date'] = Date_time::ymdDate($detailarticle['date'],$this->context['lng']);
  255.         }
  256.         // voir si même langue que interface
  257.         if($detailarticle['language']!=$this->context['lng']) {
  258.             $detailarticle['ol'] = $this->contents->getNameLanguage($detailarticle['language']);
  259.         }
  260.         // recuperer les fichiers associes a ce contenu
  261.         $datafile $this->contents->getAssociateFileContent($detailarticle['idcontent']);
  262.         if(!empty($datafile)) {
  263.             foreach($datafile as $key=>$value) {
  264.                 if(!empty($value['is_image']))  {
  265.                     // vignette
  266.                     $datafile[$key]['vignette'] = $this->contents->getThumbnail($datafile[$key]['file'], $this->other_img_size['thumb_size'], $this->other_img_size['direction']);
  267.                     // image de taille moyenne et grande
  268.                     $datafile[$key]['vignette_grd'] = $this->contents->getThumbnail($datafile[$key]['file'],600,'thumb');
  269.                     $datafile[$key]['vignette_moy'] = $this->contents->getThumbnail($datafile[$key]['file'],270,'thumb');
  270.                 }
  271.             }
  272.             $detailarticle['files'] = $datafile;
  273.         }
  274.         if ($detailarticle['display_media']==1) {
  275.             // voir si il y a une video dans le contenu
  276.             $multimedias $this->em->getRepository(Multimedias::class);
  277.             // l'afficher dans une autre dimension
  278.             if (!empty($this->other_dimensions)) {
  279.                 $multimedias->setDimensions($this->other_dimensions);
  280.             }
  281.             // parmètres des statistiques de la vidéo intégrées
  282.             $multimedias->setStatsParameters();
  283.             $datamedia $multimedias->getMultimediaContent($detailarticle['idcontent'],'contents',array('share' => true));
  284.             if(!empty($datamedia)) {
  285.                 $detailarticle['media'] = $datamedia;
  286.             }
  287.         }
  288.         // convertir les champs wiki
  289.         foreach(array('deck','text') as $v) {
  290.             if (empty($detailarticle[$v])) continue;
  291.             $detailarticle[$v] = $this->contents->wikiTransform($detailarticle[$v], $detailarticle['markdown']);
  292.         }
  293.         // si l'idextranetuser est celui connecté on le note
  294.         if(!empty($detailarticle['login']) && ($this->context['session'] instanceof Extranetusers && $detailarticle['login'] == $this->context['session']->getIdExtranetuser())) {
  295.             $detailarticle['is_extranetuser'] = true;
  296.         }
  297.         // si le groupe est l'insensé
  298.         if(!empty($detailarticle['writer_group_url']) && strpos($detailarticle['writer_group_url'],'insense-scenes.net')!==false) {
  299.             $detailarticle['image_groupe'] = '/images/bannieres/insense.png';
  300.         }
  301.         // source du document
  302.         if(!empty($detailarticle['source_link']) || !empty($detailarticle['source_description'])) {
  303.             $detailarticle['source'] = true;
  304.             $detailarticle['source_link_short'] = substr($detailarticle['source_link'], 050).'...';
  305.         }
  306.         // URL canonique
  307.         if(!empty($detailarticle['canonical_url'])) {
  308.             $this->context['view']->link_more[] = array(
  309.                 'type' => 'canonical',
  310.                 'href' => $detailarticle['canonical_url'],
  311.             );
  312.         }
  313.         // detail de l'article
  314.         $this->detailarticle $detailarticle;
  315.     }
  316.     // }}}
  317.     // {{{ compare_lng()
  318.     /** callback pour le tri par langue des articles
  319.      *
  320.      *
  321.      * @param  mixed $a
  322.      * @param  mixed $b
  323.      * @access protected
  324.      * @return boolean
  325.      */
  326.     protected function compare_lng($a,$b) { return ($b==$this->context['lng']); }
  327.     // }}}
  328.     // {{{ getArticles()
  329.     /** Liste des articles
  330.      *
  331.      */
  332.     public function getArticles() { return $this->articles; }
  333.     // }}}
  334.     // {{{ getDetailArticle()
  335.     /** Detail de l'article en cours
  336.      *
  337.      */
  338.     public function getDetailarticle() { return $this->detailarticle; }
  339.     // }}}
  340.     // {{{ setOtherDimensions()
  341.     /** Taille maxi des vidéos
  342.      *
  343.      */
  344.     public function setOtherDimensions($other_dimensions) { $this->other_dimensions $other_dimensions; }
  345.     // }}}
  346.     // {{{ setImgSize()
  347.     /** Taille des images
  348.      *
  349.      */
  350.     public function setImageSize($other_img_size) { $this->other_img_size $other_img_size; }
  351.     // }}}
  352.     // {{{ setPublishStatus()
  353.     /** Précise si on veux les articles publiés, pas publiés ou tous
  354.      *
  355.      * Par défaut : uniquement les publiés
  356.      *
  357.      */
  358.     public function setPublishStatus($publish_status=1) { $this->publish_status $publish_status; }
  359.     // }}}
  360.     /** Précise si on ignore le groupement par classification s'il n'y a qu'une seule classification block d'article
  361.      *
  362.      * Par défaut : on ignore par défault
  363.      *
  364.      */
  365.     public function setGroupByClassification($group_by_classification=1) { $this->group_by_classification $group_by_classification; }
  366.     // }}}
  367. }