Construction d'un menu avec les articles en sous menu
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 :
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 ?
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
0
Connectez-vous ou Inscrivez-vous pour répondre.

Réponses
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)
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
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
/** * 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.'?>'; }[== 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