JON SEGADOR
  • Portada
  • Programador Freelance
  • Proyectos
  • Blog
  • Contacto

 

Formulario de login (y logout) básico en Symfony 1.4

marzo 3, 2011

En el post anterior creamos un sistema de registro de usuarios básico para Symfony 1.4. Lo que vamos a hacer ahora es un sistema de login (y logout) para que el usuario pueda iniciar sesión en nuestra web.

Primero creamos el formulario de login, por lo que creamos un nuevo archivo:

/lib/form/LoginForm.class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class LoginForm extends BaseForm
{
  public function configure()
  {
    parent::configure();
 
    $this->setWidgets(array(
      'email'        => new sfWidgetFormInput(),
      'password'  => new sfWidgetFormInputPassword(),
    ));    
 
    $this->setValidators(array(
      'email'        => new sfValidatorEmail(array('required'=>true), array('required'=>'El email es obligatorio')),
      'password'  => new sfValidatorString(array('required'=>true), array('required'=>'Escribe tu contraseña')),
    ));
 
    $this->widgetSchema->setNameFormat('login[%s]');
    $this->widgetSchema->setFormFormatterName('list');
 
  }
 
}

<?php class LoginForm extends BaseForm { public function configure() { parent::configure(); $this->setWidgets(array( 'email' => new sfWidgetFormInput(), 'password' => new sfWidgetFormInputPassword(), )); $this->setValidators(array( 'email' => new sfValidatorEmail(array('required'=>true), array('required'=>'El email es obligatorio')), 'password' => new sfValidatorString(array('required'=>true), array('required'=>'Escribe tu contraseña')), )); $this->widgetSchema->setNameFormat('login[%s]'); $this->widgetSchema->setFormFormatterName('list'); } }

El formulario no tiene mayor misterior. Un input text para el email y un input password para la contraseña. Validamos que se hayan rellenado los dos campos.

Editamos las actions del módulo user que creamos en el post anterior para añadir el login.

