December 29th, 2011 Category: Curso Zend Framework
89 Comments »

En los anteriores capitulos habiamos usado el video como metodo de aprendizaje, hoy habiendo cubierto la parte inicial y basica de Zend Framework, creo que estamos preparados para dejar el video atras, y continuar los capitulos leyendo un poco.

En este capitulo vamos a ver como crear un sistema de login en nuestro proyecto. Nosotros actualmente en nuestro portal de noticias tenemos una pantalla donde publicamos nuestras noticias. Pero actualmente esa pantalla es accesible por cualquier persona.

El objetivo de este capitulo es crear una pantalla de login, y restringir el acceso a la administracion de las noticias solo a las personas que tengan usuario y contraseña.

Lo primero que vamos a hacer es crear un nuevo controller, UsuarioController.php

El codigo de este controller inicialmente sera asi.


class UsuarioController extends Zend_Controller_Action
{
    
    public function init()
    {
        
    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){
            
            if( $form->isValid( $this->_getAllParams() )) {
                
                // Do something
            }
        }

        $this->view->form = $form;
    }


}

Para este controller vamos a tener que crear una vista asi que creamos la carpeta en views/scripts/usuario y agregamos el archivo login.phtml, donde vamos a imprimir el formulario y mostrar un mensaje, el archivo quedaria asi

<div>
    <h2>Ingresar al sistema</h2>
    <?php echo $this->form ; ?>
</div>

Tambien vamos a necesitar un formulario para poder ingresar usuario y contraseña.

Creamos el archivo en forms/Login.php

Este formulario va a tener un input para el usuario otro para el contraseña, y el boton de submit, el formulario Login.php nos quedaria asi.


class Application_Form_Login extends Zend_Form 
{

    public function init() 
    {

        $this->addElement(
            'text', 'username', array(
                'label' => 'Usuario:',
                'required' => true
            )
        );

        $this->addElement(
            'password', 'password', array(
                'label' => 'Contraseña:',
                'required' => true
            )
        );

        $this->addElement(
                'submit', 'Ingresar', array()
        );
    }

}

Hasta ahora no vimos nada nuevo, es mas o menos el mismo mecanismo que usamos para crear un nuevo post. Si entramos en la url de nuestro proyecto /usuario/login vamos a ver el formulario de login como aparece en la siguiente imagen.

Ahora que tenemos el codigo vamos a crear una tabla donde se van a guardar todos los usuarios que van a tener permisos al panel de administracion de nuestro proyecto. El sql para crear la tabla es el siguiente.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(40) NOT NULL,
  `password` char(40) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

INSERT INTO `users` (`username`, `password`) VALUES
    ('pablo', '7c4a8d09ca3762af61e59520943dc26494f8941b');

Nuestra tabla de usuario es bastante sencilla, por ahora vamos a cumplir con los requerimientos minimos. El hash extraño que se ve es la contraseña “123456″ encriptada con la funcion sha1()

Ahora que ya tenemos un usuario (pablo) y una contraseña (123456), nos falta agregar la logica para que se valide si el usuario existe o no.

Zend Framework nos brinda el componente Zend_Auth el cual a partir de sus Adapters, nos permite validar un usuario y loguearlo en el sistema. La forma de usarlo es bastante simple, Zend Auth entiende identidad y credencial, donde la identidad es el nombre de usuario o mail que vamos a usar para identificar a un usuario dentro del sistema, y la credencia es la contraseña.

Nosotros vamos a usar Zend_Db_Adapter_DbTable el cual se encarga de validar el usuario y contraseña en nuestra base de datos.

El codigo cuando usemos Zend_Auth deberia ser el siguiente.

$authAdapter = new Zend_Auth_Adapter_DbTable();

$authAdapter
    ->setTableName('users')
    ->setIdentityColumn('username')
    ->setCredentialColumn('password');

$authAdapter
    ->setIdentity('pablo')
    ->setCredential(sha1('123456'));

$auth = Zend_Auth::getInstance();

$result = $auth->authenticate($authAdapter);
                
if(  $result->isValid() ){
    echo "Estamos Logueado!";
}else{
    echo "Datos incorrecto";
}

Ahora este codigo vamos a adaptarlo a nuestro controller. Nos quedaria asi

class UsuarioController extends Zend_Controller_Action
{
    
    public function init()
    {
        
    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){
            
            if( $form->isValid( $this->_getAllParams() )) {
                
                $authAdapter = new Zend_Auth_Adapter_DbTable();
                $authAdapter
                    ->setTableName('users')
                    ->setIdentityColumn('username')
                    ->setCredentialColumn('password');

                $authAdapter
                    ->setIdentity($form->getValue('username'))
                    ->setCredential(sha1($form->getValue('password')));

                $auth = Zend_Auth::getInstance();

                
                $result = $auth->authenticate($authAdapter);
                
                if(  $result->isValid() ){
                    return $this->_redirect('/posts/listar');
                }else{
                    $form->username->addErrorMessage('Datos Incorrectos');
                }
            }
        }
        $this->view->form = $form;
    }


}

