Menu avec categories suivies des articles rattachés

krockroc Member
décembre 2011 modifié dans Entraide
Bonjour,

Je cherche à faire un menu qui afficherait automatiquement les différentes catégories et les articles qui y sont rattachés.

Categorie 1
Article 1
Article 4
Article 6
Categorie 2
Article 2
Article 3
Article 5
Article 7


Y-a t'il un moyen de réaliser cela de façon dynamique ?

J'ai essayer de répéter des catList et des lastArtList mais ça ne fonctionne pas (ça n'affiche pas la deuxième catégorie).
<?php $plxShow->catList($extra='', $format='<h2 id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a></h2>', $include='1', $exclude='')?>
<ul>
<?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>',$max=20,$cat_id='1'); ?>
</ul>

<?php $plxShow->catList($extra='', $format='<h2 id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a></h2>', $include='2', $exclude='')?>
<ul>
<?php	$plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>',$max=20,$cat_id='2');	?>
</ul>
Merci d'avance pour votre aide.

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • krockroc Member
    décembre 2011 modifié
    Merci pour ta réponse.

    J'ai regardé le plugin mais il semble que ça ne réponde pas vraiment à mon besoin :
    Je voudrais utiliser ce menu dans la sidebar, donc en permanence tout au long de la navigation.

    De plus, je voudrai conserver les états art_status et cat_status pour avoir une état on et off des catégories et articles au cours de la navigation

    Je ne comprends pas pourquoi ma proposition ne fonctionne pas ?
    Est-il impossible d'utiliser au sein de la même page deux fonctions $plxShow->catList ou $plxShow->lastArtList avec des paramètres différents ?
  • danielsandanielsan Member
    décembre 2011 modifié
    Hello,

    un petit code très pratique:
    <ul>
    <?php
    		$menu = array('003', '002', '004', '005', '006'); // lister ici les catégories à afficher.
    		foreach($menu as $id_cat) {
    			$plxShow->catList('','<li id="menu_#cat_id" class="#cat_status">',$id_cat);
    			echo "\n";
    			$plxShow->catList('','<a href="#cat_url" title="#cat_name">#cat_name</a>',$id_cat);
    			echo "\n";
    				echo "<ul>\n";
    					$plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>','20',$id_cat);
    			echo "\n";
    				echo "</ul>\n";
    			echo "</li>\n";
    		}
    		?>
    </ul>
    
    explications:
    on crée un tableau ( $menu ) avec les numéros des catégories à afficher dans le menu.
    Puis on utilise la fonction d'affichage des articles ( lastArtList() ) filtrée par catégorie ( $id_cat ).

    Reste plus qu'à choisir quelles catégories afficher, dans quel ordre, et le nombre d'articles à afficher ( ici 20 ).

    Enjoy,

    _____
    D.San
  • FAN-TAS-TIQUE ! Ça répond parfaitement à ma demande.
    Merci mille fois !
  • de rien :D
  • Salut,
    est-ce que ca marcherai avec les groupes et les pages statiques?
    merci
  • FrancisFrancis Member
    février 2012 modifié
    Merci bien Danielsan pour ce code très utile !


    Le seul problème est que les articles sont obligatoirement dans l'ordre chronologique inverse. Et comme la fonction lastArtList ne renvoie pas une valeur mais écrit directement le contenu avec l'instruction echo, on ne peut rien modifier.


    Il reste à modifier les dates-heures des articles, dans le dossier articles et dans configuration/tags.xml pour obtenir l'ordre que l'on veut pour les pages.
    Ca marche, mais si l'utilisateur ajoute une page, elle se trouve au début du menu, donc il faut remodifier date-heure pour mettre une date plus ancienne. Et l'utilisateur final (si on fait le site pour un client par exemple), en général il ne sait pas le faire.


    Ou alors, il faudrait écrire un plugin qui ajoute à plxShow une fonction lastArtList_reverse, copie de lastArtList mais avec un tri dans le sens chronologique croissant, en remplaçant rsort par sort, vers le début.
    D'après le Guide du développeur (merci Stéphane, en voilà un document indispensable !), ça doit être possible, mais je n'ai pas eu le temps d'essayer.
  • chez moi le dernier articles publiés se retrouve en première position ...
  • StéphaneStéphane Member, Former PluXml Project Manager
    et oui dernier publié en 1er, d'où le nom de la fonction lastArtList

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • Jerry WhamJerry Wham Member
    décembre 2011 modifié
    Voici le template que j'utilise dans ma sidebar :
    <?php if(!defined('PLX_ROOT')) exit; ?>
    
    	
    
    	<div class="grid_5 noprint" id="menu_gauche"><!-- LE BLOC DE GAUCHE  -->
    
    		<div class="box"><!-- BOX -->
    
    
    
    		<h1>ARTISTES</h1>
    
    		<ul class="navigation">
    
    			<?php 
    
    			if($aFiles = $plxMotor->plxGlob_arts->query('/^[0-9]{4}.[home|'.$plxMotor->activeCats.',]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort', 0, false, 'before')) {
    
    				
    
    				$plxRecord_arts = false;
    
    				$array=array();
    
    				foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
    
    					$array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    
    				}
    
    				# On stocke les enregistrements dans un objet plxRecord
    
    				$plxRecord_arts = new plxRecord($array);
    
    			}
    
    			?>
    
    			<?php foreach ($plxShow->plxMotor->aCats as $key => $value): $i=0;?>
    
    			<?php if ($key != '006'):?>		
    
    				<li class="toggleSubMenu">
    
    					<span>
    
    						<?php echo $value['name']; ?>
    
    						
    
    					</span>
    
    					<ul class="subMenu" id="<?php echo strtolower($value['name']); ?>">
    
    							<?php
    
    							if($plxRecord_arts) {
    
    								# On boucle sur nos articles
    
    								while($plxRecord_arts->loop()) {
    
    									if ($plxRecord_arts->f('categorie') == $key) {
    
    										$i++;
    
    										$num = intval($plxRecord_arts->f('numero'));
    
    										echo '<li><a href="'.$plxMotor->urlRewrite("?article".$num."/".plxUtils::strCheck($plxRecord_arts->f('url'))).'">'.$plxRecord_arts->f('title').'</a></li>'."\n";
    
    									}
    
    
    
    								}
    
    								if ($i == 0) {
    
    										echo 'Aucun article';
    
    								}
    
    							}
    
    							?>
    
    							
    
    					</ul>
    
    				</li>
    
    			
    
    			<?php endif;?>	
    
    			<?php endforeach ?>
    
    			
    
    		</ul>
    
    
    
    		</div><!-- FIN BOX -->
    
    	</div><!-- FIN DU BLOC DE GAUCHE  -->
    
    
    
    	<div class="grid_11" id="centre"><!-- LE CONTENU CENTRAL -->
    
    		<div class="box"><!-- BOX -->
    
    Seule la catégorie 006 n'est pas prise en compte car je ne voulais pas l'afficher.
    Cordialement.
  • Coucou,


    j'ai mis à jour l'astuce de création d'un menu listant les articles classés par catégories.
    On paramètre le nombre d'article maxi à afficher, s'il est supérieur, cela affiche un lien "voir l'ensemble des articles" ( utile pour celles et ceux qui ne pensent pas à cliquer sur le lien de la catégorie et qui pensent qu'il n'y en a pas plus ... )
    J'ai aussi fait un peu le ménage dans la feuille de style en la séparant en 2: le gabarit d'une part et les styles de l'autre.


    Cordialement,
    _____
    D.San
  • Je reprends cet ancien post, j'avais oublié de te remercier, Jerry, pour ta liste des articles par catégorie qui me rend de grands services.


    Je m'en sers pour créer mes menus, en triant les articles par date croissante (ce que ne permet pas la fonction lastArtList utilisée par DanielSan, bien que cette solution soit intéressante aussi).

    De cette façon, si mon client veut créer une nouvelle page sur son site, elle se place à la fin de la liste.


    Voici la version de Jerry que j'ai mise à ma sauce, notamment en ajoutant la classe active ou noactive pour repérer le menu en cours.
    Je l'appelle à partir du header (pour les articles de la catégorie "Menu principal") et à partir du footer (pour les articles de la catégorie "Pied de page"), après avoir initialisé la variable $numcategorie avec le bon n° de catégorie.


    En modifiant la date des articles, les utilisateurs peuvent d'ailleurs placer une page où ils le souhaitent, dans le menu en question.
    <?php
      // Affichage des lignes du menu (SANS LA BALISE <ul>) : noms des pages = noms des articles triés par DATE CROISSANTE
      // => si un article est ajouté (nouvelle page), il se place automatiquement en dernier dans le menu
       
      // Dans le header, renseigner le numéro de la catégorie dont il faut afficher les articles : $numcategorie (sinon, $numcategorie = '001' par défaut)
      if ($numcategorie=='') $numcategorie = '001'; // Numéro de la catégorie dont il faut afficher les articles en tant que menu
    ?>
    
    <?php
      // Recherche de la liste des fichiers articles
      $motif = '/^[0-9]{4}.[home|'.$plxMotor->activeCats.',]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/'; 
      // Liste des articles : paramètre 'sort' pour un tri chronologique normal, 'rsort' pour un tri chronologique inverse
      if($aFiles = $plxMotor->plxGlob_arts->query($motif, 'art', 'sort', 0, false, 'before')) { 
    
          $plxRecord_arts = false;
          $tab_nomsdefichiersarticles = array();
          
          foreach ($aFiles as $k=>$v) { # On parcourt tous les fichiers
              $tab_nomsdefichiersarticles[$k] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
          }
          # On stocke les enregistrements dans un objet plxRecord
          $plxRecord_arts = new plxRecord($tab_nomsdefichiersarticles);
      }
    ?>
    
    <?php
    if($plxRecord_arts) {
        # On boucle sur nos articles
        while($plxRecord_arts->loop()) {
            
            if ($plxRecord_arts->f('categorie') == $numcategorie) 
            {
                $num_article = intval($plxRecord_arts->f('numero'));
        				// Si c'est l'article courant (en cours d'affichage), classe "active" pour la ligne, sinon classe "noactive"
        				// => marche pour la page d'accueil (affichage d'un seul article sur la page d'accueil - $plxShow->artId() vaut 1)
                $status = 'noactive';
                if ( ($plxShow->mode()=='article') && ($num_article == $plxShow->artId()) )  $status = 'active'; 
                // Ecriture d'une ligne de menu
                echo '<li class="' . $status . '">
                        <a href="' . $plxMotor->urlRewrite("?article" . $num_article . "/" . plxUtils::strCheck($plxRecord_arts->f('url'))) . '">'
                          . $plxRecord_arts->f('title')
                      .'</a>
                      </li>'."\n";
            }
        } // fin while (écriture de toutes les lignes de menu)
    } // fin du if
    ?>
    

    Il reste un problème non résolu : lorsqu'un article appartient à plusieurs catégories, il n'apparaît que dans une seule. Par exemple, si mon premier article appartient à la catégorie "Menu principal" et que je coche "Accueil" en même temps, il disparaît de la catégorie "Menu principal".
  • J'avais modifié le template car j'avais le même problème de disparition lors de l'appartenance à plusieurs catégories. Voici les modif que j'ai faite:
    	<div class="box"><!-- BOX -->
    
    		<h1>ARTISTES</h1>
    		<ul class="navigation">
    			<?php 
    			if($aFiles = $plxMotor->plxGlob_arts->query('/^[0-9]{4}.[home|'.$plxMotor->activeCats.',]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort', 0, false, 'before')) {
    				
    				$plxRecord_arts = false;
    				$array=array();
    				foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
    					$array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    				}
    				# On stocke les enregistrements dans un objet plxRecord
    				$plxRecord_arts = new plxRecord($array);
    			}
    			$i = 0;
    			$tmp = '';
    			$TableauCats = array();
    			$menu = array();
    			?>
    			<?php foreach($plxRecord_arts->result as $k => $v):
    			$CatArt = $plxShow->plxMotor->aCats[substr($v['categorie'],0,strpos($v['categorie'],','))]['name'];
    			 if ($plxShow->plxMotor->aCats[substr($v['categorie'],-strpos($v['categorie'],','))]['name'] == 'ARTISTES'):?>
    				<?php if($plxRecord_arts) {
    					# On boucle sur nos articles
    
    					while($plxRecord_arts->loop()) {
    						$NomCatArt = $plxShow->plxMotor->aCats[substr($plxRecord_arts->f('categorie'),0,strpos($plxRecord_arts->f('categorie'),','))]['name'];
    						if ($NomCatArt == $CatArt && !in_array($plxRecord_arts->f('numero'),$TableauCats)) {
    							$TableauCats[] = $plxRecord_arts->f('numero');
    							$i++;
    							$num = intval($plxRecord_arts->f('numero'));
    							$menu[$CatArt][] = '
    							<li><a href="'.$plxMotor->urlRewrite("?article".$num."/".plxUtils::strCheck($plxRecord_arts->f('url'))).'">'.$plxRecord_arts->f('title').'</a></li>'."\n";
    						}
    
    					}
    					if ($i == 0) {
    							$menu[$CatArt][] = 'Aucun article';
    					}
    				}
    			
    			?>
    			<?php endif;?>	
    			<?php endforeach; ?>
    			<?php
    			natsort($menu);
    			foreach ($menu as $key => $value):?>
    				<li class="toggleSubMenu">
    					<span>
    						<?php echo $key; ?>
    
    					</span>
    					<ul class="subMenu" id="<?php echo strtolower($key); ?>">
    						<?php foreach ($menu[$key] as $k => $v): 
    						echo $v;
    						 endforeach ?>
    					</ul>
    				</li>
    			<?php endforeach;?>
    			
    		</ul>
    		<h1>MANIFESTATIONS</h1>
    		<ul class="navigation">
    			<?php 
    			if($aFiles = $plxMotor->plxGlob_arts->query('/^[0-9]{4}.[home|'.$plxMotor->activeCats.',]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','sort', 0, false, 'before')) {
    				
    				$plxRecord_arts = false;
    				$array=array();
    				foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
    					$array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    				}
    				# On stocke les enregistrements dans un objet plxRecord
    				$plxRecord_arts = new plxRecord($array);
    			}
    			$i = 0;
    			$tmp = '';
    			$TableauCats = array();
    			$menu = array();
    			?>
    			<?php foreach($plxRecord_arts->result as $k => $v):
    			 $CatArt = $plxShow->plxMotor->aCats[substr($v['categorie'],-strpos($v['categorie'],','))]['name'];
    			 $CatGlob = $plxShow->plxMotor->aCats[substr($v['categorie'],0,strpos($v['categorie'],','))]['name'];
    			 if ($CatGlob == 'MANIFESTATIONS' || $CatGlob == 'ACTUALITES'):?>
    				<?php if($plxRecord_arts) {
    								# On boucle sur nos articles
    
    								while($plxRecord_arts->loop()) {
    									$NomCatArt = $plxShow->plxMotor->aCats[substr($plxRecord_arts->f('categorie'),-strpos($plxRecord_arts->f('categorie'),','))]['name'];
    									if ($NomCatArt == $CatArt && !in_array($NomCatArt,$TableauCats)) {
    										$TableauCats[] = $NomCatArt;
    										$i++;
    										$num = intval(substr($plxRecord_arts->f('categorie'),-strpos($plxRecord_arts->f('categorie'),',')));
    										$menu[$CatGlob][] = '
    										<li><a href="'.$plxMotor->urlRewrite("?categorie".$num."/".plxUtils::strCheck($NomCatArt)).'">'.$NomCatArt.'</a></li>'."\n";
    									}
    
    								}
    								if ($i == 0) {
    										$menu[$CatGlob][] = 'Aucun article';
    								}
    							}
    							?>
    				
    			<?php endif;?>	
    			<?php endforeach; ?>
    			<?php
    			natsort($menu);
    			foreach ($menu as $key => $value):?>
    				<li class="toggleSubMenu">
    					<span>
    						<?php echo $key; ?>
    
    					</span>
    					<ul class="subMenu" id="<?php echo strtolower($key); ?>">
    						<?php foreach ($menu[$key] as $k => $v): 
    						echo $v;
    						 endforeach ?>
    					</ul>
    				</li>
    			<?php endforeach;?>
    		</ul>
    
    		</div><!-- FIN BOX -->
    
  • FrancisFrancis Member
    Merci Jerry, cette possibilité de traiter toutes les catégories des articles me manquait.


    Je vais regarder et tester ça dès que j'aurai un peu de temps.
  • krockroc Member
    septembre 2012 modifié
    Bonjour,


    Revenant sur cette fonction bien utile (celle de Danielsan), je me retrouve face à un ptit soucis.

    Je ne sais pas si c'est relatif aux dernières version de PluXml, mais la ligne
    $nbArtCat = $plxShow->nbAllArt('',$id_cat);
    
    renvoie l'affichage du nombre d'article total du site et non plus de la catégorie courante de la boucle for-each.

    Du coup on ne peux plus faire de test sur le nombre d'article contenu dans une catégorie…


    MAJ : D'après le wiki, la fonction "nbAllArt" ne permet pas l'utilisation d'un paramètre catégorie ?

    http://devzone.pluxml.org/index.php?page=plxShow-nbAllArt



    Merci pour votre aide.
  • danielsandanielsan Member
    septembre 2012 modifié
    exact.

    il y a
    $nbArtCat = $plxShow->plxMotor->nbArticles($id_cat);
    
    mais je ne sais pas pourquoi ça ne marche pas.
  • Ça fonctionne chez moi avec
    $nbArtCat = $plxShow->plxMotor->nbArticles($id_cat);
    

    Merci Danielsan !
  • Une petite question supplémentaire sur ce sujet :


    Comment faire en sorte de remplacer
    $menu = array('003', '002', '004', '005', '006'); // lister ici les catégories à afficher.
    
    par un code qui prendrait l'ensemble des catégories créées et actives sans devoir les spécifier une à une ?


    D'avance merci pour votre aide.
  • danielsandanielsan Member
    septembre 2012 modifié
    Hello,


    ça fait un peu bidouillage ...
    if($plxShow->plxMotor->activeCats!=""){ // vérifie s'il y a des catégories actives
    	$menu = $plxShow->plxMotor->activeCats;
    	$menu = rtrim($menu, "|000,"); // enlève la catégorie vide
    	$menu = explode("|", $menu); // crée un tableau à partir de la chaine
    }else{}
    

    Tu peux placer le foreach dans la condition.



    Par contre $nbArtCat ne fonctionne toujours pas chez moi, je ne comprends pas pourquoi ... :(
  • Je vous remercie pour cette réponse, je n'avais pas vu que vous m'aviez répondu. Ça fonctionne parfaitement !
Connectez-vous ou Inscrivez-vous pour répondre.