Ahora KumbiaPHP está en Slack!!

Si deseas contactar con nosotros y de forma rápida, estamos en Slack:

http://slack.kumbiaphp.com/

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!!! :roll:

Comentarios

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

    Éxitos!
  • edited noviembre -1
    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.
  • edited noviembre -1
    Un slug no es un filtro es una transformación de dato, eso puede ser una función y listo
  • edited noviembre -1
    ok, gracias. :roll:
  • edited noviembre -1
    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 noviembre -1
    Perfecto. esa es la respuesta que queria!
    :P
  • edited noviembre -1
    Plantea tu solución por aqui cuando la tengas lista para verificar que la hayas hecho bien
  • edited noviembre -1
    He aqui una solucion:
    -Creo un archivo php llamado slug en app/libs/
    -Pego allí el siguiente código:
    <?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('Á'=>'A', 'É'=>'E','Í'=>'I', 'Ñ'=>'N', 'Ó'=>'O', 'Ú'=>'U', 'á'=>'a', 'é'=>'e', 'í'=>'i', 'ñ'=>'n', 'ó'=>'o', 'ú'=>'u', '@'=>'_arroba_',);
    $a= strtr($cadena, $table);
    $spacer = '_';
    $string = trim($a);
    $string = strtolower($string);
    $string = trim(ereg_replace("[^ A-Za-z0-9_]", " ", $string));
    $string = ereg_replace("[ \t\n\r]+", $spacer, $string);
    $string = str_replace(" ", $spacer, $string);
    $string = ereg_replace("[ -]+", $spacer, $string);
    return $string;
    }
    }
    ?>

    -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::lib('slug');
    $articulo->tituloweb=Slug::create($this->post('titulo'));
    //...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!!!
    :lol:
  • edited noviembre -1
    Pues esa es la forma :) 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.