Con este codigo cada vez que nos identifiquemos correctamente nos va a redirigir a /posts/listar donde vamos a mostrar todas las noticias.

Ahora los que nos faltaria agregar es que en cada lugar donde nosotros queramos restringir el acceso, agregar el chequeo si el usuario esta logueado o no, sino esta logueado vamos a redireccionarlo a la pantalla de login.

En cada action que querramos validar esto vamos a agregar el siguiente codigo.

$auth = Zend_Auth::getInstance();
if (! $auth->hasIdentity()) {
    return $this->_redirect('/usuarios/login');
}

Notese que en el caso de PostsController, tenemos metodos que son de acceso publico y acceso privado, si llegado el caso tenemos un Controller donde necesitamos que todos los metodos sean de alcance privado, las lineas de arriba podemos escribirlas en el metodo init() de nuestro controller, ese metodo init se va a llamar antes de ejecutar un action de ese controller, y de esta forma evitamos repetir codigo.

Hay otras practicas para mejorar esto pero eso podemos verlo mas adelante.

Ahora que restringimos el acceso, vamos a necesitar la posiblidad de desloguearnos del sistema, para eso vamos agregar un link en nuestro layout.phtml en la parte del menu, que nos redireccione a /usuarios/logout y este es el codigo de nuestro action para desloguarnos.

public function logoutAction()
{
    Zend_Auth::getInstance()->clearIdentity();
    return $this->_redirect('/usuario/login');
}

Bastante simple, no :D , asi es todo con Zend Framework.

Ahora, vamos a dejarlo mas bonito a todo esto, y vamos validar en la vista si el usuario esta logueado, voy a mostrar un link a logout, si esta deslogueado voy a mostrar un link a la pantalla de login. El codigo a agregar en nuestro layout seria el siguiente.

<?php
$auth = Zend_Auth::getInstance();
if ( $auth->hasIdentity()) :
?>
    <li>Usuario:<?php echo $auth->getIdentity() ?></li>
    <li><a href="/usuario/logout">Logout</a>
<?php else: ?>
    <li><a href="/usuario/login/">Login</a>
<?php endif;?>

Y con esto ya somos capaces de agregar un sistema de login en nuestros proyectos usando Zend Framework.

Ver todos los capitulos del curso

Subscribe to me on YouTube

Comentar


89 Responses

Francisco Pinzón 2011-12-30 12:33:24
Excelente, de hecho lo vi por ahi en un video en youtube, practicamente es lo mismo, y si, con ZF todo es muy sencillo.

Me sruge una duda, por que el mismo codigo no funciona en local, pero se sube al servidor y si funciona, logicamente con las respectivas configuraciones del config.ini

Quisiera hacerte una sugerencia, pero como vos dices, es cuestion de mejorar el aplicativo.

Crear en el controller del login o usuarios como sea una funcion tal cual


private function getAuthAdapter()
{
$authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
$authAdapter->setTableName('eme_usuarios')
->setIdentityColumn('email')
->setCredentialColumn('pass')
->setCredentialTreatment('MD5(CONCAT(MD5(?),secure))');

// obtenemos el query sobre el que trabaja el adapter
$select = $authAdapter->getDbSelect();
// le agregamos nuestra condición al where
$select->where('estado = ?', 1);

return $authAdapter;
}

y si son validos los datos del form


$authAdapter = $this->getAuthAdapter();

$email = $formLogin->getValue('email');
$pass = $formLogin->getValue('password');

$authAdapter->setIdentity($email)
->setCredential($pass);

$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);

if($result->isValid()){
$identify = $authAdapter->getResultRowObject();
$authStorage = $auth->getStorage();
$authStorage->write($identify);
$this->_redirect('/administradorModule/');
}else{
switch ($result->getCode()) {
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
$this->view->errorMessage =
'
El usuario no existe en la base de datos.
';
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
$this->view->errorMessage =
'
Verfifique su contraseña y/o usuario.
';
break;
default:
$this->view->errorMessage =
'
Acceso Inválido
';
break;
}

Pablo Morales 2011-12-30 14:31:21
Tenes mucho mas codigo para hacer lo mismo, no entiendo cual seria la mejora.

Tambien recorda, que no es una buena practica tener metodos que no sean nombreAction() en los controllers, y menos privates, de ultima llama a los modelos.

Francisco Pinzón 2011-12-30 17:03:59
A ver si comprendo, o sea que en este caso para tenr la funcion
private function getAuthAdapter()
{
...
}
dentro del controller, es mejor inyectarlo desde un modelo?? o sea esto esuna funcion particular para partir el codigo.

Pablo Morales 2011-12-30 17:08:35
Acordate que no es una funcion, es un metodo :)

Cuando abris un controller la idea es que lo unico que veas es metodos Action, no funcionalidades extras. Para eso tenes las librerias y los modelos. Los controllers tienen que ser lo mas escueto posible.

