Inicio > Tecnología > Castellaniza los nombre de tus modelos y controllers en CakePHP

Castellaniza los nombre de tus modelos y controllers en CakePHP

Lunes, 2 de Junio de 2008

Actualización: Por alguna razón el nuevo cake se niega a encontrar el singular de las palabras terminadas en “as”, he actualizado las reglas de inflexión para corregir este problema.

¿Alguna vez haz necesitado que los nombres de los modelos que creas en cake estén en español ? ¿Haz sufrido (como yo) los azares de hacer bake de nombres de tablas en español con una “a” al final? La solución es muy simple…. pero primero, algo de historia.

Algo increíble de CakePHP es que tiene la inteligencia necesaria para deducir sinónimos y plurales de palabras, lo cual es muy utlizado dentro de las convenciones de este framework para darle semántica a los nombres de archivo que se han de crear para cada capa de las aplicaciones.

Como podrás recordar, las convenciones dictan que los nombres de tabla deben estar en plural (cosa que a los purista de SQL no les agrada, puesto que una tabla representa una entidad, no un conjunto de ellas), los nombres de modelo en plural, que a veces representan el conjunto y a veces la entidad; finalmente los controladores, que deben ser nombrados igual que las tablas, pues representan acciones sobre el conjunto de datos.

El lado negativo de estas convenciones, es que, como fueron diseñadas para el idioma inglés, no toman en cuenta las inflexiones del lenguaje castellano, que si bien no son más complicadas que la de la lengua anglosajona, son un poco diferentes.

Una de las reglas que difieren entre estas dos lenguas, y que más me mortifican al momento de autogenerar código con CakePHP, son las palabras terminadas por “a”, puesto que el plural en inglés tiene terminación “um”, mientras que en la hermosa lengua castellana, simplemente se le agrega una “s” al final.

Pues bien, los desarrolladores de mi framework favorito sabían que el inglés no es el único idioma, así que dejaron la infraestructura armada para agregar o quitar reglas de inflexión muy sencillamente. A continuación les dejo mi archivo inflections.php, que debe ser depositado en la carpeta app/configs de tu aplicación cake, para ser utilizado. Si se les ocurren nuevas reglas de inflexión, por favor avísenme y se las iremos agregando hasta que cubramos las reglas enteras para el castellano:

$pluralRules = array('/([r|d|j|n|l|m|y|z])$/i' => '\1es','/a$/i' => '\1as');
$uninflectedPlural = array();
$irregularPlural = array();
$singularRules = array('/([r|d|j|n|l|m|y|z])es$/i' => '\1', '/as$/i' => 'a', '/([ti])a$/i' => '\1a');
$uninflectedSingular = $uninflectedPlural;
$irregularSingular = array_flip($irregularPlural);

¡Qué lo disfruten!

