Está en la página 1de 57

UNIVERSIDAD PRIVADA TELESUP

FACULTAD DE INGENIERA Y ARQUITECTURA

CARRERA PROFESIONAL DE INGENIERA DE SISTEMAS E INFORMTICA

V CICLO

MONOGRAFA:

YII FRAMEWORK

AUTORES:

Bailon Victorio, Luis Armando


Rodriguez Tume, Bruce Arnold Alex

Romn Casahuamn, Florencio

DOCENTE:

Atunga Vergara Jose Timoteo

LIMA - PER

2017
Dedicatoria

A Dios por la sabidura e inteligencia que


nos da da a da. A nuestros padres por
el apoyo incondicional que nos brindan.
A todas aquellas personas con sed de
conocimiento y deseos de superacin,
que leen hoy estas pginas y premian el
esfuerzo de este trabajo.

ii
Agradecimientos

Agradecemos en primer lugar a


Dios por permitirnos finalizarlo con xito
nuestro trabajo de investigacin; y en
segundo lugar, pero no menos
importante, a nuestros queridos padres,
por su respaldo emocional, moral y
econmico. En sta oportunidad,
nuestro reconocimiento y
agradecimiento a nuestro profesor
Atunga Vergara Jose Timoteo, por su
instruida orientacin.

iii
NDICE

NDICE .......................................................................................................................................... iv
CAPTULO I INTRODUCCIN .................................................................................................. 6
OBJETIVOS .................................................................................................................................. 7
CAPTULO II MARCO TERICO .............................................................................................. 8
2.1. Framework ............................................................................................................................. 8
2.2. Yii ............................................................................................................................................ 8
2.2.1. Requerimientos ......................................................................................................... 8
2.2.2. Para que es bueno utilizar yii? ................................................................................ 8
2.2.3. Cmo se compara yii con otros frameworks? ...................................................... 9
2.3. Instalacin.............................................................................................................................. 9
2.3.1. Requerimientos ......................................................................................................... 9
2.4. Creacion de una aplicacin yii.......................................................................................... 10
2.4.1. Conectndose a base de datos ............................................................................ 13
2.5. Fundamentos ...................................................................................................................... 13
2.5.1. Modelo vista controlador (MVC) ........................................................................... 13
2.5.2. Script de entrada ..................................................................................................... 16
2.5.3. Aplicacin ................................................................................................................. 16
2.5.4. Controlador ...................................................................................................................... 20
2.5.4.1. Ruta (route) ........................................................................................................... 20
2.5.4.2. Instanciacin de controlador .............................................................................. 21
2.5.4.3. Accin (Action) ..................................................................................................... 22
2.5.5. Modelo (Model)................................................................................................................ 24
2.5.6. Vista (View) ...................................................................................................................... 26
2.5.6.1. Esquema (Layout) ............................................................................................... 27
2.5.6.2. Widget.................................................................................................................... 27
2.5.6.3. Vistas de sistema ................................................................................................. 29
2.6. Trabajando con formularios .............................................................................................. 30
iv
2.6.1. Descripcin............................................................................................................... 30
2.6.2. Creando el modelo.................................................................................................. 30
2.6.2.5. La declaracin de atributos seguros ................................................................. 37
2.6.2.6. Activacin-Validacin .................................................................................................. 39
2.6.2.7. Recuperacin de errores de validacin .................................................................... 40
2.6.2.8. Las etiquetas de atributos .......................................................................................... 41
2.6.4. Creando el formulario ............................................................................................. 43
2.6.5. Colectando entradas tabulares ............................................................................. 46
2.7. Trabajando con Base de Datos........................................................................................ 48
2.7.1. Descripcin............................................................................................................... 48
2.7.2. Objetos de acceso a BD ........................................................................................ 49
CONCLUSIONES....................................................................................................................... 55
RECOMENDACIONES ............................................................................................................. 55
Bibliografa................................................................................................................................... 57

v
CAPTULO I
INTRODUCCIN

Muchos de los que se dedican al desarrollo de software utilizan, conocen o, como


mnimo, se han tropezado con el concepto de framework (cuya traduccin
aproximada sera marco de trabajo).
Sin embargo, el concepto de framework no es sencillo de definir, a pesar de que
cualquiera con experiencia programando captar su sentido de manera casi
intuitiva, y es muy posible que est utilizando su propio framework (aunque no lo
llame as). En este trabajo se presentara uno de los Frameworks ms usados para
el desarrollo web, Yii Framework es un framework PHP basado en componentes de
alta performance para desarrollar aplicaciones Web de gran escala. El mismo
permite la mxima reutilizacin en la programacin web y puede acelerar el proceso
de desarrollo.

6
OBJETIVOS

1) Desarrollo de un CRUD (Create, Read, Update, Delete) con una base de


datos.

2) Conocer las diferentes funciones que ofrece Yii.

3) Aprender a usar Yii Framework para desarrollo web.

7
CAPTULO II
MARCO TERICO

2.1. Framework

1Un framework, es una estructura conceptual y tecnolgica de soporte


definido, normalmente con artefactos o mdulos de software concretos, que puede
servir de base para la organizacin y desarrollo de software. Vamos, una manera
de hacernos ms fcil la programacin.

2.2. Yii

Yii es un framework PHP basado en componentes de alta performance para


desarrollar aplicaciones Web de gran escala. El mismo permite la mxima
reutilizacin en la programacin web y puede acelerar el proceso de desarrollo. El
nombre Yii (pronunciado /i:/) es por fcil (en ingls: easy), eficiente (en ingls:
efficient) y extensible (en ingls: extensible)

2.2.1. Requerimientos
Para correr una aplicacin Web Yii, usted necesita tener un servidor Web con
soporte PHP 5.1.0 o superior.

Para desarrolladores que deseen utilizar Yii, el entendimiento de Programacin


Orientada a Objetos (OOP) ser de gran ayuda ya que Yii es un framework
totalmente basado en OOP.

2.2.2. Para que es bueno utilizar yii?


Yii es un framework genrico de programacin Web que puede ser utilizado
para todo tipo de aplicaciones Web. Gracias a que es liviano de correr y est

1
Orix Systems, 2017)

8
equipado con soluciones de cacheo sofisticadas, es adecuado para
desarrollar aplicaciones de gran trfico como portales, foros, sistemas de
administracin de contenidos (CMS), Sistemas de comercio electrnico (e-
commerce), etc.

2.2.3. Cmo se compara yii con otros frameworks?


Como la mayora de los frameworks PHP, Yii es un framework MVC (modelo-
vista-controlador).

Yii sobresale frente a frameworks PHP en su eficiencia, su gran cantidad de


caractersticas y su clara documentacin. Yii ha sido diseado
cuidadosamente desde el principio para el desarrollo de aplicaciones de
Web. No es ni un subproducto de un proyecto ni un conglomerado de trabajo
de terceros. Es el resultado de la vasta experiencia de los autores en
desarrollo de aplicaciones Web y de la investigacin y la reflexin de los ms
populares los frameworks de programacin Web y aplicaciones.

2.3. Instalacin

Para instalar Yii solo debe seguir los siguientes 2 pasos:

1. Descargar el framework Yii de yiiframework.com.

2. Descomprimir el archivo a un directorio accesible por el servicio Web.

2.3.1. Requerimientos
Luego de instalar Yii, usted puede verificar si su server satisface todos
los requerimientos para utilizar Yii. Para hacerlo debe hacer accesible
el script de verificacin de requerimientos para utilizar Yii. Usted puede
acceder al script de verificacin de requerimientos en la siguiente URL
en un explorador Web:

http://hostname/path/to/yii/requirements/index.php

9
El requerimiento mnimo de Yii es que su server soporte PHP 5.1.0 o
superior. Yii ha sido testeado con Apache HTTP server en los
sistemas operativos Windows y Linux. Tambin puede funcionar en
otras plataformas que soporten PHP 5.

2.4. Creacion de una aplicacin yii

Para ingresar al mundo de Yii, en esta seccin le indicamos como crear nuestra
primera aplicacin Yii. Usaremos la poderosa herramienta yiic que puede ser
utilizada para automatizar la creacin del cdigo de ciertas tareas. Por conveniencia
asumimos que YiiRoot es el directorio donde Yii se encuentra instalado
y WebRoot es la ruta del documento de tu Web Server.

Ejecute yiic en la lnea de comandos de la siguiente manera:

% YiiRoot/framework/yiic webapp WebRoot/testdrive

Esto crear una aplicacin Yii esqueleto en el directorio WebRoot/testdrive. Esta


aplicacin contiene la estructura de directorios requerida por la mayora de las
aplicaciones Yii.
Sin escribir ni una sola lnea de cdigo, nosotros podemos probar nuestra primera
aplicacin Yii ingresando a la siguiente URL en un explorador Web:

http://hostname/testdrive/index.php

Como vemos, la aplicacin contiene tres pginas: homepage (la pgina inicial),
contact (pgina de contacto) y login (pgina de login de usuario). La pgina inicial
muestra informacin de la aplicacin y del estado del usuario logueado, la pgina
de contacto contiene un formulario para rellenar y enviar sus consultas y la pgina
de login de usuario permite a los mismos autenticarse para acceder a contenidos
que necesitan privilegios de acceso. Mire las siguientes pantallas para ms detalles.

10
Ilustracin 1 Home page

Ilustracin 2 Contact page

11
Ilustracin 3 Contact page with input errors

Ilustracin 4 Contact page with success

12
Ilustracin 5 Login page

2.4.1. Conectndose a base de datos


La mayora de las aplicaciones Web utilizan bases de datos. Nuestra
aplicacin test-drive no es una excepcin. Para utilizar una base de datos,
primero se debe decir a la aplicacin como conectarse a la misma. Esto se
realiza modificando el archivo de configuracin de
aplicacin WebRoot/testdrive/protected/config/main.php como se
muestra a continuacin.

2.5. Fundamentos

2.5.1. Modelo vista controlador (MVC)


Yii implementa el diseo de patrn modelo-vista controlador (model-view-
controller MVC) el cual es adoptado ampliamente en la programacin Web.
MVC tiene por objeto separar la lgica del negocio de las consideraciones de
la interfaz de usuario para que los desarrolladores puedan modificar cada
parte ms fcilmente sin afectar a la otra. En MVC el modelo representa la
informacin (los datos) y las reglas del negocio; la vista contiene elementos
de la interfaz de usuario como textos, formularios de entrada; y el controlador
administra la comunicacin entre la vista y el modelo.

13
Ms all del MVC, Yii tambin introduce un front-controller llamado aplicacin
el cual representa el contexto de ejecucin del procesamiento del pedido. La
aplicacin resuelve el pedido del usuario y la dispara al controlador apropiado
para tratamiento futuro.

El siguiente diagrama muestra la estructura esttica de una aplicacin Yii"

Ilustracin 6 Estructura esttica de aplicacin Yii

2.5.1.1. Un flujo de tareas tpico

El siguiente diagrama muestra un tpico flujo de tareas de una aplicacin Yii


cuando resuelve un pedido de usuario:

14
Ilustracin 7 Un tpico flujo de tareas de una aplicacin Yii

1. Un usuario hace una peticin al script de entrada web / index.php.


2. El script de entrada carga la configuracin de la aplicacin y crea una
instancia de aplicacin para manejar la solicitud.
3. La aplicacin resuelve la ruta solicitada con la ayuda del componente de
aplicacin de solicitud.
4. La aplicacin crea una instancia de controlador para gestionar la solicitud.
5. El controlador crea una instancia de accin y realiza los filtros para la
accin.
6. Si falla algn filtro, la accin se cancela.
7. Si todos los filtros pasan, la accin se ejecuta.
8. La accin carga un modelo de datos, posiblemente desde una base de
datos.
9. La accin convierte una vista, proporcionndola con el modelo de datos.
10. El resultado renderizado se devuelve al componente de aplicacin de
respuesta.

15
11. El componente de respuesta enva el resultado renderizado al navegador
del usuario.
2.5.2. Script de entrada
El script de entrada es el script de inicio y es el que se ocupa de procesar el pedido
del usuario inicialmente. Es el nico script PHP que el usuario puede pedir
directamente para ejecutarse.

En la mayora de los casos, el script de entrada de una aplicacin Yii contiene un


cdigo tan simple como el siguiente,

// remove the following line when in production mode


defined('YII_DEBUG') or define('YII_DEBUG',true);
// include Yii bootstrap file
require_once('path/to/yii/framework/yii.php');
// create application instance and run
$configFile='path/to/config/file.php';
Yii::createWebApplication($configFile)->run();

Este script incluye el archivo principal de Yii framework yii.php, crea la instancia de
aplicacin web con la configuracin especificada e inicia su ejecucin.

2.5.2.1. Modo Debug


Una aplicacin Yii puede correr en modo debug o modo produccin segn el valor
de la constante YII_DEBUG. Por predeterminado el valor de esta constante
es false lo que significa modo produccin. Para correr su aplicacin en modo debug
defina esta constante con el valor true antes de incluir el archivo yii.php. Ejecutar
aplicaciones en modo debug es menos eficiente ya que debe mantener los logos
internamente. Por otro lado el modo debug es de mucha ayuda durante la etapa de
desarrollo ya que provee informacin de debug rica cuando ocurre el error.

2.5.3. Aplicacin
Aplicacin (Application) representa la el contexto de ejecucin de cada pedido a la
aplicacin. Su principal tarea es resolver el pedido del usuario y dispararlo al
controlador apropiado para procesamiento futuro. Tambin se utiliza como el lugar

16
principal para configuraciones que deben estar en el nivel de aplicacin. Por esta
razn application es tambin llamado front-controller (controlador principal).
Application es creado como un singleton por el script de entrada. El singleton
Application puede ser accedido en cualquier lugar mediante Yii::app().

2.5.3.1. Configuracin de aplicacin

Por predeterminado, application es una instancia de CWebApplication. Para


customizarlo normalmente se provee un archivo de configuracin (o un
arreglo) para inicializar los valores de sus propiedades cuando la instancia
application es creada. Una alternativa de personalizar la aplicacin es
extender CWebApplication.
La configuracin es un arreglo de pares llave-valor (key-value). Cada par
representa el nombre de una propiedad de la instancia de la aplicacin y cada
valor representa el valor inicial de la correspondiente propiedad. Por ejemplo,
la siguiente configuracin configura las propiedades name y defaultController
de application.

array(
'name'=>'Yii Framework',
'defaultController'=>'site',
)

Usualmente guardamos la configuracin en un archivo de script PHP


separado (ejemplo: protected/config/main.php). Dentro del script retornamos
el arreglo de configuracin como a continuacin:

return array(...);

Para aplicar estas configuraciones pasamos el nombre del archivo de


configuracin como parmetro al constructor de application o
a Yii::createWebApplication() como en el siguiente ejemplo el cual es
usualmente utilizado en el Script de entrada:

