Sie sind auf Seite 1von 91

Tutorial Yii Framework (Parte 4)

AuthorBeN Published onFebruary 10, 2012 Categories Desarrollo Web, Tutorial Yii, Yii Framework 9 Para esta cuarta parte del tutorial quiero asegurarme que vayamos en sintona, pueden revisar las partes anteriores en estas ligas: http://bensite.info/2011/09/tutorial-yii-framework-parte-3/ http://bensite.info/2011/09/tutorial-yii-framework-parte-2/ http://bensite.info/2011/09/tutorial-yii-framework-parte-1/ Antes de comenzar recapitulemos un poco: Archivos del Tutorial Estamos usando un repositorio gratuito provisto por los servicios de Google Project, les recomiendo que si no usan SVN y repositorios, comiencen a usarlos, tan pronto lo prueben no los podrn dejar. Aqu tengo un tutorial para que se inicien en ello usando Eclipse, pero tambien pueden usar aplicaciones gratis, las cuales hay para todos los sistemas operativos, aqui no veremos como usarlas tal ves mas adelanta escriba algo mas detallado pero si les dejo esta liga donde se listan muchos aplicaciones para este fin: http://www.sliksvn.com/en/download La liga del proyecto en google http://code.google.com/p/yii-framework-tutorial (Sin embargo comenzare a agregar un zip con los archivos a partir de este punto, los subir como quedaron en la parte inmediata anterior con el objetivo de que realicen los pasos siguientes, en la siguiente entrega subir el cdigo con estos pasos ) Descargar ZIP hasta parte 3 Descomprimir el contenido en una carpeta llamada tutorial la cual deber ir dentro de su carpeta pblica web (wwwroot, htdocs, etc. segn sea el caso) y recuerden que igual dentro de su carpeta pblica debern tener el framework yii. (dudas? revisen parte 2 del tuto). Comencemos con parte 4 En la parte 3 aprendimos un poco del MVC, no desistan si lo ven complicado ya que con el uso en realidad se vuelve muy sencillo y creanme les hara el trabajo mas sencillo adoptar una metodologa de desarrollo. Vimos como existen 3 carpetas importantes en nuestro proyecto: controllers, models, views y que contenido hay dentro de ellas. Tambin vimos como crear un nuevo controlador con acciones en su cdigo y sus respectivas vistas y como

se comportan al navegarlas via Web. Hasta aqu no hay problema verdad? pueden dar un repaso a la parte 3 si tienen alguna. Sin embargo puede resultar tedioso el estar creando controladores manualmente con sus respectivas vistas, Yii nos ayuda y trae una herramienta que automatiza esta tarea, esta herramienta es Web y viene desactivada por default, activemosla, en nuestro archivo de configuracin: view source print?
1 tutorial/protected/config/main.php