franpisa911@gmail.com 2011-12-30 17:13:10
Otra cosita Pablo, igual acá andamos para aprender. He visto por ahi que con Zend Framework, algunos sugieren crear un modelo para la tabla como debe ser, pero adicionalment otro modelo para combertir las tabals y suis atributos y manejarlos com objetos, entre otras cosas con todo eso del getter y setter, no se cual seria su posicion frente a todo esto, claro, podria pensarse, para que mas codigo si se ahce lo msimo, pero en muchos casos es bueno saber las opiniones y las practicas recomendadas.

Pablo Morales 2011-12-31 05:24:52
Estas hablando del Data Mapper.

Es un intento de ZF de tener su propio ORM, no me parece mal, salvo lo de getter y setter, creo que el Data Mapper es algo perfecto para usar.

El tema de getter y setter es una pelotudes que se implementa copiando a la gente de Java, totalmente inutil, y totalmente inecesario.

Tenemos magi method, o mejor es usar un toArray, o setFromArray o cosas parecidas. Yo tendria dos capas.

El DbTable que sea como el modelo de hoy en Dia, extendiendo de Zend_Db_Table, y un dataMapper no por cada tabla sino cada vez que lo amerite

Gildus 2011-12-31 14:06:26
Hola Pablo,

Que diferencia hay entre colocar la validacion:

$auth = Zend_Auth::getInstance();
if (! $auth->hasIdentity()) {
return $this->_redirect('/usuarios/login');
}

en preDispatch() y en init() ??

No es mas seguro que este en preDispatch() ?.

Saludos

Pablo Morales 2011-12-31 14:16:34
Glidus, no se me ocurre porque seria mas seguro en el preDispatch que en el init


El metodo init lo ejecuta antes de ejecutar un action, deberia comportarse igual.


Pero podes agregarlo en el PreDispatch tambien, o de alguna forma mas personalizada en el Bootstrap, pero ahi tendrias que trabajar un poquito mas con la logica.

gildus@gmail.com 2011-12-31 14:43:27
En el controlador usuario metodo login:

if( $result->isValid() ){
return $this->_redirect('/posts/listar');
}else{
$form->username->addErrorMessage('Datos Incorrectos');
}

No me muestra el error si coloco datos incorrectos, pero cambie la funcion addErrorMessage a addError y si funciona..

Saludos

fredyx007@gmail.com 2011-12-31 15:15:52
hola pablo muy buenos tus posts. me estan sirviendo de mucho. podrias realizar algun reporte con zend_pdf o pequeña introduccion, ya que los otros posts que hay en otros website no se entienden bien. an te cuento que ya puedo utilzar dos base de datos en zend framework pero el adaptador los puse en cada acction.
me despido de usted deseandole exito en todo y ya le considero como un amigo mas porque me ha facilitado sus conocimientos para poder realizar mi tesis,de verdad gracias por su ayuda desinteresada. bueno le deso un Feliz Año Nuevo.

Pablo Morales 2011-12-31 15:25:42
@Gildus gracias por la aclaracion tenes razon, ahi lo volvi a revisar. Gracias!


@fredyx007 Gracias, un gusto haber servido. LO de Zend_PDF podemos verlo mas adelante. La verdad es que nunca lo use.

Ivan Manetta 2012-01-01 11:39:20
Hola Pablo, es excelente esto que estas haciendo y hoy justo me encuentro con esto del Auth que queria verlo, ojala el proximo sea sobre Zend_Acl que me interesa mucho verlo, estuve viendo en internet un poco pero usan plugins, bootstrap y no estoy muy familiarizado con eso todavia!
Feliz año nuevo! y gracias!

Alberto Rosales 2012-01-01 20:20:46
Hola Pablo, este curso es de los mas genial, te agradezco por lo que haz hecho, al igual que Ivan Manetta, también espero que la próxima clase sea de Zend_Acl que es muy necesario para algunas aplicaciones, y que aun no puedo comprender.
Una vez mas te agradezco por este curso.
Feliz año nuevo!!! :)

Francisco Pinzón 2012-01-02 13:52:03
Pablo, me mencinas algo del mapper, pero bueno ser aprenderlo para nota r diferencias por el momento, tengo creado a parte el BDtable (modelo) y un modelo que conteine unas metodos y set y get de cada atributo de la tabla, algoq ue "compremdo".

Manito sigo guerriando con la vaina de la edicion de datos, listo me cargan los datos al campo de l form, pero cuando voy a actualizar con algun campo vacion, me genera erro no hace nada,s e supone que el form debe ser validado antes, que tendre mal mano.

Pablo Morales 2012-01-02 15:25:15
@ivan @alberto gracias, voy a ver si lo meto dentro del programa lo de ACL, el proximo capitulo es Testing y TDD con PHPUnit

@francisco cuando hablo de data mapper me refiero a esto http://martinfowler.com/eaaCatalog/dataMapper.html

El ejemplo que usan el quickstart de la pagina de Zend Framework, te muestra como usar el mapper, y los dbtable.

Oscar Duván Flórez Ricardo 2012-01-03 15:04:18
Muchas gracias Pablo por el curso, ha sido de gran ayuda para mi, muchas de las funcionalidades que has descrito las he estado utilizando para el desarrollo de un aplicativo de la Universidad, estaré atento a nuevos Post, es bueno aprender de esta forma.

