Bug Pagination

Bonjour,

Est-ce moi où il me semble que la méthode plxShow->pagination() est bugguée ?

En effet, sur un site que je maintiens et que je viens de passer en 5.1.5, sur la page d'accueil j'ai 6 pages alors que je ne devrais en avoir qu'une. Je n'avais pas ce problème avec la 5.1.4.

J'ai désactivé mes plugins au cas où mais l'erreur est toujours là. (Je les ai donc réactivés).

J'ai réglé l'affichage à 5 articles sur la page d'accueil et j'en ai que 4 qui sont dans la catégorie "page d'accueil". Tous mes autres articles sont dans des catégories différentes.

Une idée ?

Petite suggestion également, il serait bien de mettre des espaces insécables entre "précédent" et "page" de même qu'avec "première", "dernière" et "suivante".

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Je viens de regarder sur mon site perso qui est en 5.1.5. Pas de problème de pagination (avec url rewriting en +)
    Ce qui est sur, c'est qu'il n'y a eu aucune modif sur la 5.1.5 par rapport à la 5.1.4 qui justifie que la pagination ne fonctionne plus maitenant.
    Mais comme il me semble que tu es la 2ieme personne à parler de pagination, ça m'inquiete un peu...

    Pour la suggestion: à toi de gérer l'espacement par css, les textes étant encadrés de balises <span>

    Consultant PluXml

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

  • Stéphane a écrit:
    Pour la suggestion: à toi de gérer l'espacement par css, les textes étant encadrés de balises <span>
    Mouaif :/

    C'est un peu "foireux" (désolé pour le terme, j'ai pas mieux) car les mots sont collés les uns aux autres et une solution en css est beaucoup plus lourde que 3 &nbsp à ajouter. C'est un peu l'histoire du bazooka et de la mouche...
  • Dans la méthode pagination, tu calcules la dernière page ainsi :
    $last_page = ceil($this->plxMotor->plxGlob_arts->count/$this->plxMotor->bypage);
    
    Je pense que l'erreur vient de là car $this->plxMotor->plxGlob_arts->count retourne l'ensemble des articles, sans tenir compte du fait qu'ils soient à afficher ou non dans la page d'accueil (home.php).

    Lorsqu'on enregistre un article dans une catégorie, et que l'on décoche l'option "emplacements : page d'accueil", cet article ne doit pas entrer dans le décompte du nombre d'articles à afficher dans la page d'accueil et donc dans le décompte du nombre de pages.

    Il faudrait voir si $this->plxMotor->plxGlob_arts->count peut le faire...
  • StéphaneStéphane Member, Former PluXml Project Manager
    Je n'arrive pas à reproduire l'erreur. :(
    Te serait-il possible de me faire un plux avec quelques articles qui vont bien pour avoir le problème de pagination et me mailer l'ensemble stp
    Merci

    Consultant PluXml

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

  • Jerry WhamJerry Wham Member
    décembre 2011 modifié
    Je t'envoie ça. En même temps j'ai cherché de mon côté et je te propose également ça :
    public function pagination() {
    		# Hook Plugins
    		if(eval($this->plxMotor->plxPlugins->callHook('plxShowPagination'))) return;
    		
    		$count = 0;
    		# On verifie que la variable bypage n'est pas nulle
    		if($this->plxMotor->bypage AND $this->plxMotor->plxGlob_arts->count>$this->plxMotor->bypage) {
    			foreach ($this->plxMotor->plxGlob_arts->aFiles as $k=>$v) {
    				if (strpos($v,'.home.') !== false ){
    					$count++;
    				}
    			}
    			# on supprime le n° de page courante dans l'url
    			$arg_url = $this->plxMotor->get;
    			if(preg_match('/(\/?)(page[0-9]+)$/',$arg_url,$capture)) {
    				$arg_url = str_replace($capture[2], '', $arg_url);
    			}
    			if(!empty($arg_url) AND empty($capture[1])) $arg_url .= '/';
    			# Calcul des pages
    			$prev_page = $this->plxMotor->page - 1;
    			$next_page = $this->plxMotor->page + 1;
    			if ($count != 0 && empty($arg_url)) {
    				$last_page = ceil($count/$this->plxMotor->bypage);
    			} else {
    				$last_page = ceil($this->plxMotor->plxGlob_arts->count/$this->plxMotor->bypage);
    			}
    			
    			# Generation des URLs
    			$p_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$prev_page); # Page precedente
    			$n_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$next_page); # Page suivante
    			$l_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$last_page); # Derniere page
    			$f_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page1'); # Premiere page
    			# On effectue l'affichage
    			if($this->plxMotor->page > 2) # Si la page active > 2 on affiche un lien 1ere page
    				echo '<span class="p_first"><a href="'.$f_url.'" title="'.L_PAGINATION_FIRST_TITLE.'">'.L_PAGINATION_FIRST.'</a></span>';
    			if($this->plxMotor->page > 1) # Si la page active > 1 on affiche un lien page precedente
    				echo '<span class="p_prev"><a href="'.$p_url.'" title="'.L_PAGINATION_PREVIOUS_TITLE.'">'.L_PAGINATION_PREVIOUS.'</a></span> ';
    			# Affichage de la page courante
    			printf('<span class="p_page">'.L_PAGINATION.'</span>',$this->plxMotor->page,$last_page);
    			if($this->plxMotor->page < $last_page) # Si la page active < derniere page on affiche un lien page suivante
    				echo ' <span class="p_next"><a href="'.$n_url.'" title="'.L_PAGINATION_NEXT_TITLE.'">'.L_PAGINATION_NEXT.'</a></span>';
    			if(($this->plxMotor->page + 1) < $last_page) # Si la page active++ < derniere page on affiche un lien derniere page
    				echo ' <span class="p_last"><a href="'.$l_url.'" title="'.L_PAGINATION_LAST_TITLE.'">'.L_PAGINATION_LAST.'</a></span>';
    		}
    	}
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bug confirmé. En cours de résolution

    Consultant PluXml

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

  • Je te propose ça comme correction. Qu'en penses-tu ?
    /**
    	 * Méthode qui affiche la pagination
    	 *
    	 * @return	stdout
    	 * @scope	global
    	 * @author	Florent MONTHEL, Stephane F
    	 **/
    	public function pagination() {
    		# Hook Plugins
    		if(eval($this->plxMotor->plxPlugins->callHook('plxShowPagination'))) return;
    		
    		$count = array();
    		$catsActives = explode('|',$this->plxMotor->activeCats);
    		# On verifie que la variable bypage n'est pas nulle
    		if($this->plxMotor->bypage AND $this->plxMotor->plxGlob_arts->count>$this->plxMotor->bypage) {
    			foreach ($this->plxMotor->plxGlob_arts->aFiles as $k=>$v) {
    				$cat = substr($v,5,3);
    				if (strpos($v,'.home.') !== false ){
    					$count['home']++;
    				}
    				if (in_array($cat,$catsActives)) {
    					$count[$cat]++;
    				}
    			}
    			
    			# on supprime le n° de page courante dans l'url
    			$arg_url = $this->plxMotor->get;
    			if(preg_match('/(\/?)(page[0-9]+)$/',$arg_url,$capture)) {
    				$arg_url = str_replace($capture[2], '', $arg_url);
    			}
    			if(!empty($arg_url) AND empty($capture[1])) $arg_url .= '/';
    			# Calcul des pages
    			$prev_page = $this->plxMotor->page - 1;
    			$next_page = $this->plxMotor->page + 1;
    			
    			if ($count[$this->plxMotor->plxRecord_arts->f('categorie')] != 0) {
    				$last_page = ceil($count[$this->plxMotor->plxRecord_arts->f('categorie')]/$this->plxMotor->bypage);
    			} else {
    				$last_page = 1;
    			}
    			
    			# Generation des URLs
    			$p_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$prev_page); # Page precedente
    			$n_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$next_page); # Page suivante
    			$l_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$last_page); # Derniere page
    			$f_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page1'); # Premiere page
    			# On effectue l'affichage
    			if($this->plxMotor->page > 2) # Si la page active > 2 on affiche un lien 1ere page
    				echo '<span class="p_first"><a href="'.$f_url.'" title="'.L_PAGINATION_FIRST_TITLE.'">'.L_PAGINATION_FIRST.'</a></span>';
    			if($this->plxMotor->page > 1) # Si la page active > 1 on affiche un lien page precedente
    				echo '<span class="p_prev"><a href="'.$p_url.'" title="'.L_PAGINATION_PREVIOUS_TITLE.'">'.L_PAGINATION_PREVIOUS.'</a></span> ';
    			# Affichage de la page courante
    			printf('<span class="p_page">'.L_PAGINATION.'</span>',$this->plxMotor->page,$last_page);
    			if($this->plxMotor->page < $last_page) # Si la page active < derniere page on affiche un lien page suivante
    				echo ' <span class="p_next"><a href="'.$n_url.'" title="'.L_PAGINATION_NEXT_TITLE.'">'.L_PAGINATION_NEXT.'</a></span>';
    			if(($this->plxMotor->page + 1) < $last_page) # Si la page active++ < derniere page on affiche un lien derniere page
    				echo ' <span class="p_last"><a href="'.$l_url.'" title="'.L_PAGINATION_LAST_TITLE.'">'.L_PAGINATION_LAST.'</a></span>';
    		}
    	}
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    bonjour

    Je te propose plutôt cette version.
    Peux-tu me confirmer que ton problème de pagination est corrigé avec cette version.
    Merci

    public function pagination() {
    		# Hook Plugins
    		if(eval($this->plxMotor->plxPlugins->callHook('plxShowPagination'))) return;
    		
    		$plxGlob_arts = clone $this->plxMotor->plxGlob_arts;
    		$aFiles = $plxGlob_arts->query($this->plxMotor->motif,'','',0,false,'before');
    
    		if($aFiles AND $this->plxMotor->bypage AND sizeof($aFiles)>$this->plxMotor->bypage) {
    			
    			# on supprime le n° de page courante dans l'url
    			$arg_url = $this->plxMotor->get;
    			if(preg_match('/(\/?)(page[0-9]+)$/',$arg_url,$capture)) {
    				$arg_url = str_replace($capture[2], '', $arg_url);
    			}
    			if(!empty($arg_url) AND empty($capture[1])) $arg_url .= '/';
    			# Calcul des pages
    			$prev_page = $this->plxMotor->page - 1;
    			$next_page = $this->plxMotor->page + 1;
    			$last_page = ceil(sizeof($aFiles)/$this->plxMotor->bypage);
    			# Generation des URLs
    			$p_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$prev_page); # Page precedente
    			$n_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$next_page); # Page suivante
    			$l_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page'.$last_page); # Derniere page
    			$f_url = $this->plxMotor->urlRewrite('?'.$arg_url.'page1'); # Premiere page
    			# On effectue l'affichage
    			if($this->plxMotor->page > 2) # Si la page active > 2 on affiche un lien 1ere page
    				echo '<span class="p_first"><a href="'.$f_url.'" title="'.L_PAGINATION_FIRST_TITLE.'">'.L_PAGINATION_FIRST.'</a></span>';
    			if($this->plxMotor->page > 1) # Si la page active > 1 on affiche un lien page precedente
    				echo '<span class="p_prev"><a href="'.$p_url.'" title="'.L_PAGINATION_PREVIOUS_TITLE.'">'.L_PAGINATION_PREVIOUS.'</a></span> ';
    			# Affichage de la page courante
    			printf('<span class="p_page">'.L_PAGINATION.'</span>',$this->plxMotor->page,$last_page);
    			if($this->plxMotor->page < $last_page) # Si la page active < derniere page on affiche un lien page suivante
    				echo ' <span class="p_next"><a href="'.$n_url.'" title="'.L_PAGINATION_NEXT_TITLE.'">'.L_PAGINATION_NEXT.'</a></span>';
    			if(($this->plxMotor->page + 1) < $last_page) # Si la page active++ < derniere page on affiche un lien derniere page
    				echo ' <span class="p_last"><a href="'.$l_url.'" title="'.L_PAGINATION_LAST_TITLE.'">'.L_PAGINATION_LAST.'</a></span>';
    		}
    	}
    

    Consultant PluXml

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

  • Ça m'a l'air bon. Testé sur deux sites différents. Je ne vois pas d'erreur. Merci.
  • StéphaneStéphane Member, Former PluXml Project Manager
    ok vendu
    Merci ;)

    Consultant PluXml

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

  • Salut !!!
    Où dois-je placer ce code pour que cela fonctionne ?
    A la place de
    <p id="pagination"><?php $plxShow->pagination(); ?></p>
    
    ?
  • k610i a écrit:
    Salut !!!
    Où dois-je placer ce code pour que cela fonctionne ?
    A la place de
    <p id="pagination"><?php $plxShow->pagination(); ?></p>
    
    ?

    Non, c'est directement dans le fichier core/lib/class.plx.show.php
  • StéphaneStéphane Member, Former PluXml Project Manager
    Edite le fichier core/lib/class.plx.show.php et remplace toute la fonction pagination par le code que j'ai donné plus haut dans ce post.
    Cette modif sera inclue dans la prochaine version de PluXml pour corriger le bug

    Consultant PluXml

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

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