Vous n'êtes pas identifié.

Annonce

  •  

#1 06-08-2009 22:49:03

amoweb
Pluxml Staff
Date d'inscription: 05-08-2009
Messages: 66
Site web

[PLUGIN] Suggérer la lecture

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 :

Code:

<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) :

Code:

<?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)

Dernière modification par amoweb (22-01-2010 21:42:10)

Hors ligne

 

#2 07-08-2009 08:05:44

Hamtaro
Membre aguerri
Lieu: La Rochelle
Date d'inscription: 12-06-2007
Messages: 476
Site web

Re: [PLUGIN] Suggérer la lecture

Excellent, je vais tester cela de suite ! smile

Hors ligne

 

#3 07-08-2009 10:14:09

Stéphane
Responsable du projet
Lieu: pas loin de Metz
Date d'inscription: 07-08-2007
Messages: 1032

Re: [PLUGIN] Suggérer la lecture

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

Hors ligne

 

#4 07-08-2009 14:07:11

amoweb
Pluxml Staff
Date d'inscription: 05-08-2009
Messages: 66
Site web

Re: [PLUGIN] Suggérer la lecture

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

Hors ligne

 

#5 07-08-2009 18:04:07

Stéphane
Responsable du projet
Lieu: pas loin de Metz
Date d'inscription: 07-08-2007
Messages: 1032

Re: [PLUGIN] Suggérer la lecture

En effet pour strCheck smile. 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.

Hors ligne

 

#6 18-01-2010 17:04:47

antistress
Membre aguerri
Date d'inscription: 28-12-2009
Messages: 177
Site web

Re: [PLUGIN] Suggérer la lecture

C'est une bonne idée qui aurait sa place au wiki, ça :-)

Hors ligne

 

#7 19-01-2010 09:04:46

Hamtaro
Membre aguerri
Lieu: La Rochelle
Date d'inscription: 12-06-2007
Messages: 476
Site web

Re: [PLUGIN] Suggérer la lecture

Je ne comprends pas ta démarche dans le forum antistress. Ce sont justes des remarques, ne voit rien d'offosant là dedans. wink
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

Hors ligne

 

#8 19-01-2010 10:32:53

antistress
Membre aguerri
Date d'inscription: 28-12-2009
Messages: 177
Site web

Re: [PLUGIN] Suggérer la lecture

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 :-)

Hors ligne

 

#9 19-01-2010 13:12:45

Stéphane
Responsable du projet
Lieu: pas loin de Metz
Date d'inscription: 07-08-2007
Messages: 1032

Re: [PLUGIN] Suggérer la lecture

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).

Hors ligne

 

#10 19-01-2010 13:30:19

antistress
Membre aguerri
Date d'inscription: 28-12-2009
Messages: 177
Site web

Re: [PLUGIN] Suggérer la lecture

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)

Hors ligne

 

#11 19-01-2010 15:45:44

Stéphane
Responsable du projet
Lieu: pas loin de Metz
Date d'inscription: 07-08-2007
Messages: 1032

Re: [PLUGIN] Suggérer la lecture

Toute contribution que tu pourras apporter dans le wiki est la bienvenue
Merci d'avance en tout cas pour ton initiative.

Hors ligne

 

#12 22-01-2010 14:24:19

Hamtaro
Membre aguerri
Lieu: La Rochelle
Date d'inscription: 12-06-2007
Messages: 476
Site web

Re: [PLUGIN] Suggérer la lecture

Le code a été optimisé pour la nouvelle version ou il n'y a rien à faire de plus en particulier ?

Hors ligne

 

#13 22-01-2010 14:35:37

Fred
Pluxml Staff
Lieu: a coté d'Auxerre
Date d'inscription: 03-06-2009
Messages: 377
Site web

Re: [PLUGIN] Suggérer la lecture

Le code est différent lorsque l'on le compare à une 4.3.

Testé à l'état brut avec des erreurs sad

Dernière modification par Fred (22-01-2010 14:36:21)


() ()    () ()
(*_*) (*_*)
.o()()o. .o()()o.Les Lapins aiment ⓟⓛⓤⓧⓜⓛ
-Le WiKi regorge d'informations. 
-La Documentation du développeur vous donneras toutes les fonctions plxShow.

Hors ligne

 

#14 22-01-2010 21:40:17

amoweb
Pluxml Staff
Date d'inscription: 05-08-2009
Messages: 66
Site web

Re: [PLUGIN] Suggérer la lecture

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 :

Code:

<?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);
?>

Hors ligne

 

#15 22-01-2010 21:49:15

Stéphane
Responsable du projet
Lieu: pas loin de Metz
Date d'inscription: 07-08-2007
Messages: 1032

Re: [PLUGIN] Suggérer la lecture

Je me suis permis de passer le n° de version de ton script de 1.3 en 1.4 wink

Hors ligne

 

#16 22-01-2010 23:26:28

Fred
Pluxml Staff
Lieu: a coté d'Auxerre
Date d'inscription: 03-06-2009
Messages: 377
Site web

Re: [PLUGIN] Suggérer la lecture

Merci Amoweb, Ajouté dans le wiki.

Dernière modification par Fred (22-01-2010 23:48:58)


() ()    () ()
(*_*) (*_*)
.o()()o. .o()()o.Les Lapins aiment ⓟⓛⓤⓧⓜⓛ
-Le WiKi regorge d'informations. 
-La Documentation du développeur vous donneras toutes les fonctions plxShow.

Hors ligne

 

Pied de page des forums

Généré par FluxBB | Valide xHTML 1.0 - Css 3

Copyright © 2006-2010 PluXml.org, tous droits réservés