Bug affichage page catégorie, $plxShow->artCat(); et boucle

BloodyBloody Member
Bonjour,

Je ne sais pas si c'est bug déjà signalé. :/

Dès que je passe la class <?php $plxShow->artCat(); ?> en dehors de la boucle d'affichage des articles,
le nombre d'article affiché est égale n-1.

Donc si la catégorie a un seul article, il y a aucun article d'affiché.

Par contre, dès que j'enlève la fonction tout est normal. Difficile de réaliser un fil d’Ariane dans ce cas ! :D

Je vous met un lien, ici j'ai une cartouche utilisant aussi catDescription() et artCat() :
http://portfolio.chantdeleau.com/categorie2/packaging-et-logotypes

Réponses

  • BloodyBloody Member
    Le problème d'affichage avec n-1 articles apparaît aussi avec la fonction catDescription() seule, si elle est en dehors de la boucle. :/

    Je vous met le code de ma page article pour voir d'où le problème.
    <?php include(dirname(__FILE__).'/header.php'); # On insere le header ?>
    
    		<!-- Begin #colLeft -->
    		<div id="colLeft">
    
    		<!-- archive-title -->				
    		<div id="archive-title">
    			<?php $plxShow->mainTitle('link'); ?> ► Projets ► 
    		</div>
    		<!-- /archive-title -->
    		<div id="blurb" class="cartouche">
    			<span class="cat-icon<?php echo $plxShow->artCatId(); ?> alpha"></span>
    			<h2><?php $plxShow->artCat(); ?></h2>
    			<p><?php $plxShow->catDescription() ?></p>
    		</div>
    		<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>
    		<!-- Begin .postBox -->
    		<div class="postItem">		
    				<h2><?php $plxShow->artTitle('link'); ?></h2> 
    				        <div class="meta">
    							<?php $plxShow->artDate('#num_day #num_month #num_year(4)'); ?>   //   
    							<?php $plxShow->lang('WRITTEN_BY') ?> <span class="author"><<?php $plxShow->artAuthor() ?><span/>   //    
    							<?php $plxShow->lang('CLASSIFIED_IN') ?> :  <?php $plxShow->artCat(); ?>  //   
    							<?php $plxShow->lang('TAGS') ?> : <?php $plxShow->artTags(); ?>
    							<span><?php $plxShow->artNbCom(); ?></span> 
    						</div>
    							<?php ob_start(); 
    							$plxShow->artContent($chapo=true);
    							$content = ob_get_clean();
    							$masque = '#<img.+src="(.+?)"#i'; preg_match($masque, $content, $resultats);
    							$extension = pathinfo($resultats[1], PATHINFO_EXTENSION); ?>
                        
    							<?php if($extension['extension'] == ('jpg'||'jpeg'||'png'||'gif')) : ?>
    							
    						
    							<a href="<?php $plxShow->artUrl($type='relatif'); ?>" rel="bookmark" title="Lien vers <?php $plxShow->artTitle(''); ?>">        
    							<img src="<?php $plxShow->template(); ?>/thumb.php?src=<?php echo $resultats[1]; ?>&w=400&h=150&zc=1&q=100" alt="<?php $plxShow->artTitle(''); ?>" width="400px" height="150px" class="thumbnail-400-150" />
    							</a>
    						
    							<?php else : ?>
    						<div>
    							<a href="<?php $plxShow->artUrl($type='relatif'); ?>" rel="bookmark" title="Lien vers <?php $plxShow->artTitle(''); ?>">        
    							<img src="<?php $plxShow->template(); ?>/thumb.php?src=<?php $plxShow->template(); ?>/images/nothumb.jpg&w=400&h=150&zc=1&q=100" alt="<?php $plxShow->artTitle(''); ?>" width="400px" height="150px" class="thumbnail-400-150" /></a>
    							</a>
    						<div/>	
    
    							<?php endif; ?>							
    				<?php $plxShow->artChapo(); ?>
    				<div class="clear"></div>
    				<a title="En savoir plus ..." class="more-new" href="<?php $plxShow->artUrl('absolu'); ?>">Lire la suite ► </a>
    		</div>		
    		<!-- End .postBox -->
    		<?php endwhile; # Fin de la boucle sur les articles ?>
    
    		<div class="feed_categorie"><?php $plxShow->artFeed('atom',$plxShow->catId()); ?></div>
    		<?php # On affiche la pagination ?>
    		<p id="pagination"><?php $plxShow->pagination(); ?></p>
    		</div>
    		<!-- End #colLeft -->
    	<?php include(dirname(__FILE__).'/sidebar.php'); # On insere la sidebar ?>
    <?php include(dirname(__FILE__).'/footer.php'); # On insere le footer ?>
    
    Merci par avance. ;)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Ces fonctions ne sont pas faites pour ete utilisées en dehors de la boucle.

    Consultant PluXml

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

  • BloodyBloody Member
    Merci Stéphane. ;)

    Dommage car, je trouvais plutôt sympa de pourvoir mettre un fil d'ariane et surtout logique de mettre la description d'une catégorie avant de lister les articles qui en font partie.

    Il n'y a pas un moyen de contourner ce problème ? :)
  • HamtaroHamtaro Member
    juin 2011 modifié
    TU peux utiliser catList : http://devzone.pluxml.org/?plxShow/function/catList

    Dans ton CSS, tu fais un display : none sur une class définie pour tous les li (ou autre balise, cela dépend comment tu structures ton fil)
    Et ensuite pour la class active, tu lui fais un display:inline-block par exemple, qui te permettra donc d'afficher uniquement la catégorie de la page affichée et ce en dehors de la boucle ;)

    Nan ? :p
  • BloodyBloody Member
    juin 2011 modifié
    Merci Hamtaro. :)
    Le fameux display none. :P Pas très catholique mais bon ! :D
    <?php $plxShow->catList('','<a href="#cat_url" title="#cat_name" class="ariane">#cat_name</a>'); ?>
    
    /*Test CSS N°1*/
    .ariane{ 
    	display:none;	}
    	
    .ariane:active{ 
    	 display:inline-block;}
    
    /*Test CSS N°2*/
    .ariane{ 
    	display:none;	}
    	
    .ariane a:active{ 
    	 display:inline-block;}
    
    Nada. :/ Seul le "none" fonctionne. J'ai essayé le "block" et le "inline" seul; pour le lien actif, pas mieux.

    Sinon, crois tu qu'il est possible d'afficher autrement la description de la catégorie en cours, en dehors de la boucle, en utilisant, cet extrait de la class plx show ? :)
    * Méthode qui affiche le contenu de la description d'une catégorie
    	 *
    	 * @return	stdout
    	 * @scope	categorie,article
    	 * @author	Stephane F.
    	 **/
    	public function catDescription() {
    
    		# On va verifier que la categorie existe en mode categorie
    		if($this->plxMotor->mode == 'categorie' AND isset($this->plxMotor->aCats[$this->plxMotor->cible]))
    			echo plxUtils::strcheck($this->plxMotor->aCats[$this->plxMotor->cible]['description']);
    		# On va verifier que la categorie existe en mode article
    		if($this->plxMotor->mode == 'article' AND isset($this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]))
    			echo plxUtils::strCheck($this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]['description']);
    
    	}
    
  • Peut être cela :
    <?php echo plxUtils::strCheck($plxShow->plxMotor->aCats[ $plxShow->plxMotor->cible ]['description']); ?>
    
    Et pour le "display:none/dispay:inline", il faut que tu mettes le "active" en id, il surpassera les directives données à la class normal ;)
  • BloodyBloody Member
    Peut être cela :
    Hamtaro a écrit:
    <?php echo plxUtils::strCheck($plxShow->plxMotor->aCats[ $plxShow->plxMotor->cible ]['description']); ?>
    
    Sympa ça et super ! La ligne, sans modifications, était dans le code plus haut. :) Et la description de ma catégorie apparue en dehors de la boucle !! :lol:
    Hamtaro a écrit:
    Et pour le "display:none/dispay:inline", il faut que tu mettes le "active" en id, il surpassera les directives données à la class normal ;)
    Bon je commence à perdre mon latin. :mad:
    J'ai testé l'id en div encadrant le nom de la catégorie, et directement dans le lien comme ceci :
    <?php $plxShow->catList('','<a href="#cat_url" title="#cat_name" id="block" class="ariane">#cat_name</a>'); ?>
    Il faut que je dorme. :P

    D'autant plus que je viens de m'apercevoir, <?php echo $plxShow->artCatId(); ?> n'était pas utilisable en dehors de la boucle, sans perturber l'affichage de tout les articles dans la catégorie.

    J'utilise cette fonction pour faire apparaître une illustration en fonction de l'id de la catégorie affichée + CSS.

    Merci encore Hamtaro. ;)
  • BloodyBloody Member
    juin 2011 modifié
    Bon pour éviter de passer par le display : none, pour faire apparaître le nom de la catégorie, j'ai placé le code suivant .
    <?php echo plxUtils::strCheck($plxShow->plxMotor->aCats[ $plxShow->plxMotor->cible ]['name']); ?>
    
    Et miracle, ça fonctionne. :P

    Pour remplacer <?php echo $plxShow->artCatId(); ?>, j'ai essayé
    <?php plxUtils::strCheck($plxShow->plxMotor->plxRecord_arts->f('categorie'));?>
    
    Evidemment ça ne s'affiche pas.

    J'ai essayé aussi ceci
    <?php ob_start();
    		$catId = explode(',', $this->plxMotor->plxRecord_arts->f('categorie'));?>
    		<?php echo catId; ?>
    
    "$this" n'est pas reconnu et pour cause je ne l'appelle pas.
    Des idées ! :)

    Franchement, existe-t-il un bouquin du genre php pour les nuls ? :P
  • HamtaroHamtaro Member
    juin 2011 modifié
    Essaie ça :
    <?php echo $plxShow->plxMotor->plxRecord_arts->f('categorie'); ?>
    
    Mais bon, je vois pas ce que tu veux faire au final ^^
  • BloodyBloody Member
    Merci Hamtaro. ;) Ton code fonctionne. L'id de la catégorie a 3 digits mais un j'ai modifié la CSS.

    Par contre, cette fonction elle aussi empêche l'affichage de la totalité des articles. Je suis toujours à n-1.

    Je fais apparaître un icone différent de la catégorie affichée, via CSS :
    Je te met des images de ça donne (icone à droite du screenshot) :

    Vue catégorie avec n-1 articles, mais sans le code d'affichage de l'icone :
    icon.png

    Même catégorie avec totalité des articles, mais sans affichage de l'icone :
    sans-icon.png

    Vue d'une seconde catégorie avec n-1 articles (ici 0), avec affichage de l'icone :
    sans-icon-cat2.png
  • Tu peux faire plus simple et créer un template categorie-nom_de_ta_categorie.php et ensuite faire la modif en dur sans variable ;)

    Après, au moment de la rédaction de tes articles, en plus de lui attribuer une catégorie, tu lui attribues le bon template.

    Tu vois ce que je veux dire ?
  • BloodyBloody Member
    Ben en fait, j'utilises déjà un template spécifique pour 3 catégories du genre categorie-portfolio.php.
    Ta solution est en effet la solution à laquelle j'avais pensé, en dernier recours. :)

    Vu que tu m'a résolu l'affichage de la catégorie, et de sa description, :P ça sera simple pour les mises à jour éventuelles des catégories. Ça devrait le faire. ^^

    Par contre, je ne comprend toujours pas pourquoi <?php $plxShow->catDescription(); ?> n'a été prévu pour être utilisé en dehors de la boucle.
    Une description de catégorie ne doit pas être répétée autant de fois qu'il y a d'articles .... Bizarre comme choix. :rolleyes:
    D'ailleurs sous Wordpress, le code équivalent de "catDescription();", s'utilise en dehors de la loop.

    Encore un grand merci Hamtaro. Sympa, pour un "petit" hamster ! ;)
  • HamtaroHamtaro Member
    juin 2011 modifié
    Tu peux également inclure la description de catégorie dans la boucle, lui attribuer un compteur et ainsi lui dire de ne s'afficher qu'une fois, c'est du genre comme ça :
    <?php $compteur = 0; ?>
    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>
    <?php if ($compteur < 1) : ?>
    <?php $plxShow->catDescription() ?>
    <?php endif; ?>
    
    // Ton affichage d'articles
    
    <?php $compteur++; ?>
    <?php endwhile; # Fin de la boucle sur les articles ?>
    
  • BloodyBloody Member
    Ben mince, j'aurai passé par là d'abord. Je ne pensais qu'un compteur pouvait être aussi facile à placer. C'est génial !. :P

    Du coup, j'ai remis les class php natives de Pluxml.

    Je met le code final pour ceux qui voudrait le même résultat. A adapter bien sur en fonction de chacun. :)
    <h2>Dernières réalisations</h2>
    
    					<?php $compteur = 0; ?>
    					<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>
    					<?php if ($compteur < 1) : ?>
    			<div id="blurb" class="cartouche">
    				<span class="cat-icon<?php echo $plxShow->artCatId(); ?> alpha"></span>
    				<h2><?php $plxShow->artCat(); ?></h2>
    				<p><?php $plxShow->catDescription(); ?></p>
    			</div>
    					<?php endif; ?>
    						<div class="portfolioItem">
    						<h3><?php $plxShow->artTitle('link'); ?></h3>
    							<?php ob_start(); 
    							$plxShow->artContent($chapo=true);
    							$content = ob_get_clean();
    							$masque = '#<img.+src="(.+?)"#i'; preg_match($masque, $content, $resultats);
    							$extension = pathinfo($resultats[1], PATHINFO_EXTENSION); ?>
                        
    							<?php if($extension['extension'] == ('jpg'||'jpeg'||'png'||'gif')) : ?>
    							
    							<a href="<?php $plxShow->artUrl($type='relatif'); ?>" rel="bookmark" title="Lien vers <?php $plxShow->artTitle(''); ?>">        
    							<img src="<?php $plxShow->template(); ?>/thumb.php?src=<?php echo $resultats[1]; ?>&w=278&h=200&zc=1&q=100" alt="<?php $plxShow->artTitle(''); ?>" width="278px" height="200px" class="img_border" />
    							</a>
    						
    							<?php else : ?>
    							<a href="<?php $plxShow->artUrl($type='relatif'); ?>" rel="bookmark" title="Lien vers <?php $plxShow->artTitle(''); ?>">        
    							<img src="<?php $plxShow->template(); ?>/thumb.php?src=<?php $plxShow->template(); ?>/images/nothumb.jpg&w=278&h=200&zc=1&q=100" alt="<?php $plxShow->artTitle(''); ?>" width="278px" height="200px" class="img_border" /></a>
    							</a>
    
    							<?php endif; ?>							
    							<p><?php $plxShow->artChapo(); ?></p>
    		<p><a title="En savoir plus ..." class="more-new" href="<?php $plxShow->artUrl('absolu'); ?>">Voir le projet ► </a></p>
    					</div>
    		<!-- End .postBox -->
    		<?php $compteur++; ?>
    <?php endwhile; # Fin de la boucle sur les articles ?>
    
    Un grand merci Hamtaro pour le temps passé à résoudre mes petits problèmes. ^^
    [HS]Au fait Hamtaro, je te suis sur Twitter. @chantdeleau[/HS] ;)
  • BloodyBloody Member
    Mince, j'oubliais le lien vers le résultat de cette page de catégorie. :)
    C'est ici : http://portfolio.chantdeleau.com/categorie1/web
  • Tu as un trait vertical qui doit être la séparation sidebar en affichage classique, il faudrait modifier cela pour un affichage eb pleine page. :p
  • BloodyBloody Member
    :lol: Ouai merci. Je l'avais vu celui là et un peu laissé de coté. :P Un bkg 3x2px placé à 695 px. J'ai dû le déplacé en sidebar. :)
    C'est corrigé ! ;)
  • cool !
    ça marche aussi pour moi ;)
  • Cool ! ;) C'est pour la refonte de ton site principal ? :)
  • pour mes 3 sites et 5 blogs ... boulot-boulot ! mais archi plaisant :P
    J'espère y arriver d'ici 15jrs ! 8)
  • Rien que ça !! :| Bon courage ! ;)
    Une fois terminé, tu pourras les lister sur le wiki :

    Si tu veux un coup de main, je suis partant. :P Même si je sais que tu n'as pas franchement besoin de mon aide. :D
  • Merci pour la proposition. Mais ça va aller :P
    Beaucoup de graphismes et j'aime prendre mon temps :D

    J'ai vu pour le Wiki, je n'y manquerai pas !
  • OK Daniel. ;)
  • danielsandanielsan Member
    août 2011 modifié
    Je re pour vous faire par d'une bizarrerie ...
    On dirait que le titre de la catégorie vient de celle du premier article affiché.
    Or, si ce dernier fait partie de plusieurs catégories,
    le titre de la page catégorie contient le nom de toutes les catégories auxquelles appartient cet article.

    Vous me suivez ?
    Bloody tu as apparemment ce pb sur ton site ...

    Au lieu d'utiliser les renseignement de cet article, peut-être faire une comparaison entre l'URL et le fichier categories.xml
  • danielsandanielsan Member
    août 2011 modifié
    Presque 2 heures plus tard ...
    une solution qui a l'air de marcher chez moi,
    je ne comprends d'ailleurs pas pourquoi artCatTitle() n'est pas basé comme catDescription().
    D'où ma proposition:
    public function catTitle() {
    
    		# On va verifier que la categorie existe en mode categorie
    		if($this->plxMotor->mode == 'categorie' AND isset($this->plxMotor->aCats[$this->plxMotor->cible]))
    			echo $this->plxMotor->aCats[$this->plxMotor->cible]['name'];
    		# On va verifier que la categorie existe en mode article
    		if($this->plxMotor->mode == 'article' AND isset($this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]))
    			echo $this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]['name'];
    
    	}
    
    et dans le template catégorie, utiliser <?php $plxShow->catTitle(); ?>.

    Si vous pouvez me donner un retour.

    Cordialement,
    _____
    D.San
  • Exact, j'ai ce problème. S'affiche en 1er la catégorie de l'article le plus récent. :/
    Je n'ai pas réussi à le résoudre.

    Je réussi tout de même à faire apparaître correctement l'icone (au survol de l'image) spécifique de la catégorie de chaque article au lieu d'une absence icone (je ne sais si je suis clair). Ce qui est bizarre.
    Le code pour cet icone est pourtant seulement le suivant :
    <span><img src="<?php $plxShow->template(); ?>/images/<?php echo $plxShow->artCatId(); ?>.png" border="0"></span></a>
    
  • Vi c'est bizarre ça ... attendons les lève-tôt :P
  • SudwebdesignSudwebdesign Member
    juillet 2012 modifié
    Bonjour à Tous et à Toutes,

    J'ai aussi débusqué le même style de bug :
    Lorsque je place "$plxShow->artCat();" avant la boucle d'affichage des articles d'une catégorie il manque l'article le plus récent de cette catégorie.
    Par contre lorsque je le place après la boucle tout est nickel ;-)

    J'ai fais plusieurs essais et c'est tjrs le plus récent qui ne s'affiche pas, même avec le theme defaut.

    Je pencherai vers $this->plxMotor->plxRecord_arts->f('categorie')) dans la fonction artCat puisque l'on utilise plxMotor->plxRecord_arts->loop(), mais je ne connait pas assez bien se superbe outil qu'est PluXml.


    J'ai donc integré la fonction catTitle() dans class.plx.show.php de PluXml 5.1.6 et cela fonctionne bien.

    Longue et belle vie a PluXml


    ps : s'il a la possibilité d'utiliser artCat() avant la boucle d'affichage des articles d'une catagorie, ça m'interresse aussi.
    [edit]c'est trouvé ^^[/edit]
    danielsan a écrit:
    public function catTitle() {
    
    		# On va verifier que la categorie existe en mode categorie
    		if($this->plxMotor->mode == 'categorie' AND isset($this->plxMotor->aCats[$this->plxMotor->cible]))
    			echo $this->plxMotor->aCats[$this->plxMotor->cible]['name'];
    		# On va verifier que la categorie existe en mode article
    		if($this->plxMotor->mode == 'article' AND isset($this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]))
    			echo $this->plxMotor->aCats[$this->plxMotor->plxRecord_arts->f('categorie')]['name'];
    
    	}
    

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • SudwebdesignSudwebdesign Member
    juillet 2012 modifié
    Une solution simple et qui fonctionne :

    après avoir afficher artCat()
    lancer une boucle vide
    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    <?php endwhile; ?>
    

    cela remet le pointeur au début (artcat doit etre prévu pour être dans une boucle).

    Un peu alambiqué, mais affiche bien tous les articles de la catégorie par la suite.

    Cette instruction est à placer dans le theme Boldy et peut être ailleurs...
    @ PluX

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

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