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
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!
se agradece, como seria mandar al index.php al cerrar la sesion ?
ResponderEliminarHola,
ResponderEliminarDejando la línea 78 así:
Tools::redirect('index.php');
¿Y como se podría redireccionar a la misma página que estoy visitando?
ResponderEliminarno 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
Hola, echa un vistazo a esto:
Eliminarhttps://www.prestashop.com/forums/topic/266211-solved-redirect-to-last-page-after-login-15/
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!
ResponderEliminarPerdón, pero no he entendido muy bien lo que quieres hacer.
EliminarCuando 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!
EliminarHola,
EliminarPerdón por la tardanza en responder. He comprobado el código y éste también redirige a un CMS cuando el usuario se "registra".
Perdón, ha sido fallo mío, ya he descubierto cómo hacerlo, pero tiene algunos inconvenientes, si te interesa seguimos hablando.
EliminarHola Francisco Javier.
EliminarA mi me interesa saber como, para presashop 1.5.6.
Tú dirás y muchas gracias
Hola Fernando,
EliminarTambién se puede hacer para Prestashop 1.5.