Ciao Ragazzi,
poco tempo fa mi è capitato di dover realizzare un sito di E-Commerce dove era necessario che gli utenti effettuassero la Login prima ancora di vedere le pagine dei prodotti.
In giro per la rete si trovano diverse soluzioni, ma creano problemi con le versioni 2.x di Opencart.
Vediamo come prenderlo in giro e far fare quello che vogliamo noi.
Opencart utilizza il framework MVC (Model-View-Controller) quindi per prima cosa andremo a realizzare un Controller che crei le condizioni che ci servono.
Dentro la cartella catalog/controller/common/ creiamo un file chiamato login.php
Dentro questo file:
Class ControllerCommonLogin extends Controller {
public function index() {
if($this->config->get('config_store_id') == 0) { // if desired store, continue checking
$skip = array(
'product/category',
'product/search',
'product/manufacturer/info',
'common/home',
);
$route = empty($this->request->get['route']) ? 'common/home' : $this->request->get['route'];
if(!$this->customer->isLogged()) { // Check user isn't logged in
if(in_array($route, $skip)) { // Redirect if route isn't account/login
$this->load->language('account/register');
$this->response->redirect($this->url->link('account/login','','SSL'));
}
}
}
}
}
Spieghiamo un po’ questo codice. Per prima cosa creiamo una classe ControllerCommonLogin che estende Controller.
Il metodo principale che ridefinisce è il metodo index().
$this->config->get('config_store_id') == 0
Con questo codice controlliamo per quale Store vogliamo implementare il controllo (di default lo store_id è 0)
Creiamo un array con le pagine che NON vogliamo siano accessibili.
Se l’utente non è loggato e sta cercando di accedere ad una delle pagine proibite
in_array($route, $skip)
Il sistema effettua la redirect verso la pagina di Login utente.
Per rendere effettivo il nostro hack, dobbiamo inserire il Controller appena creato nella index.php del sito subito dopo la voce:
$controller->addPreAction(new Action('common/maintenance'));
Ecco come risulterà la nostra index.php dopo la modifica:
// Maintenance Mode
$controller->addPreAction(new Action('common/maintenance'));
// Login needed pre-action
$controller->addPreAction(new Action('common/login'));
Enjoy!