忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 13:27 |
EC-CUBE 会員専用サイトに

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
<?php
    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.phpLC_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の記事
 

PR


2010/02/26 22:48 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Xbox360シューティングフェスタ2010に行ってきた | HOME | ==NOVEL PHILOSOMA== 03>>
忍者ブログ[PR]