EC-CUBEはデフォルト設定では、非会員の人も商品を閲覧、検索、購入できるようになっています。
非会員は特定の機能を使用できないように変更してみます。
EC-CUBEのインスタンスの基底となるファイルは/data/class/pages/LC_Page.phpです。
そして、基底ファイルはそれしかありません。
対応する/data/class_extends/page_extends/LC_Page_Ex.php的なものが存在しません。
つまり、サイト全体に関わる変更を行いたい場合は直接これをいじるしかないんだよね。
また、LC_Page::process()は、継承されたクラスでは何故か呼び出されていません。
従って、LC_Page::init()で判定を行う必要があります。
/data/class/pages/LC_Page.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
function init() {
//ログインしていない場合、指定したページの閲覧を禁止します
//2回目以降の呼び出しではログインチェックをパス
static $login_checked=false;
if($login_checked===true){return true;}
$login_checked=true;
//ログインを強要するURLリスト
$force_login_page=array(
'products/' //商品ページ、検索等
,'cart/' //買い物かご
,'shopping/' //購入ページ
);
//$force_login_pageにひっかからなければ何もしない
if($this->str_match_array(
$_SERVER['PHP_SELF'],$force_login_page) === false){
return true;
}
//ログインチェックし、ログイン状態であれば何もしない
$objCustomer = new SC_Customer();
if($objCustomer->isLoginSuccess()) {
return true;
}
//ログイン状態でなければサイトトップにリダイレクト
$this->sendRedirect(SITE_URL);
}
/*
* ↑LC_Page::init()で使ってる、単なる配列対応のpreg_match()的なもの
*/
function str_match_array($haystack,$needle_array) {
if(!is_array($needle_array)){return false;}
$needle_array=array_unique($needle_array,SORT_STRING);
foreach($needle_array as $needle){
if(strpos($haystack,$needle)!==false){
return true;
}
}
return false;
}
|
以上で、商品ページおよび検索機能、買い物かご、購入ページはログイン状態でないと使用できないようになりまし……管理画面の商品管理(/html/admin/products/)で誤爆する!
URLにadminが入ってたらログイン強要URLから排除、みたいなロジックを入れておきましょう。
会員登録やマイページ、各ブロックや前回作ったヴィジェットなどは今までどおり使用できます。
今回はサイトトップにリダイレクトしてますが、もちろんエラーページの表示などを行うこともできます。
作成しながら気になったのですが、このLC_Page、ページやブロックを呼び出すたびに毎回実行されます。
サイトトップにログインブロック、商品検索ブロック、新着情報ブロック、お薦め商品ブロック、カレンダーブロックを表示していたらLC_Page::init()がなんと6回も実行されることに。
ログイン状態は一回チェックしたら2回目以降はチェックする必要ありません。
毎回SC_Customerのインスタンス化とか非常に無駄ですので、2回目以降はパスするようにしましょう。
今回は手っ取り早くstaticで実装しています。
ブロックは/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc.phpのLC_Page_FrontParts_Blocを継承しているので、ブロックにだけ行いたい処理があった場合はそちらに書けばいいのですが、レイアウトだけが継承しているクラスは無く、いきなりLC_Pageを継承しています。
なのでレイアウトにだけ行いたい処理を書いたりする場所がありません。
LC_Page_FrontParts_Bloc::init()にparent::init_block()とか書いて無理矢理分類するしかないんじゃろうか。
マスタデータを覗いていたらmtb_disable_logoutなるテーブルを見つけたので、これを利用すればいちいち実装しなくてもどうにかなるのかもしれないがよくわからなかった。
↓参考
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=870&forum=10
EC-CUBEの記事