Des tags dans Pluxml

ti_pierreti_pierre Member
janvier 2010 modifié dans Modifications
Bonjour à tous,

Après un bon retard, il est temps de vous dire comment nous avons fait.

Précautions avant usage :

Suite à la mise en place de ce système sur mon blog, j'ai constaté un très fort ralentissement du temps de chargement des pages.

Principe de fonctionnement :

J'ai demandé à Stephane qui est l'auteur de ce plugin de me faire un txt explicatif, je vous fait donc part de ce qu'il ma envoyé :
Stéphane a écrit:
Le principe de l'utilisation des tags est simple. Elle consiste à écrire dans le chapo ou le contenu d'un article, une liste de mots clés séparés par des virgules, entourés des balises [tags] et [/tags]

Exemple: [tags]tag-1, tag-2, tag-3[/tags]

1) Interagir avec le contenu d'un article à partir du thème

La boucle de lecture sur les articles dans le fichier home.php de notre theme se présente de cette façon

<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>

.....

<?php endwhile; # Fin de la boucle sur les articles ?>

Si l'on veut intéragir avec le contenu de l'article en cours de lecture dans la boucle while, on va y ajouter l'appel de la fonction getArtTags() de notre classe plxtags tout de suite après le while:

<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>

<?php $plxTags->getArtTags() # récuperation des tags ?>

...

<?php endwhile; # Fin de la boucle sur les articles ?>

Si l'on regarde le code de la fonction getArtTags

function getArtTags() {

# obligatoire pour avoir accès aux articles
global $plxShow;

# on récupere le contenu de l'article
$art = $plxShow->plxMotor->plxRecord_arts->result[$plxShow->plxMotor->plxRecord_arts->i];

# on recherche les balises tags et leur contenu
if (preg_match('#\[tags\]([^\]]*)\[\/tags\]#i', $art, $capture)) {
$this->tags = $this->_parseTags($capture[1]);
$art = str_replace($capture[0],'',$art);
}
if (preg_match('#\[tags\]([^\]]*)\[\/tags\]#i', $art, $capture)) {
$this->tags = $this->_parseTags($capture[1]);
$art = str_replace($capture[0],'',$art);
}

# on mémorise les modifications faites sur le contenu de l'article
$plxShow->plxMotor->plxRecord_arts->result[$plxShow->plxMotor->plxRecord_arts->i] = $art;

}

On récupere donc tout le contenu de l'article dans le tableau $art.
Le contenu du chapo est stocké dans $art alors le contenu de l'article est dans $chapo
Il suffit ensuite d'extraire le contenu des balises [tags] si elles existent grace à une expression régulière:

preg_match('#\[tags\]([^\]]*)\[\/tags\]#i', $art, $capture)
ou
preg_match('#\[tags\]([^\]]*)\[\/tags\]#i', $art, $capture)

De cette façon si on reprend notre exemple du début
$capture[0] = [tags]tag-1, tag-2, tag-3[/tags]
$capture[1] = tag-1, tag-2, tag-3

On mémorise la liste des tags dans la variable $this->tags et isolant de $capture[1] chaque mot clé afin de créer des liens cliquables:

$this->tags = $this->_parseTags($capture[1]);

function _parseTags($tags_line) {
$return = '';
if ($tags = explode(',', $tags_line)) {
foreach ($tags as $tag) {
$return[] = '<a href="./?tag/'.urlencode(trim($tag)).'">'.trim($tag).'</a>';
}
$return = implode(', ', $return);
}
return $return;
}

Nous voyons ici que les liens sur les tags seront de la forme:

http://monsite.org?tag/tag-1
http://monsite.org?tag/tag-2
http://monsite.org?tag/tag-3


Il faut également supprimer de l'article les balises [tags] pour qu'elles ne soient pas affichées lors de l'appel des fonctions $plxShow->artChapo() ou $plxShow->artContent().

$art = str_replace($capture[0],'',$art);

Il ne reste plus qu'à mémoriser les modifications faites sur le contenu de l'article dans la variables global $plxShow (variable utilisée dans les thèmes)
$plxShow->plxMotor->plxRecord_arts->result[$plxShow->plxMotor->plxRecord_arts->i] = $art;

2) Affichage des tags

Pour afficher les tags, on va utiliser une autre fonction de la classe plxtags: tagArtList()
Voici comment l'appeler:

