Tratamiento dinámico avanzado con etiquetas entre dominios



Para compartir el uso de etiquetas entre varios dominios lo que se suele hacer es compartir una base de datos en un servidor y utilizar varias aplicaciones que comparten modelos de datos y modifican las vistas (visualizadores) para mostrar los resultados en una sinergía creada por los usuarios que rellenan artículos, contenido, noticias, productos, etc. y establecen las etiquetas asociadas a toda esta información…

La función que va en la clase tags del modelo de datos de zenphp es:

 /**
  * Devuelve un array con todos los tags de todas las tablas que coinciden con $nombre
  **@TODO: Es inestable, no carga bien los modelos de datos que no estuvieran ya cargados...
  *
  * @param str $nombre
  * @param str $modelos
  * @return array
  */
 function obtener_lista($nombre="",$modelos=""){
  $nombre    = str_replace("_","-",$nombre);
  $modelos   = empty($modelos)?array("noticias","contenidos"):split(",",$modelos);
  if (!is_array($modelos)) return false;
  $etiquetas = array();
  foreach ($modelos as $modelo){
   $unset =false;
   if (!$this->padre->$modelo instanceof zen_modelo_datos) {
   	if (!zen___importar_modelos($this->padre,$modelo)) {
   		continue;
   	} else {
   		$unset = true;
   	}
   }
   $c = split(",",$this->padre->$modelo->campos);
   $this->padre->$modelo->poner_campos_al_modelo();
   $r = $this->padre->$modelo->obtener($c[0].",tags");
   $n = count($r);
   for ($i=0; $i<$n; $i++){
   	$tags = str_replace(array(" ,",", "),",",$r[$i]['tags']);
    $tags = split(",",$tags);
    foreach ($tags as $tag){
     $tag = html_entity_decode($tag);
     if (empty($nombre)){ //No buscamos un tag en concreto sino todos:
      if (!in_array($tag,$etiquetas)) //Insertar en la lista
       $etiquetas[] = $tag;
      continue;
     }
     if (zen_codifica_nombre_para_url($tag)==
    	zen_codifica_nombre_para_url($nombre))
     {
      if (!in_array($r[$i][$c[0]],$etiquetas)){
     	array_push($etiquetas,array(
     	 "modelo"=> $modelo,
     	 "id"   =>  $r[$i][$c[0]]
        ));
      } //comprobacion de si se estaba repetida
     } //comprobacion de si es la buscada
    } //bucle foreach de tags
   } //bucle for que recorre todos los tags de este campo
   if ($unset) unset($this->padre->$modelo);
  } //bucle for que recorre todos los modelos especificados
  return $etiquetas;
 }

Para utilizar una función dinámica que un visualizador (html_tags extends zen_html_modelo_datos) interprete usando diferentes plantillas para cada dominio podemos usar la siguiente :

 /**
  * Mostrara una pagina con un listado de tags, que enlazan a los distintos dominios,
  * se especifica el $dominio para ver cual de los contenidos han de rellenarse
  *
  * @param str $tag
  * @param str $dominio
  */
 function ver($tag,$dominio=ZF_SITIO_WEB){
  //Intentemos encontrar el tag
  $tags = $this->padre->obtener_lista($tag);
  $p = new zen_plantilla();
 // if (!count($tags)) die(sprintf("no hay ningun elemento con el tag %s",$tag));//header("Location: ".ZF_SITIO_WEB);
  $r['tag'] = str_replace("_","-",zen_sanar($tag));
  $r['enlaces'] = "";
 
  foreach ($tags as $tag){
   switch ($tag['modelo']){
   	case 'noticias': //Noticias a la web del grupo (corporativa)
   	 $tit = $this->padre->padre->noticias->obtener_campo($tag['id'],"titular");
   	 $r['enlaces'] .= 'Noticia: <a href="'.ZF_SITIO_WEB.'noticias/ver/'.$tag['id'].'/'.zen_codifica_nombre_para_url($tit).
   	 	'/">'.$tit.'</a><br>';
   	 break;
   	case 'contenidos': //Presentacion.. (informacion corporativa)
   	 $tit = $this->padre->padre->contenidos->obtener_campo($tag['id'],"nombre");
   	 $zona= $this->padre->padre->contenidos->obtener_campo($tag['id'],"zona");
   	 $r['enlaces'] .= 'Presentaci&oacute;n: <a href="'.ZF_SITIO_WEB.'presentacion/'.
   	 	$tag['id'].'/'.zen_codifica_nombre_para_url($tit).
   	 	'/">'.$tit.'</a><br>';
   	 break;
   }
  }
  $this->padre->padre->contenido['contenido'] = $p->contenido_reemplaza("etiquetas/indice.html",$r);
  switch ($dominio){
   case ZF_SITIO_WEB:
    $this->
    $this->padre->padre->contenido['columna_izda1'] = $this->listar();
    $this->padre->padre->html->mostrar_web("Etiqueta ".
  	 zen_sanar($r['tag']),"sel_inicio","cab_contacto.html","rut_etiqueta.html"); 
  	break;
   default:
    //$titulo,$menu,$ruta="",$col_izda="indice"
    $this->padre->padre->html->mostrar_web("Etiqueta ".$tag,"sel_indice","rut_etiqueta.html","indice"); 
  	break;
  } 
 } //fin-ver

Sistemas de etiquetas cíclicos para la web: buena idea, difícil implementación

La idea es crear una navegación única para cada usuario con la que vamos “barriendo” la web, usando los tags como cepillo: arrastra el polvo del contenido y nos quedamos con lo que interesa,gracias a un sistema cíclico de etiquetas clasificadoras.

Un sistema de etiquetas cíclico se basa en un sistema de etiquetas simple donde se dispone de una lista de n reglas de etiquetas (tags, cada una de una forma especial) que se aplican en un sistema de orden secuencial y después empiezan de nuevo por la primera regla.
En un sistema de este tipo, cada conjunto de reglas de etiquetas tiene una estructura especial donde es asociado un patrón a un usuario sólo si el primer elemento no es requerido, i.e., es independente del conjunto, entonces es borrado.

El lado oscuro del sistema

Sin embargo no todo es un camino de rosas, como suele pasar en los sistemas, se producen muchos problemas por el mal diseño del software y una pésima implementación puede hacer que un servidor web incluso se colapse…

Por ejemplo technorati usa un sistema de tags con 467 mil tags diferentes,cuando un típico diccionario puede tener alrededor de 75 mil entradas…la diferencia es impresionante, teniendo en cuenta que no todos los usuarios están utilizando realmente tags para clasificar sus artículos.

La parte oscura del sistema viene dado por los “memes”: si uso una cita o etiequeta específica en un artículo de mi blog o web, entonces, se conectará con otros artículos incluso de otros sitios, se crean vínculos…

Pero…sorpresa sorpresa!!, esto no funciona tan bien como se espera porque acabas creando subcomunidades que se estandarizan, pero que están navegando en contra de la dirección de otras subcomunidades.

Soluciones: usuarios y desarrolladores

En esta situación, ¿cuál de los dos grupos van a cambiar sus etiquetas retroactivamente?, o ¿es la persona que está navegando a través del sistema de etiquetas a partir de una serie de artículos la que debería saber acerca de esto y salirse del anillo a voluntad?

Con casi medio millón de etiquetas en una comunidad a la que le encanta progresar, quizás deberíamos replantearnos estas ideas y rediseñar nuestras aplicaciones…

Y ,pronto…¡la implementación!