Fonction lastComList : Ajouter #com_art_title (Titre de l'article)

SuricatSuricat Member
mai 2014 modifié dans Discussions générales
Bonjour,

C'est utile de connaître le titre de l'article sur lequel un commentaire est déposé.
On peut par exemple vouloir afficher le titre de l'article auquel un commentaire fait référence, au-dessus du commentaire, ou en tooltip (balise title).

On voit aussi souvent l'équivalent de :
[== Indéfini ==]
<li>#com_author sur <a href="#com_url">#com_art_title</a>
     <p>#com_content(50)</p>
</li>

Après, je comprend que ça diminuerai un petit peu la vitesse d'affichage d'aller chercher le titre de l'article pour les derniers commentaires.

Peut-être est-il judicieux de dupliquer le titre de l'article dans les fichiers xml des commentaires. Cela allongerait seulement le temps d'exécution lors d'un changement de titre sur un ancien article (pour mettre à jour les fichiers xml des commentaires associés), ce qui n'est pas fréquent...

Réponses

  • Jerry WhamJerry Wham Member
    mai 2014 modifié
    Et si tu faisais plutôt :
    $title = $plxShow->plxMotor->plxRecord_arts->f('title');
    <li>#com_author sur <a href="#com_url">'.$title.'</a>
         <p>#com_content(50)</p>
    </li>
    
  • SuricatSuricat Member
    Merci, mais comment intégrer ça dans l'appel à lastComList() ?
    [== Indéfini ==]
    <?php $plxShow->lastComList('<li>#com_author sur <a href="#com_url">#com_art_title</a><p>#com_content(50)</p></li>') ?>
    
  • <?php 
    $format = '<li>#com_author sur <a href="#com_url">'.$plxShow->plxMotor->plxRecord_arts->f('title').'</a><p>#com_content(50)</p></li>';
    $plxShow->lastComList($format);
     ?>
    
    Ça devrait le faire...
  • SuricatSuricat Member
    Merci Jerry !

    Je testerai ça dès que possible.
    Par contre, reste le problème des performances. Aller chercher le titre des articles correspondant à chacun des derniers commentaires, un par un, ce n'est pas très performant.
    Faire de la dénormalisation en dupliquant le titre de l'article dans le fichier des commentaires peut être justifié dans un logiciel sans base de données comme PluXml, non ?
  • Non, tu ne le fais qu'une fois, grâce à la variable $format. Il ne faut pas inclure la recherche dans une boucle.
  • SuricatSuricat Member
    mai 2014 modifié
    Merci Jerry, ça fonctionne bien.

    Mais je maintiens que ce n'est pas très performant. La boucle est dans la fonction lastComList().
    Je pense finalement avoir trouvé la solution :
    Modifier la fonction lastComList en ajoutant "#com_art_title".
    La plupart des derniers commentaires étant souvent faits sur le dernier article publié, le mieux est alors de stocker temporairement dans un tableau d'association les titres d'articles récupérés dans la boucle. Si les trois derniers commentaires sont faits sur le même article, alors on aura eu à chercher une seule fois le titre de l'article en question...

    Je proposerai une modification de la fonction lastComList prochainement.
  • SuricatSuricat Member
    En fait le code que tu m'as donné Jerry, affiche le titre du dernier article, pas celui des articles pour chaque commentaire.

    Voici le code que je propose pour la fonction lastComList(), et qui fonctionne très bien :


    /**
    * Méthode qui affiche la liste des $max derniers commentaires.
    * Si la variable $art_id est renseignée, seulement les commentaires de cet article seront retournés.
    *
    * @param format format du texte pour chaque commentaire (variable: #com_id, #com_url, #com_author, #com_content(num), #com_content, #com_date, #com_hour, #com_art_title)
    * @param max nombre de commentaires maximum
    * @param art_id id de l'article cible (24,3)
    * @param cat_ids liste des categories pour filtrer les derniers commentaires (sous la forme 001|002)
    * @return stdout
    * @scope global
    * @author Florent MONTHEL, Stephane F
    **/
    public function lastComList($format='<li><a href="#com_url">#com_author L_SAID :</a><br/>#com_content(50)</li>',$max=5,$art_id='',$cat_ids='') {

    # Hook Plugins
    if(eval($this->plxMotor->plxPlugins->callHook('plxShowLastComList'))) return;

    # Génération de notre motif
    if(empty($art_id))
    $motif = '/^[0-9]{4}.[0-9]{10}-[0-9]+.xml$/';
    else
    $motif = '/^'.str_pad($art_id,4,'0',STR_PAD_LEFT).'.[0-9]{10}-[0-9]+.xml$/';

    $count=1;
    $datetime=date('YmdHi');
    # Nouvel objet plxGlob et récupération des fichiers
    $plxGlob_coms = clone $this->plxMotor->plxGlob_coms;
    if($aFiles = $plxGlob_coms->query($motif,'com','rsort',0,false,'before')) {
    # Tableau d'association ArtId => ArtTitle (utile si #com_art_title est demandé)
    $OArtIdTitle = array();

    # On parcourt les fichiers des commentaires
    foreach($aFiles as $v) {
    # On filtre si le commentaire appartient à un article d'une catégorie inactive
    if(isset($this->plxMotor->activeArts[substr($v,0,4)])) {
    $com = $this->plxMotor->parseCommentaire(PLX_ROOT.$this->plxMotor->aConf.$v);
    $artInfo = $this->plxMotor->artInfoFromFilename($this->plxMotor->plxGlob_arts->aFiles[$com]);
    if($artInfo<=$datetime) { # on ne prends que les commentaires pour les articles publiés
    if(empty($cat_ids) OR preg_match('/('.$cat_ids.')/', $artInfo)) {
    $url = '?article'.intval($com).'/'.$artInfo.'#c'.$com;
    $date = $com;
    $content = strip_tags($com);
    # On modifie nos motifs
    $row = str_replace('L_SAID', L_SAID, $format);
    $row = str_replace('#com_id',$com,$row);
    $row = str_replace('#com_url',$this->plxMotor->urlRewrite($url),$row);
    $row = str_replace('#com_author',$com,$row);
    # Si #com_art_title est demandé
    if(strpos($format, '#com_art_title')!=FALSE) {
    $artId = $artInfo;
    $artTitle;
    # Si le titre de l'article est déjà présent dans $OArtIdTitle, on le récupère
    if(isset($OArtIdTitle[$artId])) {
    $artTitle = $OArtIdTitle[$artId];
    } else { # Sinon, on va chercher le titre de l'article, puis on le stocke dans $OArtIdTitle
    $a = $this->plxMotor->plxGlob_arts->query('/^'.$artId.'.(.*).xml$/');
    $art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf.$a);
    $artTitle = $art;
    $OArtIdTitle[$artId]=$artTitle;
    }
    $row = str_replace('#com_art_title',$artTitle,$row);
    }

    while(preg_match('/#com_content\(([0-9]+)\)/',$row,$capture)) {
    if($com == 'admin')
    $row = str_replace('#com_content('.$capture[1].')',plxUtils::strCut($content,$capture[1]),$row);
    else
    $row = str_replace('#com_content('.$capture[1].')',plxUtils::strCheck(plxUtils::strCut(plxUtils::strRevCheck($content),$capture[1])),$row);
    }
    $row = str_replace('#com_content',$content,$row);
    $row = str_replace('#com_date',plxDate::formatDate($date,'#num_day/#num_month/#num_year(4)'),$row);
    $row = str_replace('#com_hour',plxDate::formatDate($date,'#hour:#minute'),$row);
    # On genère notre ligne
    echo $row;
    $count++;
    }
    }
    }
    if($count>$max) break;
    }
    }
    }
  • Jerry WhamJerry Wham Member
    mai 2014 modifié
    Plutôt que de modifier la fonction, crée un plugin en utilisant le hook plxShowLastComList. En utilisant return true, tu pourras éviter l'exécution du code situé après l'appel du hook.
    Voici la fonction. Je te laisse écrire le reste du plugin.
                    public function plxShowLastComList() {
                    $string = <<<EOF
                    # Génération de notre motif
    		if(empty(\$art_id))
    			\$motif = '/^[0-9]{4}.[0-9]{10}-[0-9]+.xml$/';
    		else
    			\$motif = '/^'.str_pad(\$art_id,4,'0',STR_PAD_LEFT).'.[0-9]{10}-[0-9]+.xml$/';
    
    		\$count=1;
    		\$datetime=date('YmdHi');
    		# Nouvel objet plxGlob et récupération des fichiers
    		\$plxGlob_coms = clone $this->plxMotor->plxGlob_coms;
    		if(\$aFiles = \$plxGlob_coms->query(\$motif,'com','rsort',0,false,'before')) {
    			[color=#ff643d]# Tableau d'association ArtId => ArtTitle (utile si #com_art_title est demandé)
    			\$OArtIdTitle = array();[/color]
    			# On parcourt les fichiers des commentaires
    			foreach(\$aFiles as \$v) {
    				# On filtre si le commentaire appartient à un article d'une catégorie inactive
    				if(isset(\$this->plxMotor->activeArts[substr(\$v,0,4)])) {
    					\$com = \$this->plxMotor->parseCommentaire(PLX_ROOT.\$this->plxMotor->aConf['racine_commentaires'].\$v);
    					\$artInfo = \$this->plxMotor->artInfoFromFilename(\$this->plxMotor->plxGlob_arts->aFiles[\$com['article']]);
    					if(\$artInfo['artDate']<=\$datetime) { # on ne prends que les commentaires pour les articles publiés
    						if(empty(\$cat_ids) OR preg_match('/('.\$cat_ids.')/', \$artInfo['catId'])) {
    							\$url = '?article'.intval(\$com['article']).'/'.\$artInfo['artUrl'].'#c'.\$com['numero'];
    							\$date = \$com['date'];
    							\$content = strip_tags(\$com['content']);
    							# On modifie nos motifs
    							\$row = str_replace('L_SAID', L_SAID, \$format);
    							\$row = str_replace('#com_id',\$com['numero'],\$row);
    							\$row = str_replace('#com_url',\$this->plxMotor->urlRewrite(\$url),\$row);
    							\$row = str_replace('#com_author',\$com['author'],\$row);
    							[color=#ff643d]# Si #com_art_title est demandé
    							if(strpos(\$format, '#com_art_title')!=FALSE) {
    							    \$artId = \$artInfo['artId'];
    								\$artTitle;
    								# Si le titre de l'article est déjà présent dans $OArtIdTitle, on le récupère
    								if(isset(\$OArtIdTitle[\$artId])) {
    									\$artTitle = \$OArtIdTitle[\$artId];
    								} else { # Sinon, on va chercher le titre de l'article, puis on le stocke dans $OArtIdTitle
    								    \$a = \$this->plxMotor->plxGlob_arts->query('/^'.\$artId.'.(.*).xml$/');
    							        \$art = \$this->plxMotor->parseArticle(PLX_ROOT.\$this->plxMotor->aConf['racine_articles'].\$a['0']);
    								    \$artTitle = \$art['title'];
    									\$OArtIdTitle[\$artId]=\$artTitle;
    								}
    								\$row = str_replace('#com_art_title',\$artTitle,\$row);
    							}[/color]
    							while(preg_match('/#com_content\(([0-9]+)\)/',\$row,\$capture)) {
    								if(\$com['author'] == 'admin')
    									\$row = str_replace('#com_content('.\$capture[1].')',plxUtils::strCut(\$content,\$capture[1]),\$row);
    								else
    									\$row = str_replace('#com_content('.\$capture[1].')',plxUtils::strCheck(plxUtils::strCut(plxUtils::strRevCheck(\$content),\$capture[1])),\$row);
    							}
    							\$row = str_replace('#com_content',\$content,\$row);
    							\$row = str_replace('#com_date',plxDate::formatDate(\$date,'#num_day/#num_month/#num_year(4)'),\$row);
    							\$row = str_replace('#com_hour',plxDate::formatDate(\$date,'#hour:#minute'),\$row);
    							# On genère notre ligne
    							echo \$row;
    							\$count++;
    						}
    					}
    				}
    				if(\$count>$max) break;
    			}
    		}
                    return true;
    EOF;
                    echo "<?php ".$string." ?>";
          }
    
  • SuricatSuricat Member
    Merci Jerry,

    Je pense vraiment que cette modification devrait être présente dans PluXml lui-même :
    - ça ne change rien pour ceux qui n'utilisent pas le format #com_art_title
    - ça apporte une nouvelle option assez souvent utilisée pour présenter les derniers commentaires

    Mais si les administrateurs de PluXml ne veulent pas de cette modification, j'en ferais effectivement un Plugin.
  • SuricatSuricat Member
    J'ai ajouté ma modification sur le Github de PluXml et j'ai fait un "Pull Request".

    J'espère avoir fait ce qu'il faut, car c'est la première fois que j'utilise Github...
  • A priori, tu as fait ce qu'il faut. Il faut juste attendre la validation ou non de Stéphane.
  • SuricatSuricat Member
    Bonjour,

    Est-ce que quelqu'un sait combien de temps il faut attendre avant de savoir si une modification sur Github est validée ou refusée ?
    Car c'est assez frustrant de ne pas savoir ce qu'il va advenir de ma proposition de modif.

    Merci.
  • Tout dépend de la disponibilité de Stéphane. C'est variable. Mais tu auras une réponse à un moment ou un autre. Stéphane regarde avec attention toutes les modif qui lui sont soumises.

    Il faut juste être un peu patient... :P
  • SuricatSuricat Member
    OK, merci.
Connectez-vous ou Inscrivez-vous pour répondre.