Plantéanos tus dudas.
Viernes, 13 Febrero 2009
El objetivo principal de este blog era, aparte de compartir nuestros conocimientos de cakephp, intentar ayudar a todos los que se les presenta alguna dificultad que no son capaces de resolver.
Hace tiempo que no escribimos ninguna entrada en el blog, casi nos dedicamos únicamente a resolver posibles dudas sobre las entradas ya escritas, esto es debido además de porque es una época en la que tenemos varios proyectos de desarrollo web activos, por la dificultad de encontrar algún tema interesante para vosotros que nos visitáis.
Por eso, desde aquí os invito a que nos plateéis vuestras dudas e ideas para nuevos artículos, ¡qué mejor para escribir un blog para nuestros visitantes que que sean ellos quienes nos indican los temas que más les interesan!

No. 1 — Mayo 25th, 2009 a 6:51 pm
Hola,
Es la primera vez que intento abstraer varias operaciones parecidas, casi idénticas, en una sóla acción y no sé hasta qué punto es esto lo más correcto.
Por ejemplo, mi acción procesar_anotacion() recibe el entero $anotacio que le indica qué modelo debe utilizar y, justo después, asigna a una variable el nombre de ese modelo para poder trabajar con él durante la lógica que encapsula la acción. Así, más o menos:
switch ($anotacio) {
case 1:
$nombreModelo = ‘Modelo1′;
break;
case 2:
$nombreModelo = ‘Modelo2′;
break;
case 3:
$nombreModelo = ‘Modelo3′;
break;
case 4:
$nombreModelo = ‘Modelo4′;
break;
}
Pues bien… ¿Sería correcto hacer esto, o, más bien, no lo es del todo, desde el punto de vista de la escalabilidad? Espero haberme explicado
Muchas gracias de antemano por la respuesta, felicidades por el blog, y un saludo amistoso.
No. 2 — Mayo 26th, 2009 a 8:56 am
¿Qué tal jordi?.
La verdad es que tal como haces la operación que me indicas, si que existe un problema claro de escalabilidad, habría una opción con la que podrías evitarte este problema. Cakephp, en la clase Configure, tiene una operación que lo que hace es devolver el listado de objetos del tipo que queramos, pueden ser controladores, vendors, plugins y por supuesto modelos.
La operación en este caso sería “Configure::listObjects(’model’)”, esta nos devuelve un array con los nombres de todos los modelos, con un orden, en principio, aleatorio.
Ordenando este array por orden alfabético y haciendo que el número asignado coincida con este orden, podrías solucionar el problema en tres líneas.
$modelos = Configure::listObjects(’model’);
sort($modelos);
$nombreModelo = $modelos[$anotacio];
Con esto tendrías una función completamente escalable, recordando siempre que el número de modelo corresponda con el orden alfabético de estos.
No. 3 — Mayo 26th, 2009 a 9:31 am
Muchas gracias, Bernal.
No sabía que podía hacerse esto con la clase Configure y veo que, efectivamente, me ahorro unas cuantas líneas de código… De todas formas, aún haciendo esto que propones, la idea sigue siendo la misma: utilizar una sola acción para processar varios modelos distintos. ¿Suele hacerse esto así? Perdona que insista tanto, jeje. Pero es que no sé por qué me siento un poco inseguro haciendo esto. Por otra parte, y según entiendo, parece que la única alternativa a esto es crear tantas acciones como modelos queremos procesar, pero, en cambio, el código crece bastante y, además, también se repite bastante. Supongo que lo mejor es hacer lo primero… ¡Muchas gracias de nuevo y un saludo!
No. 4 — Mayo 26th, 2009 a 9:36 am
Hola de nuevo, amigos.
Aprovecho para plantear otra duda que me tiene atascado y que acabo de plantear en el grupo Google CakePHP Español.
Resulta que tengo una vista con varios campos de tipo select, parecidos a este, que relleno con una operación de tipo find desde el controlador:
echo $form->input(’anotacio’, array ( ‘type’ => ’select’,
‘label’ => false,
‘empty’ => ‘Selecciona un
color…’,
‘options’ =>
$consultaColores,
‘div’ => ‘entrada_boto’,
‘class’ => ’seleccion’
)
);
Pero me encuentro que cuando el controlador recibe estos datos a través de $this->data['anotacio'] se encuentra con la clave primaria del registro y a mí me gustaria recuperar el texto del color, por ejemplo, como en este caso que adjunto. ¿Cómo podría hacerlo?
De nuevo, muchas gracias por vuestra ayuda y vuestra amabilidad… ¡Y un saludo from Barcelona!
No. 5 — Mayo 26th, 2009 a 9:54 am
Lo normal es pasar la clave primaria en el this->data porque relacionas dos modelos a partir de esa clave y lo que queremos es guardar el identificador que los relaciona. ¿No es este tu caso?.
Si realmente no quieres el identificador para nada, ya sea porque ese identificador de color no lo utilizas para relacionar modelos, o por lo que sea, lo que podrías hacer sería inicializar el array consultaColores con las tuplas nombre de color => nombre de color, con esto el select seguiría mostrando los nombres de los colores y en $this->data['asignacio'] se pasaría el nombre del color.
Como te digo arriba esto solo podría valerte si no te interesa utilizar el identificador para nada, si no es así esta opción no te valdría y tendrías que realizar una consulta a la base de datos para conseguir el color a través de la clave primaria.
Supongo que es a eso a lo que te referías, ya me contarás si es así.
Un saludo.
No. 6 — Mayo 26th, 2009 a 11:28 am
Muchas gracias de nuevo
Pues ahora que lo dices… mi acción hace las dos cosas: trabajar con el id del registro y con el nombre del color. Lo que hago, pues, cada vez que necesito obtener el nombre del registro, es ejectuar el método findById para obtener el nombre del color. Esto lo veo innecesario y por eso hacía esta pregunta, pensando que quizás uno puede ahorrarse esta consulta.
Por estas y otras cosas, esta acción, que es aquella de la que hablaba y que hacía lo mismo para varios casos, se va complicando a medida que necesito hacer cosas de este tipo. Por eso preguntaba lo de si era correcto desde el punto de la escalabilidad, jeje.
Muchas gracias por la respuesta! Me tranquiliza saber que no puede obtenerse el nombre del color si uno rellena el $consultaColores con un find(). Saludos
Please continue discussion on the forum: link