Francisco Pinzón 2012-01-03 16:09:00
Pablo esta pregunta no viene al post, y quizas a ninguno de los aca publicados, pero quisiera preguntarte, que tanto sabe ud de las camaras ip y poderlas integrar a ZF.

De antemano Gracios


Pablo Morales 2012-01-03 16:11:16
jajaja, me matan tus preguntas Francisco.

Por lo que entiendo, se te da acceso a una url especifica en un puerto especifico. Vos deberias usar aglun reproductor flash seguramente para hacer streeming en esa url especifica.

Y claramente podrias embeberla en cualqueir vista del proyecto.

Esto tocando de oido, pero supongo que no es mucho mas que eso.

franpisa911@gmail.com 2012-01-03 16:43:57
Jajaja Pablo, gracias. Quede gringo con lo del oido, pero aca va uno para relajar la tarde.

http://tecnoculto.com/wp-content/uploads/etapas_del_programador-26-06-2008.jpg

Jorge A. Buelvas Reales 2012-01-04 23:52:21
Hola Pablo, he leido tu tutorial de principio a fin y me parece genial, con ello pasaré con toda confianza de Cakephp a Zend, mis respetos y felicitaciones. Pablo los getter y setter son altamente funcionales, cada vez que desees entregar un dato en diversos formatos, el modificador presenta el dato sin tener que las mismas funciones en los controladores y vistas, por ejemplo, una fecha puede tener 4 o 5 formatos según su uso y claro si necesitas realizar un cambio en su presentación, es solo ir al modificador y no acudir a todos los controladores y vistas, igual pasa con los números, si deseas verlo en formato moneda o incluso en letras. Con los setters es igual, puedes proteger los datos que ingresan a tu modelo, muy útiles cuando desarrollas en equipos de trabajo o incluso el intercambias datos por webservices, con ello garantizas que la información que ingrese, sea de calidad.
Pablo muchas gracias por este tutorial, sigue con tus excelentes contribuciones.

franpisa911@gmail.com 2012-01-05 16:53:43
@jorge Buen punto de vista, Pablo también tiene toda la razón lo programe de las dos formas y realmetne hacen lo mismo, es dudoso cual dejar, creerñía que dependiendo de las circunstancias, ero si se va a mpliando el proyecto, creo que lo de crear un modelo con getter y setter e suna buena alternativa
no se

nalleli 2012-01-05 21:22:35
Ya logré le loguin y el logout, pero como puedo hacer que en la pantalla siguiente me salga BIENVENIDO y el nombre del usuario!!!

Daniel 2012-01-05 22:56:38
hola tengo un problem....la cuestion esque estoy uniendo joomla y zend y la todo funca bien solo que al momento de hacer el carrito de compras al llamarlo desde joomla se pierde todo no me sale ningun articulo agregado...estoy manejando el preDispatch para manejar las sesiones no se si alguien me pueda ayudar.

Alfredo Villagómez 2012-01-06 01:08:12
Hola Pablo, primeramente agradecerte por todos los videostutoriales y zf clases que nos diste a conocer.

Quisiera que porfavor me ayudaras con un tutorial o clase usando zend_acl y zend_navegation.He encontrado poca informacion acerca de esos componentes zend y ademas están en inglés.

Saludos..

Nalleli 2012-01-06 12:26:37
Como puedo hacer para que una vez que le den clic al botón de logout el boton de back quede desabilitado, por que actualmente si salgo de la sesión y presiono back me regresa a la pagina anterior como si nunca me hubiera deslogueado., AUXILIOOO!!

Jonathan Estiven 2012-01-06 14:47:00
Hola Pablo Gracias Nuevamente por los tutoriales y las guias, Aunque son muy claras las Explicaciones,que bueno fuera que no dejaras de Utilizar los VideoTutoriales, pues aunque nuestra vocación y pasión por la programación se Enfoca en investigar y leer para cada dia estar actualizado con el mundo de la programación, cuando se hacen estos videotutoriales a muchos nos ayuda mucho mas a comprender la programación de Zend Framework en un video, que leyendo la documentación que en relidad es mucha, pero los videotutoriales como los tuyos en castellanos son muy pocos, de Hecho los unicos videos en castellano que yo he encuentrado mas completos son los tuyos, ya que los otros se encuentran en Ingles, y muchas veces los que no hablamos este idioama nos perdemos de explicaciones muy importantes, las cuales tu nos las has explicado de una forma excelente, por lo tanto te animo a que no dejes de usar esta forma de enseñar, que en realidad ha sido muy eficaz para mi y muchos otros. Gracias y espero lo mas pronto posible el proximo videotutorial, que ojala fuera enfocado al control de listas de Acceso 'Zend_acl' o tambien al uso de Ajax con Jquery ó Dojo

Pablo Morales 2012-01-06 15:16:42
@Daniel Asegurate de tener los valores en la Session

@Alfredo Voy a tratar de agregar lo de Zend Acl para los proximos capitulos

