SPIP : mettre en place la pertinence des articles - Par Coralie
Avertissement : Attention c'est un peu complexe. Il existe peut être une solution plus simple, en tout cas celle la fonctionne !... Je suis pas une top dev spip ou php juste une copinedegeek ;)
Petit conseil: histoire de pas faire trop de betises sur votre joli site, je vous conseille de tester tout ça avant la mise en place définitive sur un template de test (test_article.html). Ca peut éviter des pb :)...
Exemple
http://www.copinedegeek.com/article.php3?id_article=17
Principe
Un visiteur peut "voter" pour un article. Il s'agit en fait d'attribuer une note matérialisée sous forme de coeurs (de 1 à 4) sur copinedegeek.
Sur chaque article, on a la possibilé de voir la note attribuée, cette note doit etre visible dans les pages rubriques qui listent les articles.
1 - Création d'une nouvelle table
Créer une table dans laquelle pour un article donné (id_article), le nombre de vote obtenu sera stocké.
Ici stockage de 4 valeurs de vote : col1, col2, col3, col4
Remarque : pour éviter d'avoir des erreurs de calcul dans les %, j'ai volontairement mis des valeurs par defaut à "1".
Requête SQL à effectuer dans phpmyadmin par exemple
CREATE TABLE spip_articles_votes (
id_article bigint(21) NOT NULL default '0',
col1 bigint(21) NOT NULL default '2',
col2 bigint(21) NOT NULL default '1',
col3 bigint(21) NOT NULL default '1',
col4 bigint(21) NOT NULL default '1',
PRIMARY KEY (id_article)
)
|
Remarque : vous pouvez mettre autant de colonnes que vous voulez... mais il ne faudra pas oublier de les ajouter dans la requête de l'étape suivante.
2 - Modification du fichier /ecrire/articles.php3
A chaque nouvel article crée, il nous faut une entrée dans la table (sinon pb dans les templates). Donc il nous faut modifier la page "/ecrire/articles.php3". Cette page correspond à la page validation de la création d'un article.
Nous allons donc faire une requete SQL !
Code à ajouter
//insertion de l'id dans la base de donnee vote
$sql ="INSERT INTO spip_articles_votes VALUES ('$id_article','0','0','0','0')";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
echo("insertion ".$id_article."dans la table vote ok");
|
Ou l'ajouter ???
Dans la partie if ($new=='oui')
if ($id_article==0) {
if ($new=='oui') {
if ($titre=='') $titre = "Sans titre";
$forums_publics = substr(lire_meta('forums_publics'),0,3);
spip_query("INSERT INTO spip_articles (id_rubrique, statut, date, accepter_forum) VALUES ($id_rubrique, 'prepa', NOW(), '$forums_publics')");
$id_article = spip_insert_id();
//insertion de l'id dans la base de donnee vote
$sql ="INSERT INTO spip_articles_votes VALUES ('$id_article','1','1','1','1')";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
echo("insertion ".$id_article."dans la table vote ok");
spip_query("DELETE FROM spip_auteurs_articles WHERE id_article = $id_article");
spip_query("INSERT INTO spip_auteurs_articles (id_auteur, id_article) VALUES ($connect_id_auteur, $id_article)");
} else {
@header("Location: ./index.php3");
exit;
}
|
Remarque : lors d'un passage à une version supérieure de SPIP ne pas oublier de remettre la ligne de code :)
Remarque 2 : Si vous avez ajouté des colonnes ne pas oublier de modifier la requête !!!
3- Remplir la base
He oui, si vous faite cette nanip avec un site dejà plein d'article, il vous faut d'abord remplir la table "spip_auteurs_articles" et rentrer les id_articles.
C'est le plus long :)
4- le template des articles
Dans le template il faut 2 choses (la 2ème étant optonnelle).
> l'affichage du module de sondage
> L'affichage quelque part dans la page du résultat du sondage meme si le visiteur n'a pas voté.
Par exemple à cote du titre du titre de l'article
Remarque : Pour éviter d'afficher une valeur en chiffre j'ai decider d'afficher des coeurs. C'est bien sur tout a fait possible d'afficher les chiffres :)
Remarque 2 : On est pas obligé de mettre des coeurs, on peut mettre des étoiles ou autres .... Il suffit de faire 4 images différentes ( 1 coeur, 2 coeurs....)
Remarque 3 : Dans ma page j'ai 2 couleurs de coeurs differents (a cause du fond) on peut bien sur avoir les meme :)
5- le module de sondage
Principe : le visiteur arrive sur la page de l'article, il y a le module de sondage, il vote, et hop la page se recharge et il voit les resultats !
Tout ça c'est du php et du sql l'affichage des résultats.
Le tout est afficher dans une table
Code :
<TABLE WIDTH="100%" BORDER=0 CELLPADDING=2>
<?
switch($action) {
case "add";
//requete d'update de la base
$sql ="update spip_articles_votes SET $nom_colonne= $nom_colonne + 1 WHERE id_article= $id_article";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
//aFFICHAGE DES RESULTATS
$sql2 ="SELECT * FROM spip_articles_votes WHERE id_article= $id_article";
$req2 = mysql_query($sql2) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$data = mysql_fetch_array($req2);
//Total pour faire les %
$total = $data['col1'] + $data['col2'] + $data['col3'] + $data['col4'];
////calcul des %
$pour_col1 = $data['col1'] * 100 / $total;
$pour_col2 = $data['col2'] * 100 / $total;
$pour_col3 = $data['col3'] * 100 / $total;
$pour_col4 = $data['col4'] * 100 / $total;
////Affichage réponses avec les %
echo ("<tr><td colspan=2>");
echo ("Les résultats : Comment trouvez-vous cet article ???");
echo ("</td></tr><tr><td>");
echo ("<img src=\"img/coeur4.gif\" alt=\"4 coeurs\"> <b>Excellent</b> ");
ECHO (round($pour_col1)." %");
echo ("</td></tr><tr><td>");
echo ("<img src=\"img/coeur3.gif\" alt=\"3 coeurs\"> <b>Très vrai</b> ");
ECHO (round($pour_col2)." %");
echo ("</td></tr><tr><td>");
echo ("<img src=\"img/coeur2_v.gif\" alt=\"2 coeurs\"> <b>Bien mais ...</b> ");
ECHO (round($pour_col3)." %");
echo ("</td></tr><tr><td>");
echo ("<img src=\"img/coeur1.gif\" alt=\"1 coeurs\"> <b>Bof bof</b> ");
ECHO (round($pour_col4)." %");
echo ("</td></tr>");
break;
// CAS : AFFICHAGE DU FORMULAIRE
default;
echo "<tr><td class=accroche_rubrique colspan=2>
Votre avis : Comment trouvez-vous cet article ???
</td></tr>
<FORM ACTION=\"article.php3?id_article=$id_article\" METHOD=\"post\">
<input type=\"hidden\" name=\"action\" value=\"add\">
<tr>
<td align=center><img src=\"img/coeur4.gif\" alt=\"4 coeurs\">
<INPUT TYPE=\"radio\" NAME=\"col\" VALUE=\"col1\">
</td><td> ><b>Excellent</b> : Votre commentaire
</td></tr><tr>
<td align=center><img src=\"img/coeur3.gif\" alt=\"3 coeurs\">
<INPUT TYPE=\"radio\" NAME=\"col\" VALUE=\"col2\"> </td><td>
<b>Très vrai</b>: commentaire
</td></tr>
<tr>
<td align=center><img src=\"img/coeur2_v.gif\" alt=\"2 coeurs\"><INPUT TYPE=\"radio\" NAME=\"col\" VALUE=\"col3\"></td>
<td> <b>Bien mais ...</b>: commentaire</td></tr><tr>
<td align=center><img src=\"img/coeur1.gif\" alt=\"1 coeurs\"><INPUT TYPE=\"radio\" NAME=\"col\" VALUE=\"col4\"> </td>
<td> <b>bof bof</b>: commentaire </td></tr>
<tr><td colspan=2 align=right>
<input type=\"submit\" value=\"Voter\" >
</td></tr>
</FORM>";
break;
}
?>
</table>
remarque sur le code :
- Tout ce qui est en violet est a remplacer par vos propres commentaires
- J'ai décidé que la col1 = 4 coeurs, col2 = 3 coeurs, col3 = 2 coeurs et col4= 1 coeur
|
6- le module affichage du score de chaque article
Attention la c'est plus compliqué !!!
Le code d'affichage du score de pertinance est assez simple en soit, ce qui pose pb c'est le cache de spip ...
Pour le contrer, j'ai creer un fichier script.php (qui n'est pas un template) et qui contient le script. Ainsi ce fichier n'est pas pris en compte dans le cache.
Ensuite il suffit d'inclure ce fichier dans notre template d'article.
Dans mon cas, j'affiche le score sous forme de coeur...
Code du fichier script_spip.php
<?
//recup des valeurs des votes
$sql3="SELECT col1, col2, col3, col4 FROM spip_articles_votes WHERE id_article= $id_article";
$res3=mysql_query($sql3);
$row=mysql_fetch_row($res3);
arsort($row);
//echo key($row);
$test = key($row);
Affichage sous forme d'image
switch($test)
{
case 0:
echo("<img src=\"img/coeur4.gif\" alt=\"4 coeurs\" border=0>") ;
break;
case 1:
echo("<img src=\"img/coeur3.gif\" alt=\"3 coeurs\" border=0>") ;
break;
case 2:
echo("<img src=\"img/coeur2_v.gif\" alt=\"2 coeurs\" border=0>") ;
break;
case 3:
echo("<img src=\"img/coeur1.gif\" alt=\"1 coeur\" border=0>") ;
break;
default:
echo("y a comme un pb") ;
break;
}
?>
Mettre bien sûr, vos images :)
|
Insertion du fichier script_spip dans le template
<?
include("script_spip.php");
?>
|
7- Modification du template rubrique
Principe : dans les pages rubriques qui listent les articles, le score d'un article doit etre afficher a cote de son titre.
Il suffit de faire appel a notre fameux fichier script_spip.php mais de faire l'appel dans la boucle article.
Il s'agit aussi de recupérer l'id_article (eh oui, on est dans une rubrique, l'id_article n'est pas dans l'url !!!)
Code :
<? //recup de l'id de l'article
$id_article=#ID_ARTICLE;
include("script3.php");
?>
A mettre dans une boucle type :
<B_meme_rubrique>
<BOUCLE_meme_rubrique(ARTICLES){id_rubrique}{par date}{doublons}>
#TITRE- #DESCRIPTIF
<?
$id_article=#ID_ARTICLE;
//echo($id_article);
include("script3.php");
?>
</BOUCLE_meme_rubrique>
</B_meme_rubrique>
|
Eh voila si vous avez tout suivi ça doit marcher !!!!
En tout cas chez moi ça marche ;)
et pour finir : Les templates :
Template : article
Template : rubrique
Template : script_spip
(faire voir la source pour voir le template)
img : les petits coeurs
En cas de pb, ou pour des suggestions :
|