[PLUGIN] Suggérer la lecture
amoweb
Member
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 :
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)
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)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 et développeur de PluXml (2010 à 2018)
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
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 et développeur de PluXml (2010 à 2018)
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.
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 :-)
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 et développeur de PluXml (2010 à 2018)
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)
Merci d'avance en tout cas pour ton initiative.
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
Testé à l'état brut avec des erreurs
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
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
Que faire ? Help ! Où m'ai-je gouré ?
D'avance merci !
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 !
On pourrait peut-être améliorer en ajoutant au titre tout ou partie du chapô des articles suggérés.
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.
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
http://forum.pluxml.org/viewtopic.php?pid=48910#p48910
ce serait bien un p'tit coup de main
:8
mes sites principaux : fonds d'écran gratuits - longue traîne - référencer votre site - brocante en ligne -
<?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.
ça me dépannerait vraiment bien, il ne me reste que 'ce' problème pour faire une mise à jour complète du site
mes sites principaux : fonds d'écran gratuits - longue traîne - référencer votre site - brocante en ligne -
arrivant au fur et à mesure des mises à jour ...
mes sites principaux : fonds d'écran gratuits - longue traîne - référencer votre site - brocante en ligne -
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.