@Nalleli No entendi el problema.

@Jonathan, gracias por el feedback, como le decia a Alfredo en los proximos voy a ver de incluir el tema de ACL

Nalleli 2012-01-06 19:51:06
Ya logré le loguin y el logout, pero como puedo hacer que en la pantalla siguiente reconozca el usuario que se ha logueado y me salga BIENVENIDO más el dato del nombre del usuario!!!

nalleli.vargas@hotmail.com 2012-01-06 19:51:28
como puedo hacer que en la pantalla siguiente reconozca el usuario que se ha logueado y me salga BIENVENIDO más el dato del nombre del usuario!!!

Ivan Manetta 2012-01-06 20:03:35
Hola nalleli, mira yo te muestro como resolvi de este modo a lo que planteas, espero que te ayude!

//Esta funcion ponela en el bootstrap..modifica algunos valores por los nombres que les hayas puesto a tus variables de autenticacion..

public function profileLink()
{
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {

$username = $auth->getStorage()->read('user');
return 'Bienvenido, ' . $username . ' | Logout';
}

return 'Login';
}

//Y despues yo en el layout hice lo siguiente..



Espero que te sirva, saludos!

ivanmanetta@gmail.com 2012-01-06 20:08:12
return 'a href="/profile' . $username . '">Welcome, ' . $username . ' | Logout';

nalleli.vargas@hotmail.com 2012-01-06 21:24:50
@Ivan

Soy nueva usando Zend, donde pongo eso???

Rodrigo 2012-01-07 02:34:51
hola estoy muy interesado en esto de zend veo q lo explicas bien tengo un problema me descargue un codigo de un supuesto tramite documentario que uza zend pero al probarlo en localhost y pner en usuario admin y pass 123456 no me reenvia a ninguna otra ventana noc si esto tenga algo q ver con zend tengoq configurarlo antes porq ya cree la base de datos tal como esta en el script q te dan noc si podrias revisar este codigo porfavor te dejo el link gracias de todas formas

https://code.google.com/p/midocu/downloads/list

Nalleli 2012-01-09 16:31:19
Como puedo obtener el nombre y ID del usuario una vez que ya esté logueado ??

Pablo Morales 2012-01-09 16:34:24
@Rodrigo ni idea deberias contactar al que publico el codigo

@Nalleli, podes traerlo haciendo una busqueda en el modelo con el username

nalleli.vargas@hotmail.com 2012-01-09 17:03:49
@Pablo
Podrías darme un ejemplo??
tengo muchas dudas sobre como ponerlo :(....

Nalleli 2012-01-11 13:24:38
Como puedo hacer para que al momento de hacer el update cargue todos los valores menos la contraseña????

Francisco Pinzon 2012-01-24 19:51:26
Pablo, que sabe usted respecto a los selects dependientes con zend, no he encontrado nada al respecto, solo por al forma tradicional pero con zend nalgas.

Gabriel 2012-01-25 09:22:48
Excelente material ...
Gracias por el curso ...
Para cuando el siguiente capitulo ?

fredyx007@gmail.com 2012-01-27 12:56:56
hola pablo como hago para trabajar con helpers en modulos diferentes. y cuando siguen los cursos? saludos pablo.

Pablo Morales 2012-01-27 14:41:01
Los helpers estan en la vista, por lo cual no importa que estes en un modulo.

Este finde por ahi lanzo otro video.


pd: No me spamees el blog!!

fredyx007@gmail.com 2012-01-28 23:36:41
hola pablo donde te pierdes? jajaja ok ok. es que ando preocupado ultimamente con mi proyecto. bueno estare esperando el video tutorial sobre los helpers en diferentes modulos. saludos coordiales.

Jorge Bolaños 2012-02-10 00:41:51
Muy bueno el tutorial si me salio lod e la sesion

pero me gustaria como guardar los datos de una sesion en una cookie, ya que estoy haciendo un carrito de compras en zend, pero los datos los esta gurdando en una base de datos, pero la recomendacion que me dieron fue que gurdara la informacion en una cookie.

Si puedes redponderme ha esta pregunta estaria muy agradecido

Pablo Morales 2012-02-10 09:38:29
Aca tenes la referencia para usar cookies con ZF

http://framework.zend.com/manual/en/zend.http.cookies.html

jose luis perales 2012-02-13 19:28:47
buenos tutos cuando va ha ver otro? gracias por los tutoriales.

fredyx007@gmail.com 2012-02-19 13:07:14
hola pablo como hago para recuperar respuesta json en un campo de texto y no asi en un div. todo esto en jquery. es buscado mucho por la web y no encontre. espero me ayudes. saludos cordiales

alejandro 2012-02-20 13:15:48
Esperando un próximo tutorial :)

Francsico Pinzón 2012-02-21 12:06:41
Mirando por al web sobre Acl, veo que en al verion 1.8 se hacen unso costructores mas o menso de al siguiente manera, es necesario tambienn par 1.11??

