Herramientas de usuario

Herramientas del sitio


cursos:yii:modelos

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 CActiveRecord: 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 CactiveRecord : 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 CActiverecord: Reglas de Validación

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