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 カスタマイズ    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.php

class 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);

が行われ、DEFAULT_DSNというデータベースの接続先となる文字列を定義している。

■$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)

とやって書き込み、再度require_onceしてやって読み込む。
途中エラーが発生した場合は書き込み権限に関するエラーを表示して停止する。

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',
);

が定義されており、これは「include.phpを呼び出すモジュールの一覧」と書かれている。

$_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);

として、要は[root]/data/downloads/module/[module_name]/include.phpをインクルードする。
その後、

unset(
$_arrModule, $_objQuery, $_arrModuleCode,
$_moduleCode, $_file
);

として、このmodule.inc内で定義した各種変数を削除している。
最後に互換性維持のために空の関数

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");

があり、これはSmartyのライブラリ群を使うことを指している。
次いで

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

gif,jpg,pngの形式に対応しています。

require_once(CLASS_PATH . "SC_UploadFile.php");

ここでは

$SC_UPLOADFILE_DIR = realpath(dirname( __FILE__));
require_once($SC_UPLOADFILE_DIR . "/../module/gdthumb.php");

となっていて、GDによる自動サムネイル作成のライブラリを読み込んでいます。
そして

/* アップロードファイル管理クラス */
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');

この2つはメール処理関連の外部ライブラリ。
あとはこれを使用して、日本語メール特有の処理を付け加えた

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();

インストールファイル(HTML_PATH."install/index.php")が削除されていないと、

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; }

なので、クッキーを使用するかどうかでは常に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_base.phpが終了。

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();

これでようやくindex.phpが終了。





EC-CUBEのソースや、ECサイトの開発・構築でお困りなら、
ネットショップ構築パッケージEC-Orangeにお問い合わせください!