EC-CUBE カスタマイズ index.phpのファイル処理
ソース読みある記/2.3/index.php
index.phpがEC-CUBE内でどんなファイルを呼び出しながら
処理されていくのかを根気強く追ってみる。
index.php
はまず同じディレクトリにある
"./require.php"
を読み込み、
そこで
$require_php_dir = realpath(dirname( __FILE__));
をし、
require_once($require_php_dir . "/define.php");
としてdefine.phpを読み込む。
ここでは EC-CUBEソースツリー内での HTMLディレクトリからのDATAディレクトリの相対パス
define("HTML2DATA_DIR", "/../data/");
の定義と DATAディレクトリからのHTMLディレクトリの相対パスdefine("DATA_DIR2HTML", "/../html/");
の定義がある。次に
require_once($require_php_dir . HTML2DATA_DIR . "require_base.php");
をし、(要は[root]/data/require_base.phpを指している)
require_base.phpを読み込む。
ここでは
$require_base_php_dir = realpath(dirname( __FILE__));
の後に、以下の3つのパスを宣言する。/** クラスパス */
define("CLASS_PATH", $require_base_php_dir . "/class/");
→[root]/data/class//** クラスパス */
define("CLASS_EX_PATH", $require_base_php_dir . "/class_extends/");
→[root]/data/class_extends//** キャッシュ生成ディレクトリ */
define("CACHE_PATH", $require_base_php_dir . "/cache/");
→[root]/data/cache/次に
require_once(CLASS_EX_PATH . "SC_Initial_Ex.php");
→[root]/data/class_extends/SC_Initial_Ex.phpここでは
require_once(CLASS_PATH . "SC_Initial.php");
→[root]/data/class/SC_Initial.phpclass SC_Initial
の定義
戻ってきてclass SC_Initial_Ex extends SC_Initial
で拡張。「SC_Initial をカスタマイズする場合はこのクラスを編集する.」
との注意書きあり。
デフォルトではコンストラクタの書き換えのみがあり、
function SC_Initial_Ex() { parent::SC_Initial(); }
となっている。SC_Initialのコンストラクタでは
define('ECCUBE_VERSION', "2.3.4");
となっていてバージョン定数の定義をしている。次に
$objInit = new SC_Initial_Ex();
$objInit->init();
SC_Initial_Exの親クラスSC_Initialのinit()が呼び出され、
この中では
$this->requireInitialConfig();
$this->defineDSN();
$this->setErrorReporting();
$this->defineConstants();
$this->mbstringInit();
$this->createCacheDir();
それぞれ
■$this->requireInitialConfig();
require_once(realpath(dirname( __FILE__)) ."/../install.php");
のみ。つまり[root]/data/install.phpが読み込まれる。
このファイルはソースを落としてきた時は空っぽだが、
インストール作業をした時に内容が書き換えられ、
以下の定数の定義がなされる。(値はインストール時の指定によって変わります)
define ('ECCUBE_INSTALL', 'ON');
define ('HTML_PATH', '[root]/html/');
define ('SITE_URL', '[指定値]');
define ('SSL_URL', '[指定値]');
define ('URL_DIR', '[指定値]');
define ('DOMAIN_NAME', '');
define ('DB_TYPE', 'mysql');
define ('DB_USER', 'eccube_db_user');
define ('DB_PASSWORD', '[指定値]');
define ('DB_SERVER', '127.0.0.1');
define ('DB_NAME', 'eccube_db');
define ('DB_PORT', '');
define ('DATA_PATH', '[root]/data/');
define ('MOBILE_HTML_PATH', HTML_PATH . 'mobile/');
define ('MOBILE_SITE_URL', SITE_URL . 'mobile/');
define ('MOBILE_SSL_URL', SSL_URL . 'mobile/');
define ('MOBILE_URL_DIR', URL_DIR . 'mobile/');
■$this->defineDSN();
define ("DEFAULT_DSN",
DB_TYPE . "://" . DB_USER . ":" . DB_PASSWORD . "@"
. DB_SERVER . ":" .DB_PORT . "/" . DB_NAME);
■$this->setErrorReporting();
error_reporting(E_ALL & ~E_NOTICE);
と、エラーレベルの設定が行われる。■$this->defineConstants();
require_once(CACHE_PATH . "mtb_constants.php");
を試す。mtb_constants.phpというキャッシュファイルがまだ存在しなければ、
$mtb_constants = file_get_contents(CACHE_PATH . "../mtb_constants_init.php");
として初期データの読み込みをし、これを
$handle = fopen(CACHE_PATH . "mtb_constants.php", "w");
fwrite($handle, $mtb_constants)
途中エラーが発生した場合は書き込み権限に関するエラーを表示して停止する。
mtb_constants.php(mtb_constants_init.php)の中では
300近くの定数が定義されている。
今後定数を参照している部分をカスタマイズするなら、
ここを変更すればいいはず。
■$this->mbstringInit();
ini_set("mbstring.http_input", CHAR_CODE);
ini_set("mbstring.http_output", CHAR_CODE);
ini_set("auto_detect_line_endings", 1);
ini_set("default_charset", CHAR_CODE);
ini_set("mbstring.internal_encoding", CHAR_CODE);
ini_set("mbstring.detect_order", "auto");
ini_set("mbstring.substitute_character", "none");
//ロケールを明示的に設定
setlocale(LC_ALL, LOCALE);
つまり、php(またはphp-mbstring)のインストール時に
mbstringに関する上記の設定をわざわざしなくてもいいということ。
■$this->createCacheDir();
ここは単に動作上必要なキャッシュデータ用のディレクトリの存在確認と、
無かった場合は作成するという作業だけが行われている。
require_base.phpに戻ると、次に来るのが
require_once($require_base_php_dir . "/include/module.inc");
ここではまず
require_once CLASS_PATH . 'SC_DbConn.php';
この中身は
$current_dir = realpath(dirname(__FILE__));
をして、require_once($current_dir . "/../module/DB.php");
このDB.phpの中身ではPEAR(PHP Extension and Application Repository)を読み込み、
データベース関連の("DB_"で始まる)定数を定義し、
Database independentなデータベースインターフェースクラスを定義したり・・・
すべてhttp://pear.php.net/package/DBから手に入るファイルを
そのまま持ってきたものらしい。
次に
require_once($current_dir . "/util/SC_Utils.php");
require_once($current_dir . "/util/GC_Utils.php");
class SC_Utils
class GC_Utils
あとは
class SC_DbConn
の定義があるだけ。module.incに戻って、次は
require_once CLASS_PATH . 'SC_Query.php';
ここはSQLの構築・実行を行う
class SC_Query
が定義されているだけ。続いて
require_once CLASS_EX_PATH . 'db_extends/SC_DB_DBFactory_Ex.php';
ここでは
require_once(CLASS_PATH . "db/SC_DB_DBFactory.php");
をしていて、親クラスclass SC_DB_DBFactory
を定義した後に、MYSQLとPGSQLに固有の処理を実装した子クラス
class SC_DB_DBFactory_MYSQL extends SC_DB_DBFactory
class SC_DB_DBFactory_PGSQL extends SC_DB_DBFactory
続いて
require_once(CLASS_EX_PATH . "db_extends/dbfactory/SC_DB_DBFactory_MYSQL_Ex.php");
require_once(CLASS_EX_PATH . "db_extends/dbfactory/SC_DB_DBFactory_PGSQL_Ex.php");
それぞれ先ほど定義した
SC_DB_DBFactory_MYSQL
と
SC_DB_DBFactory_PGSQL
を親クラスとする子クラス
class SC_DB_DBFactory_MYSQL_Ex extends SC_DB_DBFactory_MYSQL
class SC_DB_DBFactory_PGSQL_Ex extends SC_DB_DBFactory_PGSQL
自分でカスタマイズする場合はこれを使えと書かれている。
そして最後に
class SC_DB_DBFactory_Ex extends SC_DB_DBFactory
があり、この中で定義されているfunction getInstance()
メソッドでは、使用しているデータベースが
■mysqpの場合
return new SC_DB_DBFactory_MYSQL_Ex();
■pgsqlの場合return new SC_DB_DBFactory_PGSQL_Ex();
■どれでもない場合return new SC_DB_DBFactory_Ex();
として対応するデータベース操作クラスのインスタンスを返すようになっている。module.incに戻ってきて、
$_arrModule = array(
'mdl_a8',
'mdl_moba8',
'mdl_janet',
'mdl_opebuilder',
'mdl_souraku',
'mdl_ts',
);
$_objQuery = new SC_Query;
$_arrModuleCode = $_objQuery->getCol('dtb_module', 'module_code');
テーブル名:dtb_module
コラム名 :module_code
で指定される1列を取り出し
、 その列中の各文字列が$_arrModuleの中にあれば、
$_file = MODULE_PATH . "$_moduleCode/include.php";
include_once($_file);
その後、
unset(
$_arrModule, $_objQuery, $_arrModuleCode,
$_moduleCode, $_file
);
最後に互換性維持のために空の関数
function sfPrintEbisTag() {}
function sfPrintAffTag() {}
);
require_base.phpに戻ってきて
require_once(CLASS_EX_PATH . "util_extends/GC_Utils_Ex.php");
require_once(CLASS_EX_PATH . "util_extends/SC_Utils_Ex.php");
それぞれ
class GC_Utils_Ex extends GC_Utils
class SC_Utils_Ex extends SC_Utils
GC_UtilsとSC_Utilsをカスタマイズするときはここで実装しろと書かれている。
次は
require_once(CLASS_EX_PATH . "db_extends/SC_DB_MasterData_Ex.php");
ここでは
require_once(CLASS_PATH . "db/SC_DB_MasterData.php");
が最初にある。
ここではマスタデータに関するクラスが実装される。
以下ソースのコメントを引用
* マスタデータを扱うクラス.
*
* プルダウン等で使用するマスタデータを扱う.
* マスタデータは, DB に格納されているが, パフォーマンスを得るため,
* 初回のみ DBへアクセスし, データを定義したキャッシュファイルを生成する.
*
* マスタデータのテーブルは, 下記のようなカラムが必要がある.
* 1. キーとなる文字列
* 2. 表示文字列
* 3. 表示順
* 上記カラムのデータ型は特に指定しないが, 1 と 2 は常に string 型となる.
*
* マスタデータがキャッシュされると, key => value 形式の配列として使用できる.
* マスタデータのキャッシュは, MASTER_DATA_DIR/マスタデータ名.php というファイルが生成される.
class SC_DB_MasterData
が定義される。SC_DB_MasterData_Ex.phpに戻って、
class SC_DB_MasterData_Ex extends SC_DB_MasterData
という空クラスが用意され、SC_DB_MasterDataの拡張はここで行えとの注釈が付く。require_base.phpに戻り、
require_once(CLASS_EX_PATH . "db_extends/SC_DB_DBFactory_Ex.php");
とあるが、すでに以前にrequire_onceされているので無視されるはず。require_once(CLASS_PATH . "SC_View.php");
ここは
$SC_VIEW_PHP_DIR = realpath(dirname(__FILE__));
require_once($SC_VIEW_PHP_DIR . "/../module/Smarty/libs/Smarty.class.php");
次いで
class SC_View
が定義され、Smarty用のクラスとなっている。さらに、
class SC_AdminView extends SC_View
class SC_SiteView extends SC_View
class SC_UserView extends SC_SiteView
class SC_InstallView extends SC_View
class SC_MobileView extends SC_SiteView
require_base.phpに戻って、
require_once(CLASS_PATH . "SC_DbConn.php");
が来るが、これはすでにrequire_onceが済んでいる。require_once(CLASS_PATH . "SC_Session.php");
ここでは、セッション管理のためのクラス
class SC_Session
が定義され、プロパティとして
var $login_id; // ログインユーザ名
var $authority; // ユーザ権限
var $cert; // 認証文字列(認証成功の判定に使用)
var $sid; // セッションID
var $member_id; // ログインユーザの主キー
var $uniqid; // ページ遷移の正当性チェックに使用
次は
require_once(CLASS_PATH . "SC_Query.php");
だが、これも以前require_onceされているので無視される。require_once(CLASS_PATH . "SC_SelectSql.php");
これはSELECT文関係の検索を行うクラス
class SC_SelectSql
の作成。require_once(CLASS_PATH . "SC_CheckError.php");
エラーチェックのためのクラス
class SC_CheckError
を定義している。フォームからの入力値のチェックなどもこれが行っているようだ。
require_once(CLASS_PATH . "SC_PageNavi.php");
これは複数ページがある場合のナビゲーションクラス。
class SC_PageNavi {
var $now_page; // 現在のページ番号
var $max_page; // 最終のページ番号
var $start_row; // 開始レコード
var $strnavi; // ページ送り文字列
var $arrPagenavi = array(); // ページ
/* ※使用条件※
・formタグに以下を追加する。
・ソースの最初に以下を記述する。
$objPage->tpl_pageno = $_POST['pageno'];
・$func_nameに指定するJavaScriptの例
// ページナビで使用する
function fnNaviPage(pageno) {
document.form1['pageno'].value = pageno;
document.form1.submit();
}
*/
require_once(CLASS_PATH . "SC_Date.php");
これは
/* 日時表示用クラス */
class SC_Date {
var $start_year;
var $month;
var $day;
var $end_year;
require_once(CLASS_PATH . "SC_Image.php");
こちらは
//---- アップロードファイル加工クラス(thumb.phpとセットで使用する)
class SC_Image
require_once(CLASS_PATH . "SC_UploadFile.php");
ここでは
$SC_UPLOADFILE_DIR = realpath(dirname( __FILE__));
require_once($SC_UPLOADFILE_DIR . "/../module/gdthumb.php");
そして
/* アップロードファイル管理クラス */
class SC_UploadFile
require_once(CLASS_PATH . "SC_SiteInfo.php");
このクラスには注意書きがあり、
/**
* サイト情報を取得する.
*
* FIXME このクラスを使用している場合は,
* SC_Helper_DB::sf_getBasisData() に置き変えて下さい
*
* @deprecated SC_Helper_DB::sf_getBasisData() を使用して下さい.
*/
class SC_SiteInfo
require_once(CLASS_EX_PATH . "SC_SendMail_Ex.php");
これは最初に
require_once(CLASS_PATH . "SC_SendMail.php");
ここでは
require_once(dirname(__FILE__) . '/../module/Mail.php');
require_once(dirname(__FILE__) . '/../module/Mail/mime.php');
あとはこれを使用して、日本語メール特有の処理を付け加えた
class SC_SendMail
を定義している。
SC_SendMail_Ex.phpに戻ってきて、
あとは毎度のカスタマイズ用のクラス
class SC_SendMail_Ex extends SC_SendMail {
function SC_SendMail_Ex() {
parent::SC_SendMail();
}
}
require_once(CLASS_PATH . "SC_FormParam.php");
これはフォームを抽象化し、パラメータを管理するクラスを定義する。
/* パラメータ管理クラス */
class SC_FormParam
require_once(CLASS_PATH . "SC_CartSession.php");
カート関連の処理を担うクラスの定義が書かれている。
class SC_CartSession
カート関連の変更を行うならここだろうか。require_once(CLASS_PATH . "SC_SiteSession.php");
ページ関連のセッション管理クラスですね。
class SC_SiteSession
require_once(CLASS_PATH . "SC_CampaignSession.php");
キャンペーン管理のためのクラスを定義している。
class SC_CampaignSession
中身を読むと、単にあるセッションに対して、キャンペーンのマークが付けられているかどうかを判定するだけ。
require_once(CLASS_PATH . "SC_Customer.php");
その名の通り、顧客管理のためのクラスを定義している。
class SC_Customer
require_once(CLASS_PATH . "SC_CustomerList.php");
顧客検索用のクラスの定義。
class SC_CustomerList extends SC_SelectSql
require_once(CLASS_PATH . "SC_Cookie.php");
クッキー管理用のクラス
class SC_Cookie
コンストラクタ内ではデフォルトで1年の有効期限となっている。クッキーの書き込みと取得のためのメソッドがある。
require_once(CLASS_PATH . "SC_Pdf.php");
これはPDFを扱うためのクラス。
class SC_Pdf
PDFLibが必須とのこと。require_once(CLASS_PATH . "SC_MobileUserAgent.php");
これは携帯端末の種類に関する情報を扱うクラス。
内部で
require_once(dirname(__FILE__) . '/../module/Net/UserAgent/Mobile.php');
をしており、外部ライブラリを利用している。コメントを引用しておくと
/**
* 携帯端末のキャリアを表す文字列を取得する。
*
* 文字列は docomo, ezweb, softbank のいずれか。
*
* @return string|false 携帯端末のキャリアを表す文字列を返す。
* 携帯端末ではない場合は false を返す。
*/
require_once(CLASS_PATH . "SC_MobileEmoji.php");
この中では最初に
/**
* 表示できない絵文字を置き換える文字列 (Shift JIS)
* デフォルトは空文字列。
*/
define('MOBILE_EMOJI_SUBSTITUTE', '');
次に
class SC_MobileEmoji
が宣言され、その中のメソッド
function indexToCode($index)
で$arrMap = @include_once(dirname(__FILE__) . "/../include/mobile_emoji_map_$carrier.inc");
とある。絵文字のマッピングがそこにあるのがわかる。
require_once(CLASS_PATH . "SC_MobileImage.php");
携帯端末の画面解像度に合わせて画像を変換するクラス。
class SC_MobileImage
この中で$fp = fopen(MOBILE_IMAGE_INC_PATH . "/mobile_image_map_$carrier.csv", "r");
となっているので、ここに端末の解像度の資料がある。require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_PageLayout_Ex.php");
ここでは最初に
require_once(CLASS_PATH . "helper/SC_Helper_PageLayout.php");
これはコメントの引用からすると
/**
* Webページのレイアウト情報を制御するヘルパークラス.
*
* @package Helper
* @author LOCKON CO.,LTD.
* @version $Id:SC_Helper_PageLayout.php 15532 2007-08-31 14:39:46Z nanasess $
*/
class SC_Helper_PageLayout
あとはお決まりの
class SC_Helper_PageLayout_Ex extends SC_Helper_PageLayout
で終わり。require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_DB_Ex.php");
ここでも最初に
require_once(CLASS_PATH . "helper/SC_Helper_DB.php");
ときて、class SC_Helper_DB
コメントには「DB関連のヘルパークラス」とあるが、
受注関連の計算に関するメソッドなども含まれている。
戻ってきて拡張用空クラスの定義。
class SC_Helper_DB_Ex extends SC_Helper_DB
require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_Session_Ex.php");
セッション関連のヘルパークラス。こちらも同様。
class SC_Helper_Session
とclass SC_Helper_Session_Ex extends SC_Helper_Session
require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_Mail_Ex.php");
こちらも同様。メール関連。
テンプレートを使用してのメール送信など。
class SC_Helper_Mail
とclass SC_Helper_Mail_Ex extends SC_Helper_Mail
require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_Mobile_Ex.php");
こちらも同様だが、
途中で
require_once(CLASS_PATH . '../module/Net/URL.php');
をしている。その後
class SC_Helper_Mobile
を作り、class SC_Helper_Mobile_Ex extends SC_Helper_Mobile
include_once($require_base_php_dir . "/require_plugin.php");
これはデフォルトでは
<?php
/*
* プラグインを require するためのファイル
*/
?>
ここで長く続いた設定関連は終わって、
// セッションハンドラ開始
$objSession = new SC_Helper_Session_Ex();
// インストールチェック
SC_Utils_Ex::sfInitInstall();
SC_Utils::sfErrorHeader(">> /install/index.phpは、インストール完了後にファイルを削除してください。");
をセットされて表示される。続いて、
require_once CLASS_PATH . 'session/SC_SessionFactory.php';
これは最初に
require_once CLASS_PATH . 'session/sessionfactory/SC_SessionFactory_UseCookie.php';
を行う。ここでは
class SC_SessionFactory_UseCookie extends SC_SessionFactory
が定義される。その中のメソッドの1つが
function useCookie() {
return true;
}
次に
require_once CLASS_PATH . 'session/sessionfactory/SC_SessionFactory_UseRequest.php';
を行い、この中で
class SC_SessionFactory_UseRequest extends SC_SessionFactory
を定義し、
function useCookie() {
return false;
}
そして、
/**
* セッションデータ管理クラスの基底クラス
*
*/
class LC_UseRequest_State {
/**
* PCサイト用のセッションデータ管理クラス
*
*/
class LC_UseRequest_State_PC extends LC_UseRequest_State {
/**
* モバイルサイト用のセッションデータ管理クラス
*
*/
class LC_UseRequest_State_Mobile extends LC_UseRequest_State {
戻ってきて、
/**
* セッションの初期化処理を抽象化するファクトリークラス.
*
* このクラスはセッションの維持方法を管理するクラスです.
* 他のセッション管理クラスとは若干異なります.
*
* EC-CUBE2.1.1ベータ版から、
* 管理画面>基本情報>パラメータ管理で、セッションの維持方法を
* ・Cookieを使用する場合
* ・リクエストパラメータを使用する場合
* の2種類が選択できますが、どちらの設定であっても下記のように呼び出すことで
* 適切にセッションを開始することができます.
*
* $sessionFactory = SC_SessionFactory::getInstance()
* $sessionFactory->initSession();
*
* @package SC_Session
* @author LOCKON CO.,LTD.
* @version $Id: SC_SessionFactory.php 17560 2008-08-26 11:07:54Z adachi $
*/
class SC_SessionFactory {
またrequire_base.phpに戻ってきて、
$sessionFactory = SC_SessionFactory::getInstance();
$sessionFactory->initSession();
最後に
// 絵文字変換 (除去) フィルターを組み込む。
ob_start(array('SC_MobileEmoji', 'handler'));
require.phpに戻ってきて、
携帯端末の場合は mobile 以下へリダイレクトする処理をして、
require.phpが終了。
ようやくindex.phpに戻ってきて、
require_once(CLASS_EX_PATH . "page_extends/LC_Page_Index_Ex.php");
ここでは最初に
require_once(CLASS_PATH . "pages/LC_Page_Index.php");
があり、この最初にrequire_once(CLASS_PATH . "pages/LC_Page.php");
ここでは
require_once(DATA_PATH . 'module/Net/URL.php');
があり、外部モジュールを読み込んでいる。つぎに
/**
* Web Page を制御する基底クラス
*
* Web Page を制御する Page クラスは必ずこのクラスを継承する.
* PHP4 ではこのような抽象クラスを作っても継承先で何でもできてしまうため、
* あまり意味がないが、アーキテクトを統一するために作っておく.
*
* @package Page
* @author LOCKON CO.,LTD.
* @version $Id:LC_Page.php 15532 2007-08-31 14:39:46Z nanasess $
*/
class LC_Page {
戻ってきて
class LC_Page_Index extends LC_Page
戻ってきて拡張用のクラスの定義。class LC_Page_Index_Ex extends LC_Page_Index
index.phpに戻ってきて、
$objPage = new LC_Page_Index_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();
EC-CUBEのソースや、ECサイトの開発・構築でお困りなら、
ネットショップ構築パッケージEC-Orangeにお問い合わせください!
EC-CUBEのカスタマイズ・制作会社 強いネットショップ構築します|EC-Orange




