====== Crear y configurar Modelos ====== Podemos definirlos manualmente, pero es más rápido y cómodo utilizar el generador (gii). Hay que habilitarlo previamente (ver 'Crear aplicación') ===== Generar Modelos ===== * Entramos en http://localhost/miaplicacion/?r=gii * Nos pedirá la contraseña que incluimos en la configruación de gii * Seleccionamos "Model Generator" * Escribimos el nombre de la tabla * El nombre del modelo será igual, con la primera letra en mayúsculas. Se puede cambiar si se desea * Pulsamos "preview" * Si va todo bien, aparecerá el nombre del fichero que generará. Pulsamos "Generate". Si ya existía, y vamos a volverlo a generar porque hemos hecho cambios en la tabla, tenemos que marcar la casilla "overwrite" antes de pulsar "Generate" Repetimos esta operación para todas las tablas deseadas ** IMPORTANTE: Antes de generar los modelos se debe comprobar que en el base de datos están definidas correctamente las relaciones entre las tablas. De esta forma, se crearán las relaciones entre los modelos generados ** ===== Configurar Modelos ===== Una vez generados los modelos, se deben revisar para terminarlos de configurar segun las necesidades de nuestra aplicación. En models/MODELO.php: ==== Validación de datos ==== Revisamos el método rules(), para añadir o modificar reglas de validación. Ver más abajo el apartado "Reglas de Validación" ==== Relaciones ==== Si están correctamente definidas en la BD, se habrán generado automáticamente. Si no es así, habrá que introducirlas manualmente. Ver [[.:clases:activerecord:relaciones]]: * BELONGS_TO: Ejemplo: 'autor' => array(self::BELONGS_TO, 'Autores', 'autores_id'), * HAS_MANY: Ejemplo: 'comentarios' => array(self::HAS_MANY, 'Comentarios', 'entradas_id') ==== Etiquetas ==== Modificaremos el método "attributeLabels" para escribir correctamente la descripción de cada atributo. Esta descripción aparecerá en los formularios, grids, vistas de detalle, etc... ==== Descripción por defecto ==== Es muy conveniente definir el método _ _tostring(), que devolverá uno o varios atributos que describen al objeto. public function __tostring(){ return $this->nombre; } De esta forma generalizamos la forma en que se muestra la descripción de los modelos de una clase. En cualquier parte podremos poner: $autor=Autores::model()->findByPk(23); echo $autor; //Como $autor es un objeto, se llamará a __tostring() y se mostrará lo que devuelva ==== Atributos de búsqueda ==== Modificar el método search para quitar los atributos que no se utilizarán en las búsquedas ==== Filtros y ordenación (scopes) ==== Podemos definir filtros con nombre (scopes), que utilizaremos en toda la aplicación, evitando tener que escribir continuamente las condiciones SQL a las que referencian. Ver [[.:clases:activerecord:scopes]] También se puede definir un scope que se aplicará siempre en todas las búsquedas (find(), findAll(), etc...) . Para ello, hay que crear un método llamado **defaultScope**. * public function defaultScope(){ return array( 'condition'=>'language="'.Yii::app()->language.'"', 'with'=>array('categoria'), 'order'=>'fecha' ); } ==== Reglas de Validación ==== Revisaremos las reglas de validación del modelo, que comprobarán que los datos introducidos por el usuario son correctos de acuerdo a lo especificado por ellas. Ver [[.:clases:activerecord:reglas]] ==== Atributos que admiten únicamente una lista de valores ==== Es habitual que tengamos atributos que admiten únicamente una lista restringida de valores, y que cada uno de ellos tenga un significado. Por ejemplo: el atributo //estado// de Usuarios, podría admitir los valores: P=Pendiente de validar, A=Activo, B=Bloqueado. Para que en las vistas podamos mostar la descripción de estos valores, o mostrar un desplegable en los formularios con los valores posibles, haremos lo siguiente: En el modelo definiremos un método getATRIBUTOOptions() que devuelve un array con todos los valores permitidos, de la forma valor=>descripcion: function getEstadoOptions() { return array('P'=>'Pendiente de validar', 'A'=>'Activo', 'B'=>'Bloqueado'); } Definimos también un método getATRIBUTOText() que me devolverá el texto asociado al valor actual del atributo: function getEstadoText(){ if(!$this->estado) return ''; else return $this->estadoOptions[$this->estado]; } (Fíjate que $this->estadoOptions llamará a getEstadoOptions(), que devolverá el array de valores.) Así, en las vistas podremos utilizar **$model->estadoText** para mostrar la descripción del estado actual: $model->estado='A'; echo $model->estadoText; //Devolverá 'Activo' } Y en los formularios podremos utilizar $model->estadoOptions como lista de valores de un desplegable