17
2.5.3.2. Directorio base de application

El directorio base de Application refiere a la ruta de directorio que contiene


todos los scripts PHP sensibles de seguridad y datos de la misma. Por
predeterminado es un subdirectorio llamado protected que se encuentra bajo
el directorio que contiene el Script de Entrada. Puede ser modificado
configurando la propiedad basePath en la configuracin de application.

Las cosas que contiene el directorio base deben ser protegidas para que no
sean accesibles por usuarios Web. Con el Apache HTTP server esto se
realiza fcilmente creando un archivo .htaccess dentro del directorio base. El
contenido del archivo .htaccess debe ser el siguiente:

deny from all

2.5.3.3. Componentes de application

Las funcionalidades de la aplicacin pueden ser fcilmente customizadas y


enriquecidas con la arquitectura flexible de componentes. Application
administra un juego de componentes de aplicacin en los que cada uno
implementa caractersticas especficas. Por ejemplo, appliction resuleve un
pedido de usuario con la ayuda de los
componentes CUrlManager y CHttpRequest.
Configurando la propiedad components de application, podemos
personalizar la class y propiedades de cada uno de los componentes
utilizados en application. Por ejemplo podemos configurar el
componente CMemCache para que utilice mltiples servers encache para
realizar el cacheo,

18
array(
......
'components'=>array(
......
'cache'=>array(
'class'=>'CMemCache',
'servers'=>array(
array('host'=>'server1', 'port'=>11211, 'weight'=>60),
array('host'=>'server2', 'port'=>11211, 'weight'=>40),
),
),
),
)

En el ejemplo anterior agregamos el elemento cache en el


arreglo components. El elemento cache define que la clase del componente
ser CMemCache y la propiedad servers` debe ser inicializada como lo
indica.
Para acceder a un componente de application utilice Yii::app()-
>ComponentID, en donde ComponentID indica el ID del componente que
desea (ejemplo: Yii::app()->cache).
Un componente de aplicacin puede ser deshabilitado mediante su
configuracin indicando la propiedad enabled con un valor false en su
configuracin. En el caso de intentar acceder a un componente deshabilitado,
application le devolver Null.

2.5.3.4. Ciclos de vida de la aplicacin

Cuando se maneja un pedido de usuario, la aplicacin realizar el siguiente


ciclo de vida:

1. Configurar el autocargado de clases y el manejador de errores;


2. Registrar los componentes del ncleo de la aplicacin;
3. Cargar la configuracin de la aplicacin;
4. Inicializar la aplicacin mediante CApplication::init()
Carga de componentes de aplicacin static;

19
5. Ejecuta el evento onBeginRequest;
6. Procesa el pedido de usuario:;
Resuelve el pedido de usuario;
Crea el controlador
Ejecuta el controlador;
7. Ejecuta el evento onEndReques

2.5.4. Controlador

Un controlador es una instancia de CController o una de las clases que lo heredan.


Es creado por la aplicacin cuando un usuario realiza un pedido para ese
controlador. Cuando un controlador se ejecuta se realizar el pedido de la accin que
utiliza los modelos necesarios y muestra la informacin a travs de la vista
apropiada. Una accin, en su forma ms simple, es un mtodo de la clase
controlador cuyo nombre comienza con action.
Un controlador tiene una accin predeterminada. Cuando el usuario no especifica
que accin se debe ejecutar, esta ser la que se ejecute. Por predeterminado la
accin default tiene el nombre de index. Puede ser personalizada modificando la
configuracin CController::defaultAction.
Abajo se encuentra el mnimo cdigo de una clase controlador. Dado que este
controlador no tiene ninguna accin definida, pedirle resultar en una excepcin.

class SiteController extends CController


{
}

2.5.4.1. Ruta (route)


Los controladores y acciones estn definidas por IDs. El ID del controlador
se encuentra en la forma de path/to/xyz el cual es interpretado como el
archivo de clase controlador protected/controllers/path/to/XyzController.php,
donde xyz debe ser remplazada por el nombre de su controlador
(ejemplo: post corresponde a protected/controllers/PostController.php). El ID

20
de accin es el nombre del mtodo sin el prefijo action. Por ejemplo si el
controlador contiene el mtodo actionEdit el ID de la accin correspondiente
ser edit.
Los usuarios realizan pedidos por un controlador y accin en trminos de
ruta. Una ruta se encuentra formada por la concatenacin de un ID de
controlador y un ID de accin separados por una barra. Por ejemplo la
ruta post/edit se refiere a PostController y a su accin edit. Por
predeterminado la urlhttp://hostname/index.php?r=post/edit` realiza el pedido
a l ese controlador y esa accin.

Nota: Por predeterminado las rutas distinguen maysculas de minsculas.


Desde la versin 1.0.1 es posible utilizar rutas que no distingan maysculas
de minsculas modificando en la configuracin de la aplicacin la
propiedad CUrlManager::caseSensitive en false. Cuando esta propiedad no
est activada, asegrese de seguir las convencin de que los directorios que
contienen controladores deben ser llamados con minsculas y que
ambos, controller map y action map usan claves en minsculas.

Desde la versin 1.0.3 una aplicacin puede contener modules. La ruta de


una accin de controlador dentro de un mdulo cumple es de la
forma moduleID/controllerID/actionID. Para ms informacin y detalle vea la
seccin acerca de mdulos.

2.5.4.2. Instanciacin de controlador


Una instancia de controlador es creada cuando CWebApplication maneja un
pedido de usuario. Dado el ID del controlador, la aplicacin utilizar las
siguientes reglas para determinar cul es la clase del controlador y cual la
ruta al archivo de clase.
Si CWebApplication::catchAllRequest se encuentra especificado, el
controlador ser creado basado en esta propiedad y se ignorar el ID de
controlador especificado por el usuario. Esto es usado mayoritariamente

21
para dejar la aplicacin en un modo de mantenimiento y muestre una
pgina con informacin esttica.
Si el ID se encuentra en CWebApplication::controllerMap, la
configuracin de controlador correspondiente se utilizar para crear la
instancia del controlador.
Si el ID se encuentra en el formato 'path/to/xyz', la clase de controlador
asumida ser XyzCOntroller y el archivo de clase correspondiente
ser protected/controllers/path/to/XyzController.php. Por ejemplo si el ID
del controlador es admin/user ser resuelto por el
controlador UserController y el archivo de
clase protected/controllers/admin/UserController.php. En caso de que el
archivo de clase no exista, un error 404 CHttpException ser lanzado.

En el caso que se utilicen modules (disponibles desde la versin 1.0.3), El


proceso descripto anteriormente es ligeramente diferente. En particular, la
aplicacin verificar si el ID refiere a un controlador dentro de un mdulo y si
esto es as, el mdulo ser instanciado y luego se instanciar el controlador.

2.5.4.3. Accin (Action)


Como lo mencionamos anteriormente una accin puede ser definida
mediante su nombre y comenzando con la palabra action. Una forma ms
avanzada de realizar esto es definir una clase accin y pedirle al controlador
que la instancie cuando es requerida. Esto permite que las acciones sean
reusadas y genera ms reusabilidad.
Para definir una nueva clase accin, realice lo siguiente:

22
class UpdateAction extends CAction
{
public function run()
{
// place the action logic here
}
}

Para que el controlador sepa que debe utilizar esta accin hacemos
override del mtodo actions() en nuestra clase controlador de la siguiente
manera:

