plxRecord_arts->loop() sur une catégorie

P3terP3ter Responsable de PluXml
Bonjour,

Je cherche à afficher des articles de différentes catégories sur home.php, mais avec un affichage différents par catégorie.

Exemple :
Catégorie 1 :
- Titre de l'article
- Date de publication
- Tags

Catégorie 2 :
- Titre de l'article
- Date de publication
- Contenu du chapo

Exemple de code que j'utilise :
<?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
<?php if ($plxShow->plxMotor->plxRecord_arts->f('categorie')=='001'): ?>
    <article role="article">
	<div class="preview">
		<?php $plxShow->artCat(); ?>
		<?php $plxShow->artTitle('link'); ?>
	</div>	
    </article>
<?php endif; ?>
<?php endwhile; ?>


Mais ça ne fonctionne pas correctement : si l'article à plusieurs catégories il n'est pas affiché (normal car le if test une égalité stricte).
Comment faire pour afficher tous les articles qui font au moins partie de la catégorie '001' ?

Réponses

  • StéphaneStéphane Membres, Ancien responsable de PluXml
    Salut P3ter
    Essaye ça:
    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    <?php if(in_array('001', $plxShow->artCatIds)): ?>
        <article role="article">
    	<div class="preview">
    		<?php $plxShow->artCat(); ?>
    		<?php $plxShow->artTitle('link'); ?>
    	</div>	
        </article>
    <?php endif; ?>
    <?php endwhile; ?>
    

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • n'oublies pas d'éventuellement stopper l'affichage s'il y en a trop et de mettre un lien du type "Voir tous les articles de la catégorie" car la pagination de fonctionne pas dans ce cas ;p
  • P3terP3ter Responsable de PluXml
    Merci beaucoup pour votre aide

    @Stephane : avec ton code, aucun n'article ne s'affiche.

    @danielsan : effectivement, je n'y avais pas pensé. Pour n'affiche que 3 articles, j'utilise un incrément "i" :
    <?php $i=1; ?>
    <?php while($plxShow->plxMotor->plxRecord_arts->loop() AND $i<4): ?>
    ...
    <?php $i++; ?>
    <?php endwhile; ?>
    
  • StéphaneStéphane Membres, Ancien responsable de PluXml
    oups désolé.
    là ça devrait etre mieux
    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    <?php if(in_array('001', $plxShow->artActiveCatIds())): ?>
        <article role="article">
    	<div class="preview">
    		<?php $plxShow->artCat(); ?>
    		<?php $plxShow->artTitle('link'); ?>
    	</div>	
        </article>
    <?php endif; ?>
    <?php endwhile; ?>
    

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • P3terP3ter Responsable de PluXml
    C'est bon ça marche, merci Stéphane.

    Et pour revenir au début de la boucle (et afficher d'autres articles) je fais :
    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    <?php endwhile; ?>
    
  • P3terP3ter Responsable de PluXml
    Bonsoir,


    J'ai une nouvelle question sur plxRecord_arts->loop(). Comment faire pour utiliser la boucle ci-dessous, cette fois, sans prendre en compte la catégorie active ? Je souhaite faire cette boucle dans sidebar.php pour y afficher les derniers articles, peu importe ou on se trouve sur le site.

    <?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
    ...
    <?php endwhile; ?>
    
  • regarde la fonction lastArtList ;)
  • P3terP3ter Responsable de PluXml
    Bonjour,


    Oui j'y avait pensé, mais j'ai pas réussi à faire ce que je veux.


    Voici mon code avec plxRecord_arts :
    <?php $i=1; ?>
    <?php while($i<=6 AND $plxShow->plxMotor->plxRecord_arts->loop()): ?>
    	<div class="last-col">
    		<div class="last-content">	
    			<a class="big-link" href="<?php $plxShow->artUrl() ?>">
    				<div class="last-info">
    					<h2><?php $plxShow->artTitle(); ?></h2>
    				</div>
    				<?php eval($plxShow->callHook('champArt', 'preview')); ?>
    			</a>
    		</div>
    	</div>
    <?php $i++; ?>
    <?php endwhile; ?>
    

    Et ce que j'ai essayé avec lastArtlist :
    <?php $plxShow->lastArtList(
    '
    	<div class="last-col">
    		<div class="last-content">
    			<a class="big-link" href="#art_url" title="#art_title">
    				<div class="last-info">
    					<h2>#art_title</h2>
    				</div>
    				<?php eval($plxShow->callHook('champArt', 'preview')); ?>
    			</a>
    		</div>
    	</div>
    ',3) ?>
    

    Le deuxième code ne fonctionne pas, la page sidebar.php ne s'affiche pas du tout. Je soupçonne le code php au milieu de la fonction lastArtList.
  • danielsandanielsan Membres
    mars 2013 modifié
    et en remplaçant
    <?php eval($plxShow->callHook('champArt', 'preview')); ?>
    
    par
    <?php echo $plxShow->plxMotor->plxRecord_arts->f('champArt_preview'); ?>
    
    dans ton premier code ça donne quoi ?
  • P3terP3ter Responsable de PluXml
    J'ai essayé, j'ai le même résultat à savoir que la boucle affiche toujours les derniers articles de la catégorie active. Visible ici : pre.p3ter.fr
  • Je dédouble ici un message déposé dans une rubrique qui a un statut résolu, mon problème étant que la résolution fournie est une solution de rechange qui ne peut être utilisée dans le contexte où je me trouve.

    Mon contexte trop long à expliquer me force à utiliser la boucle WHILE mentionnée en début de rubrique. Je n'ai pas le luxe de pouvoir utiliser la fonction lastArtList, j'ai trop d'opérations à effectuer sur l'enregistrement avant de décider s'il sera affiché ou sauté.
    Mes contraintes demandent donc la production et l'affichage d'une page statique qui tourne une boucle WHILE plxRecord_arts->loop(), comme sur l'accueil ou certaines pages de catégorie un peu plus évoluées, mais qui affiche tous les articles. J'ai lu et essayé tout ce que j'ai pu trouver mais je frappe un mur.
    Je simplifie le sujet pour les besoins de la cause, vous comprenez bien que mon travail n'est pas terminé une fois cet obstacle surmonté.
  • StéphaneStéphane Membres, Ancien responsable de PluXml
    @Pierre

    Voilà le genre de code que tu peux utiliser dans une page statique pour récupérer les infos sur les articles (récupération de tous les articles publiés dans les catégories actives, tri par date décroissante)
    <?php
    
    $plxMotor = plxMotor::getInstance();
    
    $plxGlob_arts = clone $plxMotor->plxGlob_arts;
    if($files = $plxGlob_arts->query('/^[0-9]{4}.[home|'.$plxMotor->activeCats.',]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort',0,false,'before')) {
    
    	foreach($files as $filename) {
    
    		$tmp = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$filename);
    
    		plxUtils::debug($tmp);
    		
    		$art = array(
    			'id'		=> $tmp['numero'],
    			'url' 		=> $plxMotor->urlRewrite('?article'.intval($tmp['numero']).'/'.$tmp['url']),
    			'title' 	=> $tmp['title'],
    			'date'		=> $tmp['date'],
    			'author'	=> $plxMotor->aUsers[$tmp['author']]['name'],
    		);		
    		
    		plxUtils::debug($art);
    	}
    }
    
    ?>
    

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Ah merci, mais c'est génial quand on sait ce qu'on fait! Merci de me faire retrouver ma sanité mentale et de me laisser passer au prochain problème. Ce petit outil passe-partout va sans doute m'être très utile, très souvent. Merci encore.
  • Super ce bout de code!

    Peut-on faire la même avec les catégories? pour faire le lien avec les catégories histoire d'avoir les noms et pas des simple numéro et savoir aussi si on la catégorie doit s'afficher sur la page d'accueil.
  • Pour ceux que ça intéresse j'ai recoupé avec
    [== PHP ==]
    		# categories
    		$cats = explode(",", $art['categorie']);
    		$showCat = true;
    		$artCat ='<ul class="cat_list">';
    		foreach($cats as $item) {
    			$catArray = $plxMotor->aCats[$item];
    			$artCat .= '<li class="cat-'.$item.'">'.$catArray['name'].'</li>';
    			//plxUtils::debug($catArray);
    			// Si une categorie ne s'affiche pas en page d'accueil
    			// on n'affiche pas l'article
    			if($catArray['homepage'] == 0){
    				$showCat = false;
    			}
    		}
    		$artCat .='</ul>';
    
    pour avoir le nom des catégories.
Connectez-vous ou Inscrivez-vous pour répondre.