busquemos la parte en la cual se activan/desactivan modules (modulos), encontrarn un modulo comentado llamado gii, (as con g) el fragmento de cdigo es el siguiente: view source print?
01 'modules'=>array( 02 // uncomment the following to enable the Gii tool 03 /* 04 'gii'=>array( 05 'class'=>'system.gii.GiiModule', 06 'password'=>'Enter Your Password Here', 07 // If removed, Gii defaults to localhost only. Edit carefully to taste. 08 'ipFilters'=>array('127.0.0.1','::1'), 09 ), 10 */ 11 ),

quitemos los comentarios /* y */. como vern habilitamos el modulo el cual usa la clase system.gii.GiiModule y nos pide un password, cambiemos Enter Your Password Here por admin y ejecutemos nuestra aplicacion visitando la siguiente ruta http://localhost/tutorial/index.php?r=gii nos deber aparecer la pantalla de login, ingresemos admin y veremos la siguiente pantalla:

La herramienta Yii Code Generator es muy poderosa, comencemos a probarla generando controladores y sus respectivas vistas, en las siguientes entregas veremos como aprovecharla al mximo y como es que prcticamente har el trabajo pesado por nosotros. Demos clic en Controller Generator, nos aparecera un formulario para crear controladores y sus respectivas acciones y vistas, llenemoslo de la siguiente forma, vamos a crear el controlador contacto, con las acciones:index, ubicacion, formulario. Justo como se ve en la imgen:

Nota: el campo Controller ID es sensible a maysculas/minsculas les recomiendo siempre ingresar el nombre en minsculas. (esto para respetar la notacin CamelCase que es usada en base a las convenciones de Yii). Demos clic en preview y veremos algo como esto:

Yii automaticamente esta generando un controlador con 3 acciones y sus respectivas vistas, ademas de que crea las carpetas correspondientes de ser necesario, es importante recalcar que an no se generan los archivos, esto suceder hasta que demos clic en el boton Generate esto con el objetivo de que primero revisemos el cdigo que la herramienta propone y una ves revisado lo generemos. Demos clic en cada uno de los vinculos del controlador y vistas para ver el cdigo que propone Yii aparecern pantallas como esta:

Demos clic en Generate y una ves generado el cdigo tendremos la pantalla de confirmacin siguiente:

Nota: Si ocurre un error en estos pasos muy probablemente tengamos un problema de permisos en escritura, ya que la herramienta trata de generar archivos y carpetas nuevas. Podemos ajustar permisos a nuestra carpeta del proyecto e intentar de nuevo. Podemos dar clic en try it now y ver que tenemos ya un controlador funcional y ajustando nuestras rutas a r=contacto/ubicacion y r=contacto/contactanos podemos acceder a las distintas acciones y vistas, tambien revisemos nuestros archivos y vern el nuevo controlador y la carpeta dentro de views para dicho controlador con sus respectivas vistas. Genial no? Podra parecer simple pero ya es de gran utilidad. Hay otros puntos a tomar en cuenta cuando usamos esta herramienta

Por ejemplo que sucede si intentamos crear un controlador que ya existe o vistas que ya existen, bueno la herramienta es muy inteligente y nos avisa ademas de que inclusive puede mostrarnos la diferencia de cdigo entre el archivo que genera y el archivo que ya tenemos. Por ejemplo abri mi archivo generado ContactoController y le agrege una linea nueva, despues en la herramienta volv a dar clic en preview y me marco que ya existan los archivos y me permitio ver la diferencia, algo asi como la siguiente pantalla, pueden intentarlo uds. si gustan.

Recapitulando Como aprendimos la herramienta gii es muy til y lo que vimos en realidad es de lo mas simple, tambien nos puede generar controladores y acciones que consulten, inserten, borren o actualicen informacin en una base de datos (el famoso CRUD). Con solo configurar una base de datos y una tabla y automaticamente Gii escribir el cdigo por nosotros. Veremos un ejemplo en la parte 5. Esten al pendiente. Si les surgen problemas o comentarios no duden en postearlos. Gii - Generacin automtica de cdigo Yii viene con un asistente para generar el cdigo de nuestros proyectos de manera automtica. Es una herramienta web llamada Gii. Configurando Gii Gii est implementado como un mdulo dentro de una aplicacin Yii existente. Para usar Gii, primero debemos configurar la aplicacin. Para ello, en el archivo /protected/config/main.php debemos modificarlo de la siguiente manera: return array( ...... 'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'Especifica tu clave aqu', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), ),

Esta seccin suele estar comentada; por lo que debemos solo descomentarla y especificar nuestra propia clave. Claro est, que en caso de que no est, sencillamente hay que aadirla tal como se especifica. Por razones de seguridad, este mdulo es accesible solo desde el servidor local (127.0.0.1). Si queremos que sea accesible desde otros computadores, hay que aadir las respectivas IP's. Tambin es recomendable, que una vez que pongamos en produccin nuestra aplicacin, comentemos nuevamente esta seccin.

Usando Gii Gii es realmente una herramienta muy til para el desarrollo, ya que nos ayuda a generar una gran cantidad de cdigos para nuestros modelos, controladores y vistas. El trabajo que nos queda por hacer es el de acomodar el cdigo o el diseo a nuestras necesidades especficas. Veamos con un ejemplo muy sencillo cmo trabaja Gii. Primero, necesitamos tener una base de datos y una tabla. Asumimos que tenemos una tabla con la siguiente estructura:

Para acceder a Gii, lo hacemos a travs de la URL: http://nombredelservidor/miaplicacionyii/index.php?r=gii

Nos presenta una pantalla como la siguiente:

Ingresamos la clave que hayamos especificado en nuestra configuracin de Gii. En la pantalla siguiente seleccionamos la opcin Model Generator.

Este Generador de Modelos, hace que Yii transforme el esquema de base de datos en cdigo PHP. Utilizando el generador de cdigo basado en la Web, podemos convertir las definiciones de nuestras tablas de la base de datos en las clases de los modelos al instante, sin escribir ni una sola lnea de cdigo. Las clases del modelo nos permitirn acceder a las tablas de la base de datos de una manera orientada a objetos. En Table Prefix, ingresamos el prefijo de nuestra tabla en caso de que utilicemos uno. Si no es nuestro caso, podemos dejarlo en blanco. En Table Name, indicamos el nombre de nuestra tabla para la cual queremos generar el modelo. Y presionamos el botn Preview. Gii nos indicar la ruta del archivo que se va a generar y si es uno nuevo o va a sobrescribir a uno ya existente. Presionamos el botn Generate y se crear nuestro archivo PHP con el modelo de nuestra tabla. Para generar el cdigo CRUD (create, read, update, delete) vamos a la opcin Crud Generator. Al cdigo CRUD tambin se lo conoce como ABM (Alta, Baja, Modificacin).

Utilizando el generador de cdigo CRUD, podemos generar el cdigo que implementa el tpico CRUD (crear, leer, actualizar, eliminar) con las funciones de las tablas de bases de datos seleccionadas. El cdigo generado es muy fcil de utilizar y personalizable, siguiendo el patrn MVC. Una vez ms, Yii hace todo el

trabajo sin necesidad de escribir una sola lnea de cdigo. En Model Class especificamos el nombre de nuestro modelo para el cual queremos crear las vistas y controladores. En Controller ID va el nombre que queremos para nuestro controlador, aunque por defecto ya se asigna uno en base al nombre del modelo. Y presionamos el botn Preview. Gii nos indicar la ruta de los archivos que se van a generar y si es uno nuevo o va a sobrescribir a uno ya existente. Presionamos el botn Generate y se crear nuestros archivos PHP con las vistas y controladores asociados a nuestro modelo. Por ltimo, podemos modificar el cdigo de acuerdo a nuestras necesidades. Por ejemplo, se puede ocultar la columna password simplemente eliminando el nombre de esa columna en nuestra vista admin. <?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'user-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'username', 'password', 'email', array('class'=>'CButtonColumn'), ))); ?>

Pginas Web en PHP: Yii Framework


Posted by programacionwebgalicia en nov 19, 2012 en Noticias | 0 comments

Para crear pginas web en php rpidamente mediante un framework, vamos a explicar cmo instalar uno de los ms conocidos: Yii Framework.
Antes de empezar tenemos que tener instalado y configurado un XAMPP, para poder tener nuestras pginas en local. A partir de ah ya podemos empezar a hacer pginas web en PHP. En primer lugar vamos a dirigirnos al enlace de Yii Framework, para descargarnos el framework a usar en Download Yii. Nosotros nos hemos creado dentro de htdocs una carpeta llamada TestYii que es donde descomprimimos lo que acabamos de descargarnos, para ver que todo est correctamente escribimos en el navegador la siguiente ruta: http://localhost/testYii/requirements/index.php en la cual podemos ver si lo que acabamos de copiar y nuestra configuracin XAMPP es correcta para este framework de php. Esta carpeta es donde tenemos el framework inicial para todas nuestras futuras pginas web en php. Lo segundo es generar nuestra primera aplicacin web de pruebas, para ello si estamos en windows, tenemos que entrar en la consola de comandos [Nos dirigimos a Inicio-> Ejecutar -> Escribimos "cmd" sin las comillas y debera aparecernos]. A continuacin dentro de la consola tenemos que ir a la ruta del framework que acabamos de instalar. En nuestro caso escribiremos cd C:\xampp\htdocs\TestYii\framework\, sin las comillas, desde aqu y mediante la siguiente lnea de comandos podremos crear automticamente los archivos para iniciar nuestra aplicacin web:
yiic webapp C:\xampp\htdocs\AppYii\

Con esta lnea crearemos una carpeta llamada AppYii(o como queramos llamarle), con los archivos necesarios para ir empezando a crear pginas web en php. Podemos comprobar que todo ha ido correctamente desde el navegador mediante la ruta: http://localhost/AppYii/ donde veremos algo como en la imagen de cabecera de esta noticia. Podis ver que ya hay ciertas cosas generadas automticamente con cdigo includo. En tercer lugar vamos a meternos con la base de datos, os recomiendo que creeis en primer lugar vuestro Entidad-Relacin, para ello nosotros hemos usado la aplicacin Mysql Workbench, desde la cual una vez generado vuestro diagrama correctamente podis exportarlo a sentencias SQL para generar vuestra base de datos mediante phpmyadmin. A continuacin podemos ver la estructura que se ha generado y que compartirn inicialmente todas nuestras pginas web en php: testdrive/ index.php archivo de entrada de la aplicacin Web assets/ contiene archivos de recursos pblicos css/ contiene archivos CSS images/ contiene archivos de imgenes

themes/ contiene temas de la aplicacin protected/ contiene los archivos protegidos de la aplicacin yiic script de linea de comandos yiic yiic.bat script de linea de comandos yiic para Windows commands/ contiene comandos yiic personalizados shell/ contiene comandos yiic shell personalizados components/ contiene componentes reusables MainMenu.php clase de widget MainMenu Identity.php clase Identity utilizada para autenticacin views/ contiene los archivos de vistas para los widgets mainMenu.php el archivo vista para el widget MainMenu config/ contiene archivos de configuracin console.php configuracin aplicacin consola main.php configuracin de la aplicacin Web controllers/ contiene los archivos de clase de controladores SiteController.php la clase controlador predeterminada extensions/ contiene extensiones de terceros messages/ contiene mensajes traducidos models/ contiene archivos clase de modeloscontaining model class files LoginForm.php el formulario modelo para la accin login ContactForm.php el formulario modelo para la accin contact runtime/ contiene archivos temporarios generados views/ contiene archivos de vista de controladores y de diseo layouts/ contiene archivos de diseo main.php el diseo default para todas las vistas site/ contiene archivos vista para el controlador site contact.php contiene la vista para la accin contact index.php contiene la vista para la accin index login.php contiene la vista para la accin login system/ contiene archivos de vista del sistema De toda esta estructura, nos interesa abrir el archivo que se encuentra en la carpeta \protected\config\main.php, y descomentar las siguientes lneas de cdigo:
/* 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=NombreBaseDatosCreada', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), */

Podemos indicar los datos de conexin a nuestra base de datos, nombre de usuario y contrasea que tenemos configurado en nuestro XAMPP, con esto ya podra tener acceso nuestra aplicacin web a la base de datos que tenemos creada.

En quinto lugar vamos a generar los modelos y el CRUD (Create, Read, Update y Delete) de cada uno de ellos en nuestra aplicacin web en php, esta parte es la mejor y donde comprobaremos lo que ahorraremos en el inicio de la programacin de pginas web en php. En este paso podemos volver a usar el comando que hemos visto con anterioridad llamado Yiic para automatizar la generacin de cdigo o scaffolding, pero yo me voy a centrar en otra manera ms fcil e intuitiva que es en la herramienta Gii que viene con Yii Framework. Esta herramienta hay que activarla, para ello tenemos que ir al mismo archivo que hemos modificado anteriormente main.php y descomentar las siguiente lneas de cdigo e introducir una contrasea nueva:
'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'gii123', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ),

Para comprobar que todo ha ido bien, iremos al navegador y escribiremos: http://localhost/AppYii/index.php?r=gii, nos pedir introducir la contrasea que hemos metido con anterioridad, en nuestro caso gii123 y ahora solo queda empezar a crear los objetos que con anterioridad hemos creado mediante nuestro Entidad-Relacin en Mysql. Todos estos pasos seran un buen mtodo de desarrollo a repetir en todas nuestras pginas web en php. Para ello tenemos que entrar en la opcin Model Generator, introducir los datos de nuestra base de datos db y el nombre de tabla y luego los modelos (normalmente las tablas las ponemos en plural y los modelos en singular), presionamos en botn Preview y si todo ha ido correctamente podremos presionar el botn Generate para confirmar la creacin de nuestro modelo, este paso lo repetiremos con todos nuestros modelos. Podemos ver como se han generado todos los modelos en la siguiente carpeta: protected\models\. Ahora que tenemos los modelos, vamos a generar el CRUD de cada uno de ellos, entrando en la opcin Crud Generator, en nuestro caso mantendremos los nombres que usamos para los modelos en el campo de ID, podemos ir viendo que lo que estamos generando est activo va web: http://localhost/appYii/index.php?r=nombremodelo y veremos que hay cdigo ya creado automticamente para dar de alta, leer, modificar y borrar cada uno de los modelos. A partir de aqu, ya tenemos bastante trabajo hecho por adelantado para nuestras futuras pginas web en php con unos cuantos clicks. Programacion PHP / Yii Framework / Cargos y Abonos a Cuentas Publicado por Christian Salazar Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con Facebook en 00:59

Hola de nuevo !, En esta oportunidad quiero presentaros un componente muy util y que ahorrar mucho tiempo a quienes les toque enfrentar la tarea: Los Cargos y Abonos.

En cualquier sistema informtico en donde toca manejar pagos estar presente el bendito Payroll (como lo llamo yo, no se si asi se llame formalmente), yo lo llamo asi para no decir a cada rato "cargo y abono....blabla cargo y abono....blabla....cargo y abono".

Normalmente un sistema de cargo y abono tiene tres funciones muy claras: 1. Crear un cargo 2. Crear un abono 3. Consultar Cuenta.

Ejemplo: Tienes un sistema de administracin de condominios, a los propietarios se les hacen cargos mensuales, estos abonan o pagan completo y finalmente consultan cuando deben. Otros casos, pueden ser muchos, en donde un cliente dice "voy a pagar esta factura...esta....y esta otra"...."cuanto es ?"...."ok aqui va el cheque.". Quiza este haciendo pagos parciales o pagos totales, o mixtos. Este sistema de Cargos y Abonos funciona para Yii Framework, el cual considero un muy buen framework PHP de cual estoy muy feliz de conocer. A pesar de que la configuracin es sencilla, la implementacin es mas que todo larga, mas que complicada, pero en el fondo simple: Solo tienes que recibir peticiones muy basicas del sistema "guardar esto....insertar esto"...nada mas, no tienes que manejar logicas de negocio y calculos, ni verificaciones nada, todo eso lo hace el modulo, ni siquiera tienes que hacer formularios, estos tambin los hace el mdulo.

Si ves las imagenes de muestra abajo, la interfaz esta hecha con bootstrap...y escribiendo este blog me acabo de acordar que debo documentar eso...porque si pretenden usarla sin bootstrap entonces recibiran un error porque algunos componentes de la UI (ninguno indispensable) estan hechos en base a bootstrap, pero es algo simple de resolver.

Cargo y Abono
sitio oficial:

https://bitbucket.org/christiansalazarh/cargoyabono
@author: Christian Salazar H. christiansalazarh@gmail.com @bluyell Modulo para el manejo de cargos y abonos a una Persona (natural o juridica). Es independiente del modelo de datos seleccionado, opera bajo interfaz. ver diagramas adjuntos en carpeta diseno\

Cmo funciona.
Un sistema de manejo de cargos y abonos casi siempre es lo mismo, con varianzas que pueden abstraerse, dicho de otro modo todos tienen algo en comun: agregar cargos a una cuenta, agregar abonos que neutralizen los cargos y finalmente ver el saldo o listar las cuentas. Lo que hace este modulo es dejarte a ti solo la responsabilidad de decir donde guardar y de donde leer, siendo el modulo capaz de manejar todo lo dems de forma encapsulada.

Instalacin
en config/main.php
'modules'=>array( 'cargoyabono'=>array( 'debug'=>true, 'layout'=>'//layouts/column1', 'config'=>array( // esta es una cuenta, referenciada en el api bajo la palabra KEY // se hace asi para que se pueden tener distintos tipos de cuenta // en el mismo sistema, cada uno con su grupo de tablas y valores. // equivalente a un namespace para el sistema de cargo y abono. // 'cuenta'=>array( 'persona'=>'Persona', 'cuenta'=>'CuentaPersona', 'historia'=>'HistoriaAbono', 'cargo'=>1, // codigo que se usa para indicar que es cargo 'abono'=>2, // codigo para abono ), ), ), ), 'components'=>array( 'cyaui'=>array('class'=>'application.modules.cargoyabono.components.CyaUI'), 'cyaApi'=>array('class'=>'application.modules.cargoyabono.components.CyaApi'), // necesario porque se usa el tipo de formato 'money' que esta hecho en la clase CyaFormat // del modulo cargoyabono 'format' => array( 'class'=>'application.modules.cargoyabono.components.CyaFormat', 'datetimeFormat'=>"d M, Y h:m:s a", 'dateFormat'=>"d-m-Y", 'simboloMoneda'=>'Bsf.', ), ),

Explicacion de la configuracin.
Layout:
Indica que layout se usara para presentar los formularios.

Config:
Es un array, presenta los tipos de cuenta a manejarse. en una misma aplicacion pueden haber distintos tipos de cuenta. a) El argumento 'persona'=>'Persona' indica que la clase "Persona" sera el objetivo de la cuenta, es decir a quien se le haran los cargos o abonos. b) El argumento 'cuenta'=>'CuentaPersona' indica donde se haran los cargos y los abonos relativos

a la persona seleccionada.

Usandolo
Empiezo por mostrar un sistema de ejemplo que tiene dos tablas
CREATE TABLE zlm_persona ( idpersona serial, rifced VARCHAR(20) NULL , nombre VARCHAR(250) NULL , direccion VARCHAR(100) NULL , telefonos VARCHAR(100) NULL , tipopersona integer, PRIMARY KEY (idpersona) ) ; CREATE TABLE zlm_cuentapersona ( idcuentapersona serial, fechahora bigint, fecha bigint, monto float, concepto varchar(512), itemno varchar(20), idpersona int not null, tipocuenta integer, idcuentapersonapagada int, estatuscuenta integer DEFAULT 0, montoabonado double precision DEFAULT 0, -- estatus de como se hizo el pago -docnum varchar(45), -- numero del cheque o transfer -doctipo varchar(20), -- CHECK, TRANS, DEPOS -docentidad varchar(45), -- nombre de la entidad, nombre del banco -CONSTRAINT fk_cuentapersona_persona FOREIGN KEY (idpersona ) REFERENCES zlm_persona (idpersona ) ON DELETE RESTRICT ON UPDATE NO ACTION, PRIMARY KEY (idcuentapersona) ) ; CREATE TABLE zlm_historiaabono ( idhistoriaabono serial, idcargo int not null, idabono int not null, monto float, fechahora bigint, CONSTRAINT fk_historia_cargo FOREIGN KEY (idcargo ) REFERENCES zlm_cuentapersona (idcuentapersona) ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT fk_historia_abono FOREIGN KEY (idabono )

REFERENCES zlm_cuentapersona (idcuentapersona) ON DELETE CASCADE ON UPDATE NO ACTION, PRIMARY KEY (idhistoriaabono) ) ;

Pues bien, pueden ser usadas cualquier tipo de tablas ya que el modulo cargoyabono es abstracto. En el modelo Persona.php que representa al modelo de datos: persona (arriba sql), se debe implementar una interfaz que el modulo cargoyabono provee:
class Persona extends CActiveRecord implements IcyaPersona { public function cya_buscarPersonas($texto){ return Yii::app()->db->createCommand() ->select() ->from($this->tableName()) ->where("nombre like :patron", array( ':patron'=>"%".$texto."%", )) ->queryAll(); ; } public function cya_getobject($obj){ return array('id'=>$obj['idpersona'],'label'=>$obj['nombre'],'extra'=>$obj['rifced']); } public function cya_buscarPersona($id){ return self::model()->findByPk($id); } .. .. }

En el modelo CuentaPersona.php, se implementan los siguientes metodos de la interfaz:


class CuentaPersona extends CActiveRecord implements IcyaCuenta { const CUENTA_CARGO = 1; const CUENTA_ABONO = 2; const const const const ESTATUSCUENTA_PENDIENTE = 0; ESTATUSCUENTA_PARCIAL = 1; ESTATUSCUENTA_TOTAL = 2; ESTATUSCUENTA_NOAPLICA = 3;

// recibe un array con atributos para crear una cuenta nueva de tipo cargo // ejemplo: // [idpersona,1][concepto,hola][fecha,01-08-2012][monto,2000][itemno,4555][key,cuenta] public function cya_crearcargo($campos){ $cargo = new CuentaPersona(); $cargo->tipocuenta = self::CUENTA_CARGO; $cargo->fechahora = time(); $cargo->fecha = time($campos['fecha']); $cargo->monto = 1*($campos['monto']); $cargo->concepto = $campos['concepto']; $cargo->itemno = $campos['itemno']; $cargo->idpersona = $campos['idpersona'];

$cargo->estatuscuenta = self::ESTATUSCUENTA_PENDIENTE; if($cargo->insert()){ return $cargo->getPrimaryKey(); }else{ return null; } } // recibe un array con atributos para crear una cuenta nueva de tipo cargo // ejemplo: // [idpersona,1][concepto,hola][fecha,01-08-2012][monto,2000][itemno,4555][key,cuenta] // por ser un abono, recibe tres campos mas: (a diferencia de crearcargo) // [docnum,1298918291][doctipo,CHECK][docentidad,banco mercantil] public function cya_crearabono($campos){ $cargo = new CuentaPersona(); $cargo->tipocuenta = self::CUENTA_ABONO; $cargo->fechahora = time(); $cargo->fecha = time($campos['fecha']); $cargo->monto = 1*($campos['monto']); $cargo->concepto = $campos['concepto']; $cargo->itemno = $campos['itemno']; $cargo->idpersona = $campos['idpersona']; $cargo->estatuscuenta = self::ESTATUSCUENTA_NOAPLICA; $cargo->docnum = $campos['docnum']; $cargo->doctipo = $campos['doctipo']; $cargo->docentidad = $campos['docentidad']; if($cargo->insert()){ return $cargo->getPrimaryKey(); }else{ return null; } } /** Lista las cuenta de la persona seleccionada. $params: es un array de parametros que el API envia a la clase host. se cuenta con: 'pagadas'=>true o false, para indicar que entrege solo las cuentas pagadas o no. se espera que retorne: return self::model()->findAllByAttributes(array('idpersona'=>$idpersona)); */ public function cya_listarcuentas($idpersona,$params=array()){ if(isset($params['pagadas'])){ if($params['pagadas'] == true){ $criteria=new CDbCriteria(); $criteria->compare('idpersona',$idpersona); $criteria->compare('tipocuenta',self::CUENTA_CARGO); $criteria->compare('estatuscuenta',self::ESTATUSCUENTA_TOTAL,false); return self::model()->findAll($criteria); }else{ return self::model()->findAll( 'idpersona = '.$idpersona.' and tipocuenta = '.self::CUENTA_CARGO.' and ' .'(estatuscuenta = '.self::ESTATUSCUENTA_PENDIENTE.') or '

.'(estatuscuenta = '.self::ESTATUSCUENTA_PARCIAL.')' ); } }else{ return self::model()->findAllByAttributes(array('idpersona'=>$idpersona)); } } /** pide al modelo host que devuelva un array con los campos solicitados. array('id'=>'x','fecha'=>'x','tipo'=>'x','concepto'=>'x','monto'=>1000,'idpersona'=>1 ,'tipocuenta'=>'1','tipocuentatxt'=>'CARGO','estatus'=>1,'estatustxt'=>'pendiente' ,'montoabonado'=>900,'montopendiente'=>100,'refno'=>'12287', ,'docnum'=>'19289812', 'doctipo'=>'check', 'docentidad'=>'banco mercantil') */ public function cya_getobject($obj){ return array( 'id'=>$obj->getPrimaryKey(), 'fecha'=>$obj->fecha, 'tipo'=>$obj->tipocuenta, 'concepto'=>$obj->concepto, 'monto'=>$obj->monto, 'refno'=>$obj->itemno, 'idpersona'=>$obj->idpersona, 'tipocuenta'=>$obj->tipocuenta, 'tipocuentatxt'=>$obj->tipocuenta==self::CUENTA_CARGO ? "CARGO" : "ABONO", 'estatus'=>$obj->estatuscuenta, 'estatustxt'=>self::etiquetarEstatus($obj->estatuscuenta), 'montoabonado'=>$obj->montoabonado, 'montopendiente'=>$obj->monto-$obj->montoabonado, 'docnum'=>$obj->docnum, 'doctipo'=>$obj->doctipo, 'docentidad'=>$obj->docentidad, ); } /** registra una historia de abono a un cargo por un valor especifico. sirve para registrar que abonos se le hicieron a cual cargo y viceversa. idAbono: el identificador primario del abono obtenido con cyaApi.crearAbono idCargo: el identificador primario del cargo a ser abonado. montoAbonado: el valor que se le quiere abonar al cargo returns: nada */ public function cya_crearhistoriaabono($idAbono,$idCargo,$montoAbonado){ Yii::app()->db->createCommand() ->insert("zlm_historiaabono", array( 'idabono'=>$idAbono, 'idcargo'=>$idCargo, 'fechahora'=>time(), 'monto'=>$montoAbonado ));

} /** suma el monto al cargo indicado, para ser acumulado en cargo.montoabonado. deberia ser usada en conjunto con crearHistoriaAbono, para que quede historia de los abonos realizados a un cargo. idcargo: el identificador primario del cargo a ser abonado. monto: el valor que se quiere sumar a cargo.montoabonado returns: nada. */ public function cya_actualizarcargo($idcargo,$monto){ $cargoInst = self::model()->findByPk($idcargo); $cargoInst->montoabonado = $cargoInst->montoabonado + $monto; $cargoInst->estatuscuenta = self::ESTATUSCUENTA_PARCIAL; if($cargoInst->montoabonado >= $cargoInst->monto) $cargoInst->estatuscuenta = self::ESTATUSCUENTA_TOTAL; $cargoInst->update(); } public function etiquetarEstatus($valor){ if($valor == self::ESTATUSCUENTA_PENDIENTE) return "pendiente"; if($valor == self::ESTATUSCUENTA_PARCIAL) return "parcial"; if($valor == self::ESTATUSCUENTA_TOTAL) return "total"; if($valor == self::ESTATUSCUENTA_NOAPLICA) return "..."; return "estatus desconocido"; } ... ... }

