Redireccionar a una página de nuestra elección después de iniciar sesión en Prestashop

06 abril, 2015 |

Si te gusta, compártelo ;)

Ventana modal en Prestashop al cargar página

En Prestashop existe una función llamada redirect() que sirve para "redireccionar" a un usuario a una URL determinada. Obviamente nosotros podemos elegir esa URL. Esta función se encuentra en ../prestashop/classes/Tools.php

En este tutorial vamos a aprender a "redireccionar" a los usuarios de nuestra tienda a la página que queramos cuando inicien sesión en nuestra tienda.

La forma de utilizar el método sería así:
Tools::redirect('url');


Compatibilidad: Prestashop 1.5 y
Prestashop 1.6

Descargar los archivos del proyecto

El controlador AuthController

Para "redirigir" a un usuario tras iniciar sesión, debemos editar el archivo AuthController.php. Es preferible no tocar el archivo original, por lo tanto crearemos un override sobre el original, así que, copiemos el archivo AuthController.php y peguémoslo en prestashop/override/controllers/front

Borremos todo el contenido del controlador que acabamos de pegar en la carpeta override, y en su lugar pegar esto:

<?php

class AuthController extends AuthControllerCore
{
}

Ahora debemos tomar la función processSubmitLogin() del archivo original, ubicado en ../prestashop/controllers/front
A continuación debemos pegarla en el archivo de nuestro override, de forma que quede así:

<?php

class AuthController extends AuthControllerCore
{

protected function processSubmitLogin()
 {
  Hook::exec('actionBeforeAuthentication');
  $passwd = trim(Tools::getValue('passwd'));
  $email = trim(Tools::getValue('email'));
  if (empty($email))
   $this->errors[] = Tools::displayError('An email address required.');
  elseif (!Validate::isEmail($email))
   $this->errors[] = Tools::displayError('Invalid email address.');
  elseif (empty($passwd))
   $this->errors[] = Tools::displayError('Password is required.');
  elseif (!Validate::isPasswd($passwd))
   $this->errors[] = Tools::displayError('Invalid password.');
  else
  {
   $customer = new Customer();
   $authentication = $customer->getByEmail(trim($email), trim($passwd));
   if (isset($authentication->active) && !$authentication->active)
    $this->errors[] = Tools::displayError('Your account isn\'t available at this time, please contact us');
   elseif (!$authentication || !$customer->id)
    $this->errors[] = Tools::displayError('Authentication failed.');
   else
   {
    $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
    $this->context->cookie->id_customer = (int)($customer->id);
    $this->context->cookie->customer_lastname = $customer->lastname;
    $this->context->cookie->customer_firstname = $customer->firstname;
    $this->context->cookie->logged = 1;
    $customer->logged = 1;
    $this->context->cookie->is_guest = $customer->isGuest();
    $this->context->cookie->passwd = $customer->passwd;
    $this->context->cookie->email = $customer->email;

    // Add customer to the context
    $this->context->customer = $customer;

    if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id))
     $this->context->cart = new Cart($id_cart);
    else
    {
     $id_carrier = (int)$this->context->cart->id_carrier;
     $this->context->cart->id_carrier = 0;
     $this->context->cart->setDeliveryOption(null);
     $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)($customer->id));
     $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)($customer->id));
    }
    $this->context->cart->id_customer = (int)$customer->id;
    $this->context->cart->secure_key = $customer->secure_key;

    if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE'))
    {
     $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier.',');
     $this->context->cart->setDeliveryOption($delivery_option);
    }

    $this->context->cart->save();
    $this->context->cookie->id_cart = (int)$this->context->cart->id;
    $this->context->cookie->write();
    $this->context->cart->autosetProductAddress();

    Hook::exec('actionAuthentication');

    // Login information have changed, so we check if the cart rules still apply
    CartRule::autoRemoveFromCart($this->context);
    CartRule::autoAddToCart($this->context);

    if (!$this->ajax && $back = Tools::getValue('back'))
    {
     if ($back == Tools::secureReferrer(Tools::getValue('back')))
      Tools::redirect(html_entity_decode($back));

     $back = $back ? $back : 'my-account';
     Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : $back));
    }
   }
  }
  if ($this->ajax)
  {
   $return = array(
    'hasError' => !empty($this->errors),
    'errors' => $this->errors,
    'token' => Tools::getToken(false)
   );
   die(Tools::jsonEncode($return));
  }
  else
   $this->context->smarty->assign('authentification_error', $this->errors);

 }
}

Únicamente deberemos hacer un cambio en la línea 78:

Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : $back));

Simplemente deberemos pasar la URL como parámetro a este método. Supongamos que queremos "redirigir" a un usuario a una página CMS, pues simplemente deberemos pasar esto como parámetro:

'index.php?controller=cms&id_cms=3'

El 3 corresponde al id de la página CMS. Si queremos llevar a nuestros usuarios a cualquier página CMS solo debemos tomar nota del id del CMS y cambiarlo en la línea antes mencionada.

Si quisieramos "redirigir" a un usuario a una página de producto tendríamos que utilizar el siguiente formato:

'index.php?controller=product&id_product=1'

Donde el 1 corresponde al id del producto en cuestión.

Aunque si no queremos complicarnos, incluso podríamos utilizar una ruta absoluta, tal que así:

Tools::redirect('http://nuestro_sitio/prestashop_1.6/');

