Banner

Ultima revisión 28/10/2012

TagCloud: Clase para crear nubes de etiquetas en PHP

Recientemente necesite usar nubes de etiquetas y he decidido realizar una pequeña clase para que crearlas sea portable, sencilla y que no necesie hacer grandes cambios para usarla.

tagcloud_previo_imagen

Pues bien, ahora os la dejo para vuestro "use y disfrute".

La clase usa como fuente de datos una cadena en la que se encuentran todas las etiquetas o tags separadas por comas. Con la función create() se crearán las etiquetas y se le aplicarán los estilos definidos en tu CSS.

Código de la clase


<?php
class TagCloud {
            var $tags = "";
            var $url  = "";
            var $trimStr = "deleteSpaces";
            
            function create($tags, $url = ""){
                if($tags == "") $this->$tags = $tags;
                if($url == "") $url = $_SERVER['PHP_SELF'];
                $this->url = $url;
                
                // Formateamos y limpiamos el string sustituyendo caracteres especiales por comas
                $tags=substr($tags,0,strlen($tags)-1);
                $array_sustitucion = array(',,','.','/',':');
                $etiquetas=str_replace($array_sustitucion, ",", $tags);
    
                // Llenamos el array
                $etiquetas=explode(",",$etiquetas);
                @array_walk($etiquetas, $this->trimStr);
                $total=count($etiquetas);
                $etiquetasOk = array_count_values($etiquetas);
        
                foreach($etiquetasOk as $palabra=>$valor) {
                    $porcentaje = round($valor*100/$total);
                    if($porcentaje>= 70){
                        $estilo = 6;
                    }elseif($porcentaje>= 35){
                        $estilo = 5;
                    }elseif($porcentaje>= 30){
                        $estilo = 4;
                    }elseif($porcentaje>= 22){
                        $estilo = 3;
                    }elseif($porcentaje>= 10){
                        $estilo = 2;
                    }else{
                        $estilo = 1;
                    }
                    echo '<a href="'.$this->url.'?cat='.$palabra.'" title="Coincidencias: '.$valor.'" class="etiqueta'.$estilo.'">'.$palabra.'</a><span  class="etiqueta0">'.'('.$valor.')</span>';
                }
            }
            
            function deleteSpaces($e=' '){
                $e = trim($e);
            }
        }
?>

Estilos aplicados por CSS

Los estilos los podéis cambiar en la hoja de estilos CSS vuestra. Sólo tienen que estar definidos como los siguientes:


.etiqueta0 { color:#aaaaaa; font-size: 12px; }
.etiqueta0:hover span { text-decoration:none !important; }
a.etiqueta1 { font-size: 12px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta2 { font-size: 16px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta3 { font-size: 20px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta4 { font-size: 24px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta5 { font-size: 28px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta6 { font-size: 32px; text-decoration:none; padding:2px; margin:3px; display:inline-block; }
a.etiqueta1:hover{ text-decoration:underline; }
a.etiqueta2:hover{ text-decoration:underline; }
a.etiqueta3:hover{ text-decoration:underline; }
a.etiqueta4:hover{ text-decoration:underline; }
a.etiqueta5:hover{ text-decoration:underline; }
a.etiqueta6:hover{ text-decoration:underline; }
a.etiqueta1:hover span{ text-decoration:none !important; color:#5567B9 }

Forma de usarla

Suponemos que tenemos una cadena que contiene los siguientes valores:


$tags = "KPIs,SEO,SEM,SEM,Marketing,Social Media,SEO,Marketing,SEM,Social Media,SERPsMarketing,Social Media,Social Media,SMO,Social Media,Redes Sociales,Redes Sociales";

si queremos crear la nube de etiquetas insertaremos las siguientes 2 líneas:


$tagCloud = new TagCloud;
$tagCloud->create($tags);

Si además le queremos enviar una URL distinta a la actual podemos incluirlo en la función create(). Si no se le pone URL se tomara por defecto la URL actual.


$tagCloud = new TagCloud;
$tagCloud->create($tags, $_SERVER['REQUEST_URI']);