<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>

<?php $plxTags->getArtTags() # récuperation des tags ?>

<?php $plxTags->tagArtList() # affichage de la liste des tags sous forme de lien ?>
...

<?php endwhile; # Fin de la boucle sur les articles ?>

La fonction tagArtList() ne fait qu'afficher notre variable de class $this->tags qui elle même contient la liste des tous les tags de l'article sous forme de liens cliquables.

3) Liste des tous les articles appartenant à un tag

Nous avons vu que les liens des tags est de la forme

http://monsite.org?tag/tag-1

Dans le fichier header.php apres la ligne

<?php if(!defined('PLX_ROOT')) exit; ?>

Nous devons inclure l'appel du fichier de notre classe plxTags

<?php include(PLX_ROOT."plugins/tags.php");

A la fin du fichier tags.php, une instance de la classe plxtags est créée

$plxTags = new plxTags();

Le constructeur de la classe est alors appelé. C'est ici que nous allons regarder si dans notre url, le mot tag apparait pour savoir si nous devons rechercher tous les articles contenant le tag passé en paramètre dans l'url

function plxTags() {

if(preg_match('/^tag\/(.+)$/',urldecode($_SERVER),$capture)) {
$this->mode = 'tag';
$this->urltag = $capture[1];
$this->_search();
}

}

On fixe le mode d'affichage à 'tag' au lieu de 'home'
Le tag sélectionne est contenu dans la variable $capture[1]
La fonction _search() va chercher tous les articles contenant le tag sélectionné. Basiquement, la recherche des articles consiste à aller lire tous les fichiers xml des articles et de regarder si dans le chapo ou le contenu il y a les balises tags. Si une balise tags existe on teste si le tag de l'url est présent. Si oui on mémorise l'article (il sera pris en compte et affiché dans les boucles de lecture while des thème), sinon on passe au suivant. On se limite au nombre d'articles à afficher par page.

4) Pagination et Liste de tous les tags

Deux autres fonctionnalités sont à prendre en compte dans cette gestion des tags:
- la pagination (voir fonction pagination() de plxtags): Lorsque nous avons une url du type http://monsite.org?tag/tag-1 et que nous pagination, il faut garder le paramètre tag dans url. Si le mot tag est présent on reconstruit une url en gardant ?tag/tag-1 et en rajoutant le numéro de page visualiser. Sinon on appelle la fonction de base de pagination de la classe plxShow.

Autre fonctionnalité intéressante est de lister tous les tags des articles dans la sidebar pour obtenir une sorte de glossaire. C'est la fonction tagsList() de plxTags qui a cette tâche.
Installation de la bête :

- Créer un dossier " plugins " à la racine de votre blog.
- Créer un dossier " tags " dans le dossier " plugins " crée précédement.
- Mettez le fichier tags.php dans le dossier tags crée à l'étape précédente.

Vous n'avez plus qu'à modifier les fichiers situé dans le dossier " themes/defaut "

- Ouvrir header.php :

Après :
<?php if(!defined('PLX_ROOT')) exit; ?>
Ajouter :
<?php include(PLX_ROOT.'plugins/tags/tags.php') ?>
- Ouvrir home.php :

Après :
<?php while($plxShow->plxMotor->plxRecord_arts->loop()): # On boucle sur les articles ?>
Ajouter :
<?php $plxTags->getArtTags() ?>
et mettre :
<p>Tags: <?php $plxTags->tagArtList() ?></p>
Là ou vous désirea afficher les articles.

Remplacer :
<p id="pagination"><?php $plxShow->pagination(); ?></p>
Par :
<p id="pagination"><?php $plxTags->pagination(); ?></p>
Effectuer la même opération pour categorie.php et article.php ( sauf pour la pagination dans article.php bien sur ).

- Ouvrir sidebar.php :

Après :
<div id="sidebar">
Ajouter :
<h2>Mots Clés</h2>
	<div id="tags">	
		<ul><?php $plxTags->tagsList() ?></ul>
	</div>
Sauf erreur de ma part, le tour est joué, bon test à vous tous, et n'hésitez pas à retourner les bogues rencontrés.