class PostController extends CController


{
public function actions()
{
return array(
'edit'=>'application.controllers.post.UpdateAction',
);
}
}

En el ejemplo anterior usamos la ruta alias


application.controllers.post.UpdateAction para especificar que el archivo
clase de la accin es protected/controllers/post/UpdateAction.php.
Escribiendo acciones basados en clases podemos organizar la aplicacin de
manera modular.

23
Por ejemplo, la siguiente estructura de directorios puede ser utilizada para
organizar el cdigo de los controladores:

protected/

controllers/

PostController.php

UserController.php

post/

CreateAction.php

ReadAction.php

UpdateAction.php

user/

CreateAction.php

ListAction.php

ProfileAction.php

UpdateAction.php

2.5.5. Modelo (Model)

Un modelo es una instancia de CModel y de las clases que lo heredan. Los modelos
son utilizados para mantener los datos y sus reglas de negocio relevantes.
Un modelo representa un solo objeto de datos. El mismo puede ser una fila en una
tabla de base de datos o un formulario de ingresos por usuario. Cada campo del
objeto de datos est representado por un atributo en el modelo. El atributo tiene una
etiqueta y esta se puede validar contra un juego de reglas.

Yii implementa dos tipos de modelos: modelo de formulario y active record (registro
activo). Ambos extienden de la misma clase base CModel.
Un modelo formulario es una instancia de CFormModel. El modelo formulario es
utilizado para mantener la coleccin de datos de las entradas del usuario. Esos

24
datos coleccionados, utilizados y descartados. Por ejemplo, en una pgina de login,
nosotros podemos utilizar un modelo de formulario para representar la informacin
del nombre de usuario y su contrasea que son provistas por un usuario final.

Active Record (AR) es un patrn de diseo utilizado para abstraer la base de datos
de una forma orientada a objetos. Cada objeto AR es una instancia
de CActiveRecord o una de las clases que lo heredan, representando una nica fila
de la tabla de base de datos. Los campos de la fila son representados por
propiedades del objeto AR. Puede encontrar ms informacin de AR en Active
Record.

25
2.5.6. Vista (View)

Una vista es un script PHP que consiste bsicamente en elementos de la interfaz


de usuario (user interface - UI). La misma puede contener expresiones PHP, pero
es recomendable que estas expresiones no modifiquen los datos del modelo y se
mantengan relativamente simples. Para el mantener la separacin de la lgica y la
presentacin se recomienda que la gran parte de la lgica se encuentre en el
modelo y no en la vista.

Una vista tiene el mismo nombre que es utilizada para identificar un archivo script
de vista cuando se presenta. El nombre de la vista es el mismo que el nombre del
archivo de la vista. Por ejemplo, la vista edit se refiere a el archivo script de vista
llamado edit.php. Para presentar una vista llame a CController::render() con el
nombre de la vista. Este mtodo buscara la vista dentro del
directorio protected/views/ControllerID.
Dentro del script de vista podemos acceder al controlador utilizando $this. De esta
forma podemos pasmar cualquier propiedad del controlador en la vista
evaluando $this->propertyName.
Tambin podemos utilizar la siguiente forma de llamado a la funcin render del
controlador para pasar datos a la vista.

$this->render('edit', array(
'var1'=>$value1,
'var2'=>$value2,
));

En el ejemplo anterior, el mtodo render() extraera el segundo parmetro array en


el script de vista para que lo podamos acceder como variables
locales $var1 y $var2.

26
2.5.6.1. Esquema (Layout)
El esquema o layout es un tipo de vista especial que es utilizado para decorar
vistas. El mismo contiene usualmente porciones de la interfaz de usuario que
son comunes a travez de muchas vistas. Por ejemplo, el esquema o layout
puede contener la porcin de header y footer y embeber dentro el contenido
de la vista,

......header here......
<?php echo $content; ?>
......footer here......

En donde $content contiene el resultado de la presentacin de la vista


contenida.
El esquema o layout es aplicado implcitamente cuando se llama a la
funcion render(). Por predeterminado, el script de la
vista protected/views/layouts/main.php es utilizado como el esquema. Esto
puede ser personalizado
modificando CWebApplication::layout o CController::layout. Para presentar
una vista sin aplicarle ningn esquema, llame a la funcion renderPartial() en
vez de la funcin render().

2.5.6.2. Widget
Un widget es una instancia de CWidget o una clase que lo hereda. Es un
componente con propsito presentacional principalmente. Los widgets son
usualmente embebidos en los scripts de vista para generar interfaces de
usuarios complejas y contenidas en los mismos widgets. Por ejemplo, un
widget calendario puede ser utilizado para presentar una interfaz de usuario
compleja de calendario. Los widgets nos ayudan a tener mayor reusabilidad
de la interfaz de usuario.

27
Para utilizar un widget realice lo siguiente en un script de vista:

<?php $this->beginWidget('path.to.WidgetClass'); ?>


...body content that may be captured by the widget...
<?php $this->endWidget(); ?>

O sino tambin

<?php $this->widget('path.to.WidgetClass'); ?>

El segundo se utiliza cuando el widget no necesita ninguno contenido es su


cuerpo.

Los widgets pueden ser configurados para customizarse segn su


comportamiento. Esto es realizado mediante la configuracin de sus valores
de propiedades iniciales cuando se llama al
mtodo CBaseController::beginWidget o al mtodo CBaseController::widget.
Por ejemplo, cuando se utiliza el widget CMaskedTextField, se puede
identificar que mscara se desea utilizar. Podemos hacerlo pasandole un
array con los valores de las propiedades inicialmente de la siguiente forma,
donde las claves del array son los nombres de las propiedades y los valores
del array los valores iniciales de las correspondientes propiedades del widget:

<?php
$this->widget('CMaskedTextField',array(
'mask'=>'99/99/9999'
));
?>

Para definir un nuevo widget extienda CWidget y sobrecargue los


mtodos init() y run():

28
class MyWidget extends CWidget
{
public function init()
{
// this method is called by CController::beginWidget()
}

public function run()


{
// this method is called by CController::endWidget()
}
}

Como un controlador el widget tambin puede tener sus propias vistas. Por
predeterminado, los archivos de vista de un widget se encuentran dentro del
subdirectorio views del directorio que contiene el archivo de clase widget.
Estas vistas pueden ser presentadas llamando al mtodo CWidget::render(),
similarmente a como se realiza en un controlador. La nica diferencia es que
no se le aplicar ningn esquema o layout a la vista de un widget.

2.5.6.3. Vistas de sistema


Las vistas de sistema es la forma de referirse a las vistas utilizadas por Yii
para mostrar los errores y la informacin del logueo. Por ejemplo, cuando un
se realiza un pedido de un controlador o una accin inexistente, Yii lanzar
una excepcin explicando el error. Yii mostrar el error utilizando la vista del
sistema especfica para el mismo.

Los nombres de las vistas del sistema siguen ciertas reglas. Nombres
como errorXXX refieren a vistas que muestran las CHttpException con
cdigo de error XXX. Por ejemplo, si CHttpException es lanzada con el cdigo
de error 404, la vista error404 ser la que se mostrar.
Yii provee un conjunto de vistas de sistema predeterminados que se pueden
localizar en framework/views. Las mismas pueden ser personalizadas
creando las vistas con el mismo nombre de archivo dentro
de protected/views/system.

29
2.6. Trabajando con formularios

