Ajouter un tagcloud à PluXML 5

Comme je vous l'ai précédement expliqué, PluXML 5 gère désormais le système de tags. Seulement, l'affichage de ces mots-clés sous forme d'une liste dans le sidebar devient vite problématique lorsque nous utilisons plusieurs dizaines de tags.

Pour remédier à ça, je vous propose de créer un système de tagcloud qui prends en compte la récurrence des tags avec un système de polices variables, un peu comme Dotclear ou Wordpress.

Création d'un nouvelle fonction

Nous allons éditer la classe plx.show
vi core/lib/class.plx.show.php
Puis nous allons ajouter ce code à la fin du fichier (avant les éléments " } ?>") :

 
    /**
     * Méthode qui affiche un nuage de tags.
     *
     * @param   max     nombre maxi de tags à afficher
     * @author  PPmarcel
     **/
     public function tagCloud($max) {

        $time = @date('YmdHi');
        $array=array();
        # On verifie qu'il y a des tags
        if($this->plxMotor->aTags) {
            # On liste les tags sans créer de doublon
            foreach($this->plxMotor->aTags as $tag) {
                if($tag['date']<=$time AND $tag['active']) {
                    if($tags = array_map('trim', explode(',', $tag['tags']))) {
                        foreach($tags as $tag) {
                            if($tag!='') {
                                if(!isset($array[$tag]))
                                    $array[$tag]=1;
                                else
                                    $array[$tag]++;
                            }
                        }
                    }
                }
            }
        }
        if(intval($max)>0) $array=array_slice($array, 0, $max);
        
        $font_max_size = 32;
        $font_min_size = 12;
        $tags_max_qty = max(array_values($array));
        $tags_min_qty = min(array_values($array));  

        $tags_spread = $tags_max_qty - $tags_min_qty;
        if ($tags_spread == 0) { // Evitons la division par 0
        $tags_spread = 1;
        }

        // Parametrage de l'incrementation
        $tags_step = ($font_max_size - $font_min_size) / ($tags_spread);

        foreach($array as $tagname => $nbtags) {

            $tags_font_size = round($font_min_size + (($nbtags - $tags_min_qty) * $tags_step));
            $t = plxUtils::title2url($tagname);
            $tag_url = $this->plxMotor->urlRewrite('?tag/'.$t);
            $tag_status =  $this->plxMotor->cible==$t?'active':'noactive';
            $tag_name = plxUtils::strCheck($tagname);
            $nb_art = $nbtags;
            echo "<a class="$tag_status" href="$tag_url" style="font-size:${tags_font_size}px" title="$nb_art articles avec le tag $tag_name"> $tag_name </a>";
        }
    }

Lister tous les tags en page statique

Dans votre panneau d'administration, créez une nouvelle page statique ayant ces propriétés:

Glissez ces 2 lignes dans le fichier obtenu:

<?php global $plxShow;
$plxShow->tagCloud($max='300'); ?>

Intégrer le tagCloud dans le sidebar

Il vous faut éditer le fichier sidebar.php de votre thème et y ajouter ceci:

    <h2>Mots clés</h2>
    <p><?php $plxShow->tagCloud($max='25'); ?><br><br>
    <center><a href="index?static3/alltags" title="Tous les tags"><em>[ Tous les tags ]</em></a></center></p>

Comme vous pouvez le deviner, la variable $max correspond au nombre de tags à afficher. Si vous devez en limiter le nombre, la troisième ligne vous donne un lien vers la page statique listant tous les tags. Editez ce lien en fonction des numéros et nom de la page statique précédement créé.

Le résultat final devrait ressembler à ça:

EDIT: Un fil de discussion à été créé sur le forum officiel, avec une solution alternative proposée.
Vus : 480
Publié par PPmarcel : 21