Problema con Gii

Saludos a la comunidad…

Soy Boliviano y vengo de usar symfony en mis proyectos, estoy empezando a usar Yii y me parece un framework atrayente, tengo una no se si pequeña pero duda al fin que espero puedan ayudarme a resolver.

Sucede que cuando hago cambios en mi BD y quiero plasmarlos en mi aplicacion, es decir habiendo creado ya mi modelo y el crud (con Gii), no puedo agregar los cambios a mi modelo, solo puedo reemplazarlo; y cuando lo hago oviamente toda mi configuracion se pierde. Symfony soluciona esto haciendo que hayan clases de modelo base y personalizadas, entonces cuando vuelvo a crear el modelo se actualiza mi clase base y no asi la clase personalizada. ¿Como puedo hacer esto con Yii?

Agradesco su atencion.

Antes de sobrescribir el antiguo modelo, se puede ver las diferencias y, posiblemente, de intervenir manualmente en el código directamente de gii.

Primero que nada mil gracias por la pronta respuesta sensorario, eso habla muy bien del foro.

Efectivamente se puede ver las diferencias entre los scripts y lo que actualmente hago es ayudarme con tortoise (diff) para ver las diferencias entre ambos y solucionarlo manualmente, luego viene la parte morosa porque al tratar de generar el CRUD debo hacer lo mismo para aquellos scripts de la vista que se modificaron.

Tarde o temprano ello me lleva a errores, y queria saber si existe alguna alternativa a ello. Habia pensado tb en usar una estructura similar a la que comente en el anterior post (Clase base y personalizada), pero necesito saber antes si existe algo ya hecho para no reinventar la rueda.

Muchas gracias.

Hola Darril,

No conosco ninguna alternativa por lo menos en mi caso.

Cuando hago cambios en la base de datos, los cambios a realizar son mínimos (agrego una columna, etc) por lo que lo hago manualmente (agregando en rules - por lo menos en safe para que funciones el $model->attributes con ese nuevo atributo, agregando attributeLabels -en el caso de que tengas y modificando la función search - en caso de usarla).

Saludos,

Muchas gracias por responder.

Veré la manera mas cómoda para trabajar, de todas maneras talves podriamos pensar en como poder cubrir esa parte no?? es solo una sugerencia; de nuevo gracias por sus respuestas.

Hola Darril,

Personalmente le recomiendo el uso de GiiX o Gii-Template-Collection, que usan "dos archivos" para los modelos, uno que es el base y el otro el personalizado, de esa manera uno puede seguir generando el código de los modelos sin tener que sobreescribir las personalizaciones, funciones y validaciones que se hayan agregado al modelo original (Y de paso nos ahorramos los pasos manuales que en ciertos casos puede llegar a ser tedioso y demorado)

Saludos y éxitos,

Ricardo

Hola Ricardo

Muchas gracias por responder, es precisamente lo que buscaba, lo voy a probar y luego comento que tal la experiencia con esas herramientas.

Me decidí por giiX, muy buena la extension, ayuda bastante al momento de volver a generar los modelos que ya los tenias creados porque mantiene la personalizacion de las reglas, las relaciones y los metodos que nos creamos para el proyecto. Tb te genera automaticamente un desplegable de los atributos con claves foráneas.

Tiene algunas cosillas que se deben tener en cuenta a crear el CRUD y anque quisiera que sea mas potente (que pueda tb crear clases base para los archivos de las vistas) es una exelente ayuda.

Les recomiendo su uso.

Hola Darril,

Cuando dice que quisiera que fuera más potente a qué características puntuales se refiere? Para implementarlas en una próxima versión :)

Saludos y éxitos.

Ricardo

Ricardo, me dá gusto saber que te interesas por mejorar giix, mas aun el que escuches opiniones de las personas que lo estamos usando; pues te cuento lo que me pasó, talves solo son errores mios al manejar la extension no??

*La idea de usar clases base para los modelos es muy buena, pero está limitada solo al modelo, y cuando hacemos cambios en la BD se refleja no solo en el modelo sino tb en los scripts de las vistas y el controlador (CRUD), a lo que me refiero es, buscar un mecanismo para mantener las personalizaciones que hace uno en la vista y controlador al igual que sucede con los modelos. No sé si poner clases base sea la mejor opcion en este caso, talves podriamos pensar en una solucion diferente quiza cuando ejecutamos el crud desde giix no solo nos muestre las diferencias del anterior con el nuevo sino tb que nos permita decidir que cosas queremos conservar y que no, me refiero a algo similar a lo que ofrece tortoise (diff).

