'Redirect klant naar accountpagina'-functie repareren
Gepubliceerd op 07-02-2011, 23:42
Magento heeft extreem veel functies, de één onmisbaar, de ander minder voor de hand liggend. De gemiddelde webwinkelier zal het merendeel van de functies niet gebruiken en ook wij komen soms een functie tegen die we nog niet eerder nodig hadden. Magento biedt de optie om klanten terug te sturen naar de pagina waar hij of zij vandaan kwam, in plaats van altijd naar de accountpagina te verwijzen. Echter, deze configuratieoptie werkt al een aantal versies niet... En wij gaan hem repareren.
Een klant wil graag een inlogformulier op de voorpagina van zijn Magento webshop. Uiteraard kan dit (je zou dit formulier dankzij de flexibiliteit van Magento zelfs op elke pagina kunnen plaatsen), maar al snel werd duidelijk dat Magento de gebruiker altijd naar de accountpagina doorstuurt na het inloggen. In deze webwinkel moet je ingelogd zijn om de prijzen te kunnen bekijken, dus het ligt meer voor de hand dat de klant dát wilde doen en niet naar de accountpagina wilde. Gelukkig biedt Magento de optie om dit te doen: "Systeem -> Configuratie -> Klant-configuratie -> Aanmeldopties -> Redirect klant naar Accountpagina na inloggen". Deze functie werkt helaas niet, maar daar gaan we wat aan doen.
De code
Dit is de code die uitgevoerd wordt na het inloggen met de doorstuur-optie op 'Nee':
$referer = $this->getRequest()->getParam(Mage_Customer_Helper_Data::REFERER_QUERY_PARAM_NAME);
if ($referer) {
$referer = Mage::helper('core')->urlDecode($referer);
if ($this->_isUrlInternal($referer)) {
$session->setBeforeAuthUrl($referer);
}
}
In bovenstaande code wordt een variabele ‘referer’ uit de postURL (waarnaar de login-gegevens gepost zijn) gehaald die vervolgens gedecodeerd wordt tot een leesbare URL (de urlDecode-functie doet dat op basis van de base64-codering: een URL als http://www.magentowebshop.nu wordt aHR0cDovL3d3dy5tYWdlbnRvd2Vic2hvcC5udQ==). Deze leesbare URL wordt vervolgens in de sessie gezet, zodat hij weer gevonden kan worden op het moment dat daadwerkelijk doorgestuurd gaat worden.
Het probleem
De hierboven genoemde postURL is echter altijd hetzelfde: /customer/account/loginPost/, er is dus nooit een ‘referer’-variabele te vinden. Om deze aan te vullen hebben we de huidige URL nodig:
$this->helper('core/url')->getCurrentUrl();
Deze moet gecodeerd worden en tot een postURL in het volgende formaat gevormd worden: /customer/account/loginPost/referer/aHR0cDovL3d3dy5tYWdlbnRvd2Vic2hvcC5udQ==/.
De form-action van het inlogformulier is standaard:
echo $this->getPostActionUrl();
Dit aangevuld met ‘referer/’ en de gecodeerde URL wordt de uiteindelijke postURL:
echo $this->getPostActionUrl() . 'referer/' . base64_encode($this->helper('core/url')->getCurrentUrl()) . '/';
Op deze manier hebben we de niet-werkende functie gerepareerd zonder core-bestanden aan te passen, de enige wijziging zit in het template van uw Magento webshop waar het inlogformulier aangeroepen wordt.
