[PLUGIN] Suggérer la lecture

amowebamoweb Member
janvier 2010 modifié dans Modifications
J'ai fais un script pour faire une suggestion de lecture. Il prend aléatoirement 5 articles dans les 30 derniers de la catégorie courante.

Ajouter dans le fichier article.php :
<h1 class='suggestion-title'>Je suggère aussi</h1>
    <ul>
    <?php include('suggestion.php'); ?>
    </ul>
Fichier suggestion.php (à créer dans le dossier du thème) :
<?php

    /**
     * Constructeur qui initialise l'objet plxMotor par référence
     *
     * @param     plxMotor    objet plxMotor passé par référence
     * @return    null
     * @version   1.3
     * @author    Amaury GRAILLAT
     **/
    class plxSuggest extends plxShow
    {
        /**
         * Constructeur qui initialise l'objet plxMotor par référence
         *
         * @param    plxMotor    objet plxMotor passé par référence
         * @return    null
         * @author    Florent MONTHEL
         **/

        function PlxShow(&$plxMotor)
        {
            $this->plxMotor = &$plxMotor;
        }
        
        /**
        * Méthode qui affiche une liste d'articles au hasard dans la même catégorie.
        *
        * @param    max      nombre d'articles maximum affichés
        * @param    cat_id   id de la catégorie cible (1,home)
        * @param    maxSeek  nombres d'articles les plus rescents à parser (choisit aléatoirement entre 1 et $maxSeek)
        * @param    exclude  id de l'article à exclure
        * @return   stdout
        * @author   Amaury GRAILLAT, Florent MONTHEL
        **/

        function suggestion($max=5, $cat_id='', $maxSeek=30, $exclude = -1)
        {

            # Génération de notre motif
            if(empty($cat_id))
                $motif = '/^[0-9]{4}.([0-9]{3}|home).[0-9]{12}.[a-z0-9-]+.xml$/';
            elseif($cat_id == 'home')
                $motif = '/^[0-9]{4}.home.[0-9]{12}.[a-z0-9-]+.xml$/';
            else
                $motif = '/^[0-9]{4}.'.str_pad($cat_id,3,'0',STR_PAD_LEFT).'.[0-9]{12}.[a-z0-9-]+.xml$/';


            # Nouvel objet plxGlob et récupération des fichiers
            $plxGlob_arts = & new plxGlob(PLX_ROOT.$this->plxMotor->aConf['racine_articles']);
            $aFiles = $plxGlob_arts->query($motif,'art','rsort',0,$maxSeek);


            # On parse les fichiers
            if(is_array($aFiles)) { # On a des fichiers
                while(list($k,$v) = each($aFiles)) # On parcourt tous les fichiers
                    $array[ $k ] = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$v);

                # On stocke les enregistrements dans un objet plxRecord
                $plxRecord_arts = & new plxRecord($array);

            }

            

            if($plxGlob_arts->count AND $plxRecord_arts->size) { # On a des articles

                //Pas plus qu'on en a...
                if($maxSeek > $plxGlob_arts->count)
                    $maxPars = $plxGlob_arts->count - 1;
                else $maxPars = $maxSeek - 1;
                
                if($max > $maxPars) $max = $maxPars;
                
                // $plxRecord_arts->i < $plxGlob_arts->count

                # On boucle sur nos articles
                $used = array();
                $loop = 0;

                while($loop < $max)
                {
                    $antilag = 0;
                    while($antilag < $maxPars*2)
                    {
                        $plxRecord_arts->i = rand(1, $maxPars);
                        if(!$used[$plxRecord_arts->i])
                        {
                            $used[$plxRecord_arts->i] = true;
                            break;
                        }
                        $antilag++;
                    }              

                    $num = intval($plxRecord_arts->f('numero'));
              
                    if($num != $exclude && $antilag < $maxPars*2) //Si l'article n'est pas exclu, on l'affiche
                    {
                        # On genère notre ligne
                        $row = '<a href="' . './?article'.$num.'/'.$plxRecord_arts->f('url') . '">'
                        . htmlspecialchars($plxRecord_arts->f('title'),ENT_QUOTES,PLX_CHARSET) . '</a>';
                        echo '<li>'.$row.'</li>';
                        $loop++;
                    }
                    else $loop += 0.1; // Système antilag, mais évite quand même d'afficher
                                       // que 4 titres au lieu de 5 quand on a trouvé un exclu. J'assume.
                }
            }
        }
    };

    $suggest = & new plxSuggest($plxMotor);
    $artId = $suggest->plxMotor->plxRecord_arts->f('numero'); //cet article
    $suggest -> suggestion(5, $suggest->plxMotor->plxRecord_arts->f('categorie'), 30, $artId);
