EC-CUBE EC-CUBEのカスタマイズ・制作会社 強いネットショップ構築します|EC-Orange

EC-Orange とは

EC-CUBE カスタマイズ

EC-CUBEインストール

EC-CUBE 環境構築ノウハウ

EC-CUBE 基本構成理解

ソースコード読解

EC-CUBE カスタマイズ:初歩

EC-CUBE カスタマイズ:基礎

EC-CUBE カスタマイズ:応用

EC-CUBE 機能拡張ノウハウ

EC-CUBE カスタマイズ    トップページ表示の理解

    EC-CUBE カスタマイズ  >  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名称
urlURL
php_dirphp保存先ディレクトリ
tpl_dirtpl保存先ディレクトリ
filenameファイル名称
header_chkヘッダー使用FLG
footer_chkフッター使用FLG
edit_flg編集可能FLG
authorauthorタグ
descriptiondescriptionタグ
keywordkeywordタグ
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にお問い合わせください!