THE SAUNA これが噂のパラダイス
THE SAUNA これが噂のパラダイス
2012.06.26

これだけは理解しておこう!EC-CUBEのページ毎に行われる処理の流れ

づや

EC-CUBEのversionが2.12になって、ダウンロードに会員登録が必要になったり、プラグインが必要になったりといろいろ変化がありました。

ver2.11以前の知識を元に、初心に帰る意味もこめて大まかにコードを追ってみたいと思います。

ディレクトリ構成

ここは昔と変化はなさそう。「data」「html」「test」「docs」の4が解凍後に入っていました。

  • data  ここがプログラムの本体
  • html  画像やCSSがあったり、URLから呼ばれるphpファイルがある公開用のディレクトリ
  • test  PHPUnitを利用した、ECCUBEのテスト用コードがあるディレクトリ
  • docs  ER図とかドキュメントがありますが、ver2.11用でした

html ディレクトリの中

htmlディレクトリの中は、URLにアクセスがあった際に呼ばれるファイル群があり、やってることはほぼ同じで、下記のようになっています。

パス:/html/index.php

<br />
require_once './require.php';<br />
require_once CLASS_EX_REALDIR . 'page_extends/LC_Page_Index_Ex.php';</p>
<p>// }}}<br />
// {{{ generate page</p>
<p>$objPage = new LC_Page_Index_Ex();<br />
register_shutdown_function(array($objPage, 'destroy'));<br />
$objPage->init();<br />
$objPage->process();<br />

まず共通処理を読み込んでいき、URL毎に対応したクラスのインスタンスを作って、init → process の順番で関数を呼んでいます。
上のコードはTOPページ用のもののため、LC_Page_Index_Exクラスを利用しているのですが、ここがページによって違ってくる部分になるので、LC_Page_Index_Exのinitとprocessの中身を見てみると、下記となっています。

パス:/data/class_extends/page_extends/LC_Page_Index_Ex.php

<br />
class LC_Page_Index_Ex extends LC_Page_Index {</p>
<p>    // }}}<br />
    // {{{ functions</p>
<p>    /**<br />
     * Page を初期化する.<br />
     *<br />
     * @return void<br />
     */<br />
    function init() {<br />
        parent::init();<br />
    }</p>
<p>    /**<br />
     * Page のプロセス.<br />
     *<br />
     * @return void<br />
     */<br />
    function process() {<br />
        parent::process();<br />
    }</p>
<p>    /**<br />
     * デストラクタ.<br />
     *<br />
     * @return void<br />
     */<br />
    function destroy() {<br />
        parent::destroy();<br />
    }<br />
}<br />

「ほにゃらら_Ex」クラスはインストールした状態だと全部この形になっていて、initとproceessは親クラスの処理を呼んでいるだけなので、親クラスのLC_Page_Indexを見てみます。

パス:/data/class/pages/LC_Page_Index.php

<br />
class LC_Page_Index extends LC_Page_Ex {</p>
<p>    // }}}<br />
    // {{{ functions</p>
<p>    /**<br />
     * Page を初期化する.<br />
     *<br />
     * @return void<br />
     */<br />
    function init() {<br />
        parent::init();<br />
    }</p>
<p>    /**<br />
     * Page のプロセス.<br />
     *<br />
     * @return void<br />
     */<br />
    function process() {<br />
        parent::process();<br />
        $this->action();<br />
        $this->sendResponse();<br />
    }</p>
<p>    /**<br />
     * Page のアクション.<br />
     *<br />
     * @return void<br />
     */<br />
    function action() {<br />
        $this->tpl_title = '';<br />
        $objCustomer = new SC_Customer_Ex();<br />
        $this->isLogin = $objCustomer->isLoginSuccess(true);<br />
    }</p>
<p>    /**<br />
     * デストラクタ.<br />
     *<br />
     * @return void<br />
     */<br />
    function destroy() {<br />
        parent::destroy();<br />
    }<br />
}<br />

initはさらに親クラスのinitを呼んでいて、processはactionとsendResponseを呼んでいますが、sendResponseも親クラスにある共通処理となるため、actionの中身がTOPページで行っている独自処理となります。

そのため、基本的にはLC_Page_Index_Exの方にaction関数を作成して、そちらに独自の処理を書いて行くのが基本となります。

<br />
    /**<br />
     * Page のアクション.<br />
     *<br />
     * @return void<br />
     */<br />
    function action() {<br />
        // ここにオリジナル処理を書いたりする<br />
        // 必要に応じて、parent::action();で親のactionを呼ぶのもありです<br />
    }<br />

LC_Page_Index_Exではなく、直接LC_Page_Indexのactionをいじってもよいのですが、マイナーバージョンアップした時にファイルを置き換えるだけで済む様にExの方に追加処理を書くのがいいと思います。