/apps/frontend/modules/user/actions/actions.class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class userActions extends sfActions
{
  public function executeLogin(sfWebRequest $request)
  {
    $this->form = new LoginForm();
 
    if($request->isMethod("post")){
        $this->form->bind($request->getParameter("login"));
 
        if($this->form->isValid()){
           if(!$user = UserTable::login($this->form->getValue("email"), $this->form->getValue("password"))){
               // No hemos conseguido loguear al usuario
               // Redirigimos de nuevo al login con un mensaje de error
               $this->getUser()->setFlash("error", "datos incorrectos");
               $this->redirect("@user_login");
           }else{
               // Logueamos
               $this->getUser()->setAuthenticated(true);
               $this->getUser()->setAttribute("id",$user->id);
 
               // Comprobamos si tiene referer, si no, le llevamos a la homepage
               $url = $this->getUser()->getAttribute("referer",false)?:"@homepage";
               $this->getUser()->setAttribute("referer", false);
               $this->redirect($url);
           }
        }
 
  }
 
}

<?php class userActions extends sfActions { public function executeLogin(sfWebRequest $request) { $this->form = new LoginForm(); if($request->isMethod("post")){ $this->form->bind($request->getParameter("login")); if($this->form->isValid()){ if(!$user = UserTable::login($this->form->getValue("email"), $this->form->getValue("password"))){ // No hemos conseguido loguear al usuario // Redirigimos de nuevo al login con un mensaje de error $this->getUser()->setFlash("error", "datos incorrectos"); $this->redirect("@user_login"); }else{ // Logueamos $this->getUser()->setAuthenticated(true); $this->getUser()->setAttribute("id",$user->id); // Comprobamos si tiene referer, si no, le llevamos a la homepage $url = $this->getUser()->getAttribute("referer",false)?:"@homepage"; $this->getUser()->setAttribute("referer", false); $this->redirect($url); } } } }

Tenemos que comprobar si existe ese email junto con esa contraseña en nuestra base de datos. Si es así, logueamos al usuario y, si no, mostramos un mensaje de error.
La comprobación de si existe el usuario en la base de datos la hacemos en la linea 12, donde llamamos al método estático «login» del archivo UserTable.class.php del modelo.

/lib/model/doctrine/UserTable.class.php

1
2
3
4
5
6
7
8
9
10
11
<?php
class UserTable extends Doctrine_Table
{
    public static function login($email,$password){
      return Doctrine_Query::create()
        ->from('User u')
	->where('u.email = ?', array($email))
        ->andWhere('u.password = ?', array(md5($password))) // Podrimos usar otro algoritmo, en este caso utilizamos md5
	->fetchOne();
    }
}

<?php class UserTable extends Doctrine_Table { public static function login($email,$password){ return Doctrine_Query::create() ->from('User u') ->where('u.email = ?', array($email)) ->andWhere('u.password = ?', array(md5($password))) // Podrimos usar otro algoritmo, en este caso utilizamos md5 ->fetchOne(); } }

Y eso es todo, lo más sencillo para el final: la plantilla donde mostramos el formulario.

/apps/frontend/modules/user/templates/loginSuccess.php

1
2
3
4
5
6
7
<?php if($sf_user->getFlash("error")): ?>
    <div class="error"><?php echo $sf_user->getFlash("error"); ?></div>
<?php endif; ?>
<form action="<?php echo url_for("@user_login"); ?>" method="post">
  <?php echo $form; ?>
  <input type="submit" value="Entrar" />
</form>

<?php if($sf_user->getFlash("error")): ?> <div class="error"><?php echo $sf_user->getFlash("error"); ?></div> <?php endif; ?> <form action="<?php echo url_for("@user_login"); ?>" method="post"> <?php echo $form; ?> <input type="submit" value="Entrar" /> </form>

En este paso sería lógico desarrollar el logout para poder cerrar la sesión en la web. Para ello modificamos de nuevo la actions de nuestro módulo para añadir la nueva funcionalidad:

/apps/frontend/modules/user/actions/actions.class.php

1
2
3
4
5
6
7
8
9
<?php
class userActions extends sfActions
{
  public function executeLogout(sfWebRequest $request){
    $this->getUser()->setAuthenticated(false);
    $this->getUser()->getAttributeHolder()->clear();
    $this->redirect("@homepage");
  }
}

<?php class userActions extends sfActions { public function executeLogout(sfWebRequest $request){ $this->getUser()->setAuthenticated(false); $this->getUser()->getAttributeHolder()->clear(); $this->redirect("@homepage"); } }

Para ejecutar el logout, solo debemos crear un enlace en nuestra web donde se llame a esta action. No necesitamos plantilla ya que después de logout siempre redirigiremos a la homepage.

<?php echo link_to("Cerrar sesión", '@user_logout'); ?>

<?php echo link_to("Cerrar sesión", '@user_logout'); ?>

Debemos añadir las siguientes rutas en el archivo routing.yml:

user_login:
  url:   /login
  param: { module: user, action: login }
 
user_logout:
  url:   /logout
  param: { module: user, action: logout }

user_login: url: /login param: { module: user, action: login } user_logout: url: /logout param: { module: user, action: logout }

Cualquier duda en los comentarios!

Desarrollo Symfony 1.4
Jon
16 comentarios

Tags ; formularios , login , logout , registro , Symfony 1.4

16 comentarios

    Bruno Mar 21, 2011

    Buena muchas gracias! aunque… La primera parte para fregistrarse me funcionó bien, pero la parte de hacer el login cuando ingreso un nombre (mail, le puse nombre en vez de mail) y password en la pagina login «Invalid». Es decir que el form no es válido, al menos eso creo porque tampoco entra al if($this->form->isValid()) de la accion executeLogin(sfWebRequest $request) :S…

    La verdad llevo unas semanas metiéndome en Symfony recién, no sé si ya te había pasado eso a tí.

    De todas maneras gracias por el tutorial, si se te ocurre que puedo estar haciendo mal te agradecería que pudieras indicarmelo.

    Saludos!

    Responder
    Jon Mar 21, 2011

    ¿Te muestra algún error la barra de debug?

    Fijate que no hayas cambiado estas dos líneas:

    En LoginForm.class.php
    $this->widgetSchema->setNameFormat(‘login[%s]’);

    En actions.class.php
    $this->form->bind($request->getParameter(«login»));

    Responder
    Bruno Mar 21, 2011

    mmm Nops no las he cambiado…

    La primera parte es está así,

    ————————
    …
    $this->widgetSchema->setNameFormat(‘login[%s]’);
    $this->widgetSchema->setFormFormatterName(‘list’);
    }
    }
    ————————

    Exactamente igual a tu parte y la parte de la acción está así

    ————————
    public function executeLogin(sfWebRequest $request)
    {
    $this->form = new LoginForm();
    $this->flag=0;

    if($request->isMethod(«post»)){

    $this->flag=1;
    $this->form->bind($request->getParameter(«login»));
    if($this->form->isValid()){
    …
    ———————–

    El flag lo agregué nada más para darme cuenta hasta que if entraba

    Seguiré revisando a ver que pasa :/

    Saludos

    Responder
    Jon Mar 22, 2011

    Dices que has puesto «nombre» en vez de «email». Quizás el formulario no te valida por que estás escribiendo un nick, siendo el validador un sfValidatorEmail, por lo que debes escribir un email en el campo «nombre».

    Responder
    Alejo Abr 19, 2011

    yo estoy haciendo lo del login pero necesito con propel noc si me pudieras ayudar con eso

    Responder
    n0dix Abr 20, 2011

    Solo queria agradecer por este pequeño tuto. Me ha servido de mucha ayuda.

    Gracias! 😀

    Responder
    carlos May 18, 2011

    buenas tardes, muy buena la información, quisiera saber si tiene alguna información sobre el uso de permisos y demás del uso del plugin sfDoctrineGuardPlugin. gracias,

    Responder
    casor May 31, 2011

    Hola buen manual, pero tengo una duda, como hacer por si son diferentes tipos de usuarios, estoy haciendo un sistema donde son 3 tipos diferentes (alumno, maestro, admin), y pues cada uno tiene diferente paginas cuando entran, como se haria el login

    Responder
    Jon Jun 15, 2011

    Hola casor, deberías incluir un nuevo campo en tu base de datos llamado, por ejemplo, user_type. El login se haría igual pero, al cargar los datos del usuario que acaba de iniciar sesión, deberías comprobar el valor de user_type y cargar una página u otra dependiendo del tipo de usuario que sea.

    Un saludo.

    Responder
    matudelatower Jul 13, 2011

    Que tal yo tambien utilizo propel y que es lo que tendria que editar en vez de la
    «class UserTable extends Doctrine_Table»

    algun ejemplo?

    Responder
    Cristhian Montoya Feb 25, 2012

    Hola, muchas gracias por el post…
    Se puede verificar que la direccion de correo exista (no solo que sea vAlida sino existente)?

    Responder
    walterio Nov 26, 2012

    Hola,

    hice el ejemplo tal cual pero tengo una problema pero cuando se loguea. Al volver al layout.php y quiero mostrar el nombre el usuario que se logueo tiene la propiedad $sf_user->isAuthenticated() en false. Que puede estar fallando?

    Gracias

    Responder
    jose alvarez May 24, 2013

    lo hice tal cual pero no acepta las validaciones pasa directo

    Responder
    MarcosGilabert May 25, 2013

    walterio,
    tienes que crear una clase usuario en tuapp/lib, por ejemplo myUser.class.php y que extienda de sfBasicSecurityUser.
    No se menciona en este artículo.

    Responder
    Jorge H Jun 13, 2013

    ¡Felicitaciones por el sistema de logueo! Para los que necesitamos algo simple, esta es la solución ideal

    Responder
    rene Oct 29, 2015

    hola amigo e seguido los pasos peor cuando ingreso el formulario, me sale el siguiente error..
    Notice: Undefined variable: form in /Applications/MAMP/htdocs/abcofinal/apps/frontend/modules/contacto/templates/indexSuccess.php on line 177

    Fatal error: Call to a member function render() on a non-object in /Applications/MAMP/htdocs/abcofinal/apps/frontend/modules/contacto/templates/indexSuccess.php on line 177

    Responder

Escribe un comentario Cancelar la respuesta

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.

CATEGORÍAS


  •  Android
  •  Bases de datos
  •  Desarrollo
  •  General
  •  iOS
  •  Javascript
  •  Opinión personal
  •  Proyectos propios
  •  Seguridad
  •  Servidores
  •  Symfony
  •  Symfony 1.4
  •  Symfony 2
  • Desarrollo de aplicaciones móviles iOS y Android.
  • Desarrollo de videojuegos para móviles, PC y consolas.
  • Expertos en desarrollo web con Symfony y Wordpress.
  • Desarrollo de aplicaciones de Realidad Virtual y Realidad Aumentada.

ARTÍCULOS DESTACADOS


Me han suspendido la aplicación de Cercanías Renfe para Android

2 años, 100.730 instalaciones totales y 51.896 instalaciones activas. Eso es lo ...

Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad

Me he decidido a hacer una serie de posts a modo de curso para empezar a ...

Horarios de trenes de cercanías Renfe en tu móvil Android

Al fín he terminado esta aplicación que tenía en mente desde que tengo un ...

Configurar reCAPTCHA 2.0 con PHP

Hoy en día es totalmente necesario utilizar un captcha en los formularios de ...

Mostrar/cargar imagen externa en una aplicación Android

Muchas veces nos encontramos con el problema de tener que cargar imagenes, que ...

Etiquetas


Android aplicacion android aplicación array base de datos bitbucket bundle cocos2d-x desarrollo doctrine eclipse error formularios git github ide imagen ios ipad iphone java localhost logout market mysql netbeans notepad nsurl objective-c opensuse php programación programadores registro renfe rsa security servidor silex ssh ssh-keygen svn Symfony 1.4 Symfony 2 UIApplication

SOBRE MI


Programador freelance de aplicaciones y juegos para iOS y Android. Desarrollo de proyectos y páginas web.

ÚLTIMOS ARTÍCULOS


  • [PHP] Enviar cabeceras http con la función file_get_contents (sin cURL)
  • Utilizar Symfony 4 como si fuera Silex
  • Android: Convertir URLs en enlaces dentro de un TextView
  • Configurar reCAPTCHA 2.0 con PHP
  • WordPress: Permisos de archivos y carpetas en un servidor con Plesk

SECCIONES


Portada

Programador freelance

Proyectos

Blog

Contacto

Política de privacidad

CONTACTA CONMIGO


Jon Segador

info@jonsegador.com

633 741 562

Bilbao (España)

© Jon Segador

Esta web utiliza cookies propias y cookies de terceros para fines estadísticos. La navegación por la web supone la aceptación de estas cookies. Más información