2.6.1. Descripcin
La recopilacin de datos de los usuarios a travs de los formularios HTML es
una de las tareas ms importantes en el desarrollo de aplicaciones
Web. Adems de disear formas, los desarrolladores tienen que rellenar el
formulario con los valores de datos por defecto o existentes, validar la entrada
del usuario, mostrar mensajes de error apropiados para la entrada invlida, y
guardar la entrada en almacenamiento persistente. Yii simplifica en gran
medida el flujo de trabajo con su arquitectura MVC.
Los siguientes pasos suelen ser necesarios cuando se trata de formas de Yii:
Crear una clase de modelo que representa los campos de datos para
ser recogidos
Crear una accin de controlador con el cdigo que responde a formar
presentacin.
Crear un formulario en el archivo de script de vista asociada a la
accin del controlador.

2.6.2. Creando el modelo


2.6.2.1. La Creacin de Modelos
Antes de escribir el cdigo HTML necesario para un formulario,
hay que decidir qu tipo de datos esperamos de los usuarios finales y
las reglas que estos datos deben cumplir. Una clase de modelo se
puede utilizar para registrar esta informacin. Un modelo es el lugar
central para mantener las entradas de usuario y la validacin de ellos.
Dependiendo de la forma en que hacemos uso de la entrada del
usuario, podemos crear dos tipos de modelo. Si se recoge la entrada
del usuario, usado y luego desechado, tendramos crear un modelo de
formulario ; si se recoge y se guarda en la base de datos de la entrada
del usuario, usaramos un registro activo en su lugar. Ambos tipos de

30
modelo comparten la misma clase de base CModel que define el
interfaz comn sea necesario por la forma.

2.6.2.2. Definiendo el Model Class


A continuacin creamos una LoginFormclase del modelo utilizado
para recolectar informacin del usuario en una pgina de inicio de
sesin. Debido a que la informacin de acceso slo se utiliza para
autenticar al usuario y no necesita ser salvado, creamos LoginForm
como un modelo de formulario.

class LoginForm extends CFormModel


{
public $username;
public $password;
public $rememberMe=false;
}

Tres atributos se declaran en:


LoginForm: $username, $passwordy $rememberMe. Se utilizan para
mantener el nombre de usuario y la contrasea introducida por el
usuario, y la opcin si el usuario quiere recordar su inicio de
sesin. Debido a que $ rememberMe un valor predeterminado false, la
opcin correspondiente cuando se muestra inicialmente en la forma de
la conexin ser sin marcar.

2.6.2.3. Declaracin de reglas de validacin


Una vez que un usuario enva sus entradas y el modelo se rellena, es
necesario asegurarse de que las entradas son vlidas antes de
usarlos. Esto se hace mediante la validacin de las entradas contra un
conjunto de reglas. Se especifica las reglas de validacin del rules(),
mtodo que debe devolver un conjunto de configuraciones de reglas.

31
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;

private $_identity;

public function rules()


{
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'),
);
}

public function authenticate($attribute,$params)


{
$this->_identity=new UserIdentity($this->username,$this-
>password);
if(!$this->_identity->authenticate())
$this->addError('password','Incorrect username or
password.');
}
}

El cdigo anterior especifica que username y password son ambos


necesario, password debe ser autenticado, y rememberMe debe ser
un valor booleano.
Cada regla que devuelve rules() debe ser del siguiente formato:

array('AttributeList', 'Validator',
'on'=>'ScenarioList', ...additional options)

32
donde AttributeListes una cadena de nombres de atributos
separados por comas que necesitan ser validado segn la
regla; Validatorespecifica qu debe realizarse tipo de
validacin; el onparmetro es opcional que especifica una lista de
escenarios en los que la regla se debe aplicar; y opciones adicionales
son pares nombre-valor que se utilizan para inicializar el validador
correspondiente valores de las propiedades de los componentes.
Desde la versin 1.1.11 es posible lista negra escenarios. Si no desea
llevar a cabo la validacin por alguna regla cuando escenarios
particulares estn activos podra especificar exceptel parmetro que
contiene sus nombres. La sintaxis es la misma que para onel
parmetro.
Lista de escenarios ( ony exceptparmetros) podra especificarse en
dos formas diferentes, que significa lo mismo:

// arbitrary array with scenario names


'on'=>array('update', 'create'),
// string with scenario names separated with commas (spaces are
ignored)
'except'=>'ignore, this, scenarios, at-all',

Hay tres formas de especificar Validatoren una regla de validacin. En


primer lugar, Validatorpuede ser el nombre de un mtodo en la clase
del modelo, como authenticateen el ejemplo anterior. El mtodo de
validacin debe ser de la siguiente firma:

/**
* @param string $attribute the name of the attribute to be
validated
* @param array $params options specified in the validation rule
*/
public function ValidatorName($attribute,$params) { ... }

En segundo lugar, Validator puede ser el nombre de una clase de


validador. Cuando se aplica la regla, se crear una instancia de la
clase de validador para llevar a cabo la validacin real. Las opciones
adicionales en la regla se utilizan para inicializar los valores de atributo

33
de la instancia. Una clase de validador debe extenderse
desde CValidator .
En tercer lugar, Validatorpuede ser un alias predefinido a una clase de
validador. En el ejemplo anterior, el nombre required es el alias
a CRequiredValidator que asegura el valor del atributo a ser validado
no est vaco. A continuacin se muestra la lista completa de los alias
de validacin predefinidos:
boolean: Alias de CBooleanValidator , asegurando el atributo tiene
un valor que es o bienCBooleanValidator ::
TrueValue o CBooleanValidator :: falseValue .
captcha: Alias de CCaptchaValidator , asegurando el atributo es
igual al cdigo de verificacin que aparece en una de CAPTCHA .
compare: Alias de CCompareValidator , asegurando el atributo es
igual a otro atributo o constante.
email: Alias de CEmailValidator , asegurando el atributo es una
direccin vlida de correo electrnico.
date: Alias de CDateValidator , asegurando el atributo representa
una fecha, hora, fecha y hora o un valor vlido.
default: Alias de CDefaultValueValidator , la asignacin de un valor
por defecto de los atributos especificados.
exist: Alias de CExistValidator , asegurando el valor del atributo se
puede encontrar en la columna de la tabla especificada.
file: Alias de CFileValidator , asegurando el atributo contiene el
nombre de un archivo cargado.
filter: Alias de CFilterValidator , transformando el atributo con un
filtro.
in: Alias de CRangeValidator , asegurando los datos se encuentra
entre una lista de pre-especificado de valores.
length: Alias de CStringValidator , asegurando la longitud de los
datos est dentro de cierto rango.

34
match: Alias de CRegularExpressionValidator , asegurando los
datos coinciden con una expresin regular.
numerical: Alias de CNumberValidator , asegurando que el dato es
un nmero vlido.
required: Alias de CRequiredValidator , asegurando el atributo no
est vaco.
type: Alias de CTypeValidator , asegurando el atributo es del tipo
de datos especfico.
unique: Alias de CUniqueValidator , asegurando que el dato es
nico en una columna de tabla de base de datos.
url: Alias de CUrlValidator , asegurando que el dato es una URL
vlida.
A continuacin se enumeran algunos ejemplos del uso de los
validadores predefinidos:

/ username is required
array('username', 'required'),
// username must be between 3 and 12 characters
array('username', 'length', 'min'=>3, 'max'=>12),
// when in register scenario, password must match password2
array('password', 'compare', 'compareAttribute'=>'password2',
'on'=>'register'),
// when in login scenario, password must be authenticated
array('password', 'authenticate', 'on'=>'login'),