Class Application_Model_LibraryAcl extends Zend_Acl {
public function __construct() {
$this->add(new Zend_Acl_Resource('cotizaciones'));
$this->add(new Zend_Acl_Resource('listar'), 'cotizaciones');

$this->addRole(new Zend_Acl_Role('user'));
$this->addRole(new Zend_Acl_Role('admin'),'user');

$this->allow('user', 'cotizaciones', 'listar');
$this->allow('admin', 'cotizaciones', 'index');
$this->allow('admin', 'cotizaciones', 'edit');
$this->allow('admin', 'cotizaciones', 'delete');

}
}

trauma 2012-03-01 22:57:58
donde estan los tutos nuevos. este siteo esta avandonado?

ponelosvideos@peroya.com 2012-03-01 22:58:58
jejejeejejejej

Pablo Morales 2012-03-01 23:06:09
No esta abandonado, el autor entro en modo vagancia.

Perdonen :(

Heraud Chalco Huamaní 2012-03-02 01:27:40
Hola Pablo como estas.Muchas grcais por tus tutoriales, la verdad han sido de mucha ayuda para mi. UNA PREGUNTA ESTE BLOG EN QUE CMS LO HICISTES O LO HICISTES DESDE CERO. QUE ME RECOMENDARIAS PARA CREAR TAMBI'EN MI BLOG.
y OTRA ESTE ES EL PROYECTO DE bootstrap twitter NO?? SI ES UN CMS COMO LO ADAPTASTES.
MUCHAS MUCHAS GRACIAS DE ANTE MANO. ESPERO TU RECOMENDACI'ON

Pablo Morales 2012-03-05 17:35:22
Wordpress, es la mejor y mas completa plataforma para crear blogs.

omar 2012-03-12 00:34:57
Muy buen tutorial, se agradece, ojala eso de las otras practicas para hacer esto q tal ves sea con ACL igual nos pueda mostrar un ejemplo asi de comprensible
de nuevo gracias y saludos cordiales

omar.e007@gmail.com 2012-03-12 00:36:57
bueno lo de las otras practicas me referia a la leccion 10 de login, la verdad me sirvio mucho ojala el modo vagancia se acabe pronto, felicidades por la pagina q nos ayuda a los q somos nuevos en zend :D

fredyx007@gmail.com 2012-03-20 01:18:00
hola pablo donde te perdes, te cuento estoy esperando los tutos. y tb te cuento que avanze mucho con el zend framework. la verdad muy bueno. solo que un poco lento y como puedo mejorarlo. alguna compresion de archivos de php y html talvez?

Alvaro Garcia 2012-04-03 10:27:40
Felicidades Pablo Morales por este curso de Zend Framework muy practico para los que somos principiantes,me ha servido de mucha ayuda realmente gracias, seguiras colgando nuevos tutoriales? algun proyecto con varios tipos de usuarios con accesos a diferentes tipos de funcionalidades o algo asi? Un saludo.

Sebastian 2012-04-12 00:04:57
Hola Pablo! me parecen fantásticos tus cursos y me gustaría contactarte por mail para hacerte unas consultas labolares. Muchas Gracias y Saludos.

Pablo Morales 2012-04-12 22:38:01
Sebastian mandame un direct message por tweet a @pablofmorales o el mismo nick mas gmail.com ;)

julio 2012-04-13 00:32:56
hola amigos me encontre con sitio web hecha con zend esta en esta direccion. para los que quieran http://fredyluis7.byethost7.com y como puedo extraer su codigo php?

javi 2012-04-28 11:47:20
gracias por el articulo pablo

Alberto Buitrago 2012-04-30 13:47:16
Hola, estoy trabajando con Acl y era por si alguien me podia ayudar con un problemilla que tengo, cuando obtengo el role
$role=$auth->getIdentity()->role;
siendo role la columna correspondiente de la base de datos obtenida con getStorage
me salte una notice
trying to ger property of non-object
linea $role=$auth->getIdentity()->role;
La aplicación funciona bien pero no consigo quitar el aviso.
Gracias Un saludo

quizagenio 2012-05-01 04:18:38
Excelente Pablo, muy didácticas tus clases, saludos.

malcon 2012-05-10 06:03:02
hola, tengo una consulta, estoy usando el zend_session_savehandler_dbtable, este se usa para guardar la session en en bases de datos.
Tengo los modulos de default y backoffice. En el default tengo la pagina web y en el backoffice la parte administrativa.
uso zend_Acl y Zend_Auth para autentificarme.

La ayuda que pido es que quiero insertar el registro de la session en la bd solo cuando me autentifique y estando con el role->guest
gracias.
en el bootstrap tengo

protected function _initSessionSaveHandler()
{
$this->bootstrap("db");

$config = array(
'name' => 'session', //table name as per Zend_Db_Table
'primary' => 'id', //the sessionID given by php
'modifiedColumn' => 'modified', //time the session should expire
'dataColumn' => 'data', //serialized data
'lifetimeColumn' => 'lifetime', //end of life for a specific record
'lifetime' => 10*60, //parametrizar tiempo de session,que corre con la inactividad
'overrideLifetime' => false //no se modifica el tiempo de vida de la session
);

$config['options'] = array (
'cookie_httponly' => '1',
'cookie_lifetime' => '86400',
'name' => 'WCBSESSID'
);
//create your Zend_Session_SaveHandler_DbTable and
//set the save handler for Zend_Session

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Zend_Session::setOptions($config['options']);


Zend_Session::start();

}

