Redirecciones en Prestashop
En este breve tutorial de Prestashop, os enseñaremos como lidiar con las redirecciones de la manera mas limpia posible, enviando a nuestros clientes donde ellos quieran despues de loguearse.
Usar redirecciones ‘normales’ en PHP con el metodo header en Prestashop no es muy recomendable. Para ello Prestashop tiene sus propios metodos para redirigir a nuestros clientes a la paguina que quieran, especialmente para el front y el backoffice.
Redirigiendo usuarios al Front office despues de loguear.
Podemos usar dos metodos para redirigir al front office en Prestashop
- Tools::redirect($url)
- Tools::redirectLink($url)
El primero es el que personalmente mas utilizo :
1 | Tools::redirect('order'); |
redirectLink puede usarse de la misma manera. De todas maneras, el anterior tambien nos habilita el uso de una url propia, una ‘link class’ y headers personalizados.
1 | Tools::redirect($url, $base_uri = __PS_BASE_URI__, Link $link = null, $headers = null) |
Generalizadamente no son necesarios, pero pueden ser util en determinados casos. Si solo utilizas el nombre de la pagina, deberias utilizar el de aqui abajo, asegurandote de que existe en la tienda. De otra manera no funcionaria y obtendrias un error 404.
1 | Tools::redirect('ordersomethingelse'); |
1 2 3 | Conociendo este fallo, vamos a ver como redirigir nuestros usuarios a una pagina personalizada despues de loguear. Para ser mas rapidos no utilizaremos overrides. Abrimos el archivo <strong>AuthController.php</strong> localizado en la ruta <strong>controllers - front.</strong>, y nos situamos aproximadamente sobre la linea 620. |
1 2 3 4 5 6 7 8 9 10 11 12 | if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) Tools::redirect(html_entity_decode($back)); // redirection: if cart is not empty : redirection to the cart 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)); } |
Podemos deshacernos de la mayoría ya que realmente queremos que los usuarios lleguen a nuestra página personalizada (en este caso, un producto).
1 2 3 4 | if (!$this->ajax) { Tools::redirect('index.php?controller=product&id_product=1'); } |
Sin importar qué, esto enviará a los usuarios a la página de ese producto cuando inicien sesión.
Redirigiendo usuarios al Backoffice.
Para redirigir a una página de la interfaz de administración, será suficiente usar lo siguiente.
1 | Tools::redirectAdmin($url); |
Sin embargo, recuperar la url puede ser un poco molesto ya que Prestashop usa un token para proteger las páginas de back office. En este caso, primero necesitamos tener la url de la siguiente manera:
1 2 | $link = $this->context->link->getAdminLink('AdminProducts'); Tools::redirectAdmin($link); |
$link contendrá el token necesario para que su página de back office no se bloquee con un error de “token no válido”.
Devolver siempre links correctos,
Aquí hay una lista de métodos que puede usar para recuperar los enlaces de varias entidades en Prestashop.
1 2 3 4 5 6 7 8 9 10 11 | // page link, like 'index', 'order'... $this->context->link->getPagelink('pagename') // CMS page link, first parameter being the cms id $this->context->link->getPagelink(9) // Various entities, with id as the parameter $this->context->link->getSupplierLink(9) $this->context->link->getManufacturerLink(9) $this->context->link->getProductLink(9) $this->context->link->getCategoryLink(9) // Modules, with parameters like ('modulename', 'controller', array(1,2,3)), the array being a list of querystring parameters $this->context->link->getModuleLink('psticket', 'mytickets', array('id_ticket' => 1, 'example' => 1)) |
Y esto es todo, ¡nos vemos en proximos tutoriales!