finalmente la tabla de historia queda asi:


class HistoriaAbono extends CActiveRecord implements IcyaHistoria { /** lista los ABONOS que se hicieron para este CARGO (id) ejemplo: valor que retorna model()->findAllByAttributes() returns: array de instancias de clase del modelo de datos */ public function cya_listarhistoriacargo($id){ return self::model()->findAllByAttributes(array('idcargo'=>$id)); } /** lista los CARGOS que se abonaron con el ABONO indicado (id)

ejemplo: valor que retorna model()->findAllByAttributes() returns: array de instancias de clase del modelo de datos */ public function cya_listarhistoriaabono($id){ return self::model()->findAllByAttributes(array('idabono'=>$id)); } /** obtiene los valores del objeto en forma de array. obj: instancia del modelo de datos recibida por funciones cya_listarhistoriaXXXX() returns: array con lista de campos: id: idcargo: idabono: fechahora: monto: adata: cdata: identificador primario del registro de historia identificador primario de la cuenta cargo identificador primario de la cuenta abono valor numerico del timestamp de fechahora valor float del monto abonado data (string) serializada del registro abono referenciado data (string) serializada del registro cargo referenciado

*/ public function cya_getobject($obj){ return array( 'id'=>$obj->getPrimaryKey(), 'idcargo'=>$obj->idcargo, 'idabono'=>$obj->idabono, 'fechahora'=>$obj->fechahora, 'monto'=>$obj->monto, 'adata'=>serialize($obj->idabono0), 'cdata'=>serialize($obj->idcargo0), ); } ... ... }

Muy bien todo esta configurado, pero ahora cmo lo uso ?


Existen dos componentes configurados, estos podrian servirte para hacer consultas a bajo nivel.
<?php echo CHtml::link("crear cargo" ,Yii::app()->cyaui->getCrearCargoUrl('cuenta'))); ?> usalo para que se cree un enlace "crear cargo" que lanzara el formulario de nuevo cargo. El argumento "cuenta" hace referencia a la entrada en config main llamada 'cuenta', la cual indica cuales seran las clases involucradas. <?php echo CHtml::link("crear abono" ,Yii::app()->cyaui->getCrearAbonoUrl('cuenta'))); ?>

usalo para que se cree un enlace "crear abono" que lanzara el formulario de nuevo abono. El argumento "cuenta" hace referencia a la entrada en config main llamada 'cuenta', la cual indica cuales seran las clases involucradas. <?php echo CHtml::link("consultar" ,Yii::app()->cyaui->getConsultarUrl('cuenta'))); ?> usalo para que se cree un enlace que muestra la consulta de la cuenta.

El componente Yii::app()->cyaApi te provee funciones de acceso de bajo nivel, no todas son de uso libre, algunas son usadas internamente por el modulo, pero una como esta puede servir:
<?php $saldo = Yii::app()->cyaApi->calculaSaldo('cuenta',$idpersona,&$totalCargos,&$totalAbonos); ?>

Puedes hallar documentacion de cada metodo del api con un ejemplo en components/CyaApi.php

Resumen

Como muestro arriba, la unica responsabilidad del modelo de datos, de tu aplicacion, es decir donde y como vas a guardar la informacion que el modulo requiere. Si te das cuenta ambas interfaces proveen un metodo llamado "public function cya_getobject($obj)", este funciona asi: cuando el api interna de CargoyAbono quiere conocer digamos, la lista de cuentas, o una lista de personas invoca a tus metodos implementados en tus modelos para traerse la lista original de instancias,pero no toca ninguna..porque el modulo no conoce y no debe saber que campos tienes ahi, por tanto de nuevo, te pregunta a ti mediante cya_getobject($obj) para que tu devuelvas lo que el modulo requiere para la instancia especifica $obj.

Como un ejemplo en pseudocodigo, lo que haria seria como esto:


modulo_pidiendo_lista_de_cuentas: $lista = interfaz.cya_listarcuentas(idpersona); // lista trae un monton de instancias que tu devolviste en crudo con findAllByAttributes(..) $item = array(); foreach($lista as $obj) $item[] = interfaz.cya_getobject($obj) listo, ahora item tiene lo que tu indicas que debe haber para, por ejemplo , renderizar una lista de cuentas. En algunos casos cya_getobject te indica en la documentacion que es lo que se espera que tu devuelvas.

UML Diseo

Sin comentarios: Publicar un comentario en la entrada Entrada ms reciente Entrada antigua Pgina principal Suscribirse a: Enviar comentarios (Atom)

Twitter

Apoya el cdigo y conocimiento Libre con tu aporte !


_s-xclick NZLE932JPW534

Christian Salazar

Christian Salazar Ver todo mi perfil

Suscribe tu correo para recibir actualizaciones


Submit

TrucosDeProgram en_US

Perfil

Areas de Experiencia Dedicada: * Inventario y Stock. * Horario Laboral. * E-Commerce. * Analista de Sistemas. * Analista de Requerimientos del Negocio.

Aos de Experiencia en: * Lenguaje C Ansi. (1995-1998) * Lenguaje C++. (1995-2012) * Diseo de Drivers (Linux , Windows). (2000-2003) * Programacin de Microcontroladores ATMEL. (2000-2002) * Programacin de PLC. (2000-2002)