*Otra cosa que noté no se si yo lo hice mal pero cuando genero el crud de un modelo que tiene relaciones con otros modelos, se genera los scripts con errores porque no encuentra los atributos en el modelo actual, lo solucioné agregando las relaciones necesarias al modelo, luego elimino manualmente lo generado por el crud porque de lo contrario al ejecutar de nuevo nos sale como sin cambios; para solucionarlo quizá podriamos poner la relacion automaticamente (generalmente parte del nombre del identificador del modelo lleva el nombre del modelo en si ejm id_usuario para el modelo usuario), o pedir al usuario que explicitamente indique en nombre del modelo al cual hace referencia el identificador externo.

*Por ultimo un detallito que noté es que se perdió el estilo del view. El nombre de los atributos aparecian en negrita con el gii y en el giix aparece todo sin negritas.

nombre: Darril 


apellido: Honor

etc.

Disculpa si fuí extenso queria explicarme lo mas detalladamente posible, por si no se entiende algo de lo que escribí puedo enviarte capturas de pantalla si necesitas.

Por lo demás me parece que tiene excelentes características te felicito por el trabajo y sigue adelante. Saludos.

Hola Darril,

A veces es necesario extenderse un poco para explicar con claridad las cosas.

Agradezco las observaciones, veré qué podemos hacer para mejorarlo.

En cuanto al segundo punto:

No estoy seguro de la razón por la cual se haya generado el error, pero de todas formas como consejo, es bueno crear todo los modelos antes de continuar con la generación del CRUD.

Saludos y éxitos,

Ricardo

Como te mensione anteriormente es grato saber que esten trabajando para mejorar aun mas la extension; en cuando a lo del punto dos te cuento que creé los modelos anteriormente, la única razón que le encuentro puede ser que estoy desarrollando mis aplicaciones con módulos y en mas de una ocacion tuve percanses con extensiones como rights o incluso operaciones básicas del framework, lo que pasa es que no hay muchos ejemplos del uso de módulos, pero probando se aprende no??

Siempre es un gusto ser de ayuda aunque con opiniones hasta pronto. :)

Hola Darril,

Muchas gracias!

Mis respuestas a sus sugerencias a giix:

Para los controladores, la implementación de esta funcionalidad es compleja. No tengo ideas sobre cómo hacerlo de una manera sencilla. Usted puede contribuir con ideas, que serán muy bienvenidos!

La regeneración más inteligente no es posible para las vistas como se hace actualmente. Una idea es tener varias vistas parciales y la actualización automática (regeneración) de una manera atómica. Pero esto trae complejidad. Una vez más, las ideas son bienvenidas!

Es posible que haya un problema en su base de datos. Si usted está utilizando MySQL, compruebe si las tablas son InnoDB y usted tiene la configuración de las restricciones (constraints).

En Gii, hubo un poco de estilo en línea. En mi opinión, esto no es la forma más correcta para generar el código.

Así que me quité todos los estilos en línea. De esta manera, puede que las páginas de estilo de la manera deseada.

Ricardo, gracias por sugerir giix!

[Traducido de forma automática]

Es inevitable recomendar lo bueno :)

Hola amigos, tengo la siguiente duda (estoy empezando con yii y no se como hacer esto), genero con GIIX mis clases modelos y clases base para mi aplicación, el detalle es que necesito agregar algunas relaciones en mis clases modelos sin que se pierdan las relaciones creadas automáticamente en las clases base, ya que las clases modelos extienden de las base:

ejemplo: baseEstado.php, Estado.php

class Estado extends BaseEstado

y en la clase base, las relaciones que tengo son estas:

public function relations() {

return array(

‘fKIdPais’ => array(self::BELONGS_TO, ‘Pais’, ‘fK_id_pais’),

‘ciudades’ => array(self::HAS_MANY, ‘Ciudades’, ‘id_estado’),

);

}

debo agregar una relacion STAT pero quiero hacerlo en la clase Estado y no se como hacerlo. gracias

Sobre escribe directamente la funcion "relations()" de la clase base en la clase hija, en tu caso en Estado.php y agrega la nueva relacion.


public function relations() {

return array(

'fKIdPais' => array(self::BELONGS_TO, 'Pais', 'fK_id_pais'),

'ciudades' => array(self::HAS_MANY, 'Ciudades', 'id_estado'),

'mi_relacion'=>array(self::STAT, 'Modelo', 'id_modelo'),

);

}

Espero que esa haya sido tu duda.