Archivo de la categoría: Yii Framework

TUTORIAL YII FRAMEWORK (CAPÍTULO 8) – ORDEN POR DEFECTO Y CONDICION EXTRA EN GRID

A continuación vamos explicar como hacemos para ordenar nuestro Grid bajo el criterio que queramos, eso lo hacemos modificando el parámetro sort del CActiveDataProvider que se encuentra en la función search del modelo, de igual modo vamos a agregar un condición extra en la búsqueda, en nuestro caso filtramos por el estatus.

$criteria->condition = "estatus=true";
 $sort=new CSort();
 $sort->defaultOrder='num_control DESC';
 y el CActivedataProvider queda así:
 return new CActiveDataProvider($this, array(
 'criteria'=>$criteria,
 'sort'=>$sort,
 ));

TUTORIAL YII FRAMEWORK (CAPÍTULO 7) – VALIDANDO LOS FORMULARIOS

Si queremos validar nuestros campos lo hacemos en el método rules() del modelo en cuestión:

public function rules()
{
return array( );
}

La validación mas obvia es la de hacer tu campo obligatorio:

array('nombre, correo, edad', 'required'),

También puedes especificar que el valor sea numero, incluso entero:

array('monto', 'numerical', 'integerOnly'=>true),

Para cadenas podemos restringir la longitud:

array('name','length','min'=>6, 'max'=>40),

Otra validación valiosa es para los correos electrónicos:

array('userEmail', 'email'),

o para enlaces:

array('link', 'url'),

Si queremos validar que un campo sea único en la base de datos colocamos lo siguiente:

array('campo', 'unique', 'attributeName'=>'NombreModelo.dato'),
<pre>

Para comparar dos campos del mismo formulario es así:

array('monto_auditado','compare','compareAttribute'=>'monto_contratado','operator'=>'<=','message'=>'El
Monto Auditado debe ser un numero menor o igual al monto contratado'),

TUTORIAL YII FRAMEWORK (CAPÍTULO 6) – CLAVES FORÁNEAS EN VISTAS

Suponiendo que tenemos las siguientes tablas:

Donde id_estado es clave foránea en municipio y hace referencia al id de la tabla estado. Al crear el modelo y el CRUD para ambas tablas con la herramienta Gii tenemos como resultado que en las distintas vistas del modelo Municipio el estado al que pertenece dicho municipio siempre aparece reflejado con su id, para cambiar esto y que aparezca el nombre del estado en las distintas vistas debemos cambiar varias lineas de código, a continuación te explicamos como hacerlo. Si las relacionamos bien en el gestor de base de datos Yii por defecto nos configura la relación entre ellas, Definimos la relación en el modelo Municipio:

public function relations()

{
return array('estado' => array(self::BELONGS_TO, 'Estado', 'id_estado') );
}

La mejor forma de representar a los estados en los formularios de creación y modificación de municipios es con un combo box (drop down list), para eso colocamos la siguiente linea en el archivo /protected/views/municipio/_form.php

<?php echo $form->dropDownList($model,'id_estado', CHtml::listData(Estado::model()-
>findAll(), 'id', 'nombre_estado')); ?>

En lugar de:

<?php echo $form->textField($model,'id_estado'); ?>

Para colocar el nombre del estado en el “Detail View” de cada municipio nos vamos al archivo /protected/views/municipio/_view.php y modificamos las siguientes lineas:


<?php echo CHtml::encode($data->getAttributeLabel('id_estado')); ?>:
<?php echo CHtml::encode($data->id_estado); ?>

y colocamos:

<?php echo CHtml::encode($data->getAttributeLabel('Nombre Estado')); ?>:
<?php echo CHtml::encode($data->estado->nombre_estado); ?>

Si queremos que aparezca el nombre del estado en el View (Mostrar) del municipio abrimos el archivo /protected/views/municipio/view.php y nos fijamos en el siguiente código:

<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'nombre_municipio',
'id_estado',
),
)); ?>

Donde dice ‘id_estado’ cambiamos por ‘estado.nombre_estado’ . Si deseamos que aparezca el nombre del estado en el listado de municipios (Manage) modificamos en /protected/views/municipio/admin.php

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'municipio-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'nombre_municipio',
'id_estado',

cambiamos ‘id_estado’ por

array ('name'=>'id_estado','value'=>'$data->estado->nombre_estado','type'=>'text',)

Adicionalmente, para que la búsqueda pueda funcionar nos vamos a /protected/models/Municipio.php
y modificamos la función search.

Y donde aparece:

$criteria->compare('id_estado',$this->id_estado);

colocamos:

$criteria->with =array('estado');
$criteria->addSearchCondition('estado.nombre_estado', $this->id_estado);

Si queremos que traiga tanto con minúsculas o mayúsculas colocamos:

$criteria->addSearchCondition('LOWER(estado.nombre_estado)', strtolower($this->id_estado));

Si queremos que la búsqueda en el admin se haga mediante un combo colocamos:

array(
'header'=>'Estado',
// Nombre de la columna en el CGridView
'name'=>'id_estado',
// Nombre del dato en el modelo
'value' => '$data->estado->nombre_estado',
// Valor a mostrar
'htmlOptions'=>array('style'=>'text-align: center','width'=>'80px'),
// Opciones HTML
'filter' => CHtml::listData(TipoOrgG::model()->findAll(), 'id_estado',
'nombre_estado'), // Colocamos un combo en el filtro
),

Para crear un combo cuyos datos no provengan de la base de datos lo hacemos de esta forma:

$options = array(
array('id_tipo_org'=>1, 'descripcion'=>'Dato 1'), array('id_tipo_org'=>2, 'descripcion'=>'Dato 2'),
);
array( 'header'=>'Prueba', 'name'=>'id_tipo_org', 'value' => '$data->idTipoOrg->descripcion',
'htmlOptions'=>array('style'=>'text-align: center','width'=>'80px'),
'filter'=>CHtml::listData($options, 'id_tipo_org', 'descripcion'), ),

TUTORIAL YII FRAMEWORK (CAPÍTULO 5) – AUTENTICACIÓN DE USUARIOS

Este es el sql de la tabla donde se guardaran nuestros usuarios:

CREATE TABLE usuario (
 id serial NOT NULL,
 username character varying(128) NOT NULL,
 password character varying(128) NOT NULL,
 CONSTRAINT usuario_pkey PRIMARY KEY (id) )
WITH (OIDS=FALSE);
ALTER TABLE usuario OWNER TO postgres;

Debes crear el modelo y el CRUD de esta tabla con el Gii

En protected/components/UserIdentity.php sustituimos la clase UserIdentity por:

class UserIdentity extends CUserIdentity
 {
 private $_id;
 public function authenticate()
 {
 $username=strtolower($this->username);
 $user=Usuario::model()->find('LOWER(username)=?',array($username));
 if($user===null)
 $this->errorCode=self::ERROR_USERNAME_INVALID;
 else if(!$user->validatePassword($this->password))
 $this->errorCode=self::ERROR_PASSWORD_INVALID;
 else
 {
 $this->_id=$user->id;
 $this->username=$user->username;
 $this->errorCode=self::ERROR_NONE;
 }
 return $this->errorCode==self::ERROR_NONE;
 }
 public function getId()
 {
 return $this->_id;
 }
 }

En protected/models/Usuario.php agregar las siguientes funciones:

public function validatePassword($password)
 {
 return $this->hashPassword($password)===$this->password;
 }
 public function hashPassword($password)
 {
 return md5($password);
 }

Para que la clave se guarde en MD5 al crear los usuarios agregar la siguiente linea en la función actionCreate del controlador protected/controllers/UsuarioController.php, hacer lo mismo con la función actionUpdate

$model->attributes=$_POST['Usuario'];
////////////////////////////////////////////////////////////
//////////////////LINEA A AGREGAR//////////////////////////
 $model->password=md5($model->password);
///////////////////////////////////////////////////////////
 if($model->save())

Para otorgar o denegar permisos a usuarios también se modifica el controlador del modelo, en este caso protected/controllers/UsuarioController.php, vamos a la función accessRules:

public function accessRules()
{
 return array(
 array('allow', // allow all users to perform 'index' and 'view' actions
 'actions'=>array('index','view'),
 'users'=>array('*'),
 ),
 array('allow', // allow authenticated user to perform 'create' and 'update' actions
 'actions'=>array('create','update'),
 'users'=>array('@'),
 ),
 array('allow',
 'actions'=>array('admin','delete'),
 'users'=>array('@'),
 ),
 array('deny', // deny all users
 'users'=>array('*'),
 ),
 );
}

En el arreglo actions ponemos las acciones que tiene el controlador y en users los usuarios, si queremos que solo accedan los que están autenticados ponemos una ‘@’ y si queremos que acceda cualquier personas usamos ‘*’.

TUTORIAL YII FRAMEWORK (CAPÍTULO 4) – MODIFICANDO EL MENÚ

A continuación vamos a modificar el menú, de tal forma que nos quede mas espacio para las vistas y las acciones de las vistas (crear, modificar, eliminar) se coloquen por debajo del menú principal. Para eso modificamos el /protected/views/layouts/column2.php:
- Cambiamos el nombre del id del div “sidebar” por “mainmenu”.
- Colocamos el nuevo div “mainmenu” (completo) dentro del div con class=“span-19”.
- Cambiamos class=“span-19” por class”span-25”.
- Comentamos las siguientes lineas de código:


$this->beginWidget('zii.widgets.CPortlet', array('title'=>'Operations',));
 'htmlOptions'=>array('class'=>'operations'),
$this->endWidget();

En el /protected/views/layouts/main.php, comentamos las lineas:

<?php if(isset($this->breadcrumbs)):?>
 <?php $this->widget('zii.widgets.CBreadcrumbs', array('links'=>$this->breadcrumbs,)); ?>
<?php endif?>
<p style="text-align: justify;">

Al aplicar estos cambios el menú quedaría mas o menos así:

Si queremos un menú mas potente podemos usar la extensión mbmenu
- Bajamos la extensión de la pagina oficial de Yii y copiamos la carpeta /protected/extensions
- En /protected/views/layouts/main.php cambiar el widget del CMenu por algo como:

<?php $this->widget('application.extensions.mbmenu.MbMenu',array(
 'items'=>array(
 array('label'=>'Home', 'url'=>array('/site/index')),
 array('label'=>'Principal', 'url'=>array('/site/contact'),
 'items'=>array(
 array('label'=>'Usuarios', 'url'=>array('/usuario')),
 array('label'=>'Contratos', 'url'=>array('/contrato')),
 ),
 ),
 array('label'=>'Prueba',
 'items'=>array(
 array('label'=>'Sub 1', 'url'=>array('/site/page','view'=>'sub1')),
 array('label'=>'Sub 2',
 'items'=>array(
 array('label'=>'Sub sub 1', 'url'=>array('/site/page','view'=>'subsub1')),
 array('label'=>'Sub sub 2', 'url'=>array('/site/page','view'=>'subsub2')),
 ),
 ),
 ),
 ),
 ),
 )); ?>

Al colocar el nuevo menú seguramente se ve extraño, para evitar esto debemos quitar el id=“mainmenu”, con estos cambios queda mas espacio para las vistas y el pequeño menú de la derecha queda por debajo del menú principal.

TUTORIAL YII FRAMEWORK (CAPÍTULO 3) – LENGUAJE Y VISTA POR DEFECTO

En /protected/config/main.php al final colocar dentro del arreglo principal:

Este es el lenguaje en el que quieres que muestre las cosas

'language'=>'es',

 Este es el lenguaje por defecto de los archivos

'sourceLanguage'=>'en',

Vista por defecto

'defaultController'=>'controlador/admin',

Si queremos colocar un favicon en el head de protected/views/layouts/main.php colocamos:

 <link rel="shortcut icon" href="<?php echo Yii::app()->request->baseUrl; ?>/images/icon.png" type="image/x-icon" />

TUTORIAL YII FRAMEWORK (CAPÍTULO 2) – CREANDO MODELOS Y CRUD A PARTIR DE UNA BASE DE DATOS

Una vez creada la aplicación abrimos el archivo /protected/config/admin.php y modificamos lo siguiente:

 'modules'=>array(
 /*
 'gii'=>array(
 'class'=>'system.gii.GiiModule',
 'password'=>'Enter Your Password Here',
 'ipFilters'=>array('127.0.0.1','::1'),
 ),
 */
 ),

Descomentamos el arreglo gii y colocamos el password que queramos, el modulo GII es el que nos ayuda a crear el modelo y el CRUD de las tablas de nuestra base de datos, a continuación vamos a configurar la conexión, para ello debemos comentar el siguiente arreglo:

'db'=>array(
 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
 ),

Y creamos nuestro nuevo arreglo de conexión así:

 'db'=>array(
 'connectionString' => 'pgsql:host=localhost;dbname=nombre_base_datos',
 'emulatePrepare' => true,
 'username' => 'usuario',
 'password' => 'clave.usuario',
 'charset' => 'utf8',
 ),

Para dirigirnos al modelo GII copiamos en nuestra barra de direcciones algo como http://localhost/nombre_aplicacion/index.php?r=gii, nos pide el password que configuramos anteriormente, una vez dentro le damos a “Model Generator” y colocamos el nombre de la tabla, le damos Preview y luego Generate, a continuación creamos el CRUD en “Crud Generator” colocando el nombre del modelo que acabamos de crear. Si logramos conectarnos satisfactoriamente a la base de datos nos mostrará algo como la siguiente imagen.

Con esto hemos creado todas las vistas, el controlador y el modelo para esa tabla en particular, las vistas son: create, update, index, admin y view.
Para agregar el modelo nuevo al menú nos vamos al archivo /protected/views/layouts/main.php y modificamos el arreglo de items del menú agregándole uno nuevo de la siguiente forma:

array('label'=>'Estado', 'url'=>array('/estado/admin')),

Ya podemos probar que podemos crear, modificar y eliminar registros de nuestro modelo.

TUTORIAL YII FRAMEWORK (CAPÍTULO 1) – INSTALANDO YII Y PRIMERA APLICACIÓN

Una vez instalado php, postgres (o el gestor de base de datos que utilices), apache (o el servidor web de tu preferencia), lo siguiente que hacemos es bajarnos la ultima versión de Yii Framework desde http://www.yiiframework.com la descomprimimos en nuestro directorio web, le cambiamos el nombre a “yii” y le damos permisos de lectura.

Abrimos la consola, nos ubicamos en la www y colocamos: yii/framework/yiic webapp
nombre_aplicacion, nos va a preguntar si queremos crear una aplicación web en ese directorio y le decimos que si.

Con esto hemos creado nuestra primera aplicación en Yii.Si nos dirigimos al directorio web vemos com ose han creado una cantidad de archivos y directorios en la carpeta nombre_aplicacion. En el próximo capitulo se explicará como conectar nuestra aplicación con una base de datos y como crear el modelo y el CRUD de las tablas.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.