Nogle B2B-shops har behov for at beskytte hele shoppen, så det kun er på forhånd oprettede kunder, der kan komme ind. Her vil jeg vise, hvordan det kan gøres ved at programmere et lille modul til formålet. Modulet skal hver gang en side tilgås kontrollere, om brugere er logget ind, og redirecte til login-siden, hvis login mangler.
I dette eksempel kaldes modulet MyCompany_Customer, og der derfor placeres en MyCompany_Customer.xml fil i app/etc/modules.
1. Konfiguration
app/etc/code/local/MyCompany/Customer/etc/config.xml:
<?xml version="1.0"?>
<config>
<modules>
<MyCompany_Customer>
<version>0.1.0</version>
</MyCompany_Customer>
</modules>
<global>
<helpers>
<mycustomer>
<class>MyCompany_Customer_Helper</class>
</mycustomer>
</helpers>
</global>
<frontend>
<events>
<controller_action_layout_load_before>
<observers>
<MyCompany_Customer_observer>
<type>singleton</type>
<class>MyCompany_Customer_Helper_Observer</class>
<method>checkLogin</method>
</MyCompany_Customer_observer>
</observers>
</controller_action_layout_load_before>
</events>
</frontend>
</config>
Denne konfiguration tilføjer en såkaldt observer til Magento, som kaldes ved en bestemt event. I dette tilfælde er observeren vores egen funktion, som vi laver lige om lidt, og den vil blive kaldt før et layout indlæses.
2. Observer
app/code/local/MyCompany/Customer/Helper/Observer.php:
<?php
class MyCompany_Customer_Helper_Observer extends Mage_Core_Helper_Abstract
{
public function checkLogin($observer)
{
$event = $observer->getEvent();
$controller = $event->getAction();
if (!Mage::getSingleton( 'customer/session' )->isLoggedIn() && $controller->getFullActionName() != 'customer_account_login' && $controller->getFullActionName() != 'customer_account_forgotpassword')
$controller->getResponse()->setRedirect(Mage::getUrl('customer/account/login'));
return $this;
}
}
Her er så vores observer, som kontrollerer, om brugeren er logget ind, og hvis ikke dette er tilfældet redirectes til login-siden. Det er selvfølgelig også vigtigt at huske, at dette check ikke foretages på login-siden selv, da det jo ellers vil resultere i en uendelig redirect-løkke.
Teorien bag
Teknikken, jeg brugte her, var det såkaldte Observer pattern. Fordelen ved at bruge denne teknik er, at det ikke er nødvendigt at override Magento’s core-filer. Vi fortæller blot Magento, at vi gerne vil have vores funktion kaldt ved en bestemt hændelse, og det sørger Magento så for. Magento’s wiki har mere om event-observer metoden.