Filter personalizado para crear url amigables

edited enero 2011 in Bugs y Problemas
Hola a todos!!!
Quisiera que alguien me ayude con este problema.
Dada una cadena cualquiera, quisiera convertirla al formato url amigable, a fin de guardarla en una base de datos.
Por ejemplo:
$cadena='Este es un título';
En:
$cadena='este_es_un_titulo';
Y no solo que reemplace vocales, sino cualquier otro caracter que no sea alfanumerico.

Para fines practicos, me gustaria que sea un filter personalizado que se guarde en la carpeta app/extensions/filters, asi lo puedo invocar como yo quiera.
Vi varias opciones en http://blog.unijimpe.net/convertir-texto-en-url-seo/, pero no se como se crean filtros personalizados ni como se invocan desde un controller.
Alguien podria ayudarme?

Saludos desde Argentina!!! <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Rolling Eyes" /><!-- s:roll: -->

Comentarios

  • Entiendo, seguramente en internet hay muchas expresiones regulares para cambiar a eso que quieres si buscas seguro encontraras...

    Éxitos!
  • edited 7:34
    En realidad ya tengo la expresion regular. lo que no se es como crear mi propio filter y cómo invocarlo. En el manual no dice nada sobre eso. Solo se explican los Filters que vienen por defecto.
  • Un slug no es un filtro es una transformación de dato, eso puede ser una función y listo
  • edited 7:34
    ok, gracias. <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Rolling Eyes" /><!-- s:roll: -->
  • Veo que te quedas con la duda, solo debes crear un metodo como una libs y usarla para cambiar tu string por un slug como lo deseas...

    Fijate nosotros tenemos una que la hemos colocado en apps/libs/slug.php este archivo tiene un metodo llamado create y desde utilizo esa clase donde se necesito, coloco un escenario imagina que es una vista, cargo la libreria y hago Slug::create('Es un Titulo'); el metodo retorna el slug como lo queremos en este caso es-un-titulo
  • edited 7:34
    Perfecto. esa es la respuesta que queria!
    <!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Razz" /><!-- s:P -->
  • Plantea tu solución por aqui cuando la tengas lista para verificar que la hayas hecho bien
  • edited 7:34
    He aqui una solucion:
    -Creo un archivo php llamado slug en app/libs/
    -Pego allí el siguiente código:
    &lt;?php
    class Slug{
    	/****************************
    	 * Convierte una cadena a url amigable
    	 ****************************/
    	public static function create($cadena){
    		//Convertir titulo a url amigable
    		$cadena=utf8_decode($cadena);
    		$table = array('Á'=&gt;'A', 'É'=&gt;'E','Í'=&gt;'I', 'Ñ'=&gt;'N',  'Ó'=&gt;'O', 'Ú'=&gt;'U',  'á'=&gt;'a',  'é'=&gt;'e', 'í'=&gt;'i',  'ñ'=&gt;'n', 'ó'=&gt;'o', 'ú'=&gt;'u', '@'=&;gt;'_arroba_',);
    		$a= strtr($cadena, $table);
    		$spacer = '_';
    		$string = trim($a);
    		$string = strtolower($string);
    		$string = trim(ereg_replace(&quot;&#91;^ A-Za-z0-9_&#93;&quot;, &quot; &quot;, $string));
    		$string = ereg_replace(&quot;&#91; \t\n\r&#93;+&quot;, $spacer, $string);
    		$string = str_replace(&quot; &quot;, $spacer, $string);
    		$string = ereg_replace(&quot;&#91; -&#93;+&quot;, $spacer, $string);
    		return $string;
    	}
    }
    ?&gt;
    
    -Luego abro el controller Articulo
    -En el metodo que guarda el articulo (yo lo llamé guardar), cargo la librería e invoco el método create:
    $articulo=new Articulo();
    Load&#58;&#58;lib('slug');
    $articulo-&gt;tituloweb=Slug&#58;&#58;create($this-&gt;post('titulo'));
    //&#46;&#46;&#46;continua el guardado de esta tabla
    
    -Dentro del metodo create uso utf8_decode porque el formulario esta en iso-8859-1 y se manda con ajax usando encodeURIComponent
    -Probé el código y funciona bastante bien, aunque me gustaría hacerlo con preg y no ereg, ya que el primero tiene mejor rendimiento.
    -Logicamente, la libreria se puede mejorar. Acepto sugerencias!!!
    <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
  • Pues esa es la forma <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) --> aunque la funcion puede mejorarse para que sea mas estandar pero en terminos de la idea es la correcta...
Sign In or Register to comment.