[résolu] Lister les articles d'une catégorie par catégorie

aruhunoaruhuno Member
octobre 2013 modifié dans Entraide
Bonjour à tous !

Derrière mon titre qui ne veut peut être rien dire, je cherche à faire un truc assez simple dans l'idée, mais peut être pas dans sa réalisation.
En gros, je veux que lorsqu'on arrive sur une page d'une catégorie, on est la liste de ses articles. Jusque là, tout va bien, mais dans la sidebar de cette liste d'article de la catégorie, je voudrait un menu catégorie qui cette fois listerais les articles d'une "sous-catégorie".

J'imagine que c'est pas plus clair ^^
En gros, je veux pouvoir lister des articles selon deux critères qui seraient justement, les catégories.

Exemple "concret" :
- je suis dans la page "Dossier"
- je vois dans la sidebar la liste des catégories (sauf dossier évidemment)
- je clique sur une de ces catégories
- j'arrive alors sur la liste d'article de cette catégorie choisie qui eux mêmes sont de la catégorie "Dossier"

J'ai conscience que je m'explique comme un manche, donc si vous avez des questions, allez-y.

Merci d'avance à ceux qui feront l'effort de me lire et d'essayer de m'aider !

PS: (pour les dev de PluXml) pourquoi ne pas permettre le filtrage des catégories par leur nom et non par leur ID ?

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour aruhuno
    PluXml ne gère pas les sous-catégories. Donc tout s'arrete là...
    aruhuno a écrit:
    PS: (pour les dev de PluXml) pourquoi ne pas permettre le filtrage des catégories par leur nom et non par leur ID ?
    Filtrage des catégories à quel endroit ?

    Consultant PluXml

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

  • Tu veux en somme avoir accès a tout les articles (titres) d'une catégorie en sidebar ?
  • aruhunoaruhuno Member
    septembre 2013 modifié
    Tout d'abord, merci à tous les deux pour votre intérêt.
    Stéphane a écrit:
    Bonjour aruhuno
    PluXml ne gère pas les sous-catégories. Donc tout s'arrete là...
    aruhuno a écrit:
    PS: (pour les dev de PluXml) pourquoi ne pas permettre le filtrage des catégories par leur nom et non par leur ID ?
    Filtrage des catégories à quel endroit ?
    En gros pour utiliser le nom comme paramètre à la fin de "$plxShow->lastArtList" notamment.

    Frédéric a écrit:
    Tu veux en somme avoir accès a tout les articles (titres) d'une catégorie en sidebar ?
    Non, lister les articles de cette façon : membre_cat1 && membre_cat2.
    Le plus simple est effectivement la mise en place de sous-catégorie, mais cela n'est pas possible avec PluXml et ne réponds pas pleinement à mon besoin.

    Je vais essayer d'être plus clair, voici une liste de catégorie :
    [list=*]
    [*]dossiers
    1. cuisine
    2. cinéma
    3. informatique
    4. sortie
    5. etc...
    [/*]
    [*]astuces
    1. cuisine
    2. cinéma
    3. informatique
    4. sortie
    5. etc...
    [/*]
    [/list]

    En somme, ce ne sont pas des sous catégories, puisque communes. Par contre, ce que je voudrais, c'est que sur la page "dossier", voir la liste des articles de cette catégorie (comportement de base de PluXml). Mais, en plus, dans la sidebar, on verrait les autres catégorie sauf "dossiers" et "astuces". Donc du coup, je clique sur la catégorie cuisine, j'arrive alors sur la liste des articles appartenant à la catégorie cuisine, mais aussi à celle "dossiers" (puisque je viens de la page "dossiers").
  • Erf, j'ai perdu tout le monde avec ma question ><
  • Bonjour,

    En fait, je peux faire ça en listant simplement les catégories d'un article.
    Toutefois, comment lister les catégories d'un article sans les afficher ?

    Merci d'avance à ceux qui me répondront =]
  • StéphaneStéphane Member, Former PluXml Project Manager
    Salut aruhuno
    Tu peux regarder la fonction artCat dans le fichier core/lib/class.plx.show.php
    Cette fonction affiche les catégories d'un article. S'il te faut d'autres infos n'hésite pas

    Consultant PluXml

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

  • aruhunoaruhuno Member
    octobre 2013 modifié
    Merci de ta réponse Stéphane =]

    Mais justement, je ne veux pas afficher les catégories d'un articles, mais les stocker dans une variable.
    Ça me permettrait notamment de jouer avec un explode().

    PS : si j'ai bien lu le wiki, plxShow affiche ><
  • StéphaneStéphane Member, Former PluXml Project Manager
    à la place des echo de la fonction artCat, tu stockes les infos dans une variable. Tu as dans cette fonction toutes les manips à faire pour récupérer les catégories d'un article

    Consultant PluXml

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

  • Ah oui, d'accord, je viens de comprendre ce que tu veux dire ^^
    M'inspirer de cette fonction pour en faire une sans echo donc ? =]
  • Ou alors tu peux récupérer dans une variable ce que devrait afficher la fonction echo, de cette façon-là :
    [== PHP ==]
    ob_start();
    
    $plxShow->catList('','#cat_id;');
    
    $mavariable = ob_get_clean();
    

    A partir de $mavariable, tu peux te créer un tableau contenant les catégories actives, et avec une boucle, afficher la liste des articles de chacune d'entre-elles.
    Tu peux même récupérer les noms des catégories avec la fonction catList (voir le fonctionnement de cette fonction ici).
  • Francis a écrit:
    Ou alors tu peux récupérer dans une variable ce que devrait afficher la fonction echo, de cette façon-là :
    [== PHP ==]
    ob_start();
    
    $plxShow->catList('','#cat_id;');
    
    $mavariable = ob_get_clean();
    

    A partir de $mavariable, tu peux te créer un tableau contenant les catégories actives, et avec une boucle, afficher la liste des articles de chacune d'entre-elles.
    Tu peux même récupérer les noms des catégories avec la fonction catList (voir le fonctionnement de cette fonction ici).

    Pas mal comme astuce, mais ne semble pas fonctionner sur mon OVH ><
    Message de Firefox : The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

    J'ai essayer comme ça :
    [== PHP ==]
    ob_start();
    $plxShow->artCat('|');
    $categories = ob_get_clean();
    $tmp = explode("|", $categories);
    echo '<p class="source">'.$tmp[0].' : '.$tmp[1].'</p
    

    Je vais voir le truc de Stéphane dès que j'ai un peu de temps =]
  • Je n'ai pas testé ton code, mais cette méthode marche très bien pour moi chez OVH, tout comme en local.
  • aruhunoaruhuno Member
    octobre 2013 modifié
    Normal que ça ne fonctionnait pas, manquait le ob_end_flush(); =]
    [== PHP ==]
    ob_start();
    $plxShow->artCat('|');
    $categories = ob_get_clean();
    $tmp = explode("|", $categories);
    echo '<p class="source">'.$tmp[0].' : '.$tmp[1].'</p>';
    ob_end_flush();
    

    Merci pour ton astuces !
    Maintenant va falloir que je mettes ça en forme ^^
  • Le ob_get_clean remplace le ob_end_flush
  • aruhunoaruhuno Member
    octobre 2013 modifié
    Si je l'enlève ma page affiche "The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression." ><
  • J'utilise toujours ob_start puis ob_get_clean, jamais ob_end_flush, et je n'ai aucun problème.

    Tu pourrais essayer de désactiver la compression GZIP de PluXml, pour voir : c'est dans Paramètres - Configuration avancée.
  • aruhunoaruhuno Member
    octobre 2013 modifié
    Bonjour,

    Je crois avoir mis en avant un petit bug dans le code de PluXML.
    En effet, avec le code suivant :
    [== PHP ==]
    $plxShow->artCat('|');
    
    j'obtient ça :
    Cat1Cat2|
    
    Ne devrais-je pas obtenir ceci :
    Cat1|Cat2|
    
    ?
    Francis a écrit:
    J'utilise toujours ob_start puis ob_get_clean, jamais ob_end_flush, et je n'ai aucun problème.

    Tu pourrais essayer de désactiver la compression GZIP de PluXml, pour voir : c'est dans Paramètres - Configuration avancée.
    J'avais dû oublier quelque chose, parce que ça marche maintenant avec ou sans =]

    Voilà ce que j'essaye de faire :
    [== PHP ==]
    ob_start();
    $plxShow->artCat('|');
    $categories = ob_get_clean();
    $tmp = explode("|", $categories);
    echo '<p class="source">'.$tmp[0].' : '.$tmp[1].'</p>';
    

    J'attends plus qu'une petite réponse pour ce bug, et ça sera tout bon ^^.
    Merci à vous tous !
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour aruhuno

    Le code suivant (par exemple dans home.php du thème par défaut de PluXml)
    $plxShow->artCat(' | ');
    

    m'affiche bien: Catégorie 1 | Catégorie 2 | Catégorie 3

    Consultant PluXml

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

  • aruhunoaruhuno Member
    octobre 2013 modifié
    Hum, je comprends pas pourquoi ça n'est pas mon cas ><

    Je fournis le code, au cas où j'ai raté quelque chose : http://pastebin.com/UZqv9gKx
    [== PHP ==]
    <?php include(dirname(__FILE__).'/header.php'); ?>
    
    	<div id="section">
    		<div class="content">
    			<div id="article">
    
    				<?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    
    				<div class="article">
    					<div class="article-head">
    						<p class="titre"><?php $plxShow->artTitle('link'); ?></p>
    						<?php
    							if ($plxShow->callHook('champArt', 'source_R') != "") {
    								echo '<p class="source">' . $plxShow->callHook('champArt', 'source_R') . '</p>';
    							}
    							else {
    								ob_start();
    								$plxShow->artCat('|');
    								$categories = ob_get_clean();
    								$tmp = explode("|", $categories);
    								echo '<p class="source">'.$tmp[0].' : '.$tmp[1].'</p>';
    							}
    						?>
    					</div>
    					
    					<div class="article-content">
    						<?php $plxShow->artChapo('[Lire la suite...]'); ?>
    					</div>
    
    					<div class="article-info">
    						<div class="commentaires">
    							<?php $plxShow->artNbCom('<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb', '<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb','<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb'); ?>
    						</div>
    						<div class="infos">
    							<?php $plxShow->lang('WRITTEN_BY') ?> <a href="l-equipe#<?php $plxShow->artAuthor() ?>"><?php $plxShow->artAuthor() ?></a> le <?php $plxShow->artDate('#num_day #month #num_year(4)'); ?>
    						</div>
    					</div>
    				</div>
    
    				<?php endwhile; ?>
    
    				<div id="pagination">
    					<?php $plxShow->pagination(); ?>
    				</div>
    
    			</div>
    
    		</div>
    	</div>
    
    <?php include(dirname(__FILE__).'/footer.php'); ?>
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    que cherches-tu à faire avec ce code ?
    ob_start();
    $plxShow->artCat('|');
    $categories = ob_get_clean();
    $tmp = explode("|", $categories);
    echo '<p class="source">'.$tmp[0].' : '.$tmp[1].'</p>';
    

    Consultant PluXml

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

  • aruhunoaruhuno Member
    octobre 2013 modifié
    Afficher quelque chose de ce genre :
    Catégorie 1 : Catégorie 2
    

    Comme je l’énonçais plus haut, mon but est de faire quelques catégories mères et plusieurs catégories enfantes, un peu comme ça par exemple :
    Astuce : en direct du travail
    Astuce : cuisine
    ..etc
    Dossier : en direct du travail
    Dossier : cuisine
    Dossier : cinéma
    ..etc
    
    Comme PluXML ne le permet pas, je triche et utilise ça que pour l'affichage, ce qui me va très bien d'ailleurs.
    De plus la catégorie mère à toujours un ID plus haut que celle des enfants, du coup affiché toujours avant eux ^^

    Autre avantage indéniable, c'est qu'en cliquant sur cuisine par exemple, je peux lister les dossiers ET les astuces.
    Bref, tu l'auras compris, ça me satisferais totalement ^^
  • aruhunoaruhuno Member
    octobre 2013 modifié
    Afficher quelque chose de ce genre :
    Catégorie 1 : Catégorie 2
    

    Comme je l’énonçais plus haut, mon but est de faire quelques catégories mères et plusieurs catégories enfantes, un peu comme ça par exemple :
    Astuce : en direct du travail
    Astuce : cuisine
    ..etc
    Dossier : en direct du travail
    Dossier : cuisine
    Dossier : cinéma
    ..etc
    
    Comme PluXML ne le permet pas, je triche et utilise ça que pour l'affichage, ce qui me va très bien d'ailleurs.
    De plus la catégorie mère à toujours un ID plus haut que celle des enfants, du coup affiché toujours avant eux ^^

    Autre avantage indéniable, c'est qu'en cliquant sur cuisine par exemple, je peux lister les dossiers ET les astuces.
    Bref, tu l'auras compris, ça me satisferais totalement ^^

    PS : je suis un boulet... normalement :
    [== PHP ==]
    $plxShow->artCat(' : ');
    
    m'afficherais bien :
    Catégorie 1 : Catégorie 2
    
    bon le truc, c'est que ça m'affiche ça :
    Catégorie 1Catégorie 2 :
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    Je necomprends pas tout (désolé).
    Peux-tu me donner un exemple concret avec un article, le nom des catégories dans lequel il est rattaché et ceux que tu veux voir affiché pour cet article

    Consultant PluXml

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

  • Ne t'excuse pas, je dois m'expliquer comme un manche pour pas changer ^^

    Ça c'est un article qui est sur la page d'accueil de mon PluXML donc recraché par home.php :
    1382088756.png

    Il se trouve dans les catégories suivantes :
    [list=*]
    [*]Page d'accueil[/*]
    [*]Astuces[/*]
    [*]en direct du travail[/*]
    [/list]

    Je veux qu'a la place de ça
    Astucesen direct du travail :
    
    ...je trouve ça
    Astuces : en direct du travail
    

    Actuellement, voici le code de home.php :
    [== PHP ==]
    <?php include(dirname(__FILE__).'/header.php'); ?>
    
    	<div id="section">
    		<div class="content">
    			<div id="article">
    
    				<?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    
    				<div class="article">
    					<div class="article-head">
    						<p class="titre"><?php $plxShow->artTitle('link'); ?></p>
    						<?php
    							if ($plxShow->callHook('champArt', 'source_R') != "") {
    								echo '<p class="source">' . $plxShow->callHook('champArt', 'source_R') . '</p>';
    							}
    							else {
    								$plxShow->artCat(' : ');
    							}
    						?>
    					</div>
    					
    					<div class="article-content">
    						<?php $plxShow->artChapo('[Lire la suite...]'); ?>
    					</div>
    
    					<div class="article-info">
    						<div class="commentaires">
    							<?php $plxShow->artNbCom('<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb', '<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb','<img src="themes/egarim/design/icon_comment.png" style="width:25px;"/> #nb'); ?>
    						</div>
    						<div class="infos">
    							<?php $plxShow->lang('WRITTEN_BY') ?> <a href="l-equipe#<?php $plxShow->artAuthor() ?>"><?php $plxShow->artAuthor() ?></a> le <?php $plxShow->artDate('#num_day #month #num_year(4)'); ?>
    						</div>
    					</div>
    				</div>
    
    				<?php endwhile; ?>
    
    				<div id="pagination">
    					<?php $plxShow->pagination(); ?>
    				</div>
    
    			</div>
    
    		</div>
    	</div>
    
    <?php include(dirname(__FILE__).'/footer.php'); ?>
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    ok j'ai compris ce qui se passe.
    le problème vient du fait que l'article est classé dans "Page d'accueil"
    sans mettre l'article dans cette catégorie l'affichage est bon.
    c'est donc bien un problème dans la fonction artCat
    bug #
    J'essaye de corriger ça rapidement pour te donner le code à modifier dans plxShow::artCat (en attendant la prochaine version de PluXml)

    Consultant PluXml

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

  • Hum, j'étais en train de me dire que je pouvais également sortir tous mes articles de la catégorie "Page d'accueil", mais en fait, j'ai des articles qui ne servent qu'a la page d'accueil.

    J'attends de tes nouvelles alors, merci beaucoup de ta patience !
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour aruhuno

    Voilà le code de la fonction artCats dans le fichier class.plx.show.php qui devrait résoudre ton problème avec le séparateur à l'affichage
    	public function artCat($separator=',') {
    
    		$cats = array();
    		# Initialisation de notre variable interne
    		$catIds = $this->artActiveCatIds();
    		foreach ($catIds as $idx => $catId) {
    			# On verifie que la categorie n'est pas "home"
    			if($catId != 'home') {
    				# On va verifier que la categorie existe
    				if(isset($this->plxMotor->aCats[ $catId ])) {
    					# On recupere les infos de la categorie
    					$name = plxUtils::strCheck($this->plxMotor->aCats[ $catId ]['name']);
    					$url = $this->plxMotor->aCats[ $catId ]['url'];
    					if(isset($this->plxMotor->aCats[ $this->plxMotor->cible ]['url']))
    						$active = $this->plxMotor->aCats[ $this->plxMotor->cible ]['url']==$url?"active":"noactive";
    					else
    						$active = "noactive";
    					# On effectue l'affichage
    					$cats[] = '<a class="'.$active.'" href="'.$this->plxMotor->urlRewrite('?categorie'.intval($catId).'/'.$url).'" title="'.$name.'">'.$name.'</a>';
    				} else { # La categorie n'existe pas
    					$cats[] =  L_UNCLASSIFIED;
    				}
    			} else { # Categorie "home"
    				$cats[] = '<a class="active" href="'.$this->plxMotor->urlRewrite().'" title="'.L_HOMEPAGE.'">'.L_HOMEPAGE.'</a>';
    			}
    		}
    		echo implode($separator, $cats);
    	}
    

    Peux-tu stp me confirmer que c'est ok avec ça. Merci

    Consultant PluXml

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

  • aruhunoaruhuno Member
    octobre 2013 modifié
    Salut Stéphane,

    Oui, ton fix fonctionne parfaitement bien, merci !
    Je tiens aussi à te remercier pour ta rapidité !

    Bon et bien du coup je passe en résolu parce que c'est tout bon pour moi =]

    edit : une petite option pour mettre uniquement du texte pourrait être pas mal (même si pour ma part, les liens me vont)
Connectez-vous ou Inscrivez-vous pour répondre.