Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mundosica/cakephp_behavior_slug
Enables a model object to sluggable behavior.
https://github.com/mundosica/cakephp_behavior_slug
Last synced: 29 days ago
JSON representation
Enables a model object to sluggable behavior.
- Host: GitHub
- URL: https://github.com/mundosica/cakephp_behavior_slug
- Owner: mundoSICA
- Created: 2011-11-08T17:13:49.000Z (about 13 years ago)
- Default Branch: master
- Last Pushed: 2012-09-05T20:27:06.000Z (over 12 years ago)
- Last Synced: 2024-03-26T03:30:16.014Z (10 months ago)
- Language: PHP
- Homepage: http://mundosica.github.com/cakephp_behavior_slug
- Size: 141 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
#Slug Behavior.
###Enables a model object to sluggable behavior.# Comportamiento para URLs Amigables.
En ocasiones queremos que nuestros _registros_ sean accedidos por un campo distinto al **ID**, por ejemplo en el sitio web tenemos **artículos** los cuales tiene los siguientes campos:
- id - Identificador (campo auto incrementable)
- nombre - Es campo es único también.
- contenido - texto el cual podría ser vació.Si queremos definir las acciones `ver`, `editar` y `borrar` para nuestros articulos, [el estándar del **cakephp**](http://book.cakephp.org/2.0/en/development/routing.html#default-routing) nos dice que para acceder al primer, articulo el cual se llama "algún articulo" tendríamos las siguientes **URLs**:
#visualizando un articulo
http://mi-sitio/articulos/ver/1#Editando un articulo
http://mi-sitio/articulos/editar/1
#Borrando un articulo
http://mi-sitio/articulos/borrar/1
Imaginemos que queremos hacer que nuestros artículos se pudieran acceder a partir de las siguientes **URLs**:
#visualizando un articulo
http://mi-sitio/articulos/ver/algun-articulo.html
#Editando un articulo
http://mi-sitio/articulos/editar/algun-articulo.html
#Borrando un articulo
http://mi-sitio/articulos/borrar/algun-articulo.htmlPrecisamente este `Slug Behavior` nos permite hacer esto con [cakephp](http://cakephp.org/), ¿te interesa? continua leyendo...
# Instrucciones de uso.
## Descargar el paquete.
Usted puede descargar la versión mas reciente este proyecto desde la siguientes **URLs**:
Download as .tar.gz
Download as .zip## Agrega el SlugBehavior en tu aplicación.
Agrega el archivo `SlugBehavior.php` en la carpeta `app/Model/Behavior/`.
## Edita tu tabla de base de datos.
En este caso teníamos artículos con los siguientes campos.
- id - Identificador (campo auto incrementable)
- nombre - Es campo es único también.
- contenido - texto el cual podría ser vació.Es importante comentar que el campo nombre es único ahora solo faltaria agregar otro campo único con el nombre `slug_dst`.
Como **Tip** te recomiendo configuraren tu base de datos el campo `slug_dst` como indice, esto por cuestiones de rendimiento ya que al generar `slug_dst` como indice el motor **SQL** genera mas rápido las consultas:
ALTER TABLE `articulos` ADD INDEX ( `slug_dst` ) ;
## Descripción de argumentos:
#### slug\_src:
Por defecto toma el campo que hayamos definido como [**displayField**](http://book.cakephp.org/view/1062/displayField),ademas este campo deberá ser un campo único en la tabla, el cual sufrirá la trasformación **slug** para ser almacenado como `slug_dst`.
```php
array('slug_src' => 'titulo'));
```Cabe mencionar que si definimos el **displayField** y también definimos explícitamente el campo a trasformar `slug_src` la opción que tomara sera la explicita, veamos un ejemplo:
```php
array('slug_src' => 'titulo'));
```El campo que tomara para trasformarlo sera `titulo` (por encima de `nombre`) ya que de esta forma estaremos diciendo explícitamente que el `slug_src` deberá ser el campo `titulo`.
#### slug\_dst "destino del campo slug":
Deberás agregar el campo slug_dst como indice:
```sql
ALTER TABLE `talleres` ADD `slug_dst` VARCHAR( 80 ) NOT NULL AFTER `id` ,
ADD INDEX ( `slug_dst` )
```El resultado de la trasformación **slug** la cual en este caso seria 'algun-articulo', se almacenara automáticamente en este campo y desde ahí nuestro sistema podrá responder desde una url similar a:
#accediendo a alguna acción para el articulo "algún articulo"
http://mi-sitio/articulos/alguna_accion/algun-articulo> El comportamiento Slug revisa si la tabla contiene el campo `slug_dst` para almacenar esta información automáticamente.
#### slug\_dst explícito.
Ahora sí por alguna razón necesitas(ó simplemente deseas) que almacenar el valor `slug_dst` en algún campo distinto por ejemplo `seo_url`, lo que tienes que hacer es definir explícitamente el campo `slug_dst`.
```php
array('slug_dst' => 'seo_url'));
```En este caso el valor 'algun-articulo' quedaria almacenado en el campo `seo_url` de nuestra tabla `articulos`.
#### max\_len Longitud máxima:
Longitud máxima que puede llegar a tomar `slug_dst`.
```php
array('max_len'=>30));
#esto nos genera
Articulo.slug_dst = "este-es-un-articulo-sobre-el-c"
```#### wd\_separator separador de palabras:
Separador de palabras `wd_separator` (words separator) es el carácter separador de palabras,el valor por defecto es el guion alto(-), pero tu puedes definir otro por ejemplo:
```php
array('wd_separator'=>'_'));
```Esto nos generaría en `slug_dst` el valor de `algun_articulo`(en lugar de `algun-articulo`)
```php
array('wd_separator'=>'.'));
```Esto nos generaría en `slug_dst` el valor de `algun.articulo`.
#### extension\_active Activación de extensión:
Por defecto false, si activamos este campo agrega la extensión '.html', reduciendo 5 caracteres el campo max\_len (la longitud de '.html').
```php
var $actsAs = array('Slug'=>array('extension_active'=>true));
```En este caso el valor `slug_dst` seria `algun-articulo.html` agregando al final la extensión `.html`.
## Ejemplo concreto de configuración:
Entonces definimos la siguiente tabla:
```sql
CREATE TABLE IF NOT EXISTS `articulos` (
`id` INT( 5 ) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
`nombre` VARCHAR( 80 ) NOT NULL UNIQUE,
`slug_dst` VARCHAR( 50 ) NOT NULL UNIQUE,
`contenido` VARCHAR( 150 ) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
```En nuestro modelo de **Articulo**(`APP/Model/Behavior/SlugBehavior.php`) definimos el comportamiento **slug** de la siguiente manera:
```php
array('extension_active'=>true));
}
```El código anterior hace que el campo nombre(definido como `displayField`) sera trasformado con la forma `slug` y sera almacenado en el campo `slug_dst` para que de esta forma podamos realizar las consultas.
### Accediendo a los valores desde slug
Finalmente en nuestro controlador podemos llamar a las funciones slug:
```php
Articulo->readBySlug($slug);#obteniendo el id del articulo a partir del slug
$id = $this->Articulo->primaryKeyBySlug(($slug));
```
Para las demás funciones el comportamiento slug realiza las operaciones necesarias por ejemplo si deseamos guardar un registro basta con hacer:```php
Articulo->save($this->data);
```Donde en $this->data deberá contener el campo `displayField`(o el `slug_sr` que hallamos definido) y automáticamente el comportamiento nos va a generar el `slug_dst`, _¿fácil no?_.
## Cambios futuros.
Este proyecto actualmente esta en la versión `1.0` los cambios en la siguiente versión( 1.1 ) se esperan que sean:
- Agregar **callBack slug_prefix**.
- Agregar **callBack slug_postfix**.
- Soporte para extensiones distintas a html, p.e.(`xhml`, `xml`).Por el momento no he abordado el problema si tienes alguna idea bienvenida sea
## Hackers.
Si quieres comprender mas te remiendo seguir la siguiente documentación:
>