概要
EC-CUBEのカスタマイズは、
- デザインのカスタマイズ
- 機能のカスタマイズ
に分けられます。
ここでは、機能のカスタマイズをする際に気を付ける点と、その手順について説明します。
カスタマイズするファイルを特定する
カスタマイズをする際には「○○をできるようにしたい」といったような目的があるかと思います。
具体的には、「管理画面のカテゴリーページで商品ページのようにコンテンツを入力できるようにしたい」などです。
EC-CUBEは基本的にMVCモデルに準じて作られているようなので、カスタマイズしたいページが決まっていればおのずとカスタマイズする対象のファイルが決まってきます。
ここでは、その方法を説明します。
上の画像をクリックしてアドレスバーに注目してください。
「/html/admin/products/category.php」が呼ばれているのがわかりますね?
ではそのファイルを開いてみてください。
// {{{ requires require_once("../../require.php"); require_once(CLASS_EX_PATH . "page_extends/admin/products/LC_Page_Admin_Products_Category_Ex.php"); // }}} // {{{ generate page $objPage = new LC_Page_Admin_Products_Category_Ex(); register_shutdown_function(array($objPage, "destroy")); $objPage->init(); $objPage->process();
このファイルでは
- $objPageにLC_Page_Admin_Products_Category_Exクラスのインスタンスを生成して
- initメソッドを実行して
- processメソッドを実行
していることがわかりますね。
それでは次にLC_Page_Admin_Products_Category_Exクラスを見てみましょう。
Exで終わるクラスが定義されているファイルは/data/class_extendsにあります*1 。
LC_Page_Admin_Products_Category_Exであれば
「data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Category_Ex.php」です。
class LC_Page_Admin_Products_Category_Ex extends LC_Page_Admin_Products_Category { // }}} // {{{ functions /** * Page を初期化する. * * @return void */ function init() { parent::init(); } /** * Page のプロセス. * * @return void */ function process() { parent::process(); } /** * デストラクタ. * * @return void */ function destroy() { parent::destroy(); } }
見てもらえばわかるとおり、ここにも肝心のソースはありません。
「LC_Page_Admin_Products_Category_Ex」クラスは「LC_Page_Admin_Products_Category」クラスを継承していて、「init」「process」「destroy」それぞれのメソッドでは基底クラスの「LC_Page_Admin_Products_Category」のメソッドを呼んでいるのがわかりますね。
それでは「LC_Page_Admin_Products_Category」クラスを見てみましょう。
_Exで終わるファイルの親(基底クラス)になるファイルは/data/class/にあります。
LC_Page_Admin_Products_Categoryであれば
「data/class/pages/admin/products/LC_Page_Admin_Products_Category.php」です。
中を見るとびっしりソースが書かれてますね。
「init」や「process」メソッドもあります。
「/html/admin/products/category.php」の
$objPage->init(); $objPage->process();
で呼んでいたメッソッドはこれだったんですね。
ということはつまりですよ、
結論
カスタマイズしたいページが決まってれば、アドレスを参考に/data/class/pages/の中から対象のファイルを探して、そのソースからカスタマイズする箇所と内容を決めればいいわけですね*2 。
でも、このファイルを直接修正するのは禁じ手です。オススメできません。
せっかく継承した派生クラスがあるんだから、派生クラスを編集してやりましょう。
次は、基底クラスから派生クラスにメソッドをコピーして編集する方法を説明します。
派生クラスを編集する準備
それでは「LC_Page_Admin_Products_Category」クラスの「process」メソッドの内容をカスタマイズする場合を例に説明します。
基底クラスをそのまま編集するのは禁じ手ですから、「LC_Page_Admin_Products_Category」クラスの「process」メソッドの内容をそのまま、「LC_Page_Admin_Products_Category_Ex」クラスの「process」メソッドに上書きしてやります。
「LC_Page_Admin_Products_Category_Ex」クラスの「process」メソッドに書かれている
function process() { parent::process(); }
は、基底クラス(親:parent)の「process」メソッドを呼んでますよ?って意味ですので、そのまま上書きしてもまったく同じ意味になるので心配せずに上書きしてください。大丈夫ですから。ほんとに。
で、実際のカスタマイズはコピーした派生クラスのメソッドに行えばいいわけです。
この場合どんなカスタマイズをしても基底クラスには一切影響ありませんので、もし元に戻したい場合は簡単に基底クラスの処理を呼ぶことができるわけです。
それに、万が一カスタマイズしすぎてワケワカランみたいなことになっても基底クラスを読めばなんとでもなります。
ついでに言えば、EC-CUBE自体のアップデートの際にも、基底クラスのみの上書きで済めばカスタマイズした内容をぶち壊さずにアップデートできるってワケですね*3 。