malcon1982@gmail.com 2012-05-10 06:07:01
hola, en mi anterior comentario me equivoque....
La ayuda que pido es que quiero insertar el registro de la session en la bd solo cuando me autentifique y "NO" con el role->guest
gracias.

lukhas granada 2012-05-10 13:12:41
Buenos dias, cuando vas hacer el curso de autentificacion por roles de usuario.

arias-arian@hotmail.com 2012-06-06 10:56:03
Me sumo al pedido de @lukhas, estaría bueno que expliques como usar zend_acl, que es algo bastante complejo y seria bueno ver como aplicar esto al sistema de blog actual!
Muchas gracias.

Gonzalo 2012-06-11 18:34:30
Hola, llegué medio tarde a la fiesta pero he aquí mi problema

Tengo una tabla USUARIOS que se relaciona con una tabla PERSONAS (la primera tiene el id de la segunda), por lo cual para crear un usuario debo primero crear la persona.
Debo crear un controlador para el objeto persona que llame a un modelo que tome los datos del formulario, lo inserte en la bd y me devuelva el id, y luego se los pase al controlador del objeto usuario para que este pueda almacenar al usuario?

Desde ya muchas gracias y realmente me han sido de mucha utilidad tus videos

faber murillo 2012-06-12 00:13:22
podrías dejar el proyecto proyecto para descargar

mcastiella@gmail.com 2012-06-18 10:38:49
Hola:

Estaba interesado en que mi aplicación se identificara contra Google, mirando un poco he visto que se puede crear tu propio Adapter implementando la clase Zend_Auth_Adapter_Interface. Para eso se crea un fichero php en la carpeta /application/library con el nombre de clase que quieras, en mi caso Google_Auth_Adapter.php. He resuelto la identificación de google así por si a alguien le puede venir bien:

[code]

_username=$username;
$this->_password=$password;
}

public function authenticate()
{


$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
// Create an authenticated HTTP client
try{
$client = Zend_Gdata_ClientLogin::getHttpClient($this->_username, $this->_password, $service);
} catch (Zend_Gdata_App_CaptchaRequiredException $cre) {
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,$this->_username);
} catch (Zend_Gdata_App_AuthException $ae) {
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,$this->_username);
}

return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS,$this->_username);
}

}
?>
[/code]

Una vez creado en el controler del login - UsuarioController.php - hay que hacer include del archivo al principio:

[code]

include APPLICATION_PATH.'/library/Google_Auth_Adapter.php';

[/code]

y luego crear el adapter:

[code]

$auth = Zend_Auth::getInstance();
$result= $auth->authenticate(new Google_Auth_Adapter($user,$pass));

[/code]

Y parece que funciona.

RONALD 2012-06-26 18:17:33
Bueno te felicito por el blog bien explicado...
Quisiera hacerte una consulta, quizas sabes como puedo recuperar los datos de Zend framework del servidor e interpretarlos corriendo Ext JS en una aplicacion cliente... Quizas me puedas ayudar...
Te lo agradezco de antemano...

Ziklon 2012-06-27 03:00:07
Hola Pablo
Muchas gracias por los tutos , que gracias a ellos aprendi ZF.
Quisiera porfavor , una orientación en los mensajes de errores.
redireccionar y mostrar un mensaje como una alerta y que se cierre de manera automatica.

Saludos!

@pacho911 Francisco Pinzón 2012-07-13 10:06:44
Buen día Pablo, no se si acá es conveniente la siguiente consulta.
Sucede que en muchos casos deseo hacer validadores personalizados o programados en zend framework,s como por ejemplo que el precio a ingresar no sea superior al que se debe o menor a lo que no debe meter, por ejemplo, y la idea es que esos validadores, desde mi punto de vista, pertenecen a la interacción de datos, y por ende deseo guardarlos en una carpeta dentro de models, llamada validadores, y se que no basta con decirle por ejemeplo Application_Model_Validadores_NombreValidador para que sea llamado como clase, creo que debo incluir la libreria que estoy haciendo algo asi, me puedes colaborar porfavor.

Gracias de antemano

@pacho911 2012-07-17 12:23:44
Hola Pablo, de neuvo yo.

Como vas, esperoq ue bien.

1. Como hacer que el logueo expire despues de un tiempo?
2. Tiene algo de Zend_acl complejo?

Gracias

