[Résolu] boutons pour article suivant/precédent

DeevadDeevad Member
avril 2014 modifié dans Entraide
Bonjour,

J'ai commencé à créer une fonction pour pluxml 5.0.2 qui affiche dans les page article des liens vers l'article précédent et suivant. Etant débutant en 'codage', le voici :
/**
	 * Méthode qui affiche dans l'article un lien vers le précédent et suivant article
	 * Encore expérimentale et buggé :)
	 * @scope	global
	 * @author	Deevad, inspiré et copier coller depuis d'autres codes dans Plx.show
	 **/
	public function Navigation() {

	        	# On calcul l'ID en cours , puis on génère les ID +1 et -1
        		$id = intval($this->plxMotor->plxRecord_arts->f('numero'));
        		$next_page = intval($this->plxMotor->plxRecord_arts->f('numero'))+1;
			$prev_page = intval($this->plxMotor->plxRecord_arts->f('numero'))-1;
			
			# On génère les URLs
			$p_url = $this->plxMotor->urlRewrite('?'.$arg_url.'article'.$prev_page.'/'); # Page precedente
			$n_url = $this->plxMotor->urlRewrite('?'.$arg_url.'article'.$next_page.'/'); # Page suivante
		
			# On effectue l'affichage
				echo '<a href="'.$p_url.'" title="Page précédente">< précédente</a> |';
				echo '<a href="'.$n_url.'" title="Page suivante">suivante ></a>';

	}
Ca fonctionne mais j'ai des BUGs ; nottament si la chaine des ID d'article est brisé ou si c'est non chronologique. C'est sur que se baser sur l'ID n'est pas la bonne méthode, mais c'est fait avec ce que j'ai pu comprendre. Merci si certains d'entre vous peuvent me passer un coup de main. Merci d'avance.
«1

