PrestaShop – Váš obchod přístupný až po přihlášení
Pro verze prestashopu 1.4. a 1.5.
Možná někdo z vás potřeboval přístup k obchodu až po přihlášení uživatele, tzv. b2b model. Nějak jednoduše uzamknout obchod a zpřístupnit ho až po přihlášení. Nejspíše na to existují nějaké moduly, ale proč si to neudělat sám? Je to jednoduché.
Návod na verzi 1.4.
Testováno na verzi 1.4.6.2
Pokaždé, když jdete na nějakou stránku, volá se určitý Controller k dané stránce. Všichni kontroloři mají společného předka /classes/FrontController.php.
Když se podíváme na jeho zdrojový kód, najdeme zde pěknou funkci run():
1
2
3
4
5
6
7
8
9
|
public function run() { $this ->init(); $this ->preProcess(); $this ->displayHeader(); $this ->process(); $this ->displayContent(); $this ->displayFooter(); } |
Na které je pěkně vidět, jak se postupně presta vykonává. Já jsem upravil tuto třídu v metodě preProcess(). Mohli bychom upravit i metodu init(), pokud bychom chtěli ušetřit nějaký ten čas načítání, ale vzhledem k výkonům dnešních serverů je toto zanedbatelné a pro přehlednější úpravu jsem zvolil úpravu metody preProcess(), protože byla prázdná.
Zde je teda upravený kód v metodě preProcess(), tak aby to přesměrovalo nepřihlášeného uživatele na přihlášení:
1
2
3
4
5
6
7
8
|
public function preProcess() { if (!self:: $cookie ->logged || self:: $cookie ->logged == null) { if ( $_SERVER [ 'SCRIPT_NAME' ] != "/authentication.php" && $_SERVER [ 'SCRIPT_NAME' ] != "/password.php" ) { Tools::redirect( 'authentication.php' ); } } } |
Tento kód zajišťoval redirect vždy, když uživatel nebyl přihlášený a nebo na jedné ze stránek authentication.php (přihlašování, nebo registrování), nebo na password.php (pro případ zapomenutí hesla)
Návod na verzi 1.5.
Testováno na verzi 1.5.2
U verze 1.5. je to už o něco složitější. Všechny kontroloři se dědí od classes/controller/Controller.php. To je ale pouze abstraktní třída. Třída, která ovlivňuje frontend je překvapivě classes/controller/FrontController.php.
Bohužel v této verzi a v metodě preProcess() nefunguje upravený kód, který jsem vytvořil (že by zapomněli volat všude v potomcích preProcess()). Byl jsem nucený dát kód do metody init(). U této verze bylo už o něco složitější zpřístupnit registraci, jelikož registraci mají zajištěnou přes AJAX.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
if (! $this ->context->customer->logged) { if ( $this ->ajax === FALSE) { $pattern = '/^controller=authentication/' ; if (preg_match( $pattern , $_SERVER [ 'QUERY_STRING' ]) !== 1) { Tools::redirect( 'authentication' ); } } else { if (isset( $_POST [ 'controller' ]) && $_POST [ 'controller' ] !== 'authentication' ) { $url = '"' . $_SERVER [ 'HTTP_HOST' ] . '/index.php?controller=authentication"' ; $ajax [ 'error' ] = false; $ajax [ 'errors' ] = null; $ajax [ 'page' ] = '<script type="text/javascript">window.location.href=' . $url . '</script>' ; echo json_encode( $ajax ); die ; } } } |
Při navštívení AJAXem jinou stránku než chceme, využívám zpracování odpovědi presty, kdy se vypíše do stránek javascript s redirektem na přihlášení.
Závěr
Takto upravené zdrojáky fungují s jistotou na prestashopu 1.4.6.2 (první kód) a 1.5.2 (druhý kód) s vypnutým nice url v administraci. Je možné že budou fungovat i s nice url, ale otestované to není.
Je možné, že máte nějakým způsobem upravené odkazy na přihlášení nebo registraci, tyto kódy jsou jenom ukázkové, a proto si to upravte podle své potřeby.