dennisbot 2012-08-06 01:29:23
Hola pablo de tiempo, previamente agradeciendote todo este material que nos muestras el camino de verdad y la vida xD!, y bueno comentarte que tuve problemas con la autenticación, pero ya lo solucioné pero tuve que cambiar algunas cosas y me gustaría que me dijeras porque no me funcionó como el tuyo, quizá sea la versión otra no se me ocurre, uso el zf version 1.10.5.
bueno antes me tiraba este error:
Catchable fatal error: Argument 1 passed to Zend_Auth_Adapter_DbTable::__construct()
must be an instance of Zend_Db_Adapter_Abstract, none given,
called in C:\xampp\htdocs\news123\application\controllers\UsuarioController.php
on line 19 and defined in C:\xampp\php\zend\library\Zend\Auth\Adapter\DbTable.php on line 128
y la linea 19 era esta:

$authAdapter = new Zend_Auth_Adapter_DbTable();

y luego de buscar una solución encontré que $authAdapter se instanciaba con al menos 1 parametro que era del tipo Zend_Adapter_Abstract y obtuve esta solución.

if ($form->isValid($this->_getAllParams())) {
$dbAdapter = new Zend_Db_Adapter_Mysqli(
array(
'dbname' => 'news123',
'username' => 'root',
'password' => '',
'host' => 'localhost'
)
);

$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter
->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password');
.
.
.

y sólo así me funcionó, me gustaría que me explicaras porque me paso eso?.
PD: gracias por los video tutos :)

Dudoso 2012-08-07 00:39:45
Hola,

Siguiendo tus tutoriales estoy aprendiendo mucho.
Con respecto a este tema, aunque usemos SHA1 en setCredential, de todos modos la password viaja en claro desde el cliente hasta el servidor y algun curioso podria interceptarla husmeando en la red.
Como podemos hacer para que viaje encriptada ? (supongo que utilizando ssh pero no se como hacerlo).

Saludos

Pablo Morales 2012-08-08 00:18:17
@Dudoso para eso tenes que usar https :)

tavo 2012-09-16 12:04:00
Una consulta como puedo hacer para que la pagina este siempre activa.
Me explico, que cuando salgo de navegador no se cierre la sesión y cuando abro el navegador que ya este la sesión. He visto algunas páginas que tiene opción no serrar sesión, como podría hacer eso con zend framework
gracias

@pacho911 2012-09-17 10:40:29
@tavo MMMM, todo depende, pero creo que eso que deseas no es lo mas seguro que digamos, precisamente zend funciona (a mi modo de ver) que almacena cookies o sesiones, que se mantienen cuando el navegador este activo, pero si se cierran todas las intancias del navegador, zend o la aplciacon de zend no ve esas credenciales, por lo tanto debe iicarse sesion, creoq ue es la manera segura y logica, ud pongase a pensar que ud no cerrara sesion y cerrara los navegadores y se fuese del pc y llegase otra persona y abra el navegador y ve la aplicaciona bierta, puede jodernos, ves

Una cosa distinta es que ud tenga el navegador abierto y un pestaña donde este la aplciacion de zend y al cerrar la pestaña y ud volver a abrir una neuva pestaña e ingresar de enuvo a la aplicacion se ve la sesion activa.

Kathy 2012-10-21 02:13:24
¡Excelente Tutorial!.. Me sirvió de mucho.. Gracias!!..:)

wilson 2012-10-26 18:49:32
Hola te cuento q quiero realizar un proyecto en zend framework, el problema es q no encuentro por ningun lado como realizar la conexion a postgres. agradeceria mucho tu ayuda... gracias

@pacho911 2012-10-26 19:26:25
Bueno, cuentame, en donde estas desarrollando en local o en un servidor directamente????

wimigo03@hotmail.com 2012-10-29 09:20:00
AHORITA ESTOY DESARROLLANDO COMO LOCAL... PARA LUEGO PONERLO EN UN SERVIDOR

Wilson 2012-10-29 09:25:16
Hola soy wilson me olvide poner el nombre en mi anterior comentario... como te decia estoy desarrollando como local en estos momentos.. ya realize antes un trabajo similar pero lo hice en Mysql. ahora me solicitan que lo haga en Postgres y estoy tropezando con problemas a la hora de realizar la conexion... pense q solo era de cambiar algunas en el application.ini pero no conecta... este es el codigo que cambie para intentar conectar a postgres espero q puedas ayudarme.
resources.db.adapter = pdo_pgsql
resources.db.params.host = localhost
resources.db.params.username = postgres
resources.db.params.password = infor
resources.db.params.dbname = prueba
resources.db.isDefaultTableAdapter = true

Wilson 2012-11-13 17:11:49
Alguien sabe como conectarse a dos base de datos mediante zend framework y postgresql...

@pacho911 2012-11-13 17:23:15
Que usas WampSever?, escribeme un coreo y quizas te ayude, quizas algo falta en el server emultte, y si, si se puede conectar a dos o mas bases de datos postgresql, bueno yo tengo una forma, no se si se peuda optimizar. franpisa911@gmail.com

Javier Acosta 2012-12-03 23:29:18
esta muy buena su aporte esperos que sigue adelante con su contribucion le agradesco muchisimo.

Vitho - Gif animados 2013-03-13 18:31:31
Exelente, me sirvio mucho

Se agradece el esfuerzo

Jose 2013-05-05 03:59:02
Hola podrías realizar un tutorial del manejo Zend Mail?