[Astuce] Connaître le nombre d'articles de la catégorie active

danielsandanielsan Member
mars 2012 modifié dans Modifications
Bonjour,


je souhaitais faire une mise en page intermédiaire entre un site à son lancement ( 2 articles ) et son avenir.


C'était précisément pour afficher les liens articles suivants/précédents et la liste des articles de la catégorie active.
Avec seulement 2 articles cela n'était pas nécessaire mais plus tard, oui.
Et je n'avais pas très envie de revenir sur le boulot une fois livré au client :D

"Un sportif intelligent se dispense de tout effort inutile"
comme dirait le prof. de sport du PtitSpirou


N'ayant pas trouvé de fonction toute faite ni de réponse sur le forum, voici comment récupérer le nombre d'articles de la catégorie:
$nbArt = $plxShow->plxMotor->aCats[sprintf("%03d", $plxShow->artCatId())]["articles"];

Les explications sont soufflées par le lapin bleu ici ->


Qu'en pensez-vous ?


Cordialement,
_____
D.San

Réponses

  • FrancisFrancis Member
    octobre 2013 modifié
    La fonction artCatid() utilisée dans cette astuce de DanielSan n'existe plus dans PluXml 2.
    Comme il est maintenant très occupé avec ses pizzas, j'ai trouvé un code de remplacement pour compter le nombre d'articles actifs d'une catégorie donnée (la catégorie fournie n'étant pas nécessairement la catégorie active).
    [== PHP ==]
    $idcategorie = 2; // par exemple
    ob_start();
    $plxShow->lastArtList('#art_id,',5000, $idcategorie );
    $liste_articles = ob_get_clean();
    $NbArticles = substr_count($liste_articles, ',');
    echo $NbArticles;
    
    La fonction lastArtList donne ici une suite d'identifiant d'articles, chaque identifiant étant suivi d'une virgule (1er paramètre : #art_id,).
    Il suffit ensuite de compter le nombre de virgules pour avoir le nombre d'articles.

    Mais si quelqu'un a une méthode plus directe, je suis preneur.
  • StéphaneStéphane Member, Former PluXml Project Manager
    @francis
    Voilà comment afficher le nombre d'articles publiés d'une categorie
    <?php 
    $cat = '002';
    echo $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
    ?>
    

    Remplace 002 par le n° de la catégorie souhaitée

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci bien Stéphane, j'l'avais pas vue, cette fonction nbArticles !
    Plus concis et plus rationnel, c'est pas douteux... :)
  • Comme on me l'a toujours dit, vaut mieux un qui sait que deux qui cherchent :P
  • Bonjour à tous, sans exception. Je suis un nouveau PluXml admirateur, et un nouveau membre du forum. Je ne parle pas de langue russe et française, mais je sais latine, ce qui est plus ou moins bonne compréhension du texte à l'écran. En outre utiliser un traducteur. Je voudrais demander s'il est possible d'afficher uniquement le nombre d'entrées dans la catégorie active? Il serait nécessaire que le numéro de la catégorie est entré automatiquement.

    Par exemple, la page catégorie ligne comme ceci: Catégorie: Arbres (30).
  • websyyswebsyys Member
    novembre 2013 modifié
    PUYA Molina a écrit:
    Bonjour à tous, sans exception. Je suis un nouveau PluXml admirateur, et un nouveau membre du forum. Je ne parle pas de langue russe et française, mais je sais latine, ce qui est plus ou moins bonne compréhension du texte à l'écran. En outre utiliser un traducteur. Je voudrais demander s'il est possible d'afficher uniquement le nombre d'entrées dans la catégorie active? Il serait nécessaire que le numéro de la catégorie est entré automatiquement.

    Par exemple, la page catégorie ligne comme ceci: Catégorie: Arbres (30).

    Remplacer :
    <?php $plxShow->lang('CLASSIFIED_IN') ?> : <?php $plxShow->artCat(); ?>
    
    Par :
    <?php $plxShow->lang('CLASSIFIED_IN') ?> : <?php $plxShow->artCat(); ?>
    (<?php 
    $cat = $plxShow->catId();
    echo $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
    ?>)
    

    ;)
  • Merci beaucoup! Une grande aide. Juste ce qu'il nous faut! :D
  • cpalocpalo Member
    mars 2014 modifié
    Bonjour

    Le code précédent:
    [== PHP ==]
    echo "\n";
                                echo "<ul>\n";
                                    $nb_item = 6;
                                    $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>',$nb_item,$id_cat); //liste les articles de cette catégorie
                                    (
                                    $nbArtCat = $plxShow->nbAllArt('',$id_cat);
                                    if($nb_item>$nbArtCat){
                                        $plxShow->catList('','<li id="menu_#cat_id"><a href="#cat_url" title="Voir tous les articles de la cat&eacute;gorie #cat_name">Voir tous les articles</a></li>',$id_cat);
                                    }
                                 
                            echo "\n";
                                echo "</ul>\n"
    

    Comment intégrer:
    [== PHP ==]
    <?php 
    $cat = '002';
    echo $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
    ?>
    

    Parce que simplement remplacer la ligne :
    [== Indéfini ==]
    $nbArtCat = $plxShow->nbAllArt('',$id_cat);
    
    par ce nouveau code ne fonctionne pas

    Merci
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    @cpalo,

    Ton expression régulière dans le premier paramètre n'est pas correcte.
    ? s'applique à un caractère ou méta-caractère. Si tu veux l'appliquer à (, alors il faut échapper par \(.
    Par contre, je n'ai pas approfondir plus loin pour voir si le reste était ok. En particulier dans, home|,) la virgule me parait mal venue mais je peux me tromper.

    Il y a des outils en ligne pour tester les expressions régulières : Reg101 par exemple.
  • Bonjour,

    en voulant réutiliser ce script dans la sidebar, au lieu de ne m'afficher que les 4 derniers articles de chaque catégorie et le lien voir tous les autres articles, il m'affiche tous les articles de la catégorie.
    [== PHP ==]
        <h4>Catégories suivies des articles rattachés <br />affichage limité et voir tous les articles</h4>
        <ul>
        <?php
    		$menu = array('003', '002', '004', '001'); // lister ici les catégories à afficher.
    		foreach($menu as $id_cat) {
    			$plxShow->catList('','<li id="menu_#cat_id" class="#cat_status">',$id_cat);
    			echo "\n";
    			$plxShow->catList('','<a href="#cat_url" title="#cat_name">#cat_name</a>',$id_cat);
    			echo "\n";
    				echo "<ul>\n";
    					$plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>','20',$id_cat);
                        $nb_item = 4; // nombre d'articles maxi affichés dans le menu
                        $nb_ArtCat = $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$id_cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
                        if($nb_item<$nb_ArtCat){ // si le nombre d'articles de la catégorie est supérieur à $nb_item, on affiche un lien "Voir tous les articles"
                        $plxShow->catList('','<li id="menu_#cat_id"><a href="#cat_url" title="Voir tous les articles de la cat&eacute;gorie #cat_name">Voir tous les articles</a></li>',$id_cat);
                        }else{}
    			echo "\n";
    				echo "</ul>\n";
    			echo "</li>\n";
    		}
    		?>
        </ul>
    

    Lorsque je teste ce code, cela m'affiche bien le nombre correct d'article de la catégorie
    [== PHP ==]
    <?php 
    $cat = '002';
    echo $plxShow->plxMotor->nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before'); 
    ?>
    

    Cordialement
  • cpalocpalo Member
    juillet 2014 modifié
    Le problème est en fait un tout petit peu different,
    Si dans :
    [== PHP ==]
    $menu = array('003', '002', '004', '001')
    
    je n'indique qu'une seule catégorie, là fonctionne correctement.

    Pareil si j'indique deux catégories cela fonctionne
  • Voilà j'ai trouvé l'erreur.
    Dans le code qui fonctionne, la 1° ligne est à mettre après la ligne indiquant le nombre d'items.
    Et seconde erreur il y a '20' d'indiqué au lieu de ¤nb_item
    [== PHP ==]
    	$plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>','20',$id_cat);
            $nb_item = 4; // nombre d'articles maxi affichés dans le menu
    

    Toutes mes excuses pour avoir "pollu" le sujet avec cette erreur d'étourderie

    Cordialement
  • Bonjour,


    Est-ce que quelqu'un peut m'expliquer?

    nbArticles('(?:[0-9]|home|,)*(?:'.$cat.')(?:[0-9]|home|,)*', '[0-9]{3}', '', 'before')
    

    Je comprends $cat et je comprends ce qu'est '[0-9]{3}' , c'est le $userId qu'on retrouve dans /core/admin/index.php

    Par contre, je ne comprends pas ni

    ?:[0-9]|home|,)*(?:'.
    

    avant $cat, ni

    .')(?:[0-9]|home|,)*'
    

    après, ni les deux '' vide ni le before...

    '', 'before')
    


    Est-ce que quelqu'un pourrait nous l'interpréter pour qu'on puisse mieux le comprendre et pouvoir l'adapter comme par exemple pouvoir afficher le nombre d'article d'une catégorie choisie appartenant à un utilisateur donné et possédant un statut particulier, publié, brouillon, en attente de modération...

    Merci par avance pour votre aide,

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    avril 2020 modifié

    Bonjour,

    nbArticles est une procédure de la class plxMotor.

    Tu trouveras la description des différents paramètres dans le fichier core/lib/class.plx.motor.php en recherchant la fonction nbArticles :

    '' : on ne recherche que les articles qui sont validés ou modérés

    'before' : publiés avant aujourd'hui

    (?: ) on ouvre des parenthèses pour proposer différentes variantes permises mais on ne mémorise pas la variante trouvée. Il faut en trouver une.

    entre les parenthèses on précise les différentes catégories permises :

    [0-9] : n'importe quelle catégorie

    home : la catégorie home

    (?:$cat) une série de catégories recherchées. Il faut au moins en trouver une dans la série.

    Note que l'expression régulière est mal écrite. Pour être précis et concis, il convient de l'écrire comme ceci :

    '(?:home,|\d{3},)*(?:' . $cat .')(?:,\d{3}|,home)*'
    

    Il n'y a aucune chance de trouver le dernier home vu comme sont générés les noms de fichiers articles

    et dans PluXml on devrait écrire :

    '/^' . $mod . '\d{4}\.(' . $motif .')\.' . $userId . '\.\d{12}\.[\w-]+\.xml$/'
    

    Dans une expression régulière "." correspond à n'importe quel caractère (joker) et pas seulement le point.

  • assodefisassodefis Member
    avril 2020 modifié

    Je crois que j'ai à peu près compris ce que sont

    [0-9]|home|
    

    etc

    ça correspond au possibilité de nom de fichier d'un article : numerodarticle.numerodecateorie.numerodutilisateur etc c'est bien ça?

    Mais pourquoi y-a-til l'option home dans la partie concernant numerodutilisateur?

    par contre, je ne comprends pas du tout les deux derniers

    '', 'before')
    
  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    home est une catégorie spéciale qui permet d'afficher l'article en page d'accueil. Ce n'est pas un numéro d'utilisateur

    '' correspond au paramètre $mod de la fonction. PluXml a 5 niveaux de profil différents. Pour les plus bas, on a la possibilité de valider les articles par "le chef" avant de les publier. Cela s'appelle modérer, d'où le nom de la vairable $mod.

    'before' : "Oh my Dear, you can't read english !" before signifie avant. On ne va retenir que les articles publiés jusqu'à aujourd'hui.

  • D'accord, merci beaucoup, je comprends mieux.

  • Est-il possible d'obtenir le nombre d'articles publiés d'une catégorie ultérieurement à la publication d'un article donné?
    Si on connait le nombre d'articles plus récents qu'un article donné, avec l'aide de $plxMotor->bypage, on peut calculer sur quelle page, cet article se trouve.

  • L'idée est de pouvoir créer un bouton retour dans un article vers sa page dans sa catégorie (pour l'instant mon bouton retour renvoi vers la première page de sa catégorie).

  • Serait-il possible de modifier la fonction plxShow->lastArtList() (ou s'inspirer pour en créer une nouvelle) de façon à retourner le nombre des derniers articles, non pas par rapport à un $max mais par rapport à un $artID?

  • @bazooka07 , je me permets de revenir sur ce 'before'. Je sais bien ce que signifie ce mot en anglais mais je ne comprends pas son utilité. Autrement dit, dans quel cas on n'utiliserait pas before mais after puisqu'a priori, aucun article n'appartient à after étant donné que ces before et after sont liés à la date du jour (de consultation du site c'est ça?) et non pas à une date donnée (celle de publication d'un article par exemple). Ce n'est pas très clair pour moi.
    Du coup, j'ai du mal à comprendre comment modifier plxShow->lastArtList().

  • assodefisassodefis Member
    mai 2020 modifié

    Dans
    $plxGlob_arts->query($motif,$type='',$tri='',$depart='0',$limite=false,$publi='all')

    $depart='0' signifie que la requête se fait à partir de l'indice 0, c'est à dire, l'article le plus récent, n'est-ce pas?

    Donc, pour obtenir ce que je veux, il faut

    • soit compter de $depart='0' à $limite='indice d'artID'
    • soit compter de $depart='indice d'artID' à $limite=false et le soustraire à

      $plxMotor->nbArticles('(?:[0-9]|home|,)(?:'.$cat.')(?:[0-9]|home|,)', '[0-9]{3}', '', 'before');

    dans les deux cas, mon problème dépend de la connaissance de l'indice d'artID dans le tableau $plxGlob_arts, c'est ça?
    J'ai bien compris comment ça fonctionne?
    C'est possible de connaître l'indice d'artID?

  • assodefisassodefis Member
    mai 2020 modifié

    J'ai réussi à faire ce que je voulais. Je vais détailler après comment.

  • assodefisassodefis Member
    mai 2020 modifié

    Pour réussi à mes fins, j'ai modifié plxShow->lastArtList() en lui ajoutant une variable de la façon suivante :

     /** 
     * Méthode qui affiche la liste des $max derniers articles ou calcul le nombre d'articles plus récent qu'artID
     * Si la variable $cat_id est renseignée, seuls les articles de cette catégorie sont retournés.
     * On tient compte si la catégorie est active
     *
     * @param   format  format du texte pour chaque article
     * @param   max     nombre d'articles maximum
     * @param   cat_id  ids des catégories cible (numérique ou urls) : séparés par des |
     * @param   ending  texte à ajouter en fin de ligne
     * @param   sort    tri de l'affichage des articles (sort|rsort|alpha|random)
     * @param   artID   calcul du nombre d'article plus récent que cet artID
     * @scope   global
     * @author  Florent MONTHEL, Stephane F, Cyril MAGUIRE, Thomas Ingles
     **/
    
        public function lastArtList($format='', $max=5, $cat_id='', $ending='', $sort='rsort', $artID=false) {
    
        $capture = '';
    
        $format = empty($format)? '<li><a href="#art_url" title="#art_title">#art_title</a></li>': $format; # V5.8 format par defaut si vide
    
        # Hook Plugins
        if(eval($this->plxMotor->plxPlugins->callHook('plxShowLastArtList'))) return;
    
        # Génération de notre motif
        $all = (isset($all)? $all: empty($cat_id)); # pour le hook : si $all = TRUE, n'y passe pas
        $cats = $this->plxMotor->activeCats . '|home'; # toutes les categories active
        if(!$all) {
            if(is_numeric($cat_id)) # inclusion à partir de l'id de la categorie
                $cats = str_pad($cat_id,3,'0',STR_PAD_LEFT);
            else { # inclusion à partir de url de la categorie
                $cat_id .= '|';
                foreach ($this->plxMotor->aCats as $key => $value) {
                    if(strpos($cat_id,$value['url'].'|') !== false) {
                        $cats = explode('|',$cat_id);
                        if (in_array($value['url'], $cats)) {
                            $cat_id = str_replace($value['url'].'|',$key.'|',$cat_id);
                        }
                    }
                }
                $cat_id = substr($cat_id,0,-1);
                if (empty($cat_id)) {
                    $all = true;
                }else{
                    $cats = $cat_id;
                }
            }
        }
        if(empty($motif)){# pour le hook. motif par defaut s'il n'a point créé cette variable
            if($all)
                $motif = '/^[0-9]{4}.(?:[0-9]|home|,)*(?:'.$cats.')(?:[0-9]|home|,)*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
            else
                $motif = '/^[0-9]{4}.((?:[0-9]|home|,)*(?:'.$cats.')(?:[0-9]|home|,)*).[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
        }
    
        # Nouvel objet plxGlob et récupération des fichiers
        $plxGlob_arts = clone $this->plxMotor->plxGlob_arts;
    $nbarts=0;
        if($aFiles = $plxGlob_arts->query($motif,'art',$sort,0,$max,'before')) {
            foreach($aFiles as $v) { # On parcourt tous les fichiers
                $art = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$v);
        if ($art['numero'] > $artID) {
                $num = intval($art['numero']);
                $date = $art['date'];
                if(($this->plxMotor->mode == 'article') AND ($art['numero'] == $this->plxMotor->cible))
                    $status = 'active';
                else
                    $status = 'noactive';
    
                # Mise en forme de la liste des catégories
                $catList = array();
                $catIds = explode(',', $art['categorie']);
                foreach ($catIds as $idx => $catId) {
                    if(isset($this->plxMotor->aCats[$catId])) { # La catégorie existe
                        $catName = plxUtils::strCheck($this->plxMotor->aCats[$catId]['name']);
                        $catUrl = $this->plxMotor->aCats[$catId]['url'];
                        $catList[] = '<a title="'.$catName.'" href="'.$this->plxMotor->urlRewrite('?categorie'.intval($catId).'/'.$catUrl).'">'.$catName.'</a>';
                    } else {
                        $catList[] = L_UNCLASSIFIED;
                    }
                }
    
                # On modifie nos motifs
                $row = str_replace('#art_id',$num,$format);
                $row = str_replace('#cat_list', implode(', ',$catList),$row);
                $row = str_replace('#art_url',$this->plxMotor->urlRewrite('?article'.$num.'/'.$art['url']),$row);
                $row = str_replace('#art_status',$status,$row);
                $author = plxUtils::getValue($this->plxMotor->aUsers[$art['author']]['name']);
                $row = str_replace('#art_author',plxUtils::strCheck($author),$row);
                $row = str_replace('#art_title',plxUtils::strCheck($art['title']),$row);
                $strlength = preg_match('/#art_chapo\(([0-9]+)\)/',$row,$capture) ? $capture[1] : '100';
                $chapo = plxUtils::truncate($art['chapo'],$strlength,$ending,true,true);
                $row = str_replace('#art_chapo('.$strlength.')','#art_chapo',$row);
                $row = str_replace('#art_chapo',$chapo,$row);
                $strlength = preg_match('/#art_content\(([0-9]+)\)/',$row,$capture) ? $capture[1] : '100';
                $content = plxUtils::truncate($art['content'],$strlength,$ending,true,true);
                $row = str_replace('#art_content('.$strlength.')','#art_content',$row);
                $row = str_replace('#art_content',$content,$row);
                $row = str_replace('#art_date',plxDate::formatDate($date,'#num_day/#num_month/#num_year(4)'),$row);
                $row = str_replace('#art_hour',plxDate::formatDate($date,'#hour:#minute'),$row);
                $row = str_replace('#art_time',plxDate::formatDate($date,'#time'),$row);
                $row = plxDate::formatDate($date,$row);
                $row = str_replace('#art_nbcoms',$art['nb_com'],$row);
                $row = str_replace('#art_thumbnail', '<img class="art_thumbnail" src="#img_url" alt="#img_alt" title="#img_title" />',$row);
                $row = str_replace('#img_url',$this->plxMotor->urlRewrite($art['thumbnail']),$row);
                $row = str_replace('#img_title',$art['thumbnail_title'],$row);
                $row = str_replace('#img_alt',$art['thumbnail_alt'],$row);
    
                # Hook plugin
                eval($this->plxMotor->plxPlugins->callHook('plxShowLastArtListContent'));
    
                # On genère notre ligne
          if ($artID == false) {
            echo $row;
          }
          $nbarts++;
        }
      }
      if (!$artID == false) {
        return $nbarts;
      }
        }
    }
    

    Puis, dans article.php, j'ai écrit la div de mon bouton retour de cette façon :

                                <?php $previous_page=ceil(($plxShow->lastArtList($format='', false, $plxShow->catId(), $ending='', $sort='rsort', $plxShow->artId())+1)/$plxMotor->aCats['002']['bypage']); ?>
                            <a class="button close" href="<?php echo $plxShow->catUrl($plxShow->catId()).'/page'.$previous_page; ?>">retour</a>
    

    Je me demande comment remplacer '002' dans $plxMotor->aCats['002']['bypage'] pour automatiser l'affaire?

    Que pensez-vous de cette modification apportée à plxShow->lastArtList() ? Peut-être vaudrait il mieux faire une autre fonction qui permet spécifiquement de calculer le nombre d'article plus récent ou plus ancien qu'un article précis mais pour moi, c'était plus simple d'adapter du bon code existant que d'en créer.

    @bazooka07 , si tu veux regarder de plus près, j'ai commit/push ces modifications sur la branche thème_mini-site_Défis .

  • assodefisassodefis Member
    mai 2020 modifié

    pour remplacer '002' par $cat, écrire :

    $cat = '00'.$plxShow->catId();
    

    avant. Soit pour une div de bouton retour:

                        <div class="image col sml-12 med-8 lrg-8">
                            <?php $cat = '00'.$plxShow->catId();
                            $previous_page = ceil(($plxShow->lastArtList($format='', false, $plxShow->catId(), $ending='', $sort='rsort', $plxShow->artId())+1) / $plxMotor->aCats[$cat]['bypage']); ?>
                            <a class="button close" href="<?php echo $plxShow->catUrl($plxShow->catId()).'/page'.$previous_page; ?>">retour</a>
                                <img src="<?php echo $plxMotor->urlRewrite(trim($plxMotor->plxRecord_arts->f('thumbnail'))); ?>" alt="<?php echo $plxMotor->plxRecord_arts->f('thumbnail_alt'); ?>">
                        </div>
    
Connectez-vous ou Inscrivez-vous pour répondre.