35
2.6.2.4. Securing attribute assignments
Despus se crea una instancia de modelo, a menudo necesitamos
para rellenar sus atributos con los datos presentados por los usuarios
finales. Esto se puede hacer de forma conveniente utilizando la
siguiente asignacin masiva:

$model=new LoginForm;
if(isset($_POST['LoginForm']))
$model->attributes=$_POST['LoginForm'];

La ltima afirmacin se llama asignacin masiva que asigna cada


entrada en $_POST['LoginForm'] el atributo de modelo
correspondiente. Es equivalente a las siguientes asignaciones:

foreach($_POST['LoginForm'] as $name=>$value)
{
if($name is a safe attribute)
$model->$name=$value;
}

Es crucial para determinar qu atributos son seguros. Por ejemplo, si


nos exponemos la clave principal de una tabla para estar seguro,
entonces el atacante podra tener la oportunidad de modificar la clave
principal del registro dado y por lo tanto alterar los datos que no est
autorizado.

36
2.6.2.5. La declaracin de atributos seguros

Un atributo se considera seguro si aparece en una regla de validacin


que se aplica en el escenario dado. Por ejemplo,

array('username, password', 'required', 'on'=>'login, register'),


array('email', 'required', 'on'=>'register'),

En lo anterior, los username y passwordse requieren atributos en


el login escenario, mientras que los username, password y email los
atributos son necesarios en register el escenario. Como resultado, si
realizamos una masiva asignar cuando se encuentra
en loginescenario, solamente usernamey password ser asignado de
forma masiva, ya que son los nicos atributos que aparecen en las
reglas de validacin para login. Por otro lado, si el escenario
es register, los tres atributos pueden ser asignados de forma masiva.

// in login scenario
$model=new User('login');
if(isset($_POST['User']))
$model->attributes=$_POST['User'];

// in register scenario
$model=new User('register');
if(isset($_POST['User']))
$model->attributes=$_POST['User'];

Entonces, por qu utilizamos esta poltica para determinar si un


atributo es seguro o no? La razn detrs es que si un atributo ya tiene
una o varias reglas de validacin para comprobar su validez.
Es importante recordar que las reglas de validacin se utilizan para
comprobar los datos de entrada del usuario en lugar de los datos que
generamos en el cdigo (por ejemplo, marca de tiempo, clave primaria

37
generada automticamente). Por lo tanto, NO agregar reglas de
validacin para aquellos atributos que no esperan aportaciones de los
usuarios finales.
A veces, queremos declarar un atributo que es seguro, a pesar de que
en realidad no tienen ninguna regla especfica para ello. Un ejemplo
es atributo de contenido de un artculo que puede tomar cualquier
entrada del usuario. Podemos utilizar el especial saferegla para lograr
este objetivo:

array('content', 'safe')

Para completar, hay tambin una unsaferegla que se utiliza para


declarar explcitamente un atributo que no es seguro:

array('permission', 'unsafe')

Para las entradas de datos que no son seguros, tenemos que


asignarlos a los atributos correspondientes usando declaraciones
individuales, como la siguiente:

$model->permission='admin';
$model->id=1;

38
2.6.2.6. Activacin-Validacin

Una vez que un modelo se rellena con los datos enviados por los
usuarios, podemos llamar CModel :: validate ()para activar el proceso
de validacin de datos. El mtodo devuelve un valor que indica si la
validacin es correcta o no. Para CActiveRecord modelos, validacin
tambin puede ser activado automticamente cuando llamamos
su CActiveRecord :: save () mtodo.
Podemos establecer un escenario con el escenario de la propiedad y
con ello indica que se debe aplicar conjunto de reglas de validacin.
La validacin se realiza en un escenario base. El escenario propiedad
especifica qu escenario el modelo est siendo utilizado en y qu
conjunto de reglas de validacin se debe utilizar. Por ejemplo, en
el loginescenario, slo queremos validar los username y las password
entradas de un modelo de usuario; mientras que en
el register escenario, necesitamos validar ms entradas, tales
como email, address, etc. El siguiente ejemplo muestra cmo debe
realizarse la validacin en el register escenario:

// creates a User model in register scenario. It is equivalent to:


// $model=new User;
// $model->scenario='register';
$model=new User('register');

// populates the input values into the model


$model->attributes=$_POST['User'];

// performs the validation


if($model->validate()) // if the inputs are valid
...
else
...

Los escenarios de aplicacin que una regla se asocia pueden


especificar a travs de la onopcin de la regla. Si la onopcin no est

39
activada, significa que la regla se utilizar para todos los
escenarios. Por ejemplo,

public function rules()


{
return array(
array('username, password', 'required'),
array('password_repeat', 'required', 'on'=>'register'),
array('password', 'compare', 'on'=>'register'),
);
}

La primera regla se aplicar en todos los escenarios, mientras que los


dos siguientes reglas slo se aplicarn en el register escenario.

2.6.2.7. Recuperacin de errores de validacin

Una vez que se realiza la validacin, los posibles errores sern


almacenados en el objeto del modelo. Podemos recuperar los
mensajes de error llamando CModel :: getErrors () y CModel ::
getError () . La diferencia entre los dos mtodos es que el primer
mtodo devolver todos los errores para el atributo modelo
especificado mientras que el segundo mtodo slo devolver
el primero error.

40
2.6.2.8. Las etiquetas de atributos

Al disear un formulario, a menudo necesitamos para mostrar una


etiqueta para cada campo de entrada. La etiqueta le dice al usuario
qu tipo de informacin que se espera que entre en el campo. Aunque
podemos codificar una etiqueta en una vista, que ofrecera una mayor
flexibilidad y conveniencia, si lo especificamos en el modelo
correspondiente.
Por defecto, CModel se devuelva el nombre de un atributo como su
etiqueta. Esto se puede modificar para requisitos particulares
sobreescribiendo los attributeLabels () mtodo. Como veremos en los
apartados siguientes, especificando las etiquetas en el modelo nos
permite crear una forma ms rpida y potente.

2.6.3. Creando la accin

Una vez que tenemos un modelo, podemos empezar a escribir la


lgica que se necesita para manipular el modelo. Ponemos esta lgica
dentro de una accin del controlador. Para el ejemplo de forma de la
conexin, se necesita el cdigo siguiente:

41
public function actionLogin()
{
$model=new LoginForm;
if(isset($_POST['LoginForm']))
{
// collects user input data
$model->attributes=$_POST['LoginForm'];
// validates user input and redirect to previous page if
validated
if($model->validate())
$this->redirect(Yii::app()->user->returnUrl);
}
// displays the login form
$this->render('login',array('model'=>$model));
}

En lo anterior, primero creamos una LoginForminstancia de modelo; Si


la solicitud es una solicitud POST (es decir, la forma de la conexin se
presenta), poblamos $model con los datos
presentados $_POST['LoginForm']; entonces validar la entrada y si
tiene xito, redirigir el navegador del usuario a la pgina que
anteriormente necesitaba autenticacin. Si la validacin falla, o si se
accede inicialmente a la accin, que hacen que la loginvista cuyo
contenido desee se describe en el apartado siguiente.

Vamos a prestar especial atencin a la siguiente declaracin PHP que


aparece en la accin login:

$model->attributes=$_POST['LoginForm'];

Como describimos en Asegurando de misiones de atributos , esta


lnea de cdigo rellena el modelo con los datos enviados por los
usuarios. La attributespropiedad se define por CModel que espera
una matriz de pares de nombre-valor y asigna a cada valor al atributo

