[Astuce]Afficher la liste des articles de la catégorie active

danielsandanielsan Member
janvier 2012 modifié dans Modifications
Hello,

Dans la lignée du Menu listant les articles classés par catégories, voici une autre astuce qui consiste à afficher simplement la liste des articles de la catégorie active.

On la place souvent à gauche en tant que sous-menu ou en pied de page pour proposer à l'internaute d'aller visiter d'autres pages intéressantes.

Vous pouvez en voir un exemple sur http://www.samare.net, juste dessous la zone article suivant/précédent.

Pour se faire, copiez ( tout simplement ) ce code et placez-le à l'endroit stratégique dans votre template article.php.
<div id="autres_articles">
    <h4>Articles concernant la catégorie <?php $plxShow->artCat(); ?></h4>
    <ul>
        <?php
        $idCat = sprintf("%03d", $plxShow->artCatId());
        $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>','20', $idCat);
        ?>
    </ul>
</div>

Le chiffre 20 indique le nombre de lien que vous souhaitez afficher.

Cordialement,
_____
D.San

Réponses

  • Ah bin j'y avait pas pensé mais c'est une bonne astuce. Par exemple, faudrait que j'arrive à bricoler çà dans un menu déroulant.
  • Si tu réussis à mettre dans un menu déroulant, fait signe sur le forum, très bonne idée !
  • danielsandanielsan Member
    février 2012 modifié
    très simple, tu peux t'inspirer de l'astuce de mon menu ...
  • Oui par exemple :)


    Un jour je m'amuserai avec çà, et si j'écris un article là dessus je te le dirai sur ce fil.
  • Jerry WhamJerry Wham Member
    mai 2012 modifié
    Voici la solution que je propose pour afficher un menu déroulant listant les articles d'une catégorie. L'appel se fait de la même manière que la fonction standard à ceci près que l'on indique le nombre d'articles que l'on souhaite afficher dans un tableau en deuxième argument de fonction avec le format.


    Cette astuce utilise le hook standard "plxShowLastCatList" de la méthode "catList()" de la classe plxShow.


    Plutot qu'un long discours, voici le code, à placer dans un plugin :
    <?php 
            /**
    	 * Méthode qui affiche la liste des catégories actives, avec la liste des articles associés.
    	 * Si la variable $extra est renseignée, un lien vers la
    	 * page d'accueil (nommé $extra) sera mis en place en première
    	 * position.
    	 *
    	 * @param	$extra	string nom du lien vers la page d'accueil
    	 * @param	$format	string format du texte pour chaque catégorie (variable : #cat_id, #cat_status, #cat_url, #cat_name, #art_nb)
    	 *			ou
    	 *			$format array(
    	 *					$format[0] string format du texte pour chaque catégorie (variable : #cat_id, #cat_status, #cat_url, #cat_name, #art_nb)
    	 * 					$format[1] integer nombre d'articles maximum à afficher dans les sous-menu
    	 *			)
             * @param	include string	liste des catégories à afficher séparées par le caractère | (exemple: 001|003)
             * @param	exclude string	liste des catégories à ne pas afficher séparées par le caractère | (exemple: 002|003)
     	 * @return	stdout
    	 * @scope	global
    	 * @author	Anthony GUÉRIN, Florent MONTHEL, Stephane F, Cyril MAGUIRE
    	 */
    	public function plxShowLastCatList(){
    		$string =<<<END
    		if (is_array(\$format)) {
    			\$f = \$format[0];
    			\$nbSousMenu = intval(\$format[1]);
    			\$format = \$f;
    			unset(\$f);
    		} else {
    			\$nbSousMenu = 0;
    		}
    		# Si on a la variable extra, on affiche un lien vers la page d'accueil (avec \$extra comme nom)
    		if(\$extra != '') {
    			\$name = str_replace('#cat_id','cat-home',\$format);
    			\$name = str_replace('#cat_url',\$this->plxMotor->urlRewrite(),\$name);
    			\$name = str_replace('#cat_name',plxUtils::strCheck(\$extra),\$name);
    			\$name = str_replace('#cat_status',(\$this->catId()=='home'?'active':'noactive'), \$name);
    			\$name = str_replace('#art_nb','',\$name);
    			echo \$name."\n\t\t\t";
    		}
    		if(\$this->plxMotor->aCats) {
    			foreach(\$this->plxMotor->aCats as \$k=>\$v) {
    				\$in = (empty(\$include) OR preg_match('/('.\$include.')/', \$k));
    				\$ex = (!empty(\$exclude) AND preg_match('/('.\$exclude.')/', \$k));
    				if(\$in AND !\$ex) {
    				if((\$v['articles']>0 OR \$this->plxMotor->aConf['display_empty_cat']) AND (\$v['menu']=='oui') AND \$v['active']) { # On a des articles
    					\$k = intval(\$k);
    					if (\$nbSousMenu != 0) :
    					ob_start();
    					\$this->lastArtList('<li class="#art_status"><a href="#art_url">#art_title</a></li>',\$nbSousMenu,\$k);
    					\$sousmenu = ob_get_clean();
    					if (strlen(\$sousmenu) != 0):
    			            \$sousmenu = '
    				<ul>
    					'.str_replace('</li><li', '</li>'."\n\t\t\t\t\t".'<li', \$sousmenu).'
    				</ul>
    			</li>';
    					endif;
    					else :
    						\$sousmenu = '</li>';
    					endif;
    
    					# On modifie nos motifs
    						\$name = str_replace('#cat_id','menu_cat-'.\$k,\$format);
    						\$name = str_replace('#cat_url',\$this->plxMotor->urlRewrite('?categorie'.\$k.'/'.\$v['url']),\$name);
    						\$name = str_replace('#cat_name',plxUtils::strCheck(\$v['name']),\$name);
    						if (\$this->mode() == 'article' && in_array(\$k,explode(',',\$this->plxMotor->plxRecord_arts->f('categorie')))) {
    							\$name = str_replace('#cat_status','active', \$name);
    						}else {
    							\$name = str_replace('#cat_status',(\$this->catId()==\$k?'active':'noactive'), \$name);
    						}
    						\$name = str_replace('#art_nb',\$v['articles'],\$name);
    						\$name = str_replace('</li>',\$sousmenu,\$name);
    						echo \$name;
    					}
    				}
    			} 
    		}
    		return true;
    END;
    		echo '<?php '.$string.'?>';
    	}
    ?>
    

    On utilise la méthode ainsi :
    $plxShow->catList($plxShow->getLang('HOME'),array('<li class="#cat_status page_item"><a href="#cat_url" title="#cat_name">#cat_name</a></li>'."\n\t\t",15),'001|002|003','004|005|006');
    

    Ce qui affichera 15 articles par catégorie, des catégories 1, 2 et 3. Les catégories 4, 5 et 6 ne seront pas affichées.
  • cpalocpalo Member
    Bonjour

    Pour que cela fonctionne sur mon site ( pluxml 5.3), il a fallu que je remplace
    [== PHP ==]
    $idCat = sprintf("%03d", $plxShow->artCatId());
    
    par
    [== PHP ==]
    $idCat = $plxShow->CatId();
    

    Cordialement
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Bonjour,

    Je viens de rajouter cette fonctionnalité à mon plugin myPager qui en fait un peu plus.

    Pour la catégorie, le mot-clé ou l'archive active, quand on lit un article, un navigateur s'affiche en bas de la fenêtre qui permet de sélectionner dans une liste déroulante un article dans la sélection.
    Le plugin est déjà prêt pour un éventuel mode authors (auteurs)
    Voir la démo chez Free.
  • cpalocpalo Member
    avril 2014 modifié
    Petit bug.
    J'affiche bien les articles et le nombre d'articles de la catégorie active. Et ce sans problème.
    Pour les catégories ayant un grand nombre d'articles (variable: nb_ArtCat), j'ai limité l'affichage à un nombre déterminé d'articles (nb_item). Cela fonctionne sans problème.
    Je voulais ajouter à la fin de cette liste un lien Afficher tous les articles ( l'idéal aurait été un lien voir les autres articles, c'est à dire tous sans ceux étant déjà affichés) si le nombre d'articles de la catégorie est supérieur au nombre d'articles affichés.
    Cela fonctionne à peu près bien. Mais petit bug.
    Pour le nombre d'articles affichés j'ai choisi 2 , chiffre faible mais pour faciliter le test.
    Si le nombre d'articles de la catégorie est inférieur ou égal à 2: pas de problème.
    Mais si il est supérieur à 2 ( dans mon test il est égal à 3), alors il affiche 3 fois Voir les autres articles.

    Petite précision: quand j'avais 3 catégories, il affichait 3 fois.
    Maintenant que j'ai testé avec 4 catégories il affiche 4 fois

    En fait ce que je viens de voir, chacun de ces liens dirige vers chacune des catégories et non pas la catégorie active.
    [== PHP ==]
    <ul>
            <?php
            $idCat = $plxShow->CatId();
            $nb_item = 2; // nombre d'articles maxi affichés dans le menu
            $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>',$nb_item, $idCat);
            $nb_ArtCat = $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
            if($nb_item<$nb_ArtCat){ // si le nombre d'articles de la catégorie est supérieur à $nb_item, on affiche un lien "Voir tous les articles"
                $plxShow->catList('','<li id="menu_#cat_id"><a href="#cat_url" title="Voir tous les articles de la cat&eacute;gorie #cat_name">Voir tous les articles</a></li>',$id_cat);
                }else{}
            ?>
        </ul>
    
  • cpalocpalo Member
    oups!!
    une petite erreur dans le nom de la même variable
    Tout fonctionne excepté le lien vers voir tous les articles
    [== PHP ==]
     <?php
            $cat = $plxShow->catId();
            $nb_item = 2; // nombre d'articles maxi affichés dans le menu
            $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>',$nb_item, $cat);
            $nb_ArtCat = $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
            if($nb_item<$nb_ArtCat){ // si le nombre d'articles de la catégorie est supérieur à $nb_item, on affiche un lien "Voir tous les articles"
                $plxShow->catList('','<li id="menu_#cat_id"><a href="#cat_url" title="Voir tous les articles de la cat&eacute;gorie #cat_name">Voir tous les articles</a></li>',$cat);
                }else{}
            ?>
    
  • cpalocpalo Member
    Encore oups.. le lien fonctionne ( puisque par défaut quand la catégorie est active, elle affiche tous les articles !!!)
    Non le bug qui est plus embétant que je viens de voir
    voir l'exemple (sidebar)
    c'est lorsque je clique sur un article, il perd la catégorie active et donc n'affiche plus la liste des articles de la catégorie.

    En fait le lien voir tous les articles fonctionne bien dans mon menu horizontal et correspond à la fonction que je voulais.
Connectez-vous ou Inscrivez-vous pour répondre.