Modification de la fonction de listage des catégories.

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 :
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.

Réponses

  • Excellente idée afin de faire des petits menus perso à droite et à gauche. Je vais tester prochainement.

    Bienvenue et belle entrée dans pluxml
  • bravo :)
    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é :)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour

    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
    /**
    	 * Méthode qui affiche la liste des catégories actives.
    	 * Si la variable $extra est renseignée, un lien vers la 
    	 * page d'accueil (nommé $extra) sera mis en place en première 
    	 * position. La liste des catégories peut etre filtée avec les 
    	 * paramètres include et exclude
    	 *
    	 * @param	extra	nom du lien vers la page d'accueil
    	 * @param	format	format du texte pour chaque catégorie (variable : #cat_id, #cat_status, #cat_url, #cat_name, #art_nb)
    	 * @param	include	liste des catégories à afficher séparées par le caractère | (exemple: 001|003)
    	 * @param	exclude	liste des catégories à ne pas afficher séparées par le caractère | (exemple: 002|003)
    	 * @return	stdout
    	 * @scope	global
    	 * @author	Stephane F
    	 **/
    	public function catList($extra='', $format='<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a></li>', $include='', $exclude='') {
    		# 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) {
    			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 AND $v['menu'] == 'oui') { # On a des articles
    						# 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
    		}
    	}
    
    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
    <ul>
    			<?php $plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', '001|002', ''); ?>
    		</ul>
    
    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
    <ul>
    			<?php $plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', '', '003|005'); ?>
    		</ul>
    

    Consultant PluXml

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

  • Merci à vous tous.


    @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.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Je n'ai pas de chiffre pour valider le fait que preg_match est plus lent que des fonctions de traitement sur les tableaux, mais ici c'est peut être plus efficace d'utiliser uniquement 2 preg_match comme je le fais que d'appeler 1 x is_array + 2 x array_key_exists + 2 x in_array.
    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 :p

    Et sinon Hagondange dans le 57 ? :)

    Consultant PluXml

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

  • je verrai bien un mix des 2 méthodes, avec par exemple pour le dernier paramètre, le choix de la catégorie comme suit :
    <?php $plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', '003|005'); ?>
    
    pour par exemple ne prendre que les catégorie 003 et 005
    <?php $plxShow->catList('','<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a> (#art_nb)</li>', '-003|-005'); ?>
    
    pour prendre tout sauf les catégorie 003 et 005.

    vous voyez?
  • EthtezahlEthtezahl Member
    octobre 2010 modifié
    Voilà, j'ai fait la modif demandée par super_g2, amusez-vous bien avec.
    /**
    	 * Méthode qui affiche la liste des catégories actives.
    	 * 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	nom du lien vers la page d'accueil
    	 * @param	format	format du texte pour chaque catégorie (variable : #cat_id, #cat_status, #cat_url, #cat_name, #art_nb)
    	 * @return	stdout
    	 * @scope	global
    	 * @author	Anthony GUÉRIN, Florent MONTHEL, Stephane F
    . Modifications par Bertrand Andres.
    	 **/
    	public function catList($extra='', $format='<li id="#cat_id" class="#cat_status"><a href="#cat_url" title="#cat_name">#cat_name</a></li>', $pList = 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;
    		}
    		
    		// Tableau d'inclusion et d'exclusion des pages:
    		$include = array();
    		$exclude = array();
    		
    		if($pList !== null)
    		{
    			$pList = explode('|', $pList);
    			
    			foreach($pList as $tmpElement)
    			{
    				// Découpage de la chaîne.
    				if($tmpElement[0] === '-')
    				{
    					$exclude[] = substr($tmpElement, 1);
    				}
    				else
    				{
    					$include[] = $tmpElement;
    				}
    			}
    		}
    		
    		$nbIncludes = count($include);
    		$nbExcludes = count($exclude);
    		
    		# On verifie qu'il y a des categories
    		if($this->plxMotor->aCats) {
    			foreach($this->plxMotor->aCats as $k=>$v) {
    				$doDisplay = true;
    				
    				if($pList !== null)
    				{
    					if(($nbIncludes > 0) && !in_array($k, $include))
    					{
    						$doDisplay = false;
    					}
    					else if(($nbExcludes > 0) && in_array($k, $exclude))
    					{
    						$doDisplay = false;
    					}
    				}
    				
    				if(($doDisplay === true) && ($v['articles'] > 0) && ($v['menu'] == 'oui')) { # On a des articles
    					# 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
    		}
    	}
    
  • nice ça :)
    je vais tester ça de suite, car cela m'arrive de devoir coder les liens à la main (enfin, mettre les balise a href).
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour

    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 et développeur de PluXml (2010 à 2018)

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