42
de modelo correspondiente. As que si $_POST['LoginForm']nos da
una gama tan amplia, el cdigo anterior sera equivalente a la siguiente
larga (suponiendo que todos los atributos necesarios est presente en
la matriz):

$model->username=$_POST['LoginForm']['username'];
$model->password=$_POST['LoginForm']['password'];
$model->rememberMe=$_POST['LoginForm']['rememberMe'];

La tarea que queda ahora es crear la vista login que debe contener un
formulario HTML con los campos de entrada necesarios.

2.6.4. Creando el formulario

Escribir el loginpunto de vista es sencillo. Empezamos con


una formetiqueta cuyo atributo de accin debe ser la direccin URL de
la loginaccin descrita anteriormente. A continuacin, introduzca
etiquetas y campos de entrada para los atributos declarados en
la LoginFormclase. Al final insertamos un botn de envo, que se
puede hacer clic los usuarios para enviar el formulario. Todo esto
puede hacerse en el cdigo HTML puro.
Y proporciona algunas clases de ayuda para facilitar la composicin
de vista. Por ejemplo, para crear un campo de entrada de texto,
podemos llamar chtml :: textField () ; para crear una lista desplegable,
llame chtml :: DROPDOWNLIST () .

43
A continuacin, utilizamos html para crear el formulario de
acceso. Suponemos que la variable $model representa la instancia
LoginForm.

<div class="form">
<?php echo CHtml::beginForm(); ?>

<?php echo CHtml::errorSummary($model); ?>

<div class="row">
<?php echo CHtml::activeLabel($model,'username'); ?>
<?php echo CHtml::activeTextField($model,'username') ?>
</div>

<div class="row">
<?php echo CHtml::activeLabel($model,'password'); ?>
<?php echo CHtml::activePasswordField($model,'password') ?>
</div>

<div class="row rememberMe">


<?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>
<?php echo CHtml::activeLabel($model,'rememberMe'); ?>
</div>

<div class="row submit">


<?php echo CHtml::submitButton('Login'); ?>
</div>

<?php echo CHtml::endForm(); ?>


</div><!-- form -->

El cdigo anterior genera una forma ms dinmica. Por


ejemplo, HTML :: activeLabel () genera una etiqueta asociada con el
atributo modelo especificado. Si el atributo tiene un error de entrada,
la clase CSS de la etiqueta ser cambiado a error, que cambia la
apariencia de la etiqueta con estilos CSS correspondiente. Del mismo
modo, html :: activeTextField () genera un campo de entrada de texto
para el atributo modelo especificado y cambia su clase CSS a
cualquier error de entrada.

44
Si utilizamos el archivo de estilo CSS form.css proporcionada por
el yiic guin, el formulario generado sera como el siguiente:

A partir de la versin 1.1.1, un nuevo widget llamado CActiveForm se


proporciona para facilitar la creacin de formularios. El widget es
capaz de soportar sin problemas la validacin y consistente en ambos
lados de cliente y servidor. Usando CActiveForm , el cdigo de la vista
anterior se puede reescribir como:

45
<div class="form">
<?php $form=$this->beginWidget('CActiveForm'); ?>

<?php echo $form->errorSummary($model); ?>

<div class="row">
<?php echo $form->label($model,'username'); ?>
<?php echo $form->textField($model,'username') ?>
</div>

<div class="row">
<?php echo $form->label($model,'password'); ?>
<?php echo $form->passwordField($model,'password') ?>
</div>

<div class="row rememberMe">


<?php echo $form->checkBox($model,'rememberMe'); ?>
<?php echo $form->label($model,'rememberMe'); ?>
</div>

<div class="row submit">


<?php echo CHtml::submitButton('Login'); ?>
</div>

<?php $this->endWidget(); ?>


</div><!-- form -->

2.6.5. Colectando entradas tabulares


A veces queremos recolectar informacin del usuario en un
modo por lotes. Es decir, el usuario puede introducir la informacin
para mltiples instancias de modelo y presentar todos a la
vez. Llamamos a esta entrada de tabla porque los campos de entrada
a menudo se presentan en una tabla HTML.
Para trabajar con la entrada de tabla, primero tenemos que crear o
rellenar una matriz de instancias de modelo, dependiendo de si
estamos insertar o actualizar los datos. A continuacin, recuperar los
datos de entrada del usuario de la $_POSTvariable y asignamos a
cada modelo. Una ligera diferencia de entrada de un modelo nico es
que recuperamos los datos de entrada
usando $_POST['ModelClass'][$i]en lugar de $_POST['ModelClass'].

46
public function actionBatchUpdate()
{
// retrieve items to be updated in a batch mode
// assuming each item is of model class 'Item'
$items=$this->getItemsToUpdate();
if(isset($_POST['Item']))
{
$valid=true;
foreach($items as $i=>$item)
{
if(isset($_POST['Item'][$i]))
$item->attributes=$_POST['Item'][$i];
$valid=$item->validate() && $valid;
}
if($valid) // all items are valid
// ...do something here
}
// displays the view to collect tabular input
$this->render('batchUpdate',array('items'=>$items));
}

Tener la accin listo, tenemos que trabajar en la batchUpdate para


mostrar los campos de entrada en una tabla HTML.

<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></
tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description");
?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo CHtml::submitButton('Save'); ?>


<?php echo CHtml::endForm(); ?>
</div><!-- form -->

47
Observamos a lo anterior que usamos "[$i]name" en lugar
de "name"como segundo parmetro al llamar chtml :: activeTextField .

Si hay algn error de validacin, los campos de entrada


correspondientes se resaltan automticamente, al igual que la entrada
de un nico modelo que describimos anteriormente.

2.7. Trabajando con Base de Datos

2.7.1. Descripcin
Yii provee un poderoso soporte para la programacin con bases de
datos. Construdo sobre la extensin PHP de Obejotos de Datos
(PDO), los Objetos de Acceso a Datos de Yii (DAO) habilitan el acceso
a diferentes sistemas de administracin de bases de datos (DBMS) en
una interfaz uniforme simple. Las aplicaciones desarrolladas usando
el DAO de Yii pueden ser fcilmente cambiadas para usar un DBMS
diferente sin la necesidad de modificar el cdigo de acceso a los datos.
Los Registros Activos de Yii (AR), implementados con un enfoque
ampliamente adoptado de Mapeo Objeto-Relacional, simplifican an
ms la programacin con bases de datos. Representado una tabla en
trminos de una clase y una fila como una instacia de esa clase, los
AR de Yii eliminan la tarea repetitiva de escribir aquellas sentencias
SQL que tratan principalmente con las operaciones CRUD (create,
read, update and delete; crear, leer, actualizar, borrar).

Aunque el DAO y los AR de Yii pueden manejar casi todas las tareas
relacionadas con la base de datos, an puedes usar tus propias
libreras en tu aplicacin Yii. De hecho, el framework Yii esta
cuidadosamente diseado para ser usado en conjunto con otras
libreras de terceros.

48
2.7.2. Objetos de acceso a BD
2.7.2.1. Estableciendo la conexin con la base de datos
Para establecer la conexin con una base de datos, creamos una
instancia de CDbConnetion y la activamos. Es necesario un nombre
de fuente de datos (DNS) para especificar la informacin requerida
para conectarse a la base de datos. Un nombre de usuario y
contrasea pueden ser tambin necesarios para establecer la
conexin. Ser arrojada una excepcin en el caso de que ocurra algn
error al establecer la conexin (ej.: DNS malo o nombre de
usuario/contrasea invlidos).

