Modification de la fonction de listage des catégories.
Ethtezahl
Member
dans Modifications
Bonjour.
J'ai modifié la méthode catList() de la classe plxShow, afin de pouvoir sélectionner des catégories de manière bien plus précise.
Par exemple, si je fais un menu à base de catégories, parfois, je veux n'en afficher que certaines, pas toutes.
J'ai donc ajouté un paramètre à la méthode, qui permet d'indiquer quelles catégories on doit afficher, ou (parfois plus court), quelles catégories on ne doit pas afficher.
Le paramètre additionnel est un tableau, ce qui permet (si vous avez des idées) de rajouter d'autres fonctionnalités.
Voici le code de la méthode modifiée :
Pour indiquer quelles catégories doivent être listées :
J'ai modifié la méthode catList() de la classe plxShow, afin de pouvoir sélectionner des catégories de manière bien plus précise.
Par exemple, si je fais un menu à base de catégories, parfois, je veux n'en afficher que certaines, pas toutes.
J'ai donc ajouté un paramètre à la méthode, qui permet d'indiquer quelles catégories on doit afficher, ou (parfois plus court), quelles catégories on ne doit pas afficher.
Le paramètre additionnel est un tableau, ce qui permet (si vous avez des idées) de rajouter d'autres fonctionnalités.
Voici le code de la méthode modifiée :
public function catList($extra='', $format='<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a></li>', $pAdditionalParameters=null) {
# 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;
}
# On verifie qu'il y a des categories
if($this->plxMotor->aCats) {
$doRestrictions = false;
// On regarde s'il y a des catégories à inclure ou à exclure:
if(is_array($pAdditionalParameters))
{
if(array_key_exists('include', $pAdditionalParameters))
{
$doAction = 'include';
$doRestrictions = true;
}
else if(array_key_exists('exclude', $pAdditionalParameters))
{
$doAction = 'exclude';
$doRestrictions = true;
}
}
foreach($this->plxMotor->aCats as $k=>$v) {
if($v['articles'] > 0 AND $v['menu'] == 'oui') { # On a des articles
$doDisplayCat = true;
if($doRestrictions === true)
{
// Si on doit inclure une catégorie, on vérifie que la catégorie courante fasse bien partie des catégories demandées
if($doAction === 'include')
{
// Ce n'est pas le cas, cette catégorie ne sera pas affichée.
if(!in_array($k, $pAdditionalParameters['include']))
{
$doDisplayCat = false;
}
}// Si on doit exclure une catégorie, on vérifie que la catégorie courante fasse ou non partie des catégories demandées
else if($doAction === 'exclude')
{
// Cette catégorie est à retirer.
if(in_array($k, $pAdditionalParameters['exclude']))
{
$doDisplayCat = false;
}
}
}
if($doDisplayCat === true)
{
# On modifie nos motifs
$name = str_replace('#cat_id','cat-'.intval($k),$format);
$name = str_replace('#cat_url',$this->plxMotor->urlRewrite('?categorie'.intval($k).'/'.$v['url']),$name);
$name = str_replace('#cat_name',plxUtils::strCheck($v['name']),$name);
$name = str_replace('#cat_status',($this->catId()==intval($k)?'active':'noactive'), $name);
$name = str_replace('#art_nb',$v['articles'],$name);
echo $name;
}
}
} # Fin du while
}
}
Et cela s'utilise de cette façon :Pour indiquer quelles catégories doivent être listées :
$params = array(
'include' => array('002', '003')
);
$plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', $params);
Pour indiquer quelles catégories ne doivent pas être listées :
$params = array(
'exclude' => array('001', '003')
);
$plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', $params);
Bien évidemment, ce paramètre est optionnel. S'il est omis, cela fonctionnera comme d'habitude. Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bienvenue et belle entrée dans pluxml
cette idée était devenue presque une arlésienne pour certains, d'autres (comme moi) "brodaient" quand c'était nécessaire.
belle entrée comme le dit notre conifère préféré
Tres bonne idée Ethtezahl cette modification.
Je vous propose ma version, avec une code plus léger et une utilisation je pense plus facile
tout d'abord le code de la fonction catList à remplacer dans le fichier core/lib/class.plx.show.php
J'ai rajouté 2 paramètres:
1er paramètre : liste des catégories à afficher séparées par le caractère |. Seules les catégories dans cette liste seront affichées
Exemple: 001|002
2ième paramètre: liste des catégories à ne pas afficher séparées par le caractère |. Toutes les catégories seront affichées seules celles présentes dans cette liste.
Exemple: 003|005
Consultant PluXml
Ancien responsable du projet (2010 à 2018)
@Stéphane:
Ce qui fait la différence entre nos deux versions est en grande partie le style de code (qui est propre à chacun).
Au début, je pensais en partie faire comme toi, c'est à dire ajouter deux paramètres distincts à la méthode catList(). Cependant, j'ai préféré ajouter un tableau de paramètres, car je me suis rendu compte que si cette méthode est amenée à évoluer, et que l'on ajoute petit à petit paramètre sur paramètre, cela va donner une méthode ayant parfois quinze paramètres à renseigner, ce qui est fatiguant pour un intégrateur.
De plus, avec un tableau de paramètres, tu ne renseignes que ce que tu as besoin. Dans ta version, si l'on veut exclure des pages, on doit tout de même renseigner le paramètre d'inclusion de pages. Je sais, c'est peu pour le moment, mais c'est dommage.
Par contre, pour le code de la méthode en elle-même, le tien est bien plus court que le mien, c'est incontestable. Cependant (car il y a un revers à la médaille), le preg_match() consomme davantage de temps et de ressources processeurs qu'un couple array_key_exists() et in_array()
Voilà, à bientôt.
Il y a toujours un context qui lorsque certaines fonctions sont utilisées à bon escient, on en tire un meilleur profit. Comparer certaines fonctions dans certains cas de figure ça n'a pas de sens.
Apres l'utilisation d'un parametre un peu fourre tout (comme un tableau), rend la lecture du code plus difficile et le débuggage également, ainsi que sa documentation. Les controles de validation vont demander plus de rigueur, donc allongé le code, voir l'alourdir. En finalité tu ne gagnes pas grand chose.
Mais je suis d'accord avec toi que passer par un tableau comme paramètre laisse beaucoup plus de souplesse sur son utilisation d'un point de vue du programmeur, mais pas forcément de l'utilisateur néophytes, pas toujours informaticien, à qui on va demander de placer de ligne de code php dans son thème.
Autre point à prendre en compte quand on parle de performances: passer un tableau comme paramètre ça consomme plus de mémoire que de passer une chaine de caractère, encore plus si c'est un tableau multi-dimensions.
Pour l'utilisation des paramètres d'un point de vue fonctionnel:
- soit on veut afficher des catégories en particulier -> on utilise le 1er paramètre "include" en laissant le 2ieme vide
- soit on veut tout afficher sauf certaines catégories -> on utilise le 2ieme paramètre "exclude" en laissant le 1er vide
Je ne vois pas dans quel cas un mix des 2 paramètres se justifie
Voilà pour les arguments qui justifient mon choix. Cela ne veut pas dire que c'est obligatoirement le meilleur. C'est celui que je défend
Et sinon Hagondange dans le 57 ?
Consultant PluXml
Ancien responsable du projet (2010 à 2018)
vous voyez?
je vais tester ça de suite, car cela m'arrive de devoir coder les liens à la main (enfin, mettre les balise a href).
Pour info c'est cette version http://forum.pluxml.org/viewtopic.php?pid=15388#p15388 qui sera implémentée dans la prochaine version de PluXml
Consultant PluXml
Ancien responsable du projet (2010 à 2018)