En esta entrada repasaré y personalizaré los modelos generados en la entrada anterior de desarrollo con Yii.
En esa entrada generé dos modelos para desarrollar una videoteca, un modelo User para gestionar los usuarios, y un modelo Film para guardar la información de las películas. Centraré el análisis en el modelo User. Con Film habría que realizar un análisis y una personalización similar.
Revisión del código generado
Al generar el modelo con la herramienta gii, se ha generado el archivo protected/models/User.php, con la funcionalidad del modelo.
Lo primero que encontramos en el archivo es la declaración de una clase para el modelo.
class User extends CActiveRecord
El modelo generado es una clase derivada de CActiveRecord, apropiado para esos datos que se almacenarán en una base de datos.
La clase generada tiene una serie de métodos o funciones miembro:
Método | Modificadores | Descripción |
model | public static | Devuelve el modelo estático de la clase. |
tableName | public | Devuelve el nombre de la tabla de la base de datos asociada al modelo. |
rules | public | Define las reglas de validación de los campos del modelo. |
relations | public | Devuelve un array con las relaciones (claves externas) del modelo con otros modelos. |
attributeLabels | public | Define etiquetas personalizadas asociadas para cada atributo del modelo. |
search | public | Define los atributos del modelo por los cuales pueden realizarse búsquedas. |
Me centraré ahora en los métodos más importantes, y en aquellos en los que haya que realizar modificaciones.
Método rules
El método rules es un método importante, ya que define las reglas de validación para los atributos del modelo. Es muy útil cuando los valores de los atributos de un modelo se recopilan desde un formulario de la web.
El comportamiento del método consiste simplemente en devolver un array con las reglas de validación. Cada regla de validación es, asimismo, un array donde se especifica un conjunto de de atributos del modelo, la regla de validación que debe cumplir, la lista de escenarios en la que se requiere la regla, y unos modificadores de la misma.
Por ejemplo,
array('username', 'length', 'max'=>45),
array('username, password', 'safe', 'on'=>'search'),
son dos reglas; la primera indica que el atributo username debe tener una longitud máxima de 45 caracteres, curiosamente la misma longitud que definí al crear su tabla en la base de datos: maravillas de gii; la segunda indica que los atributos username y password son seguros en el escenario de búsqueda.
Escenarios
Cuando se crea una instancia de un modelo, se puede indicar en qué escenario se va a utilizar esa instancia. Al indicar un escenario, las reglas de validación que se apliquen serán sólo aquellas que estén definidas para ese escenario en concreto.
$user = new User( 'login' ); // El usuario se crea en un escenario denominado 'login'
...
$another_user = new User;
$another_user->scenario = 'search'; // El usuario va a trabajar en el escenario denominado 'search'
Atributos seguros
Se dice que un atributo es seguro cuando existe al menos una regla de validación para el mismo, en el escenario correspondiente. El concepto de atributo seguro y su validación cobra importancia cuando se van a guardan datos proporcionados por un usuario final. La asignación de estos datos a la instancia del modelo puede realizarse mediante una asignación masiva de la forma:
$model=new User;
if(isset($_POST['User']))
$model->attributes=$_POST['User'];
De esta forma se realizará una asignación de todos los atributos incluidos en el POST, siempre que se trate de un atributo seguro.
Modificando rules
Creo un nuevo atributo a la clase User que será necesario para repetir la contraseña del usuario en el momento en el que éste se registre.
public $repeat_password;
Siguiendo los requisitos de la aplicación que estoy generando, el método de rules queda de la siguiente forma:
public function rules()
{
return array(
// El nombre de usuario es requerido en todo escenario.
array('username', 'required'),
// La contraseña ha de compararse con la contraseña repetida al registrar.
array('password', 'compare', 'compareAttribute'=>'repeat_password', 'on'=>'register'),
// La contraseña debe ser autenticada al hacer login.
array('password', 'autenticate', 'on'=>'login'),
// Tamaño de los campos
array('username', 'length', 'max'=>45, 'min'=>4),
array('password', 'length', 'max'=>125),
);
}
< Desarrollo con Yii – Generación de modelos | Desarrollo con Yii – Personalización de modelos (II)> |
2 comentarios