EC-CUBE カスタマイズ トップページ表示の理解
ソース読みある記/2.3/ページの表示を追う
ユーザーからのリクエストに応えて、
EC-CUBEが呼び出されてページを送り返すまでをやや動作面に重きを置いて追ってみる。
(細かいところはソース読みある記/2.3/index.phpを参照して下さい)
まずはトップページ([root]/html/index.php)の場合。
ユーザーはWEBサーバ(apache)にリクエストを送るのだから、
apacheはこのファイル([root]/html/index.php)を読み込もうとし、
拡張子を見てPHPに処理を渡す。
このファイルに書かれているのは
require_once("./require.php");
require_once(CLASS_EX_PATH . "page_extends/LC_Page_Index_Ex.php");
$objPage = new LC_Page_Index_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();
のみ。
つまり最初に
require_once("./require.php");
require_once(CLASS_EX_PATH . "page_extends/LC_Page_Index_Ex.php");
に出くわす。
1行目で行われることは
■各種定数の定義(数百ある)
■データベース操作関連環境の整備
■ダウンロードしたモジュールの読み込み
■Smartyの準備
■エラーチェッカの用意
■カート、顧客などのクラス定義
■セッションクラスの準備と開始
などが行われる。
2行目では
ページ表示用のクラスを読み込んでいます。
その後このクラスを用いて
$objPage = new LC_Page_Index_Ex();
としてインスタンスを作り、
register_shutdown_function(array($objPage, "destroy"));
では終了時に呼び出す関数として
LC_Page_Index_Exのdestroyメソッドを登録しています。
デフォルトでは
LC_Page_Index_Ex->destroy()
は
LC_Page_Index->destroy()
を呼び出し、これは
LC_Page->destory()
を呼び出します。
これは
/**
* デストラクタ.
*
* @return void
*/
function destroy() {}
となっている。
LC_Page->init()では、
function init() {}
なので何もしません。
結局、最後の2行のみが有効で、
表示に使うテンプレートファイル名とコラム数が設定されるのみです。
index.phpに戻ってきて、あとは最後の
$objPage->process();
があります。
毎度ながら
LC_Page_Index_Ex->process()
は
LC_Page_Index->process()
を呼び出すのみで、
これは以下のように定義されている。
function process() {
$objView = new SC_SiteView();
// レイアウトデザインを取得
$layout = new SC_Helper_PageLayout_Ex();
$layout->sfGetPageLayout($this, false, "index.php");
$objView->assignobj($this);
$objView->display(SITE_FRAME);
}
まず、親クラスの
LC_Page->process()
を呼び出していないのが気になるが、
これは空なので問題ないということなのだろう。
1行目は
$objViewへのSC_SiteViewインスタンスの割り当て。
2行目は
$layoutへのSC_Helper_PageLayout_Exインスタンスの割り当て。
3行目は少々厄介。
第2引数はプレビューという特別な場合にのみtrueにするだけなので、
普通はこのfalseで構わない。
第3引数の"index.php"はページのURLを表しています。
内部ではこのURLをキーにしてデータベースに問い合わせて、
そのURLに対する登録情報を取り出しています。
そこには対応させるテンプレートのパスに関する情報も含まれているので、
URLとViewオブジェクトとのマッピングを行っているようなものです。
(Djangoを使っている方なら、urls.pyに相当するものです)
以下のような情報が取り出されます。
| page_id | ページID |
| page_name | 名称 |
| url | URL |
| php_dir | php保存先ディレクトリ |
| tpl_dir | tpl保存先ディレクトリ |
| filename | ファイル名称 |
| header_chk | ヘッダー使用FLG |
| footer_chk | フッター使用FLG |
| edit_flg | 編集可能FLG |
| author | authorタグ |
| description | descriptionタグ |
| keyword | keywordタグ |
| update_url | 更新URL |
| create_date | データ作成日 |
| update_date | データ更新日 |
| LeftNavi | レイアウト:LEFT NAVI |
| MainHead | レイアウト:メイン上部 |
| RightNavi | レイアウト:RIGHT NAVI |
| MainFoot | レイアウト:メイン下部 |
また、終わり4行のレイアウトに関するものはそれぞれ
target_id
bloc_name
tpl_path
php_path
というキーを持つ配列になっています。
そしてこれらURLをキーにして集められたデータが、
第1引数である$this、つまり、
LC_Page_Index_Exのインスタンスから参照できるように
内部で処理されます。
SC_Helper_PageLayout_Exというヘルパークラス(インスタンス)を使って、
URLから特定したリクエストページに関するデータを
LC_Page_Index_Exのインスタンスに付け加える、という流れです。
そして4行目の
$objView->assignobj($this);
は$objView、つまりSC_SiteViewインスタンスに
$this、つまりLC_Page_Index_Exインスタンスの変数情報を書き写しています。
SC_SiteViewインスタンスにはテンプレートを扱うSmartyに関する変数が保持されており、
LC_Page_Index_Exインスタンスに先ほど割り当てられたデータを含めて、
すべて直接書き写され、Smartyがページレンダリング時に変数を参照できるようにしています。
そして最後5行目の
$objView->display(SITE_FRAME);
についてですが、
EC-CUBEはページレイアウトにはフレームの使用が前提になっているので、
引数にどんなフレーム構造を使うのかを指定するものがきます。
ここではSITE_FRAMEという定数が指定されていて、
これは(初回動作時は)
[root]/data/mtb_constants_init.php
に記述されていて、
"site_frame.tpl"
となっています。
$objView->display()は、
このテンプレートに指定されている各フレームを
各種変数とともにそれぞれレンダリングして
ページ全体を作り上げています。
大まかに言えば、
(1)あるページを表示する時に、そのページは複数のフレームで構成されている。
(2)各フレームをレンダリングするための情報をページのURLをキーにして集めてくる。
(3)最終的にレンダリングを行ってページを仕上げる
という流れです。
EC-CUBEのソースや、ECサイトの開発・構築でお困りなら、
ネットショップ構築パッケージEC-Orangeにお問い合わせください!
EC-CUBEのカスタマイズ・制作会社 強いネットショップ構築します|EC-Orange