El código completo

Aquí tenéis el código completo del override que dirigirá a un usuario a una página CMS con id 3 cuando inicie sesión en nuestra tienda prestashop:.

<?php

class AuthController extends AuthControllerCore
{

protected function processSubmitLogin()
 {
  Hook::exec('actionBeforeAuthentication');
  $passwd = trim(Tools::getValue('passwd'));
  $email = trim(Tools::getValue('email'));
  if (empty($email))
   $this->errors[] = Tools::displayError('An email address required.');
  elseif (!Validate::isEmail($email))
   $this->errors[] = Tools::displayError('Invalid email address.');
  elseif (empty($passwd))
   $this->errors[] = Tools::displayError('Password is required.');
  elseif (!Validate::isPasswd($passwd))
   $this->errors[] = Tools::displayError('Invalid password.');
  else
  {
   $customer = new Customer();
   $authentication = $customer->getByEmail(trim($email), trim($passwd));
   if (isset($authentication->active) && !$authentication->active)
    $this->errors[] = Tools::displayError('Your account isn\'t available at this time, please contact us');
   elseif (!$authentication || !$customer->id)
    $this->errors[] = Tools::displayError('Authentication failed.');
   else
   {
    $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
    $this->context->cookie->id_customer = (int)($customer->id);
    $this->context->cookie->customer_lastname = $customer->lastname;
    $this->context->cookie->customer_firstname = $customer->firstname;
    $this->context->cookie->logged = 1;
    $customer->logged = 1;
    $this->context->cookie->is_guest = $customer->isGuest();
    $this->context->cookie->passwd = $customer->passwd;
    $this->context->cookie->email = $customer->email;

    // Add customer to the context
    $this->context->customer = $customer;

    if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id))
     $this->context->cart = new Cart($id_cart);
    else
    {
     $id_carrier = (int)$this->context->cart->id_carrier;
     $this->context->cart->id_carrier = 0;
     $this->context->cart->setDeliveryOption(null);
     $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)($customer->id));
     $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)($customer->id));
    }
    $this->context->cart->id_customer = (int)$customer->id;
    $this->context->cart->secure_key = $customer->secure_key;

    if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE'))
    {
     $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier.',');
     $this->context->cart->setDeliveryOption($delivery_option);
    }

    $this->context->cart->save();
    $this->context->cookie->id_cart = (int)$this->context->cart->id;
    $this->context->cookie->write();
    $this->context->cart->autosetProductAddress();

    Hook::exec('actionAuthentication');

    // Login information have changed, so we check if the cart rules still apply
    CartRule::autoRemoveFromCart($this->context);
    CartRule::autoAddToCart($this->context);

    if (!$this->ajax && $back = Tools::getValue('back'))
    {
     if ($back == Tools::secureReferrer(Tools::getValue('back')))
      Tools::redirect(html_entity_decode($back));

     $back = $back ? $back : 'my-account';
     Tools::redirect('index.php?controller=cms&id_cms=3');
    }
   }
  }
  if ($this->ajax)
  {
   $return = array(
    'hasError' => !empty($this->errors),
    'errors' => $this->errors,
    'token' => Tools::getToken(false)
   );
   die(Tools::jsonEncode($return));
  }
  else
   $this->context->smarty->assign('authentification_error', $this->errors);

 }
}

Suerte!

11 comentarios:

  1. se agradece, como seria mandar al index.php al cerrar la sesion ?

    ResponderEliminar
  2. Hola,
    Dejando la línea 78 así:
    Tools::redirect('index.php');

    ResponderEliminar
  3. ¿Y como se podría redireccionar a la misma página que estoy visitando?
    no me refiero a la pagina my-account, sino que si yo estoy visitando un producto que el link de login dirija al mismo producto o si estoy visitando una categoria que redirija la misma categoria

    saludos

    ResponderEliminar
    Respuestas
    1. Hola, echa un vistazo a esto:

      https://www.prestashop.com/forums/topic/266211-solved-redirect-to-last-page-after-login-15/

      Eliminar
  4. Ya hice esto para los que inician sesión y funciona a la perfección, pero como yo confirmo a los usuarios que se registran, cómo hago para que una vez registrados prestashop lo mande a una CMS (que dice que espere confirmación) en vez de enviarlo directamente a MI CUENTA? Gracias!

    ResponderEliminar
    Respuestas
    1. Perdón, pero no he entendido muy bien lo que quieres hacer.

      Eliminar
    2. Cuando un usuario se registra pro primera vez, yo debo autorizarlo antes de que pueda ver los productos de mi tienda, entonces quiero que una vez terminado su registro no se quede en la pagina "MI CUENTA" sino que lo redirija a una página CMS que diga que su cuenta debe ser verificada antes de poder comprar algo. Muchas gracias por responder!

      Eliminar
    3. Hola,
      Perdón por la tardanza en responder. He comprobado el código y éste también redirige a un CMS cuando el usuario se "registra".

      Eliminar
    4. Perdón, ha sido fallo mío, ya he descubierto cómo hacerlo, pero tiene algunos inconvenientes, si te interesa seguimos hablando.

      Eliminar
    5. Hola Francisco Javier.
      A mi me interesa saber como, para presashop 1.5.6.
      Tú dirás y muchas gracias

      Eliminar
    6. Hola Fernando,
      También se puede hacer para Prestashop 1.5.

      Eliminar