Construction d'un menu avec les articles en sous menu

flipflipflipflip Member
avril 2015 modifié dans Entraide
Bonjour,

Pour les besoins d'un thème je dois construire un menu qui liste les catégories articles et les articles qui y sont rattachés dont voici le code :
[== Indéfini ==]
<nav class="grid nav">			
	<div class="col sml-hide sml-centered med-10 med-show med-centered lrg-10 lrg-show lrg-centered">
		<ul class="menu expanded">
		<?php		
		$status = $plxShow->catId()=='home'?"active":"noactive";
		echo '	<li class="'.$status.'"><a href="'.$plxMotor->urlRewrite().'" title="Accueil">Accueil</a></li>';
		foreach($plxMotor->aCats as $k=>$v) {
		if($v['articles'] > 0 AND $v['active'] == '1' AND $v['menu'] == 'oui') {
			$id = intval($k);
			$status = $plxShow->catId()==$id?"active":"noactive";
			echo '<li id="cat-'.$id.'" class="'.$status.'"><a href="'.$plxMotor->urlRewrite('?categorie'.intval($k).'/'.$v['url']).'" title="'.$v['name'].'">'.$v['name'].'</a>';
			echo '<ul>';
			$i = 0;
			while($i < $plxShow->plxMotor->plxRecord_arts->size) {
				if ($plxShow->plxMotor->plxRecord_arts->result[$i]['categorie'] == $k) {
					$url = $plxShow->plxMotor->plxRecord_arts->result[$i]['url'];
					$id = intval($plxShow->plxMotor->plxRecord_arts->result[$i]['numero']);
					echo '<li>
						<a href="'.$plxMotor->urlRewrite('?article'.$id.'/'.$url).'">'.$plxShow->plxMotor->plxRecord_arts->result[$i]['title'].'</a></li>';
					}
					$i++;
				}
				echo '</ul>';
				echo '</li>';
			}
		}
		?>
		</ul>			
	</div>
</nav>

L'idée est d'utiliser l'objet plxRecord_arts pour ne pas recharger une nouvelle fois tout les articles. Sur la page d'accueil pas de soucis tout marche. Si je rentre dans une catégorie seul les articles de celle-ci sont listés et si je vais sur un article il y a plus que lui qui est listé.

Est-ce qu'il y a une autre méthode pour arriver à ce que je veux faire ?

J'ai un string de l'array

Réponses

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

    Inspire toi de ce que fait la fonction plxShow::lastArtList
    $motif= '.........',
    $sort = 'rsort';
    $max = 9999:
    
    $plxGlob_arts = clone $plxMotor->plxGlob_arts;
    if($aFiles = $plxGlob_arts->query($motif,'art',$sort,0,$max,'before')) {
    	foreach($aFiles as $v) {
    		$art = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    		....
    	}
    }
    

    avec le bon motif tu auras facilement la liste des articles dont tu as besoin

    un motif pour lister les articles d'une catégorie ressemble à ça
    $cat_id = 1; # on veut les articles de la categorie 001
    
    $motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.str_pad($cat_id,3,'0',STR_PAD_LEFT).')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    
    

    tu as toutes les infos sur les articles dans le tableau $art

    Consultant PluXml

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

  • Bonjour,

    Merci ça marche nikel avec ce code :
    [== Indéfini ==]
    <nav class="grid nav">			
    	<div class="col sml-hide sml-centered med-10 med-show med-centered lrg-10 lrg-show lrg-centered">
    		<ul class="menu expanded">
    		<?php		
    		
    		$status = $plxShow->catId()=='home'?"active":"noactive";
    		echo '	<li class="'.$status.'"><a href="'.$plxMotor->urlRewrite().'" title="Accueil">Accueil</a></li>';
    		foreach($plxMotor->aCats as $k=>$v) {
    			if($v['articles'] > 0 AND $v['active'] == '1' AND $v['menu'] == 'oui') {
    				$cat_id = intval($k);
    				$status = $plxShow->catId()==$cat_id?"active":"noactive";
    				echo '<li id="cat-'.$cat_id.'" class="'.$status.'"><a href="'.$plxMotor->urlRewrite('?categorie'.$cat_id.'/'.$v['url']).'" title="'.$v['name'].'">'.$v['name'].'</a>';
    				echo '<ul>';
    				$motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.$k.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    				$sort = 'rsort';
    				$max = 9999;
    							
    				$plxGlob_arts = clone $plxMotor->plxGlob_arts;
    				if($aFiles = $plxGlob_arts->query($motif, 'art', $sort, 0, $max, 'before')) {								
    					foreach ($aFiles as $v) {
    						$art = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    						$url = $plxMotor->urlRewrite('?article'.intval($art['numero']).'/'.$art['url']);
    						echo '<li id="'.$art_id.'"><a href="'.$url.'" title="'.$art['title'].'">'.$art['title'].'</a></li>';
    					}
    				}
    				echo '</ul>';
    				echo '</li>';
    			}
    		}					
    		?>
    		</ul>			
    	</div>
    </nav>
    

    J'ai essayé de reproduire la gestion de actif/inactif comme sur les catégories
    [== PHP ==]
    $status = $plxShow->catId()==$cat_id?"active":"noactive";
    

    A la place de catId() j'ai mis artId() mais ça me renvoie toujours 1 que je sois sur home ou sur un article différent de 1.

    J'ai un string de l'array

  • J'avais écris ça pour un plugin. Si ça peut t'aider...
    /**
    	 * 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' && \$this->mode() == '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"><span>#art_title</span></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.'?>';
    	}
    
  • je-evrardje-evrard Member
    avril 2015 modifié
    Sinon tu as ceci : ici... sans une ligne de code mais tu es dépendant des plugins.
  • Voila j'ai trouvé comment faire pour gérer le active:noactive des sous-menu. Reste plus qu'à écrire le css qui va bien
    [== PHP ==]
    $status = $plxShow->catId()=='home'?"active":"noactive";
    echo '	<li class="'.$status.'"><a href="'.$plxMotor->urlRewrite().'" title="Accueil">Accueil</a></li>';
    foreach($plxMotor->aCats as $k=>$v) {
    	if($v['articles'] > 0 AND $v['active'] == '1' AND $v['menu'] == 'oui') {
    		$cat_id = intval($k);
    		$status = $plxShow->catId()==$cat_id?"active":"noactive";
    		echo '<li id="cat-'.$cat_id.'" class="'.$status.'"><a href="'.$plxMotor->urlRewrite('?categorie'.$cat_id.'/'.$v['url']).'" title="'.$v['name'].'">'.$v['name'].'</a>';
    		echo '<ul>';
    		$motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.$k.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    		$sort = 'rsort';
    		$max = 9999;
    							
    		$plxGlob_arts = clone $plxMotor->plxGlob_arts;
    		if($aFiles = $plxGlob_arts->query($motif, 'art', $sort, 0, $max, 'before')) {								
    			foreach ($aFiles as $v) {
    				$art = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    				$url = $plxMotor->urlRewrite('?article'.intval($art['numero']).'/'.$art['url']);
    				$art_id = intval($art['numero']);
    				$status = $plxShow->artId()==$art_id?"active":"noactive";
    				echo '<li id="'.$art_id.'" class="text-left '.$status.'"><a href="'.$url.'" title="'.$art['title'].'">'.$art['title'].$plxShow->artId().'</a></li>';
    			}
    		}
    		echo '</ul>';
    		echo '</li>';
    	}
    }
    

    J'ai un string de l'array

Connectez-vous ou Inscrivez-vous pour répondre.