* Programacion de Simuladores 2D/3D, creacin de Engines, en bajo nivel usando C/C++ (1995-2000). * Creacin de mdulos acoplables Autocad (1997-2000). Otros: * Java. Desarrollo de aplicaciones empresariales. * PHP. Desarrollo de aplicaciones web dinmicas. * Diseo de Componentes Reutilizables (Java, PHP) * Arquitectura de Software usando UML. * Planificacin de Proyectos con PERT/CPM.

Archivos Publicados

2011 (11) o abril (10) o noviembre (1) 2012 (19) o agosto (4) Programacion PHP / Yii Framework / Cargos y Abonos... Control de Usuarios y Roles para Yii Framework Generando un Sitemap Dinamico en el website EYui - Widgets para Yii Framework - jQuery o septiembre (1) o octubre (7) o noviembre (2) o diciembre (5)

Enlaces
Yii Framework en Espaol - foro y tutoriales php Herramientas Avanzadas para Windows Mobile Developent Framework J2ME (Kuix) Descargar NetBeans Midlets y Blackberries JSON y J2ME (descargar json-1.0.jar)

Persistencia con J2ME J2ME SDK 3.0 O'Reilly MIDP Programming. Capitulo 1 y Capitulo 2 Http POST Basics Midp

Pginas

Pgina principal

Seguidores
http://www.yiiframework.com/

YII Autenticacin de usuarios + ultimo acceso


ago 26 Publicado por leninmhs Este post tiene por objetivo crear la funcionalidad de autenticacin de usuarios contra una base de datos usando el humilde y eficiente framework YII. Se pretende con este post ampliar la explicacin del capitulo 9 de la GUIA BASICA DE YII FRAMEWORK aadiendo algunos detalles como la captura y gestin del la fecha del ultimo acceso al sistema por cada usuario, condicionar mostrar elementos del men segn el perfil del usuario. Creamos la tabla que vamos a usar para la practica en este caso estamos usando como base de datos postgreSQL, creamos la columna created_at que guardara automticamente la fecha en que se ingresa cada registro haciendo uso de la funcin de postgres now(). ver fuente imprimir?
01 CREATE TABLE usuario 02 ( 03 id_usuario serial NOT NULL,

04 cedula character varying(12) NOT NULL, 05 nombre character varying(50) NOT NULL, 06 apellido character varying(50) NOT NULL, 07 email character varying(100) NOT NULL, 08 username character varying(128) NOT NULL, 09 password character varying(128) NOT NULL, 10 perfil character varying(10) NOT NULL, 11 created_at timestamp without time zone DEFAULT now(), 12 last_login timestamp without time zone, 13 CONSTRAINT usuario_pkey PRIMARY KEY (id_usuario ) 14 );

created_at-last-login-php-yii Se deber autogenerar el modelo y el CRUD para esta tabla usando el modulo gii (YII code generator). Acceden a el con este url http://localhost/sistema/index.php?r=gii En lo sucesivo es importante que antes de modificar cualquier archivo realicen una copia del mismo por si se trancan o no resulta puedan restituir y revisar con calma desde el comienzo. Sustituiremos el contenido del archivo protected/components/UserIdentity.php por lo siguiente: ver fuente imprimir?
<?php /** * UserIdentity represents the data needed to identity a user. * It contains the authentication method that checks if the provided * 01 data can identity the user. */ class UserIdentity extends CUserIdentity { private $_id; public function authenticate(){ $username=strtolower($this--->username); 02 $user=Usuario::model()->find('LOWER(username)=?',array($username)); 03 if($user===null) 04 $this->errorCode=self::ERROR_USERNAME_INVALID; 05 else if(!$user->validatePassword($this->password)) 06 $this->errorCode=self::ERROR_PASSWORD_INVALID; 07 else{ 08 $this->_id=$user->id_usuario; 09 $this->username=$user->username; 10 $this->errorCode=self::ERROR_NONE; 11 12 /*Consultamos los datos del usuario por el username ($user->username)

*/ $info_usuario = Usuario::model()->find('LOWER(username)=?', array($user->username)); /*En las vistas tendremos disponibles last_login y perfil pueden setear 14 las que requieran */ 13 15 $this->setState('last_login',$info_usuario->last_login); 16 $this->setState('perfil',$info_usuario->perfil); 17 18 19 /*Actualizamos el last_login del usuario que se esta autenticando ($user->username) */

$sql = "update usuario set last_login = now() where username='$user>username'"; 20 $connection = Yii::app() -> db; 21 $command = $connection -> createCommand($sql); 22 $command -> execute(); 23 24 } 25 return $this->errorCode==self::ERROR_NONE; 26 } 27 28 public function getId(){ 29 return $this->_id; 30 } 31 32 }

Las lineas 22, 23, 24 y 25 son las que hacen la magia de guardar la fecha, hora, minutos y segundos actual en el campo dispuesto para almacenar el ultimo acceso del usuario cuyas credenciales (usuario y contrasea) para entrar al sistema sean validas. luego debemos agregar en el Modelo relacionado a la tabla usuario lo necesario para que convierta la contrasea que se enva desde el formulario de login al metodo de su preferencia, en esta practica usaremos MD5 para luego comparar la cadena resultante con la cadena ya almacenada en el campo password en la tabla usuario. En el archivo protected/models/Usuario.php agregaremos las siguientes lineas: ver fuente imprimir?
1 public function validatePassword($password){ 2 return $this->hashPassword($password)===$this->password;

3} 4 5 public function hashPassword($password){ 6 return md5($password); 7}

Por si tienen dudas, las lineas anteriores van dentro de la clase Usuario (despus de: class Usuario extends CActiveRecord { y antes del ultimo } ) Ahora es el turno de agregar y ajustar un par de lineas en el controlador ( protected/controllers/UsuarioController.php ) para que todo marche bien. Es necesario que cuando se cree o se modifique un usuario la cadena de caracteres que representa la contrasea sea guardado en MD5 para asi ser guardado en la Base de Datos. Para esto solo agregaremos una linea que pasa la cadena a MD5 $model>password=md5($model->password); antes de guardar o modificar ver fuente imprimir?
01 public function actionCreate() 02 { 03 $model=new Usuario; 04 05 // Uncomment the following line if AJAX validation is needed 06 // $this->performAjaxValidation($model); 07 08 if(isset($_POST['Usuario'])) 09 { 10 $model->attributes=$_POST['Usuario']; 11 12 13 if($model->save()) 14 $this->redirect(array('view','id'=>$model->id_usuario)); 15 } 16 17 $this->render('create',array( 18 'model'=>$model, 19 )); 20 } $model->password=md5($model->password); //agregar esta linea antes del save() lo mismo en la funcion de modificar actionUpdate()

Y para que puedan tener acceso a los mdulos de editar, crear, eliminar, el admin y dems es necesario agregar permisos en accessRules(), indicando que podrn ser usados esos mdulos por todos los usuarios que estn autenticados con el smbolo @ o directamente el nombre del usuario. En el siguiente cdigo pondremos crear y modificar usuarios solo lo puede hacer el usuario leninmhs y para acceder al modulo de admin de usuarios permitiremos a todos los usuarios autenticados. ver fuente imprimir?
01 public function accessRules() 02 { 03 return array( array('allow', 04 actions // allow all users to perform 'index' and 'view'

05 'actions'=>array('index','view'), 06 'users'=>array('*'), 07 ), array('allow', // allow authenticated user to perform 'create' and 08 'update' actions 09 'actions'=>array('create','update','delete'), 10 'users'=>array('leninmhs'), 11 ), array('allow', // allow admin user to perform 'admin' and 'delete' 12 actions 13 'actions'=>array('admin'), 14 'users'=>array('@'), 15 ), 16 array('deny', // deny all users

17 'users'=>array('*'), 18 ), 19 ); 20 }

En caso contrario se toparan con este mensaje de error que les indica que no estn autorizados para usar estos mdulos.

Error 403
You are not authorized to perform this action. De este punto en adelante solo trabajaremos en las vistas ( todos los directorios y archivos que se encuentran en: protected/views/ ) Si auto generaron el crud en base a la tabla que se presento al inicio, en el archivo protected/views/usuario/_form.php debern quitar o comentar como mejor le parezca las

lineas de cdigo que forman los campos de created_at y last_login ya que esto se llena tras bambalinas. ver fuente imprimir?
01 <div> 02 <?php //echo $form->labelEx($model,'created_at'); ?> 03 <?php //echo $form->textField($model,'created_at'); ?> 04 <?php //echo $form->error($model,'created_at'); ?> 05 </div> 06 07 <div> 08 <?php //echo $form--->labelEx($model,'last_login'); ?> 09 <?php //echo $form->textField($model,'last_login'); ?> 10 <?php //echo $form->error($model,'last_login'); ?> 11 </div>

en caso contrario obtendrn un error como este:


CDbCommand failed to execute the SQL statement: SQLSTATE[22007]: Invalid datetime format: 7 ERROR: la sintaxis de entrada no es vlida para tipo timestamp: LINE 1: inmhs, 74be16979710d4c4e7c6647856088456, ADMIN, , ) ^. The SQL statement executed was: INSERT INTO usuario (cedula, nombre, apellido, email, username, password, perfil, created_at, last_login) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8)

Ahora vamos a imprimir la fecha del ultimo acceso cuando el usuario este autorizado a para usar el sistema y vamos a mostrar el men de acceso al modulo de usuarios solo si el perfil del usuario es de administrador ( ADMIN ) modificaremos el archivo: protected/views/layouts/main.php ver fuente imprimir?
01 <div id="mainmenu"> 02 <?php 03 04 $admin = (isset(Yii::app()->user->perfil) and Yii::app()->user->perfil == 'ADMIN') ? true : false ;

05 $this->widget('zii.widgets.CMenu',array( 06 'items'=>array( 07 array('label'=>'Home', 'url'=>array('/site/index')), 08 array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),

09 array('label'=>'Contact', 'url'=>array('/site/contact')), array('label'=>'Usuarios', 'url'=>array('/usuario/admin'), 'visible' => 10 $admin), array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest), array('label'=>'Salir ('.Yii::app()->user->name.')', 12 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest) 11 13 ), 14 )); ?> 15 </div><!-- mainmenu --> 16 17 <div style="text-align: right;"> <?php if(!Yii::app()->user->isGuest and isset(Yii::app()->user18 >last_login)){ echo "Ultimo Acceso: ".Yii::app()->dateFormatter->format("d-M-y h:m a", Yii::app()->user->last_login);} ?> 20 </div> 19

Bsicamente nos interesa:

La linea 4 y la 10 que muestra o oculta la opcin de menu que lleva a la administracin de usuarios mediante la opcin visible de CMenu.que solo acepta valores booleanos, es por esto que antes creamos una variable de nombre $admin el cual mediante un if ternario le asigno true o false segn sea o no ADMIN. De la linea 17 a la 20 validamos si el usuario se autentico y si tiene fecha de ultimo acceso para proceder a darle formato a la fecha en cuestin y imprimirla.

De modo que se tienen dos usuarios uno con perfil ADMIN y otro con un perfil distinto, el primero vera la opcin de ir a la administracin de usuarios y el segundo no.

Control de Usuarios y Roles para Yii Framework Publicado por Christian Salazar Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con Facebook en 11:26

Sistema de Control de Usuarios y ROLES (RBAC)


Hola de nuevo, en esta oportunidad quiero presentarles a Cruge, es un trabajo serio- con el propsito de aislar todo el proceso de creacion de cuentas de usuario, registro, login, edicion de usuarios, asignacion y edicion de roles, tareas y operaciones. La pgina wiki oficial de Cruge, donde encontrars extensa y detallada informacin es: http://yiiframeworkenespanol.org/cruge/ Este modulo es dos cosas a la vez:

Una extensin del sistema RBAC de Yii Framework. Porque ampla las funciones basicas del paquete original de autenticacin, agregando mayor funcionalidad no presente por defecto, por ejemplo: a. Gestin automtica de Controllers y Actions usando roles, tareas y operaciones. b. Amplicacin del sistema de autenticacin, proveyendo ms funciones a Yii::app()->user. Ejemplo, ahora "user", permite acceder a los campos personalizados del usuario que inici sesin, Yii::app()->user>getField("cedula"); c. Incorporacin de : filtro de autenticacin y filtro de otorgamiento de sesin. El primero sirve para que por ejemplo tu puedas crear una clase que autentifique al usuario en un blog o en otro mecanismo que ya este usando cuentas de usuario. El segundo sirve para controlar como se le otorga una sesion al usuario. Estos filtros se crean de una forma muy simple: creando una nueva clase que implemente una interfaz, luego registras el filtro en config/main.php y Cruge lo reconocer y usar para el propsito de su naturaleza: para autenticar o para dar sesion. (No tengo totalmente documentada esta

parte, pero muy a la brevedad lo har, disculpas por eso, de todos modos hay documentacin en el cdigo) Un componente de UI. Cruge trae hechos muchos formularios necesarios, de forma muy ordenada para que tu puedas usarlos en tus propios layouts, as que se amoldarn a tu aplicacin, incluso con Bootstrap.

Cruge funciona como un API. Cruge funciona como un API, con arquitectura de software estndar basada en un escalonamiento as: a) usando la UI: [tu aplicacion]-->[cruge UI]--->[cruge API]--->[cruge Factory]---->[modelos especificos de datos]

b) usandolo como un API: [tu aplicacion]-->[cruge API]--->[cruge Factory]---->[modelos especificos de datos] Es por razones de complejidad y orden, de esta forma, Cruge queda abstracto ante cualquier modelo de datos especfico, puedes usar CActiveRecord o cualquier otro modelo de datos de tu preferencia y Cruge no lo va a notar. A diferencia de otros sistemas RBAC muy usados en Yii, pero que personalmente catalogo como desastrosos y mal elaborados, hechos en base a "parche y cura"...disculpas si ofendo pero es la verdad y fue lo que me motiv de manera muy enojada a elaborar Cruge. Por eso digo que:.... Cruge no es invasivo: Tu aplicacin usa a Cruge mediante: Yii::app()->user->um (el api de cruge) o mediante: Yii::app()->user->ui (el api de cruge para obtener links a los formularios) o mediante:

Yii::app()->user->rbac (el api de cruge para controlar el acceso..aunque no es necesario casi nunca acceder por aqu, esta disponible, casi todo lo puedes hacer desde Yii::app()->user->um ) Con esto te quiero mostrar que con Cruge no tendrs piezas de cdigo desparramadas por toda la aplicacin (como muchos otros sistemas RBAC bien conocidos en la comunidad de Yii). Tu unico punto de entrada es: Yii::app()->user. Desde aqui podrs acceder a toda la funcionalidad. Bueno, basta de tanta chchara..ahora te dejo el repositorio de bitbucket para que puedas seguir el trabajo all. Gracias por tu inters. Cualquier pregunta o duda por favor djalo en el sistema de Issues del repositorio de bitbucket. enlace a cruge: https://bitbucket.org/christiansalazarh/cruge

20 comentarios: 1.

Pluk21 de agosto de 2012 07:15 Hola Christian, como vers, soy yo de nuevo! jejejeje lo siento por ser tan pesado, pero indagando he encontrado esto, que buena pinta no? me voy a poner con ello, espero puedas ayudarme en mis futuras dudas, que seguro tendr! Gracias! ResponderSuprimir

2. Christian Salazar21 de agosto de 2012 18:46 hola, ! no te preocupes a la orden. Es mejor que lo canalices por el foro de Yii Framework en Espaol, ahi la comunidad te da mas soporte, igualmente yo (respondiendo temas ahi a diario). ResponderSuprimir

3. Pluk21 de agosto de 2012 19:05 de acuerdo, voy a echarle un ojo a cruge, como e has aconsejado por el privado, y te cuento, a ver si encuentro algn manual en castellano!! Gracias de nuevo!! ResponderSuprimir

4. Alberto22 de agosto de 2012 11:13 Hola he seguido todas las instrucciones de instalacin del modulo CRUGE, pero cuando corro la aplicacin me da el siguiente error: **Property "CWebApplication.user" is read only. ** y me indica el lugar especfico: /yii/framework/base/CModule.php(483) la verdad no he mirado mucho la estructura de yii y no tengo idea de a que se deba el error, cualquier ayuda es bienvenida. ResponderSuprimir Respuestas

1. Christian Salazar29 de agosto de 2012 15:03 hola, pon el tema en http://www.yiiframeworkenespanol.org. primero prueba con un proyecto base, ahi en el repo hay un demo listo para probar incluso para arrancar el proyecto desde ahi. Si en ese demo aun te da problemas es porque tu framework de yii tiene problemas, instala uno nuevo. segundo, si el proyecto demo esta bien y tu apliacion no, es porque seguramente instalaste mal Cruge en tu propia aplicacion existente, seria para mi dificil saber que tienes ahi. lo que si puedo decirte es que leas bien el readme, ahi hay mucha info de lo mas delicado. Normalmente estos problemas que salen como el que muestras son por fallas de la propia aplicacion que quiere integrar a cruge, ojo no estoy diciendo que tu app este mala, sino digo que quiza hayas cambiado algo en ella de forma sustancial.

Suprimir Responder

5. Pluk23 de agosto de 2012 05:49 Christian, como podra hacer un renderpartial, de la vista registration de gruge? supongo que ser posible, pero las combinaciones que he probado no funcionaban! Gracias de antemano, lo voy consiguiendo! jejejejejeje Responder Demos Guide Class Reference Wiki Extensions Live Chat

About About Yii Features Performance License Contact Us Downloads o Framework o Extensions o Demos o Logo Documentation o Take the Tour o Tutorials o Class Reference o Wiki o Screencasts o Resources Development o Contribute to Yii o Latest Updates o Report a Bug o Report a Security Issue Community o Forum o Live Chat
o o o o o

o o o

News Hall of Fame Badges

search

Yii Framework Forum: redirect - Yii Framework Forum


Jump to content Sign In New user? Register Now! Search

forum

Help
Search

Advanced

Forums Members Yii Framework Forum > Yii International > Spanish View New Content

Page 1 of 1

You cannot start a new topic You cannot reply to this topic

redirect Rate Topic:


#1 RTJ

Junior Member

Group: Members

Posts: 34 Joined: 04-May 12

Posted 06 May 2012 - 11:41 AM Hola a todos, voy probando con Yii y tengo una duda. porque este redirect no me funciona despus en un edit:
$this->redirect('view',array('id'=>$model->id));

solo me funciona as:


$this->redirect('../view/'.$model->id));

tengo la versin 1.1.10 de Yii no se si tiene que ver algo con esto o estoy haciendo algo mal Muchas gracias de antemano. 0

Back to top of the page up there ^

#2

bluyell

Standard Member

Group: Members Posts: 192 Joined: 28-October 11

Posted 06 May 2012 - 09:01 PM RTJ, on 06 May 2012 - 11:41 AM, said: Hola a todos, voy probando con Yii y tengo una duda. porque este redirect no me funciona despus en un edit:
$this->redirect('view',array('id'=>$model->id));

solo me funciona as:


$this->redirect('../view/'.$model->id));

tengo la versin 1.1.10 de Yii no se si tiene que ver algo con esto o estoy haciendo algo mal Muchas gracias de antemano.

hola, para invocar una vista dentro de un action de un controller es: render, no redirect.

$this->render('view', array('id'=>$model->id)); si tu quisieras llamar a redirect, seria para algo como: $this->redirect('index.php?r=tucontroller/update&id=12'); EL RENDER/VIEW funciona asi: ejemplo, tienes

un modelo llamado Orden, en /protected/models/orden.php. una controladora: /protected/controllers/orden.php una vista: /protected/views/orden/vista.php

cuando tu llamas a
index.php?r=orden/vista&id=1

lo que sucede internamente es esto:

root/index.php recibe un GET, para ir a la controladora ORDEN (protected/controllers/orden.php) y buscar la funcion: public function actionVista($id) { // codigo... } se invoca la funcion actionVista, ella espera tener en la URL el parametro ID, porque se o pusiste en los argumentos de la funcion ($id) el actionVista debera cargar el modelo, de: /protected/models/orden.php, asi:

o $model = Orden::model()->findByAttributes(array('idorden'=>$id)); el actionVista indicara renderizar la vista: protected/views/orden/vista o asi: $this->render('vista', array('model'=>$model)); donde: this, es el apuntador a la controladora: orden instanciada por Yii framework para ti por el archivo root index.php 'vista', es el nombre del archivo a conseguir en: /protected/views/orden/vista.php listo.

Debers echas una lectura mas profunda a Yii, la consigues aqui mismo en el sitio web, mira como esta hecha la aplicacion de inicio que crea el yiic.bat

Christian Salazar. Yii Framework en Espaol http://www.yiiframeworkenespanol.org Yii Framework en Espaol en Facebook Twitter: @yiienespanol

Blog (personal) trucosdeprogramacionmovil.blogspot.com 0

Back to top of the page up there ^

#3

sebas

Advanced Member

Group: Yii Dev Team Posts: 485 Joined: 28-October 08 Location:Buenos Aires, Argentina

Posted 07 May 2012 - 12:07 PM A la funcion redirect hay que pasarle la URL. Lo que vos le envias es un array. Fijate de poner as:
$this->redirect(array('view', 'id'=>$model->id));

Lo cual normaliza la URL. Web Design & Development - Artfos 1

Back to top of the page up there ^

#4

RTJ

Junior Member

Group: Members Posts: 34 Joined: 04-May 12

Posted 08 May 2012 - 07:24 AM sebas, on 07 May 2012 - 12:07 PM, said:

A la funcion redirect hay que pasarle la URL. Lo que vos le envias es un array. Fijate de poner as:
$this->redirect(array('view', 'id'=>$model->id));

Lo cual normaliza la URL.

Muchas gracias, es justo lo que necesitaba gracias por aclararme esto Saludos 0

Back to top of the page up there ^

#5

sportive Newbie

Group: Members Posts: 4 Joined: 01-August 12

Posted 03 October 2012 - 09:01 AM Como hago para enviar dos o mas variables por referencia en usando redirect??? por ejemplo $this->redirect(array('view_numeros','num'=>$num, 'error'=>$error)); asino me funciona probe tambien $this->redirect(array('view',array('num'=>$num, 'error'=>$error))); y tampoco como puedo hacer para pasar las variables num y error a la vista? 0

Back to top of the page up there ^

|-- Spanish

Go

Previous Topic Spanish Next Topic

Share this topic:


Page 1 of 1

You cannot start a new topic You cannot reply to this topic

1 User(s) are reading this topic 0 members, 1 guests, 0 anonymous users

Skin and Language


880ea6a14ea49e 1 show topic=31539

Language:

English (USA)

Go

Execution Stats

Time Now: Jan 02 2013 06:18 PM Back To Top Forum Home

Delete My Cookies Mark Board As Read

Community Forum Software by IP.Board Errores y problemas al trabajar con Yii En esta seccin tendremos una serie de errores que se pueden presentar al trabajar con Yii, una explicacin de qu se trata y cmo resolverlos. Al ejecutar yiic, se presenta el mensaje "php.exe" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable. Yiic es un archivo por lotes que a su vez ejecuta php.exe para elaborar la estructura base para funcionar. En este caso, yiic no ha encontrado el archivo php.exe. Para solucionarlo, podemos modificar las variables de entorno para aadir el directorio dnde tengamos instalado PHP. Otra alternativa es editar el archivo yiic.bat, localizar PHP_COMMAND=php.exe y modificarlo para incluir el path completo a nuestro archivo php.exe. Debe quedar algo similar a PHP_COMMAND=D:\Program Files\EasyPHP5.2.10\php\php.exe Problemas con las tildes y caracteres especiales Al tener una aplicacin y desplegar palabras que contienen tildes, la o caracteres especiales, aparecen smbolos como los siguientes: carcter, extrao, s Esto se debe a la codificacin utilizada. Nuestra aplicacin, nuestra base de datos, la conexin y los archivos deben estar como UTF-8. Revisar la Aplicacin Yii: Si revisamos el archivo en \protected\views\layouts\main.php encontraremos una lnea as: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> De esta manera podemos conocer cul es el juego de caracteres utilizado en nuestra aplicacin. Tambin podemos poner esta lnea de cdigo para revisar si no ha cambiado el juego de caracteres en la pgina que nos da problemas: <?php echo Yii::app()->charset;?> Los archivos PHP Nuestros archivos deben estar guardados como UTF-8 sin BOM. Para ello podemos utilizar un editor de texto como Notepad++. (con el doble signo +, ya que no se trata del editor propio de Windows). Lo pueden descargar de aqu.

Si utilizan este editor, abren el archivo (que comnmente estar en ANSI) y lo convierten a UTF-8 sin BOM. Lo graban y listo. A continuacin una captura del Notepad++ para convertir un archivo.

La base de datos La base de datos debe tener codificacin UTF-8. Recuerden que MySQL permite codificar de manera individual cada tabla con un juego de caracteres diferente al de la base.
CREATE TABLE IF NOT EXISTS `mi_tabla` ( .... mis columnas ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

La conexin a la base de datos En el archivo \protected\config\main.php al definir la conexin a la base de datos, el juego de caracteres debe ser UTF-8.
return array( ...... 'components'=>array( ...... 'db'=>array( 'connectionString'=>'sqlite:protected/data/source.db', 'charset'=>'utf8', ), ), ...... );

Las cabeceras HTTP del servidor web

Podemos revisar el cdigo fuente de la pgina cargada por el navegador (no el archivo php, sino lo cargado por el navegador): Si se sobreescriben las cabeceras, la prioridad, de mayor a menor es: Cdigo PHP con cabeceras ('Content-Type: text/html; charset=utf-8'); El servidor web (por ejemplo Apache) Pginas HTML con <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Si debemos configurar nuestro servidor Apache, podemos modificar el archivo .htaccess y aadir la siguiente lnea en la seccin de VirtualHost.

AddDefaultCharset UTF-8

Yii - include(PDO.php): failed to open stream: No such file or directory Este mensaje de error se presenta porque no se ha habilitado las extensiones de PHP necesarias para conectarse a la base de datos. En Windows: El archivo php.ini debe modificarse. Normalmente se debe descomentar (eliminar el punto y coma al inicio de la lnea) el lugar dnde se cargan las libreras. Siempre debe ser

extension=php_pdo.dll

y otras que dependen de la base de datos que utilicemos. Por ejemplo:


extension=php_mysql.dll extension=php_pdo_mysql.dl extension=php_pgsql.dll extension=php_pdo_pgsql.dll extension=php_oci8.dll extension=php_pdo_oci8.dll

Sobre la clase PDO podemos ver aqu. Y sobre los diferentes controladores PDO podemos revisar ac. Si an se mantiene el problema, debemos modificar el archivo httpd.conf para aadir la siguiente lnea: Loadfile "C:/Program Files/PostgreSQL/8.4/bin/libpq.dll" (dependiendo de la ruta en la cul est la librera libpq.dll)

En Linux: Instalamos las extensiones PDO y de la base de datos que requerimos acorde a la versin de nuestro PHP. Desde la consola es muy fcil: Yum install php-pdo php-pgsql y reiniciamos el servidor apache Service httpd restart Modificamos el archivo php.ini para incluir estas extensiones:

extension=pdo.so extension=php_pdo_pgsql.dll

Publicado por Diego Valenzuela en 23:00 3 comentarios: Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con Facebook Etiquetas: archivo por lotes, caracteres especiales, Errores y problemas al trabajar con Yii, PDO, tildes, yiic Reacciones:

domingo, 22 de julio de 2012


Personalizando Gii Si bien el cdigo por defecto que genera Gii es muy completo y til, es muy probable que lo queramos modificar para adaptarlo a nuestras necesidades. Por ejemplo, podemos adaptarlo a nuestro propio estilo o que soporte varios lenguajes. Sean las necesidades que tenemos, es posible optimizar los generados de cdigo Gii. Para personalizar Gii lo podemos hacer a travs de 2 maneras: 1. Modificando el cdigo existente; o, 2. Escribiendo nuevos generadores de cdigo.

Estructura de un generador de cdigo Un generador de cdigo est en un directorio cuyo nombre est relacionado con el nombre del generador. El directorio usualmente consiste del siguiente contenido:

model/ ModelCode.php ModelGenerator.php views/ generador index.php templates/ default/ model.php

el directorio raz del generador el modelo usado para la generacin del cdigo el controlador para la generacin del cdigo contiene los scripts de las vistas para el

el script de inicio por defecto contiene el conjunto de plantillas el conjunto de plantillas por 'defecto' la plantilla para generar el cdigo del modelo

Especificar el directorio del generador Gii busca generadores disponibles en un conjunto de directorios especificados por la propiedad GiiModule::generatorPaths. Cuando la personalizacin se necesita, podemos configurar esta propiedad en la configuracin de la aplicacin de la siguiente manera:

return array( 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'generatorPaths'=>array( 'application.gii', // a path alias ), ), ), );

La configuracin anterior indica a Gii que busque generadores bajo el alias del como application.gii, adems de la ubicacin por defecto system.gii.generators. Es posible tener dos generadores con el mismo nombre pero bajo diferentes rutas. En este caso, el generador en la ruta especificada anteriormente en GiiModule::generatorPaths tendr prioridad.

Personalizando el cdigo de las plantillas Esta es la forma ms fcil y la ms comn de extender Gii. Usaremos un ejemplo para explicar cmo personalizar las plantillas. Supongamos que deseamos personalizar el cdigo generado por el generador de modelos. En primer lugar, creamos un directorio llamado protected/gii/model/templates/compact. Aqu model significa que vamos a reemplazar el generador de modelos por defecto. Y templates/compact que vamos a aadir una plantilla llamada compact. A continuacin, modificamos nuestra configuracin de la aplicacin para agregar application.gii a GiiModule::generatorPaths, como se muestra en el inciso anterior. Ahora abrimos la pgina de Gii para generar modelos (la opcin Model Generator cuando ingresamos a nuestra aplicacin Gii). Al hacer clic en el campo Code Template veremos una lista desplegable que contiene nuestro directorio de plantillas recin creado. Sin embargo, si elegimos esta plantilla para generar el cdigo, vamos a ver un error. Esto se debe a que todava tenemos que poner cualquier archivo de cdigo de la plantilla real en este conjunto de plantillas nuevo. Copiemos el archivo framework/gii/generators/model/templates/default/model.php a protected/gii/mo del/templates/compact. Si tratamos de generar de nuevo con la plantilla compact, deberamos poder hacerlo sin problemas. Sin embargo, el cdigo generado no es diferente de la generada por el conjunto de plantilla predeterminada. Es hora de que nosotros hagamos el trabajo de personalizacin real. Abramos el archivo protected/gii/model/templates/compact/model.php para editarlo. No hay que olvidar que este archivo se utilizar como un script de vista, lo que significa que puede contener expresiones y declaraciones de PHP. Vamos a modificar la plantilla para que el mtodo attributeLabels() en el cdigo generado utilice Yii::t() para traducir las etiquetas de los atributos:

public function attributeLabels() { return array( <?php foreach($labels as $name=>$label): ?> <?php echo "'$name' => Yii::t('application', '$label'),\n"; ?> <?php endforeach; ?> ); }

Creando nuevos generadores En esta sub-seccin, se muestra cmo crear un nuevo generador que puede generar una nueva clase widget. En primer lugar, creamos un directorio llamado protected/gii/widget. En este directorio, vamos a crear los siguientes archivos:

contiene el controlador WidgetGenerator. Este es el punto de entrada del generador del widget. WidgetCode.php: contiene el modelo WidgetCode. Esta clase tiene la lgica principal de la generacin de cdigo. views/index.php: el script con la vista que muestra el formulario de entrada para el generador de cdigo. templates/default/widget.php: la plantilla por defecto para generar un archivo de la clase widget.
WidgetGenerator.php:

Creando WidgetGenerator.php Este archivo es extremadamente simple. Solamente contiene el siguiente cdigo:

class WidgetGenerator extends CCodeGenerator { public $codeModel='application.gii.widget.WidgetCode'; }

En el cdigo anterior, se especifica que el generador utilizar el modelo cuya ruta alias es application.gii.widget.WidgetCode. La clase WidgetGenerator se extiende desde CCodeGenerator que implementa una gran cantidad de funcionalidades, incluyendo las acciones del controlador necesarios para coordinar el proceso de generacin de cdigo. Creando WidgetCode.php Este archivo contiene el modelo WidgetCode que tiene al lgica principal para la generacin de una clase widget basado en la entrada del usuario. En este ejemplo, asumimos que la nica entrada que queremos de el usuario es el nombre de la clase del widget. Nuestro cdigo sera similar al siguiente:

class WidgetCode extends CCodeModel { public $className; public function rules() {

return array_merge(parent::rules(), array( array('className', 'required'), array('className', 'match', 'pattern'=>'/^\w+$/'), )); } public function attributeLabels() { return array_merge(parent::attributeLabels(), array( 'className'=>'Widget Class Name', )); } public function prepare() { $path=Yii::getPathOfAlias('application.components.' . $this->className) . '.php'; $code=$this->render($this->templatepath.'/widget.php'); $this->files[]=new CCodeFile($path, $code); } }

Creando views/index.php Ahora que tenemos el controlador y el modelo, podemos crear la vista views/index.php

<h1>Widget Generator</h1> <?php $form=$this->beginWidget('CCodeForm', array('model'=>$model)); ?> <div class="row"> <?php echo $form->labelEx($model,'className'); ?> <?php echo $form->textField($model,'className',array('size'=>65)); ?> <div class="tooltip"> Widget class name must only contain word characters. </div> <?php echo $form->error($model,'className'); ?> </div> <?php $this->endWidget(); ?>

Bsicamente, lo que hacemos es generar un formulario usando el widget CCodeForm. Con este formulario, presentamos un campo para obtener el atributo className en WidgetCode.

Creando templates/default/widget.php Finalmente, crearemos el cdigo de la plantilla. Como hemos descrito anteriormente, ste es usado como una vista que puede contener expresiones y declaraciones PHP. En una plantilla, siempre podemos acceder a la variable $this que hace referencia al objeto del modelo. En nuestro ejemplo, $this hace referencia al objeto WidgetModel. De este modo podemos obtener el nombre de la clase widget ingresado por el usuario a travs de $this->className.

<?php echo '<?php'; ?> class <?php echo $this->className; ?> extends CWidget { public function run() { } }

Esto concluye la creacin de un nuevo generador. Podemos acceder a l a travs de la URL: http://nombredelservidor/miaplicacionyii/index.php?r=gii/widg et

Tambin te puede interesar: Gii - Generacin automtica de cdigo Publicado por Diego Valenzuela en 23:44 Sin comentarios: Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con Facebook Etiquetas: ABM, Generador CRUD, Generador de modelos, Gii - Generacin automtica de cdigo, Optimizar Gii, Personalizar Gii Reacciones:

domingo, 17 de junio de 2012


Gii - Generacin automtica de cdigo Yii viene con un asistente para generar el cdigo de nuestros proyectos de manera automtica. Es una herramienta web llamada Gii. Configurando Gii Gii est implementado como un mdulo dentro de una aplicacin Yii existente. Para usar Gii, primero debemos configurar la aplicacin. Para ello, en el archivo /protected/config/main.php debemos modificarlo de la siguiente manera:

return array( ...... 'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'Especifica tu clave aqu', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), ),

Esta seccin suele estar comentada; por lo que debemos solo descomentarla y especificar nuestra propia clave. Claro est, que en caso de que no est, sencillamente hay que aadirla tal como se especifica. Por razones de seguridad, este mdulo es accesible solo desde el servidor local (127.0.0.1). Si queremos que sea accesible desde otros computadores, hay que aadir las respectivas IP's. Tambin es recomendable, que una vez que pongamos en produccin nuestra aplicacin, comentemos nuevamente esta seccin. Usando Gii Gii es realmente una herramienta muy til para el desarrollo, ya que nos ayuda a generar una gran cantidad de cdigos para nuestros modelos, controladores y vistas. El trabajo que nos queda por hacer es el de acomodar el cdigo o el diseo a nuestras necesidades especficas. Veamos con un ejemplo muy sencillo cmo trabaja Gii. Primero, necesitamos tener una base de datos y una tabla. Asumimos que tenemos una tabla con la siguiente estructura:

Para acceder a Gii, lo hacemos a travs de la URL: http://nombredelservidor/miaplicacionyii/index.php?r=gii

Nos presenta una pantalla como la siguiente:

Ingresamos la clave que hayamos especificado en nuestra configuracin de Gii. En la pantalla siguiente seleccionamos la opcin Model Generator.

Este Generador de Modelos, hace que Yii transforme el esquema de base de datos en cdigo PHP. Utilizando el generador de cdigo basado en la Web, podemos convertir las definiciones de nuestras tablas de la base de datos en las clases de los modelos al instante, sin escribir ni una sola lnea de cdigo. Las clases del modelo nos permitirn acceder a las tablas de la base de datos de una manera orientada a objetos. En Table Prefix, ingresamos el prefijo de nuestra tabla en caso de que utilicemos uno. Si no es nuestro caso, podemos dejarlo en blanco. En Table Name, indicamos el nombre de nuestra tabla para la cual queremos generar el modelo. Y presionamos el botn Preview. Gii nos indicar la ruta del archivo que se va a generar y si es uno nuevo o va a sobrescribir a uno ya existente. Presionamos el botn Generate y se crear nuestro archivo PHP con el modelo de nuestra tabla. Para generar el cdigo CRUD (create, read, update, delete) vamos a la

opcin Crud Generator. Al cdigo CRUD tambin se lo conoce como ABM (Alta, Baja, Modificacin).

Utilizando el generador de cdigo CRUD, podemos generar el cdigo que implementa el tpico CRUD (crear, leer, actualizar, eliminar) con las funciones de las tablas de bases de datos seleccionadas. El cdigo generado es muy fcil de utilizar y personalizable, siguiendo el patrn MVC. Una vez ms, Yii hace todo el trabajo sin necesidad de escribir una sola lnea de cdigo. En Model Class especificamos el nombre de nuestro modelo para el cual queremos crear las vistas y controladores. En Controller ID va el nombre que queremos para nuestro controlador, aunque por defecto ya se asigna uno en base al nombre del modelo. Y presionamos el botn Preview. Gii nos indicar la ruta de los archivos que se van a generar y si es uno nuevo o va a sobrescribir a uno ya existente. Presionamos el botn Generate y se crear nuestros archivos PHP con las vistas y controladores asociados a nuestro modelo. Por ltimo, podemos modificar el cdigo de acuerdo a nuestras necesidades. Por ejemplo, se puede ocultar la columna password simplemente eliminando el nombre de esa columna en nuestra vista admin. <?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'user-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'username', 'password', 'email', array('class'=>'CButtonColumn'), ))); ?>

Tambin te puede interesar:

Personalizando Gii Conectar a una Base de Datos Modelo en Yii Vista en Yii Controlador en Yii Publicado por Diego Valenzuela en 22:49 Sin comentarios: Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con Facebook Etiquetas: ABM, Generador CRUD, Generador de modelos, Gii - Generacin automtica de cdigo Reacciones: )((((((((((((((((((((((( http://notepad-plus-plus.org/download/v6.2.3.html

Hola a todos, estoy aprendiendo PHP y conociendo Yii y cada vez hago cosas muy buenas pero en esta oportunidad me qued estacionado y no encuentro la solucin a mi problema que es el siguiente: He guardado un archivo ".txt" en una base de datos a travs de un formulario que gener mi modelo en cuestin. Lo que necesito ahora es descargar este archivo para ver su contenido. Exactamente quiero hacerlo mediante un enlace en la vista segun el ID del registro. Lo que he hecho hasta ahora es esto: 1) Hice esta funcin en mi controlador para consultar en la base de datos y traerme el contenido que quiero.Por cierto que no comprendo loque significa esta linea de cdigo: (array(':id_tabla1'=>1)) public function Download() { $consulta= Yii::app()->db->createCommand() ->select('archivo') ->from('tabla1') ->where('id_tabla1=id_tabla1', array(':id_tabla1'=>1)) ->queryAll();

//echo $this->archivo=$fila['archivo']; return $resultado; } 2) Para probar que me funcionara llamo a la funcin dentro del mismo controlador en la accion index para que al ir al index me mostrara la consulta.

public function actionIndex() { $objeto=new tabla1;

echo $objeto->Download();//supongo que asi se llama la funcin y supongo que asi me devolveria el resultado de la consulta... $dataProvider=new CActiveDataProvider('tabla1'); $this->render('index',array( 'dataProvider'=>$dataProvider, )); } 3) luego en lo que voy al index me muestra todo lo normal de Yii mas esto: "Array"... No s en que estoy fallando he revisado muchos foros y no he dado con la solucin adems porque casi todo viene en ingls y los que he encontrado lo manejan de otra manera... agradezco a quien me pueda ayudar! 0

Back to top of the page up there ^

#2

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 04 July 2012 - 10:41 AM te recomiendo hacer lo siguiente: en el archivo modelController.php (cambia model por el nombre de tu modelo) crea una accin llamada 'actionGetTextFile' y agregala en los permisos de acceso del controlador.
public function actionGetTextFile() { $content = ''; // en esta varibale vas a guardar el contenido del archivo que traes de la db // header HTML header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream; "); header("Content-Disposition: attachment; filename=archivo.txt"); header("Content-Transfer-Encoding: binary"); // agregar el contenido print_r($content); }

en donde quieras que se pueda descargar el archivo, creas un link que apunte a 'http://dominio.com/modelo/getTextFile' y cuando hacen click ahi, el navegador empezara a descargar un archivo 'archivo.txt' con el contenido que le asignes la ruta anterior fue asumiendo que usas el urlManager y ocultas index.php de la ruta de tu aplicacion 0

Back to top of the page up there ^

#3

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 04 July 2012 - 01:58 PM

Gracias por Responder! me funcion pero: al sustituir


$content = $this->download();// funcin de la consulta en el mas simple php (porque no encontr otra forma que me funcionara): public function Download() { $conexion = mysql_connect("miservidor","miusuario","miclave") or die ("Fallo en el establecimiento de la conexin"); mysql_select_db("prueba_1") or die("Error en la seleccin de la base de datos"); $consulta = mysql_query ("SELECT archivo FROM tabla1 WHERE id_tabla1 =id_tabla1") or die ("Error en la consulta SQL"); while( $row = mysql_fetch_array ( $consulta )) { echo $row [ "archivo" ]; }

Cuando hago esto me abre la ventanita para guardar el archivo pero al abrirlo me muestra solo el nombre del archivo y no el contenido!!! ser que me estoy equivocando en la consulta? la estar haciendo incorrectamente? cmo sera?... Por cierto el archivo puede ser de cualquier extensin... 0

Back to top of the page up there ^

#4

JCS

Junior Member

Group: Members

Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 04 July 2012 - 03:34 PM jajaja, pues el nombre del archivo lo puedes definir dinamicamente, yo simplemente le puse ese por dar un ejemplo bastante general ^^. asumo que tienes un modelo Archivo, vamos a ver si esto funciona
public function actionGetTextFile() { $id = $_REQUEST['id']; // Obtener el id de una consulta POST o GET $model = Archivo::model()->findByPk($id); // Trae los datos de un registro especifico del modelo Archivo $content = $model->archivo; // Sacamos en valor de 'archivo' de la consulta // header HTML header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream; "); header("Content-Disposition: attachment; filename=archivo.txt"); header("Content-Transfer-Encoding: binary"); // agregar el contenido print_r($content); }

presento ese $id como $_REQUEST pero pues ya depende de ti como le pases la variable id para que sepa que es lo que debe buscar ^^ 0

Back to top of the page up there ^

#5

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 06 July 2012 - 10:15 AM Hola! no entiendo! jjj tengo en mi controlador hasta ahora esto:
public function Download($ida) { $consulta ="SELECT archivo FROM tabla1 WHERE id_tabla1=$ida"; $comando = Yii::app() -> db -> createCommand($consulta); $fila = $comando -> queryRow(); $archivo=$fila['archivo']; echo $archivo; }

Esta funcin la llamo de mi vista asi:


<?php $ida=$model->id_tabla1; $this->Download($ida); //con esto imprime dentro de la vista slo el nombre del archivo.Archivo es el campo de tabla1 donde guarde mi doc. echo "<br>"; echo CHtml::link('Descargar 1',array('tabla1/getTextFile')); echo "<br>"; // este es el enlace a la action en el controlador ?>

y tambin esta que me dijiste: public function actionGetTextFile() { $content = $this->Download($ida);// $extensiones = array("application/msword"=>"doc","application/pdf"=>"pdf","image/jpeg"=> "jpg"); // header HTML header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream; "); header("Content-Disposition: attachment; filename="); header("Content-Transfer-Encoding: binary"); //agregar el contenido print_r($content); }

Luego me sale este error: Undefined variable: ida Creo que el problema es cmo pasarle la consulta a la action GetTextFile. Bueno ya viste ccul es mi consulta de sencilla.pero no comprendo esto que dices que creo que es la solucin pero como todo novato no veo!: $id = $_REQUEST['id']; // Obtener el id de una consulta POST o GET $model = Archivo::model()->findByPk($id); // Trae los datos de un registro especifico del modelo Archivo $content = $model->archivo; // Sacamos en valor de 'archivo' de la consulta

Back to top of the page up there ^

#6

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 06 July 2012 - 10:51 AM vamos a analizar las partes del cdigo que pusiste al final del post
/** * Esta variable representa el id del registro del cual queremos obtener la informacion, * es como la variable $ida que recibes en tu funcion 'Download()', lo mejor es reemplazar * $_REQUEST por $_GET */ $id = $_REQUEST['id']; /** * Consulta en la base de datos el registro de la tabla con id = $id * es como la variable $consulta que tienes en tu funcin 'Download()', * pero este comando hace un 'SELECT *', tu puedes hacer el select de lo que necesites */

$model = Archivo::model()->findByPk($id); /** * podemos tratar a $model como un objeto, entonces para acceder a alguno de los campos * del registro en la base de datos, lo hacemos con $model->nombreCampo * ac asumo que en la base de datos, la columna archivo contiene el texto o lo que * sea que debe ir en el archivo, si es una que se llama contenido, entonces ser * $model->contenido */ $content = $model->archivo;

ahora el error que aparece es porque en ningn lado de tu funcin 'actionGetTextFile()' estas definiendo la variable, solo la estas invocando. cuando quieras generar el link para descargar, entonces lo que debes hacer es crear un link con javascript para hacer uso de AJAX y le pasas el id como uno de los parmetros de consulta, desde el navegador podras probarlo accediendo a la ruta: 'http://dominio.com/modelo/getTextFile?id=1'. 0

Back to top of the page up there ^

#7

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 10 July 2012 - 11:20 AM !!! Me hablaste en chino! jjjj He conseguido en este mismo foro esta manera de hacer el enlace a la accin del controlador:
<?php echo CHtml::link('Link Text',array('controller/action','param1'=>'value1')); ?>

con lo que he sustituido de acuerdo a mi necesidad as:

echo CHtml::link('Link Text',array('tabla1/getTextFile','param1'=>$id));

por supuesto anteriormente he hecho esto en mi vista:


$id=$model->id_tabla1;

para poder utilizar ese "id" y enviarselo. y la accin del controlador quedo as;
public function actionGetTextFile($id) { $id = $_GET['id']; $model = tabla1::model()->findByPk($id); $content = $model->archivo; // header HTML header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream; "); header("Content-Disposition: attachment; filename=edd.txt"); header("Content-Transfer-Encoding: binary"); //agregar el contenido print_r($content); }

Ser que est bien? porque de otra manera no s!... y todava no me funciona... solo me muestra: Error 400 Your request is invalid. 0

Back to top of the page up there ^

#8

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 10 July 2012 - 11:28 AM que pasa cuando vas a la siguiente ruta: http://dominio.com/m...etTextFile?id=1 ?? fjate que en el link que estas creando le pasas el parametro 'param1', que no es un parametro definido en tu accin, deberas pasarle 'id' podemos ver el log de errores de Yii o del Servidor?? 0

Back to top of the page up there ^

#9

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 10 July 2012 - 03:27 PM todo lo que me has dicho hasta ahora funciona correctamente, he sustituido esto:
$model = Archivo::model()->findByPk($id);

por esto
$model = tabla1::model()->findByPk($id);

ya que tabla1 es una tabla de mi db. es decir es un modelo o el modelo que estoy utilizando. y esto:
$content = $model->archivo; por esto:

por esto:
$content = $model->archivo; por esto:

ya que "archivo" es el campo donde guardo el tipo blob que anteriormente se ha guardado. El resultado final cuando le doy descargar es: me abre el dialogo con el .txt (abrir o guardar...) y al abrir, dentro del .txt me muestra es el nombre del archivo que se encuentra guardado en ese campo mas no me lo abre como debe ser. Es decir, lo que se pretende es que al darle descargar me descargue el archivo como cuando lo guarde. por ejemplo, si guarde un tipo odt o txt o pdf... que me lo retorne nuevamente para guardarlo en un pendrive o simplemente visualizarlo... cmo puedo hacer eso? JCS, on 10 July 2012 - 11:28 AM, said: que pasa cuando vas a la siguiente ruta: http://dominio.com/m...etTextFile?id=1 ?? fjate que en el link que estas creando le pasas el parametro 'param1', que no es un parametro definido en tu accin, deberas pasarle 'id' podemos ver el log de errores de Yii o del Servidor?? 0

Back to top of the page up there ^

#10

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 10 July 2012 - 05:03 PM pense que en la db guardabas el contenido de un archivo, no el archivo completo ^^, supongo que al guardar el archivo estas guardando tambien el tamao del archivo, el tipo y el nombre, entonces probemos lo siguiente
<?php public function actionGetTextFile($id) { $id = $_GET['id']; $model = tabla1::model()->findByPk($id); $content = $model->archivo; $size = $model->size; $type = $model->type; $name = $model->name; // header HTML header("Content-length: $size"); header("Content-type: $type"); header("Content-Disposition: attachment; filename=$name"); //agregar el contenido echo $content; }

y cambia el nombre de la funcin de actionGetTextFile a uno mas acorde pues no solo se descargaran archivos de texto ^^ 0

Back to top of the page up there ^

#11

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 11 July 2012 - 12:57 PM JCS, on 10 July 2012 - 05:03 PM, said: pense que en la db guardabas el contenido de un archivo, no el archivo completo ^^, supongo que al guardar el archivo estas guardando tambien el tamao del archivo, el tipo y el nombre, entonces probemos lo siguiente

Estuve viendo que quiz la forma en que estoy subiendo los archivos puede no ser la correcta. Te explico: Para el ejemplo de prueba que tengo es una db de 2 tablas. Una de ellas es la tabla1 que tiene 2 campos ("id_tabla1" y "archivo"). El campo "archivo" esta definido como tipo blob Entonces en el campo "archivo" fue donde subi el archivo como tal a travs del formulario create que genera automaticamente yii. Simplemente en ese formulario le indico "examinar", busco mi archivo y creo. veo en la base de datos y efectivamente est alli. aplicando lo ltimo que me dijiste evidentemente me regresa el error: "Property "tabla1.size" is not defined. " porque dentro de la tabla no tengo ese campo. hay alguna forma en yii de extraer tanto el tamao tipo y contenido de una vez sin agregar esos campos en la tabla?

Back to top of the page up there ^

#12

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 11 July 2012 - 01:15 PM no, desafortunadamente debes guardar en algn lado esos valores. busque un poco en google y ac hay un tutorial, seguro es de mas ayuda de lo que te pueda decir ^^ Uploading files into a MySQL database using PHP 0

Back to top of the page up there ^

#13

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 13 July 2012 - 09:40 AM

Hola amigo buenos das... consegui un ejemplo y corre perfectamente. Entiendo lo que hace y cmo funciona pero no s cmo aplicarlo a yii pues esta hecho de manera sencilla. en yii entiendo que el actioncreate te redirecciona al formulario pero despus que le das al boton crear pra donde van esos valores de las variables? 0

Back to top of the page up there ^

#14

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 13 July 2012 - 10:31 AM esos valores van para la funcin actionCreate() de tu controlador 0

Back to top of the page up there ^

#15

emendez Junior Member

Group: Members Posts: 33

Joined: 29-June 12

Posted 16 July 2012 - 03:51 PM Oye, estoy tratando de subir un archivo con esto y no funciona. He hecho un ejemplo del foro y no me funciona:
public function actionCreate() { $model=new archivo; // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['archivo'])) { $model->attributes=$_POST['archivo']; $archivo = CUploadedFile::getInstance($model,'contenido'); $model->nombre = $archivo->name; $model->extension = $archivo->type; $fp = fopen($archivo->tempName, 'r'); $content = fread($fp, filesize($archivo>tempName)); fclose($fp); $model->contenido = $content;

if($model->save()) $this>redirect(array('view','id'=>$model->id_archivo)); } $this->render('create',array( 'model'=>$model, )); }

Luego voy al form y modifico "fileField" para cargar el archivo:


<div class="row"> <?php echo $form->labelEx($model,'contenido'); ?> <?php echo $form->fileField($model,'contenido'); ?> <?php echo $form->error($model,'contenido'); ?> </div>

Despus voy al create y cargo el archivo sin llenar nombre ni extension y me muestra este error:
Trying to get property of non-object

y me seala esta lnea:


$model->nombre = $archivo->name;

Ms abajo en el Stack Trace meseala esta lnea tambien:


Yii::createWebApplication($config)->run();

qu ser lo que estoy haciendo mal? Mi db tiene unas sola tabla:"archivo" con los campos: id_archivo, nombre, contenido y extension. 0

Back to top of the page up there ^

#16

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 16 July 2012 - 04:08 PM

generaste el modelo, controlador y vistas con Gii??? puedes subir lo que nombre anteriormente en un .zip, asi puedo ver mas facil que puede estar pasando y salir de esto de una vez por todas . 0

Back to top of the page up there ^

#17

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 16 July 2012 - 04:18 PM JCS, on 16 July 2012 - 04:08 PM, said: generaste el modelo, controlador y vistas con Gii??? puedes subir lo que nombre anteriormente en un .zip, asi puedo ver mas facil que puede estar pasando y salir de esto de una vez por todas .

Los modelos los gener por consola. no con el gii grfico. Te refieres a un zip de la app completa con la db tambin? 0

Back to top of the page up there ^

#18

JCS

Junior Member

Group: Members Posts: 57 Joined: 10-January 11 Location:Bogot

Posted 16 July 2012 - 04:22 PM pues no es necesaria la app completa, solo los archivos relacionados a la subida del archivo y la tabla de la db, no mas ^^ 0

Back to top of the page up there ^

#19

emendez Junior Member

Group: Members Posts: 33 Joined: 29-June 12

Posted 17 July 2012 - 08:33 AM JCS, on 16 July 2012 - 04:22 PM, said: pues no es necesaria la app completa, solo los archivos relacionados a la subida del archivo y la tabla de la db, no mas ^^

Buenos das hermano, aqu te dejo el sql de la db, el controlador, el modelo y el _form. Gracias... Attached File(s)

subir_archivos_yii.zip (4.29K) Number of downloads: 10

Back to top of the page up there ^

#20

robregonm

Advanced Member

Group: Members Posts: 421 Joined: 30-July 09 Location:Colombia

Posted 17 July 2012 - 10:03 AM Ahora que hablan de cargar archivo completos en una tabla de la base de datos, lo cual no est mal, pero por rendimiento, se prefiere guardarlos en el sistema de archivos, es decir, en el disco duro, de modo que en la base de datos se guarda la ruta o un identificador para localizarlo. De todas formas, si es absolutamente necesario almacenarlos en la Base de Datos, entonces, es buena idea guardar informacin relacionada, con el fin de indexarlos e identificarlos ms fcilmente: Fecha Creacin, Fecha de subida, Tamao, Tipo MIME de archivo (la extensin no siempre dice realmente el tipo MIME).... y cosas as. Saludos y xitos.

r el mdulo Yii-User en tres pasos


Yii es un Framework MVC novedoso en PHP. Su caracterstica ms importantes es el manejo de Cache para acelerar la aplicaciones Web. Como todava es nuevo no tiene mucha documentacin y los manuales de los mdulos estn un poco descuidados. A pesar de todo recomiendo el uso de Yii en proyectos pequeos porque entrega resultados rpidos. La curva de aprendizaje es rpida si tenemos experiencia previa en PHP u otro framework MVC. Luego de instalar y configurar una nueva aplicacin en Yii nos damos la sorpresa que la

aplicacin no tiene funcin de registro de usuarios y verificacin por correo basado en Roles. El mdulo Yii-User es perfecto y simple para esta tarea. Almacena el registro de usuarios en la base de datos y permite la verificacin por correo. En esta ocasin escrib un pequeo tutorial para instalar el mdulo, porque la documentacin del mdulo no esta muy bien diseada a pesar de que Yii-User es un mdulo popular (?) Hacer desde cero (from Scratch) o reinventar la rueda no es muy interesante ni econmico, as que luego de muchos intentos leyendo guas infructuosas logr instalar el mdulo.

Este tutorial funcionan con la versin yii-user-0.3-r107.zip y Yii Framework v1.1.11: Paso 1 Descargar el mdulo desde http://code.google.com/p/yii-user/downloads/list y descomprimir en rutadeaplicacion/protected directamente. Debe quedar as: rutadeaplicacion/protected/modules/user . Paso 2 Ejecutamos el script de MySQL ubicado en protected\modules\user\data. Paso 3 Modificar el archivo protected/config/main.php de la siguiente manera: ? 1 // autoloading model and component classes 2 'import'=>array( 3 'application.models.*', 'application.components.*', 4 'application.modules.user.models.*', 5 'application.modules.user.components.*', 6 7 ), 8 Declarar las tablas que harn servicio al mdulo: ? 1 2modules'=>array( ... 3 'user' => array( 4 'tableUsers' => 'tbl_users', 5 'tableProfiles' => 'tbl_profiles', 6 'tableProfileFields' => 'tbl_profiles_fields', ), 7 8 Declarar el componente: ?

1 2 // application components 'components'=>array( 3 #... 4 'user'=>array( 5 // enable cookie-based authentication 'allowAutoLogin'=>true, 6 'loginUrl' => array('/user/login'), 7 ), 8 #... 9 ), 10 Al final, para poder ver los botones "Login" y "Register" del sitio modificamos la Vista en protected\views\layouts\main.php . ?
//array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest), //array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)), array('url'=>Yii::app()->getModule('user')->loginUrl, 1'label'=>Yii::app()->getModule('user')->t("Login"), 2'visible'=>Yii::app()->user->isGuest), 3 array('url'=>Yii::app()->getModule('user')->registrationUrl, 'label'=>Yii::app()->getModule('user')->t("Register"), 4 5'visible'=>Yii::app()->user->isGuest), array('url'=>Yii::app()->getModule('user')->profileUrl, 6'label'=>Yii::app()->getModule('user')->t("Profile"), 'visible'=>!Yii::app()->user->isGuest), array('url'=>Yii::app()->getModule('user')->logoutUrl, 'label'=>Yii::app()->getModule('user')->t("Logout").' ('.Yii::app()>user->name.')', 'visible'=>!Yii::app()->user->isGuest)),

Es todo. Prueba La contrasea es admin/admin y demo/demo y la lista de parmetros que se puede usar en el mdulo -por ejemplo, si no queremos usar md5 para las contraseas o la activacin por e-mail- se encuentra aqu http://code.google.com/p/yii-user/wiki/Installation Buen da.

Das könnte Ihnen auch gefallen