Blog ou CMS à l'Xml
Vous n'êtes pas identifié.
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)
Dernière modification par amoweb (22-01-2010 21:42:10)
Hors ligne
Excellent, je vais tester cela de suite ! ![]()
Hors ligne
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
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
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.
Hors ligne
C'est une bonne idée qui aurait sa place au wiki, ça :-)
Hors ligne
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
Hors ligne
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
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
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
Toute contribution que tu pourras apporter dans le wiki est la bienvenue
Merci d'avance en tout cas pour ton initiative.
Hors ligne
Le code a été optimisé pour la nouvelle version ou il n'y a rien à faire de plus en particulier ?
Hors ligne
Le code est différent lorsque l'on le compare à une 4.3.
Testé à l'état brut avec des erreurs ![]()
Dernière modification par Fred (22-01-2010 14:36:21)
Hors ligne
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);
?>Hors ligne
Je me suis permis de passer le n° de version de ton script de 1.3 en 1.4 ![]()
Hors ligne
Merci Amoweb, Ajouté dans le wiki.
Dernière modification par Fred (22-01-2010 23:48:58)
Hors ligne