Tecnología ,

  1. Lunes, 2 de Junio de 2008 a las 09:49 | #1

    Tremenda ayuda con esas inflecciones. La verdad a veces nos puede causar problemas estos nombres en español.

  2. Lunes, 2 de Junio de 2008 a las 12:28 | #2

    La verdad es que casi siempre suelo agregar los casos muy puntuales en que necesito una regla especial
    Este listado viene bien y lo voy a probar asi me olvido del tema.

  3. Manuel
    Lunes, 25 de Agosto de 2008 a las 11:20 | #3

    Muy buen aporte, ya me estaba complicando con esas reglas gringas… GRACIAS.

  4. Martes, 2 de Septiembre de 2008 a las 15:32 | #4

    Hola!

    La verdad que tu artículo me ayudó mucho, así que te agradezco.

    Sin embargo, el otro día me encontré con un caso que no vi contemplado. Yo ‘heredé’ una base de datos, que tiene una tabla, cuyo nombre es ‘web_bases’

    El problema es que con las reglas de inflections.php, me modificaba el plural ‘bases’ a ‘basis’ como singular, cuando el singular es claramente ‘base’

    Así que le agregué un nuevo elemento a los arrays de inflection y me quedó así:

    ‘\1es’,
    ‘/a$/i’ => ‘\1as’,
    ‘/e$/i’ => ‘\1es’ //nuevo
    );

    $uninflectedPlural = array();

    $irregularPlural = array();

    $singularRules = array(
    ‘/([r|d|j|n|l|m|y|z])es$/i’ => ‘\1′,
    ‘/as$/i’ => ‘a’,
    ‘/([ti])a$/i’ => ‘\1a’,
    ‘/es$/i’ => ‘\1e’ //nuevo
    );

    $uninflectedSingular = $uninflectedPlural;

    $irregularSingular = array_flip($irregularPlural);
    ?>

    Ahora parece funcionar todo bien!

    Un saludo,
    Fabricio.

  5. Miércoles, 17 de Septiembre de 2008 a las 12:21 | #5

    Una correción al la correción de Fabricio,

    $pluralRules = array(
    ‘/([r|d|j|n|l|m|y|z])$/i’ => ‘\1es’,
    ‘/a$/i’ => ‘\1as’,
    ‘/e$/i’ => ‘\1es’,
    ‘/s$/i’ => ‘\1ses’
    );

    $singularRules = array(
    ‘/([r|d|j|n|l|m|y|z])es$/i’ => ‘\1′,
    ‘/as$/i’ => ‘a’,
    ‘/([ti])a$/i’ => ‘\1a’,
    ‘/ises$/i’ => ‘\1is’, //nuevo
    ‘/es$/i’ => ‘e\1′,
    );

    El problema daba con la palabra Pais, me decia Paise.

    Saludos

  6. Jueves, 16 de Octubre de 2008 a las 10:32 | #6

    Buenas José,

    a ver si me puedes echar una mano. Estoy empezando con CakePHP y con la primera tabla de mi modelo ya tengo problemas de singulares/plurales (ya es puntería…). Se trata de ‘Serie’, al parecer el inflector lo traduce como ‘Series’ tanto en singular como en plural. ¿Alguna idea?

    Un saludo,

    Sergio.

  7. Jueves, 16 de Octubre de 2008 a las 11:14 | #7

    @Sergio

    ¿Cual es exactamente el error que estás obteniendo?

  8. Jueves, 16 de Octubre de 2008 a las 12:02 | #8

    A ver, creo que he llegado a una solución un poco radical…

    el error era algo como “No se encuentra el modelo ‘Series’ …”, en lugar de ‘Serie’ que era el que yo creé. La causa parece estar en las variables $coreUninflectedPlural/Singular del Inflector de PHPCake, que contenían la palabra ‘Series’. Al final he optado por borrarla, y parece que ha funcionado, pero me pregunto si es posible “sobreescribir” de alguna forma esa regla sin tocar las librerías…

    Gracias!

  9. Viernes, 24 de Octubre de 2008 a las 16:44 | #9

    Para solucionar el problema de Series -> Series:


    $irregularPlural = array('serie' => 'series');

  10. jimmy
    Viernes, 14 de Noviembre de 2008 a las 14:19 | #10

    Necesito ayuda, no se si sera un problema por los nombres, tengo una tabla “tipoexamen”, todas las demas andan bn, sus modelos, controller, vistas, pero al tratar de abrir esta, me dice:
    Missing Controller
    Error: TipoexamenesController could not be found.
    Error: Create the class TipoexamenesController below in file: app/controllers/tipoexamenes_controller.php

    y esta creado todo tal cual las otras tablas.

  11. jimmy
    Viernes, 14 de Noviembre de 2008 a las 14:29 | #11

    ya encontre el problema, jejeje, lo que paso fue una letra cambiada, decia:
    <?php
    class TipoexamanesController
    cuando deberia haber sido:
    <?php
    class TipoexamenesController

    Gracias de todas formas.

  12. alvaro
    Martes, 20 de Enero de 2009 a las 08:20 | #12

    hola, me ha servido mucho este script, es genial gracias pero tengo un pequeño problema que estoy intentando solucionar y no puedo, estoy en el curro y me dicen que muy bien estan estas expresiones regules pero que quieren controlar los acentos, es decir, me piden que una palabra como león pasa a leones y viceversa leones a león. Como podría realizar yo esto, muchas gracias de antemano.

  13. Martes, 20 de Enero de 2009 a las 08:54 | #13

    En primer lugar debes entender que las Inflexiones son para palabras clave dentro del código, en ciertas ocasiones se puede usar apa mostrar texto legible a los usuarios, pero en definitiva son pocas la veces. Realmente desconozco el soporte de PHP para variables y nombres de clase con caracteres que no sean ASCII. Pero Aqui te puedo dar un ejemplo para león -> leones. Si tienes éxito y no se quema tu servidor nos avisas a todos :P

    $singularRules = array(
    ‘(n)es$/i’ => ‘ó\1′, // Esta regla seria la que debes agregar
    [..Todas las otras reglas..]
    );

    Igual me pareceuna locura. ¿Cuál es la verdadera razón para lo que quieres hacer eso?

  14. Viernes, 27 de Febrero de 2009 a las 15:33 | #14

    Gracias por las reglas :)
    ¿Se han preguntado por qué cake insiste en el uso de nombres de tabla en plural?
    Yo no sé la respuesta y nadie a quién he preguntado me ha sabido responder :(
    En mi modesta opinión, las convenciones se pueden simplificar grandemente si TODOS los nombres fueran singular. Entonces las funciones de pluralizar y singularizar no tendrían necesidad de ser. La vida sería más simple :)
    Una forma de hacer esto podría ser poniendo lo siguiente ne inflections:
    $pluralRules = array(
    ‘/^aco$/’=>’acos’,
    ‘/^aro$/’=>’aros’,
    ‘/^(.*)$/’=>’\1′ // simple, todo igual
    );
    $uninflectedPlural = array();
    $irregularPlural = array();
    $singularRules = array(
    ‘/^acos$/’=>’aco’,
    ‘/^aros$/’=>’aro’,
    ‘/^(.*)$/’=>’\1′ // simple, todo igual
    );
    Es decir, las funciones para pluralizar y singularizar devuelven lo mismo.
    He agregado excepciones para acos y aros. Al parecer el componente hace suposiciones en duro sobre los nombres de las tablas.

  15. Zicco
    Domingo, 19 de Abril de 2009 a las 21:12 | #15

    Pero esto NO FUNCIONA cuando utilizas nombres en los controladores como: “NuevosUsuariosController” para el nombre de la clase del controlador.
    “nuevo_usuario” para el nombre del modelo.

    ¿Qué solución podemos utilizar para esta situación?

  16. Viernes, 22 de Mayo de 2009 a las 19:16 | #16

    @Joaquin Windmüller
    Brother excelente tu aporte

  17. PISISTRATO
    Martes, 28 de Julio de 2009 a las 20:37 | #17

    Saludos

    probé todas las versiones de las inflexiones que colocaron.

    Pero no se sirve en el caso de colocar “Univerdades” como nombre de la tabla me crea en singular “universide”

    ayuda por favor

    gracias de antemano

  18. Martes, 28 de Julio de 2009 a las 21:38 | #18

    Estoy seguro que para este caso funciona, ¿Qué estás haciendo exactamente?

  19. Martes, 3 de Noviembre de 2009 a las 22:40 | #19

    Que buen aporte hermano. gracias me será de ayuda. recien estoy comenzando con cakePHP y me preguntaba justamente eso.. Y para el que pregunto porque cakePHP hace estas reglas de las tablas en plural y de los modelos en singular es porque asi trabaja el patron Active Record que es el que utiliza cake para trabajar con las Bases de datos

  1. Martes, 5 de Enero de 2010 a las 07:55 | #1