Réponses

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

    Voilà ce que je te propose (code à rajouter dans le fichier core/lib/class.plxshow.php)
    public function artPrevNext($prevLib="Précedent", $nextLib="Suivant") {
    	
    		$ordre = preg_match('/asc/',$this->plxMotor->tri)?'sort':'rsort';
    		$aFiles = $this->plxMotor->plxGlob_arts->query('/[0-9]{4}.[home|0-9,]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art',$ordre,0,false,'before');
    		$key = array_search(basename($this->plxMotor->plxRecord_arts->f('filename')), $aFiles);
    		$prevUrl = $prev = isset($aFiles[$key-1])? $aFiles[$key-1] : false;
    		$nextUrl = $next = isset($aFiles[$key+1])? $aFiles[$key+1] : false;
    		if($prev AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$prev,$capture))
    			$prevUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    		if($next AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$next,$capture))
    			$nextUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    		if($ordre=='rsort') { $dummy=$prevUrl; $prevUrl=$nextUrl; $nextUrl=$dummy; }
    		if($prevUrl) echo '<div class="artPrev" style="float:left"><a href="'.$prevUrl.'">'.$prevLib.'</a></div>';
    		if($nextUrl) echo '<div class="artNext" style="float:right"><a href="'.$nextUrl.'">'.$nextLib.'</a></div>';
    	
    	}
    
    ajoute dans le fichier article.php de theme, là où tu veux voir apparaitre les liens Précedent/Suivant
    <p class="artPrevNext"><?php $plxShow->artPrevNext() ?></p>
    
    tu disposes des classes css .artPrevNext, .artPrev, .artNext pour personnaliser l'affichage dans le fichier style.css de ton thème.

    La fonction $plxShow->artPrevNext accèpte 2 paramètres afin de personnaliser le titre des liens Précedent/Suivant
    Tu peux par exemple l'appeler de cette autre façon:
    <p class="artPrevNext"><?php $plxShow->artPrevNext('Article précedent', 'Article suivant') ?></p>
    
    La fonction tient compte de l'ordre d'affichage paramétré dans l'administration (options d'affichage/Tri des articles). Le tri se fait donc par date.
    Le code est pleinement optimisé car il tire profit des améliorations apportées dans la gestion des fichiers xml depuis la version 5 de PluXml.

    je n'ai pas fait un debug et des tests poussés. Donc ne pas hésiter à remonter les éventuels problèmes.

    Compatibilité: PluXml 5.+

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Waoo, Merci mille fois Stephane !
    C'est noël pour moi et mes facultés de codeur. D'ailleurs , en bon échange si besoin d'un dessin en retour ; je suis là.

    Je vais pouvoir faire des boutons suivant et précédent pour mes dessins ; ex: http://www.davidrevoy.com/?article41/electron-donor.

    Une petite question qui me reste ; est-il possible de brider cette fonction à l'article suivant/précédent dans sa catégorie. ( ici ; par exemple la categorie 'digital painting' ).

    Merci encore
  • StéphaneStéphane Member, Former PluXml Project Manager
    Remplace la ligne
    $aFiles = $this->plxMotor->plxGlob_arts->query('/[0-9]{4}.[home|0-9,]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art',$ordre,0,false,'before');
    
    par
    $aFiles = $plxGlob_arts->query('/[0-9]{4}.[CAT_ID].[0-9,]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort',0,false,'before');
    
    où tu remplaces CAT_ID par l'id de ta categorie (exe: 002)

    Occasionnelement tu peux créer un 3ieme paramètre à la fonction avec un petit test: si le paramètre est renseigné tu utilises la ligne qui filtre sur la catégorie, sinon tu utilises le code initial.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • DeevadDeevad Member
    octobre 2010 modifié
    Alors, là c'est trop cool. Je m'empresse d'aller intégrer ça dans mon projet ( en localhost pour le moment ) ; et j’espère bien que cette nouvelle classe se retrouvera dans les version supérieure : c'est vraiment excellent. Encore un grand merci !
  • Bonjour,

    peut-on imaginer la même chose pour les statics ?

    De manière à proposer un ordre "normal" de lecture des articles
    ou d'inciter le lecteur à la fin de sa lecture, d'aller lire le suivant ...

    Cordialement,

    D.San
  • Danielsan : Pour coder quelquechose de similaire pour les pages statiques , j'en ai aucune idée. Les pages statiques n'étant jamais très nombreuses, j'aurais tendance à gérer ça 'en dur' dans le contenu des pages statiques elle-même si le problème se présentait à moi. C'est assez simple de relier les ID entre eux.

    ---

    Sinon, je profite du déterrement de ce sujet un an et demi après pour dire que j'utilise toujours cette fonction sur mon Pluxml (avec de beaux boutons noir et blanc que je me suis fait sous Gimp ) ; c'est visible ici http://www.davidrevoy.com/index.php?article84/trophy-hunting ;)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour David

    c'est vraiment magnifique ce qu'on peut voir dans ton portfolio.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • @Deevad: c'est finalement ce que j'ai fait. En utilisant aussi la solution de Stéphane pour le blog.

    Je me joins de tout coeur à Stéphane pour la qualité de ton portfolio.
  • Merci beaucoup :)
    Mon petit portfolio/blog est motorisé par Pluxml depuis pas mal d'année maintenant ; jusque là , jamais eu de soucis :)

    Avec Gedit ( un notepad sous Linux Mint ) , Xampp et Filezilla ça me rends bien indépendant des 'blogspot' et autres blog tout fait. J'aime beaucoup la souplesse de Pluxml pour mon portfolio. ( ma partie portfolio est actuellement géré par des statiques qui redirigent vers des HTML en fonction de la taille d'écran ( mobile ) ou de la langue ( fr / uk ) ) .

    J'aime beaucoups les bricolages sur le wiki aussi , ( tag cloud ; champs de recherche ; gravatar ; style pour commentaire admin ; lien de reseaux sociaux ) ça me fait bricoler un peu de temps en temps ; c'est mon instant 'tuning'.

    Stéphane : super aussi ton blog ( et j'aime beaucoup le look de ta page d'acceuil avec la citation ).
  • StéphaneStéphane Member, Former PluXml Project Manager
    Deevad a écrit:
    Stéphane : super aussi ton blog ( et j'aime beaucoup le look de ta page d'acceuil avec la citation ).
    Merci ;)

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Coucou,

    Existe-t-il une méthode pour obtenir le titre de ces articles suivant/précédent ..?
    Voir même les champs de statiques.xml, je me dépatouille après.

    Je vois bien obtenir la clef de l'article et la comparer avec la valeur de "number" de statiques.xml et extraire ensuite ce qu'on veut, mais je ne suis pas très bon en Parssage de xml :D

    Quelqu'un aurait-il une astuce ?

    Merci

    Cordialement,

    D.San
  • danielsandanielsan Member
    septembre 2011 modifié
    Bonjour,

    après moultes essais, je suis arrivé à ça:
    public function artPrevNext($prevLib="Précédent", $nextLib="Suivant") {
    
    		$ordre = preg_match('/asc/',$this->plxMotor->tri)?'sort':'rsort';
    		$aFiles = $this->plxMotor->plxGlob_arts->query('/[0-9]{4}.[home|0-9,]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art',$ordre,0,false,'before'); // parmis tous les articles
    		// $aFiles = $plxGlob_arts->query('/[0-9]{4}.[CAT_ID].[0-9,]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort',0,false,'before'); // parmis les articles de sa catégorie
    		$key = array_search(basename($this->plxMotor->plxRecord_arts->f('filename')), $aFiles);
    		$prevUrl = $prev = isset($aFiles[$key-1])? $aFiles[$key-1] : false;
    		$nextUrl = $next = isset($aFiles[$key+1])? $aFiles[$key+1] : false;
    
    		$plxGlob_arts = clone $this->plxMotor->plxGlob_arts;
    
    			if($prev AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$prev,$capture))
    				$prevUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    				if ($prev){
    					$art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$prev);
    					$nextTitle = STRIP_TAGS($art['title']);
    				}
    			if($next AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$next,$capture))
    				$nextUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    				if ($next) {
    					$art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$next);
    					$prevTitle = STRIP_TAGS($art['title']);
    				}
    			if($ordre=='rsort') { $dummy=$prevUrl; $prevUrl=$nextUrl; $nextUrl=$dummy; }
    			if($prevUrl) echo '<p class="pre">'.$prevLib.': <a href="'.$prevUrl.'" title="'.$prevTitle.'">'.$prevTitle.'</a></p>';
    			if($nextUrl) echo '<p class="next">'.$nextLib.': <a href="'.$nextUrl.'" title="'.$nextTitle.'">'.$nextTitle.'</a></p>';
    	}
    
    ça marche mon côté ... et du du votre ?

    Cordialement,
    _____
    D.San
  • Merci danielsan pour le partage de cette solution.
    Je n'ai pas encore tester, mais je le ferais surement si le besoin de boutons pour mes pages statiques s'en fait sentir.
  • De rien,
    mais ce n'est pas pour les pages statics,
    plutôt pour afficher le titre de l'article suivant/précédent.


    Cordialement,
    _____
    D.San
  • JohanJohan Member
    Merci beaucoup pour le snippet, je l'intègre bientôt sur mon blog... :)
  • Ça fonctionne très bien chez moi. Merci !
  • Très cool comme plugin \o/
    Merk6
  • Bonjour,

    Est-ce qu'il est possible de restreindre ces liens à la catégorie courante ?
    Si oui comment ?

    D'avance merci pour votre aide
  • Bonjour,


    le plugin artPS du lapin bleu vous facilitera la vie je suppose ... A télécharger ici


    Cordialement,
  • En effet, ça fonctionne parfaitement. Merci pour votre réponse !
  • Bonjour,
    Je viens de tester toutes ces solutions avec une version fraiche ( codes dans plxshow ou le plugin ArtPS ).
    Plus aucuns ne fonctionnent ...

    O:) Merci d'avance pour l'aide !
    ( Je suis bloqué dans l'élaboration de mon nouveau thème printanier, étant pas assez compétent pour résoudre les bug... )
  • stephane a fait un plugin là-dessus ...
  • Merci Danielsan pour me montrer la voie, mais même en lisant méticuleusement tout ; je ne trouve pas le plugin. Voici les endroits ou j'ai cherché :
    * http://code.google.com/p/my-pluxml/downloads/list
    * http://pluxopolis.net/allarchives
    * https://github.com/Pluxopolis?tab=repositories

    ( note ; ces listes sont des mines d'or :) )
  • http://pluxopolis.net/article35/pluxml-recommander-des-articles
    si rien ne fonctionne c'est qu'il y a un pb ailleurs ...
  • Merci DanielSan pour cette nouvelle piste.
    Je vais essayer de me servir de cette syntaxe "Recommander des articles" pour voir comment corriger les bouts de codes qui bug. Ils ont bien fonctionner jusqu'a 5.2 , mais après plus moyen 8.( .
    Mon but étant toujours deux simples boutons article 'suivant' et 'précédant' qui reste dans la même catégorie.
    Je tiens au courant si mes copier-coller et substitution de code fonctionne.
  • Mmm... Je viens de trouver ou ça coince :
    Le code de Stephane et de DanielSan fonctionne encore ; pour un 'Suivant' et 'Precedant' en global. ( sur tous les articles ).
    C'est la ligne pour limiter au suivant ou précedent de la catégorie de l'article qui bug.
  • DeevadDeevad Member
    avril 2014 modifié
    Trouvé ! Maintenant, ça parcours bien la catégorie en cours. 8o

    dans core/lib/class.plx.show.php :
    	/**
    	 * Méthode qui affiche un bouton Suivant et Precedant
    	 **/
    	public function artPrevNext($prevLib="Précédent", $nextLib="Suivant") {
    
    		$ordre = preg_match('/asc/',$this->plxMotor->tri)?'sort':'rsort';
    		$artCatIds = explode(',', $this->plxMotor->plxRecord_arts->f('categorie'));
    		$activeCats = explode('|',$this->plxMotor->activeCats);
    		$activecat = array_intersect($artCatIds,$activeCats);
    		$activecat = ($activecat ? implode('|', $activecat) : '');
    		$plxGlob_arts = clone $this->plxMotor->plxGlob_arts;
    		$aFiles = $plxGlob_arts->query('/[0-9]{4}.['.$activecat.']*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art',$ordre,0,false,'before');
    		$key = array_search(basename($this->plxMotor->plxRecord_arts->f('filename')), $aFiles);
    		$prevUrl = $prev = isset($aFiles[$key-1])? $aFiles[$key-1] : false;
    		$nextUrl = $next = isset($aFiles[$key+1])? $aFiles[$key+1] : false;
    
    		$plxGlob_arts = clone $this->plxMotor->plxGlob_arts;
    
    			if($prev AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$prev,$capture))
    				$prevUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    				if ($prev){
    					$art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$prev);
    					$nextTitle = STRIP_TAGS($art['title']);
    				}
    			if($next AND preg_match('/([0-9]{4}).[home|0-9,]*.[0-9]{3}.[0-9]{12}.([a-z0-9-]+).xml$/',$next,$capture))
    				$nextUrl=$this->plxMotor->urlRewrite('?article'.intval($capture[1]).'/'.$capture[2]);
    				if ($next) {
    					$art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$next);
    					$prevTitle = STRIP_TAGS($art['title']);
    				}
    			if($ordre=='rsort') { $dummy=$prevUrl; $prevUrl=$nextUrl; $nextUrl=$dummy; }
    			if($prevUrl) echo '<p class="pre">'.$prevLib.': <a href="'.$prevUrl.'" title="'.$prevTitle.'">'.$prevTitle.'</a></p>';
    			if($nextUrl) echo '<p class="next">'.$nextLib.': <a href="'.$nextUrl.'" title="'.$nextTitle.'">'.$nextTitle.'</a></p>';
    	}
    

    et dans le template /themes/<nomdutheme>/article.php :
    <?php $plxShow->artPrevNext(); ?>
    
  • cool ! te reste plus qu'à en faire un plugin maintenant car à la prochaine MàJ tu devras tout refaire ;)
  • Bonjour,

    pour ma part j'utilise le plugin artPS et j'ai constaté un bug que je cherche à corrigé, d'où ma présence sur ce fil.
    Depuis l'accueil, ça liste bien les articles suivant précédent jusqu'à tomber sur un article qui n'est pas classé en page d'accueil. À partir de ce moment là ça n'affiche plus que les liens vers les articles non classés en page d'accueil.
    Et depuis une catégorie, ça affiche tous les articles. Je cherchais justement comment limiter la liste à la catégorie en cours.

    Il y a un moment que j'ai décroché en PHP… du coup si quelqu'un a une idée…
    Et pourquoi développer sa propre fonction ou son propre plugin plutôt que de contribuer à artPS et l'améliorer éventuellement ?
    Ceci étant, ça pourrait être une bonne idée d'avoir ça dans le core de PluXML.
  • J'ai fait un plugin pour ça il y a un moment...
Connectez-vous ou Inscrivez-vous pour répondre.