$connection=new CDbConnection($dsn,$username,$password);
// establish connection. You may try...catch possible exceptions
$connection->active=true;
......
$connection->active=false; // close connection

La forma del DNS depende del driver PDO de la base de datos en uso.
En general, un DNS consiste del nombre del driver PDO, seguido por
dos puntos (:), seguido por la sintaxis especfica del driver. Mira
la Documentacin PDO para una informacin completa. A
continuacin, una lista de los formatos DNS ms comunmente
utilizados:

SQLite: sqlite:/path/to/dbfile
MySQL: mysql:host=localhost;dbname=testdb
PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb

Puesto que CDbConnetion extiende de CApplicationComponent,


podemos tambin usarla como un Componente de Aplicacin. Para

49
hacerlo, configuramos un componente de aplicacin db (u otro
nombre) en Configuracin de la Aplicacin como sigue,

array(
......
'components'=>array(
......
'db'=>array(
'class'=>'CDbConnection',

'connectionString'=>'mysql:host=localhost;dbname=testdb',
'username'=>'root',
'password'=>'password',
),
),
)

Podemos entonces acceder a la conexin de la base de datos a travs


de Yii::app()->db (donde db es el nombre que le pusimos al
componente) que ya est activada, a menos que explicitamente
configuremos aCDbConnection::autoConnect en false. Usar este
enfoque, una simple conexin con la base de datos puede ser usada
en diferentes lugares en nuestro cdigo.

2.7.2.2. Ejecutando sentencias SQL

Una vez establecida la conexin con la base de datos, las sentencias


SQL pueden ser ejecutadas usando CDbCommand. Se crea una
instancia CDbCommand llamando
a CDbConnetion::createCommand() con la sentencia SQL
especificada:

$command=$connection->createCommand($sql);
// if needed, the SQL statement may be updated as follows:
// $command->text=$newSQL;

50
Una sentencia SQL es ejecutada a travs de CDbCommand en una
de las siguientes dos maneras:
execute(): ejecuta una sentencia SQL que no es consulta,
como INSERT, UPDATE y DELETE. Si es exitosa, devuelve el
numero de filas afectadas por la ejecucin.
query(): ejecuta una sentencia SQL que devuelve filas de datos,
como SELECT. Si es exitosa, develve una instancia
de CDbDataReader, a partid de la cual se recorrer el resultado de
las filas de datos. Por conveniencia, estn implementados un
conjunto de mtodos queryXXX(), los cuales devuelven
directamente el resultado de la consulta.
Ser arrojada una excepcin si ocurre un error durante la ejecucin de
una sentencia SQL.

$rowCount=$command->execute(); // ejecuta una sentencia SQL sin


resultados
$dataReader=$command->query(); // ejecuta una consulta SQL
$rows=$command->queryAll(); // consulta y devuelve todas las
filas de resultado
$row=$command->queryRow(); // consulta y devuelve la primera
fila de resultado
$column=$command->queryColumn(); // consulta y devuelve la primera
columna de resultado
$value=$command->queryScalar(); // consulta y devuelve el primer
campo en la primer fila

2.7.2.3. Obteniendo resultados de la consulta

51
Luego de que CDbCommand::query() genere la instancia
de CDbDataReader, podemos recuperar filas del resultado llamando
a CDbDataReader::read() de manera repetida. Podemos tambien usar
un CDbDataReaderen un foreach de PHP para recuperar fila a fila.

$dataReader=$command->query();
// calling read() repeatedly until it returns false
while(($row=$dataReader->read())!==false) { ... }
// usando foreach para atravesar cada fila de datos
foreach($dataReader as $row) { ... }
// recuperando todos los datos de una vez en un nico arreglo
$rows=$dataReader->readAll();

2.7.2.4. Usando transacciones

Cuando una aplicacin ejecuta unas pocas consultas, cada una


leyendo y/o escribiendo informacin en la base de datos, es
importante aseguarse que la base de datos no se quede slo con
algunas de las consultas llevadas a cabo. Para evitar esto, puede ser
iniciada una transaccin, representada en Yii como una instancia
de CDbTransaction:
Comenzar la transaccin.
Ejecutar consultas una a una. Ninguna actualizacin a la base de
datos es visible al mundo exterior.
Consignar la transaccin. Las actualizaciones se vuelven visibles
si la transaccin es exitosa.
Si una de las consultas falla, la transaccin entera se deshace.
El anterior flujo de trabajo puede ser implementado usando el
siguiente cdigo:

$transaction=$connection->beginTransaction();
try
{

52
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//.... other SQL executions
$transaction->commit();
}
catch(Exception $e) // se arroja una excepcin si una consulta
falla
{
$transaction->rollBack();
}

2.7.2.5. Vinculando parmetros


Para evitar ataques de SQL injection y para mejorar el rendimiento de
sentencias SQL usadas repetidas veces, podemos "preparar" una
sentencia SQL con marcadores de posicin de parmetros opcionales,
que son marcadores que sern reemplazados con los parmetros
reales durante el proceso de vinculacin de parmetros. El driver
subyacente de la base de datos lo har por nosotros. La vinculacin
de parmetros debe hacerse antes de que la sentencia SQL sea
ejecutada.

// una SQL con dos marcadore de posicin, ":username" and ":email"


$sql="INSERT INTO users(username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// reemplaza el marcador de posicin ":username" con el valor real
de username
$command->bindParam(":username",$username,PDO::PARAM_STR);
// reemplaza el marcador de posicin ":email" con el valor real de
email
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// inserta otra fila con un nuevo conjunto de parmetros
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();

Los mtodos bindParam() y bindValue() son muy similares. La nica


diferencia es que el primero vincula un parmetro con una variable
PHP mientras que el ltimo con un valor. Para parmetros que

53
representan grandes bloques de memoria de datos, es preferible el
primero por consideraciones de rendimiento.

2.7.2.6. Vinculando columnas

Al recoger los datos del resultado de una consulta, podemos tambin


vincular columnas con variables PHP para que sean automticamente
rellenadas con los datos apropiados cada vez que una fila es recogida .

$sql="SELECT username, email FROM users";


$dataReader=$connection->createCommand($sql)->query();
// vincular la 1er columna (username) con la variable $username
$dataReader->bindColumn(1,$username);
// vincular la 2da columna (email) con la variable $email
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
// $username e $email contienen el nombre de usuaario y el
email de la fila actual
}

54
CONCLUSIONES

1) Se desarrollo de un CRUD (Create, Read, Update, Delete) con una base


de datos.

2) Se lleg a conocer las diferentes funciones que ofrece Yii.

3) Se lleg aprender a usar Yii Framework para desarrollo web.

RECOMENDACIONES

55
1) Recomendamos utilizar las distintas funciones que ofrece Yii, como por
ejemplo trabajar con la base de datos, hacer consultas, etc.

2) Es importante tener conocimiento de POO(Programacion Orientado a


Objetos).

3) Se recomienda usar SublimeText para un mejor y comodo desarrollo.

56
Bibliografa

"Introduccin: Qu Es Yii | The Definitive Guide To Yii | Yii PHP Framework".


2017. Yiiframework.Com.
http://www.yiiframework.com/doc/guide/1.1/es/quickstart.what-is-yii.

"Qu Es Un Framework Y Para Qu Se Utiliza? | Orix Systems". 2017. Orix.Es.


https://www.orix.es/que-es-un-framework-y-para-que-se-utiliza.

57