?>
Edit : Correction d'un bug s'il y a moins de $max articles dans la catégorie.
Edit 2 : Empêche la suggestion de l'article courant.
Edit 3 : Il y existe une nouvelle version de ce script (un peu plus bas dans la conversation : http://forum.pluxml.org/viewtopic.php?pid=11672#p11672)

Réponses

  • Excellent, je vais tester cela de suite ! :)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Salut amoweb

    Voilà une fonction intéressante. Merci de partager ton code

    Quelques remarques...

    1) Afin d'optimiser ton code, il est inutile de parser l'ensemble des articles alors que seul 5 articles sont attendus. Je te conseille de récupérer les fichiers, d'en sélectionner 5 au hasard et seulement après de les parser récupérer le contenu. Tu gagneras en temps de réponse et en traitement inutile.

    2)

    htmlspecialchars($plxRecord_arts->f('title'),ENT_QUOTES,PLX_CHARSET)

    doit être remplacé par

    plxUtils::strCheck($plxRecord_arts->f('title'))

    3) Afin de rendre le code plus clair il serait plus intéressant de créer une fonction dans ta classe qui renvoie un tableau de n chiffres aléatoires, avec en paramètre le nombre de valeurs aléatoires à définir.
    ça allègera ta fonction suggestion.

    Stéphane

    ps: petite précision pour ceux qui essayerait le code de amoweb, le fichier suggestion.php et à mettre dans le dossier de votre thème

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Merci pour vos messages!
    Je viens de corriger un bug quand il y a moins d'articles dans la catégorie que ce que l'on demande d'afficher.
    Ma version de pluxml ne dispose pas de la fonction strCheck. Je verrai un peu plus tard pour les optimisations.
    Amaury
  • StéphaneStéphane Member, Former PluXml Project Manager
    En effet pour strCheck :). C'est une fonction qui sera dispo dans la prochaine version de pluxml.
    A force de travailler sur la 4.2 ça m'est sorti de la tête que cette fonction n'est pas encore dispo.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • C'est une bonne idée qui aurait sa place au wiki, ça :-)
  • Je ne comprends pas ta démarche dans le forum antistress. Ce sont justes des remarques, ne voit rien d'offosant là dedans. ;)
    Tu fais du repérage pour toi en remontant les vieux topics, pour indiquer aux autres qu'il faut le mettre dans le wiki ou tu vas le mettre plus tard dans le wiki ?

    Parce que je t'ai déjà indiqué que tu pouvais l'ajouter toi même si tu le souhaites dans le wiki : on est toujours mieux servi par soi-même tu sais. :p
  • Pas d'offense, ne t'en fais pas :-)
    Je comprends que ça paraisse étrange
    La démarche des wiki m'est familière (par exemple je contribue régulièrement à wikipédia) et dans la limite de mes moyens j'ai complété celui de PluXml (création notamment des pages Gestion des commentaires / Gestion des pages statiques / Gestion des flux de syndication)
    Par contre n'ayant pas de connaissance suffisante du code, il ne serait pas raisonnable que je me charge d'astuces comme ici car renseigner des bêtises dans le wiki serait contre-productif.
    Néanmoins je trouve certaines astuces intéressantes et pense que le projet gagnerait à les centraliser et à les rendre plus visibles c'est pourquoi je le fais remarquer
    Il ne s'agit pas pour moi d'attendre que ça me tombe cuit dans la bouche, c'est juste de la prudence de ma part :-)
  • StéphaneStéphane Member, Former PluXml Project Manager
    C'est vrai qu'alimenter et maintenir à jour le wiki est un travail en soit.
    Si quelqu'un pouvait prendre en charge la partie "manuel utilisateur" en complétant ce qui existe déjà sur le wiki serait vraiment bénéfique pour les nouvels utilisateurs qui découvrent pluxml (et peut être aussi pour les plus confirmés qui passeraient à coté de fonctionnalités - à condition de se donner la peine d'aller lire le wiki).

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • J'ai prévu de m'attaquer à la page "Gestion des images" prochainement.
    Lorsque j'aurais fait joujou avec les documents, je pourrai m'occuper de la page "Gestion des documents" à ce moment là
    Il est super le wiki, très pratique pour des débutants (il suffit de copier-coller le code, et aussi pour apprendre du coup)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Toute contribution que tu pourras apporter dans le wiki est la bienvenue
    Merci d'avance en tout cas pour ton initiative.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Le code a été optimisé pour la nouvelle version ou il n'y a rien à faire de plus en particulier ?
  • FrédéricFrédéric Member
    janvier 2010 modifié
    Le code est différent lorsque l'on le compare à une 4.3.

    Testé à l'état brut avec des erreurs :(
  • Il y a en effet quelques modifications à appliquer (je n'ai malheuresement pas pensé à les préciser sur le forum). J'ai supprimé les & avant les objets qui étaient utiles avant PHP5. Voilà la nouvelle version :
    <?php
    
        /**
         * Constructeur qui initialise l'objet plxMotor par référence
         *
         * @param     plxMotor    objet plxMotor passé par référence
         * @return    null
         * @version   1.4
         * @author    Amaury GRAILLAT
         **/
        class plxSuggest extends plxShow
        {
            /**
             * Constructeur qui initialise l'objet plxMotor par référence
             *
             * @param    plxMotor    objet plxMotor passé par référence
             * @return    null
             * @author    Florent MONTHEL
             **/
    
            function PlxShow($plxMotor)
            {
                $this->plxMotor = $plxMotor;
            }
            
            /**
            * Méthode qui affiche une liste d'articles au hasard dans la même catégorie.
            *
            * @param    max      nombre d'articles maximum affichés
            * @param    cat_id   id de la catégorie cible (1,home)
            * @param    maxSeek  nombres d'articles les plus rescents à parser (choisit aléatoirement entre 1 et $maxSeek)
            * @param    exclude  id de l'article à exclure
            * @return   stdout
            * @author   Amaury GRAILLAT, Florent MONTHEL
            **/
    
            function suggestion($max=5, $cat_id='', $maxSeek=30, $exclude = -1)
            {
    
                # Génération de notre motif
                if(empty($cat_id))
                    $motif = '/^[0-9]{4}.([0-9]{3}|home).[0-9]{12}.[a-z0-9-]+.xml$/';
                elseif($cat_id == 'home')
                    $motif = '/^[0-9]{4}.home.[0-9]{12}.[a-z0-9-]+.xml$/';
                else
                    $motif = '/^[0-9]{4}.'.str_pad($cat_id,3,'0',STR_PAD_LEFT).'.[0-9]{12}.[a-z0-9-]+.xml$/';
    
    
                # Nouvel objet plxGlob et récupération des fichiers
                $plxGlob_arts = new plxGlob(PLX_ROOT.$this->plxMotor->aConf['racine_articles']);
                $aFiles = $plxGlob_arts->query($motif,'art','rsort',0,$maxSeek);
    
    
                # On parse les fichiers
                if(is_array($aFiles)) { # On a des fichiers
                    while(list($k,$v) = each($aFiles)) # On parcourt tous les fichiers
                        $array[ $k ] = $this->plxMotor->parseArticle(PLX_ROOT.$this->plxMotor->aConf['racine_articles'].$v);
    
                    # On stocke les enregistrements dans un objet plxRecord
                    $plxRecord_arts = new plxRecord($array);
    
                }
    
                
    
                if($plxGlob_arts->count AND $plxRecord_arts->size) { # On a des articles
    
                    //Pas plus qu'on en a...
                    if($maxSeek > $plxGlob_arts->count)
                        $maxPars = $plxGlob_arts->count - 1;
                    else $maxPars = $maxSeek - 1;
                    
                    if($max > $maxPars) $max = $maxPars;
                    
                    // $plxRecord_arts->i < $plxGlob_arts->count
    
                    # On boucle sur nos articles
                    $used = array();
                    $loop = 0;
    
                    while($loop < $max)
                    {
                        $antilag = 0;
                        while($antilag < $maxPars*2)
                        {
                            $plxRecord_arts->i = rand(1, $maxPars);
                            if(!$used[$plxRecord_arts->i])
                            {
                                $used[$plxRecord_arts->i] = true;
                                break;
                            }
                            $antilag++;
                        }              
    
                        $num = intval($plxRecord_arts->f('numero'));
                  
                        if($num != $exclude && $antilag < $maxPars*2) //Si l'article n'est pas exclu, on l'affiche
                        {
                            # On genère notre ligne
                            $row = '<a href="' . './?article'.$num.'/'.$plxRecord_arts->f('url') . '">'
                            . htmlspecialchars($plxRecord_arts->f('title'),ENT_QUOTES,PLX_CHARSET) . '</a>';
                            echo '<li>'.$row.'</li>';
                            $loop++;
                        }
                        else $loop += 0.1; // Système antilag, mais évite quand même d'afficher
                                           // que 4 titres au lieu de 5 quand on a trouvé un exclu. J'assume.
                    }
                }
            }
        };
    
        $suggest = new plxSuggest($plxMotor);
        $artId = $suggest->plxMotor->plxRecord_arts->f('numero'); //cet article
        $suggest -> suggestion(5, $suggest->plxMotor->plxRecord_arts->f('categorie'), 30, $artId);
    ?>
    
  • StéphaneStéphane Member, Former PluXml Project Manager
    Je me suis permis de passer le n° de version de ton script de 1.3 en 1.4 ;)

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • FrédéricFrédéric Member
    janvier 2010 modifié
    Merci Amoweb, Ajouté dans le wiki.
  • AirWAirW Member
    juillet 2013 modifié
    Bonjour !

    Merci pour cette bonne idée !
    J'ai tenté d'installer ce plugin. Outre le fait qu'il me casse tous mes beaux boutons «j'aime» et autres, il m'affiche une désobligeante
    [== Indéfini ==]
    Fatal error: Call to protected plxShow::__construct() from invalid context in /htdocs/themes/GEN22/suggestion.php on line 112
    

    Que faire ? Help ! Où m'ai-je gouré ?

    D'avance merci !
  • Bon, mon problème est résolu. Ne me demandez pas pourquoi. Je peux juste vous dire que j'ai pris le script du wiki à la place de ceux qui apparaissent dans ce fil de discussion.

    Reste une question : suivant les articles. il peut n'y avoir aucune proposition alors qu'il y a des articles dans la catégorie... Est-ce normal ? Comment les articles appartenant à plusieurs catégories sont-ils gérés ?

    Merci de votre aide !
  • Je pense qu'il faut mettre cette astuce au goût du jour car ce fil de discussion est vieux et pluxml a évolué.
  • AirWAirW Member
    juillet 2013 modifié
    A priori le script prévu pour la 5.1.3 marche sur la 5.1.7... au détail signalé plus haut près...
    On pourrait peut-être améliorer en ajoutant au titre tout ou partie du chapô des articles suggérés.
  • LolYangccoolLolYangccool Member
    avril 2014 modifié
    Bonjour,
    J'ai mis en place ce plugin mais celui-ci suggère des articles de toutes les catégories alors que d'après ce que j'ai compris, il ne doit suggérer que les articles de la catégorie courante...

    Quelqu'un a une idée d'où cela peut venir ?

    Merci. :)

    Edit : Mon site tourne sous la 5.3.1. ;)
  • HarukaHaruka PluXml Project Manager
    Salut,

    Le script est ancien et probablement doit être adapté à une version récente de PluXml.
    Par ailleurs, tu peux essayer ceci : http://pluxopolis.net/article35/pluxml-recommander-des-articles
  • bg62bg62 Member
    à mon tour de 'réveiller' ce vieux post, juste pour montrer un petit nouveau probl-me ... depuis la sortie de PluXml 5.5 :
    http://forum.pluxml.org/viewtopic.php?pid=48910#p48910
    ce serait bien un p'tit coup de main :)
    :8
  • Je me demande pourquoi utiliser un plugin pour extraire un article quand lastArtList fait très bien le travail. Stéphane m'a donné la routine pour extraire la catégorie courante et je l'insère tout simplement comme paramètre dans ma fonction préférée, par exemple:

    <?php $plxShow->lastArtList('Vous aimerez aussi : <a class="#art_status" href="#art_url" title="#art_title">#art_title</a>',1,ltrim($plxShow->plxMotor->plxRecord_arts->f('categorie'),'home,')); ?>

    C'est un peu sommaire mais ça sert d'exemple. On voit ce genre de chose au bas d'un article, j'imagine que c'est l'usage prévu.
  • bg62bg62 Member
    @Pierre : tout simplement parce que ce ' système ' de suggestion je l'utilise depuis x versions de Pluxml, mais que je rencontre quelques problèmes avec la 5.5, pourrais-tu voir de plus près ici : http://forum.pluxml.org/viewtopic.php?id=5490
    ça me dépannerait vraiment bien, il ne me reste que 'ce' problème pour faire une mise à jour complète du site :)
  • Je ne saurais pas comment réparer ou même créer un plugin, je les utilise à peine et toutes mes installations s'en portent très bien. Si ta raison pour ne pas utiliser une méthode plus simple et plus solide est que tu utilises cette "autre" méthode depuis longtemps, on pourra en parler.
  • bg62bg62 Member
    ben je ne demande PAS mieux, mais ... pourquoi tous ces problèmes ... ???
    arrivant au fur et à mesure des mises à jour ...
  • C'est la réalité à accepter quand on construit (et utilise) un plugin. Cette petite bête un programme indépendant qui se "branche" à un ou plusieurs endroits du système de base pour construire une fonctionnalité. C'est très pratique et immédiatement apprécié. Le hic est que le système de base doit évoluer et parfois l'endroit ou se "branchait" un plugin n'existe plus. C'est pourquoi une version de PluXml ne sort pas toutes les semaines, elle est offerte en alpha et en beta pendant de longs mois avant de venir finale. Pendant ce temps, les créateurs de plugins peuvent tester leur bébé chéri avec cette future version pour être prêts le jour de la sortie.

    Les utilisateurs d'un plugin doivent donc faire confiance à son créateur et le supplier de trouver le temps de faire ce travail, sinon il faut se rendre à la décision de retirer le plugin ou de rester "désuet" et ne pas passer à la dernière mouture de PluXml en attendant. Répéter l'opération pour chacun des plugins.

    De retour à notre question, j'ai donné une ligne à insérer qui donne le résultat, aucun plugin nécessaire. Il restera à formater et lui donner l'apparence désirée.
Connectez-vous ou Inscrivez-vous pour répondre.