Réponses

  • GzygGzyg Member
    janvier 2010 modifié
    Pffiouuu !!

    Vais relire ça à tête reposée... pour un dimanche soir, c'est un peu chaud !


    à plus,

    Gzyg
  • StéphaneStéphane Member, Former PluXml Project Manager
    A la demande de Ti-Pierre, je lui ai fournit une description "technique" du plugin.
    Ce qui rend certainement le texte un peu indigeste pour certain :)

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • Stéphane a écrit:
    A la demande de Ti-Pierre, je lui ai fournit une description "technique" du plugin.
    Ce qui rend certainement le texte un peu indigeste pour certain :)
    Mdr oui :) , clair que dès le matin ...
  • bonjour,

    J'ai mis en place les tags sur mon site (http://louisroche.net/blog si vous voulez voir ce que ca peut donner) et globalement ca fonctionne bien.

    Cependant deux petits problemes :
    - je ne peux pas faire s'afficher le liste des tags sur la page d'un article. J'ai juste le "Tags :" sans les tags de l'article.
    - le code a placer dans le chapô ([tags]tag1, tag2[/tags] apparait au début de l'article.

    En tout cas merci pour le travail
  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour Khady

    Vérifie que tu as mis le code nécessaire dans le fichier article.php de ton thème de la même façon que pour home.php

    Au passage: excellent le thème de ton site. je le trouve très beau !

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • KhadyKhady Member
    janvier 2010 modifié
    J'ai retiré le code apres de multiples essais parce que je n'avais que "Tags :" qui s'affichait, mais je peut faire un essai de plus. J'editerais ma réponse.

    Merci pour le theme. D'ailleurs j'ai fais quelques corrections, il faudrait que je fasse remonter.

    edit : en fait c'est bon, c'est que pour mon theme le <?php $plxTags->getArtTags() ?> ne s'insere pas exactement au même endroit.

    Beau travail !
  • Joli travail par contre je n'ose pas imaginer l'augmentation de la compléxité. Ti-Pierre, tu as eu l'occasion de quantifier l'augmentation du temps d'execution ?

    Je me demande aussi si la gestion des tags par un fichier qui fait les associations tags->{articles concernés} ne sert pas plus simple à mettre en place (je parle en terme de modifications sur un pluxml de base).
  • Skyline a écrit:
    Ti-Pierre, tu as eu l'occasion de quantifier l'augmentation du temps d'execution ?
    Salut à toi le retraité :p !

    Eh non je n'ai pas eu l'occasion, je dois faire une étude complète sur différents serveur gratuit ou non afin de bien comparer.

    Cela viens bientôt dans un blog ... ( surprise ^^ )

    Ce que j'ai constaté et qui est certains, c'est que le temps sur mon nombre d'article à été très largement augmenté, bref, au lieu de tapoter dans le vent je fais une étude plus poussée et mieux étayée que celle-ci, et je pourrais donner un compte-rendu vraiment complet.

    A bientôt.
  • CibouCibou Member
    Bonjour
    je voulais faire le test avec l'extension mais le fichier à télécharger me renvoie une erreur quand j'essaie de la décompresser.
    voici l'erreur :
    End-of-central-directory signature not found. Either this file is not
    a zipfile, or it constitutes one disk of a multi-part archive. In the
    latter case the central directory and zipfile comment will be found on
    the last disk(s) of this archive.
    ou bien est-ce du au décompresseur ubuntu et le fichier va bien ?
    meric pour votre retour !
  • bg62bg62 Member
    Khady a écrit:
    bonjour,

    J'ai mis en place les tags sur mon site (http://louisroche.net/blog si vous voulez voir ce que ca peut donner) et globalement ca fonctionne bien.

    Cependant deux petits problemes :
    - je ne peux pas faire s'afficher le liste des tags sur la page d'un article. J'ai juste le "Tags :" sans les tags de l'article.
    - le code a placer dans le chapô ([tags]tag1, tag2[/tags] apparait au début de l'article.

    En tout cas merci pour le travail
    ben ça fait pas vraiment 'tag cloud' mais plutôt des listes à rallonge ... pas moyen de simplifier ?
  • Bonjour ti_pierre.

    J'aurais bien voulu essayer le système des tags, seulement le plugin n'est plus disponible sur ton site. Est-ce que tu pourrais le re-uploader, s'il te plait?
Connectez-vous ou Inscrivez-vous pour répondre.