Desarrollo con Yii – Generación de modelos

Para ir centrado los conceptos, me centraré ahora en el desarrollo de una aplicación en concreto; es decir, comenzaré a dictar ciertos requisitos que ha de cumplir la aplicación a desarrollar.

Voy a desarrollar una aplicación consistente en una videoteca, que contendrá una colección de películas con su título, su título original, una breve sinopsis y el cartel de la película.

Por otro lado, la aplicación admitirá diferentes usuarios, y cada uno de ellos tendrá su propia colección de películas. Los usuarios tendrán que identificarse en la aplicación mediante un nombre de usuario y una contraseña.

El SGBD en el que se apoyará la aplicación será MySQL.

Diseño del modelo de datos

De los requisitos anteriores ya se puede hacer un primer diseño del modelo de datos que servirá de base a la aplicación.

Modelo de datos

Modelo de datos para la videoteca

Objetos de la base de datos

Una vez definido el modelo de datos, creo las tablas correspondientes en una nueva base de datos del servidor MySQL.

Primero, creo la base de datos.

CREATE SCHEMA IF NOT EXISTS `videoteca` DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci ;

Después, creo una tabla de usuarios.

CREATE  TABLE IF NOT EXISTS `videoteca`.`User` (
  `username` VARCHAR(45) NOT NULL COMMENT 'Nombre (nickname) del usuario.' ,
  `password` VARCHAR(125) NULL COMMENT 'Contraseña del usuario, guardada como SHA1.' ,
  UNIQUE INDEX `email_UNIQUE` (`username` ASC) ,
  PRIMARY KEY (`username`) )
ENGINE = InnoDB
COMMENT = 'Usuarios de la aplicación web.';

Y también una tabla para las películas, con su clave externa a la tabla de usuarios.

CREATE  TABLE IF NOT EXISTS `videoteca`.`Film` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(45) NULL COMMENT 'Título de la película.' ,
  `original` VARCHAR(45) NULL COMMENT 'Título original de la película.' ,
  `sinopsis` TEXT NULL COMMENT 'HTMl con la sinopsis de la película.' ,
  `username` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_Film_1_idx` (`username` ASC) ,
  CONSTRAINT `fk_Film_1`
    FOREIGN KEY (`username` )
    REFERENCES `videoteca`.`User` (`username` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;

Revisión de los modelos de Yii

El framework Yii ofrece dos tipos de modelos con los que trabajar.

El modelo formulario está diseñado para trabajar con datos temporales que son utilizados y descartados en breve, como pueden ser los datos que se recogen de formularios y que deben ser validados de cualquier forma.

El modelo Active Record se utiliza para representar los datos que se guardan en una base de datos, y que sirve como una abstracción de los registros almacenados para trabajar con ellos bajo el paradigma de la orientación a objetos.

Uso de la herramienta gii

Yii ofrece una herramienta muy potente para la generación de modelos (y otras muchas cosas). Se trata de la herramienta gii.

Gii es una herramienta que se encuentra dentro de la aplicación por defecto que creé en una entrada anterior. Por defecto, gii está desactivada. Para activar gii hay que editar la configuración de la aplicación, en el archivo protected/config/main.php, y habilitar el módulo de gii e indicando una contraseña de acceso.

'modules'=>array(
	'gii'=>array(
		'class'=>'system.gii.GiiModule',
		'password'=>'password',
		// If removed, Gii defaults to localhost only. Edit carefully to taste.
		'ipFilters'=>array('127.0.0.1','::1'),
	),
),

Ahora, gii está disponible en la aplicación web generada, en el enlace http://localhost/videoteca/?r=gii.

Generación de los modelos

Utilizando gii, la generación de los modelos es muy sencilla. Basta con seleccionar la opción Model Generator en el menú de la izquierda e indicar el nombre de la tabla en el cuadro Table Name. Después pulso el botón Preview, y por último Generate.

Con este sencillo procedimiento, ya he generado los modelos para la aplicación. Pueden verse en los archivos:

protected/models/User.php

45),
			array('password', 'length', 'max'=>125),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('username, password', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'films' => array(self::HAS_MANY, 'Film', 'username'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'username' => 'Username',
			'password' => 'Password',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('username',$this->username,true);
		$criteria->compare('password',$this->password,true);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
}

protected/models/Film.php

45),
			array('sinopsis', 'safe'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('id, title, original, sinopsis, username', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'username0' => array(self::BELONGS_TO, 'User', 'username'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'title' => 'Title',
			'original' => 'Original',
			'sinopsis' => 'Sinopsis',
			'username' => 'Username',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id);
		$criteria->compare('title',$this->title,true);
		$criteria->compare('original',$this->original,true);
		$criteria->compare('sinopsis',$this->sinopsis,true);
		$criteria->compare('username',$this->username,true);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
}
< Desarrollo con Yii – Configurar la aplicación Desarrollo con Yii – Personalización de modelos (I) >

4 comentarios

  1. website seo dice:

    Wow, that’s what I was seeking for, what a information! present here at this weblog, thanks admin of this web site.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *