EC-cubeというものを使ってショッピングカートを作りたいと思っています。
インストールまではなんとか終わりました。
ためしに、テスト商品として「花束」を入れてみました。
この「花束」をカートに入れて注文する際に、同時に「ひとことメッセージ」を入れられるようにしたいのです。現状では商品の「数量」しか変更できませんが、これにテキストエリアを加えて、「ひとことメッセージ」も自由に入力できるようにするには、どうすれば良いのでしょうか?
今までPHPスクリプトの改造は何度もやってきましたが、このEC-cubeというソフトはファイルが膨大すぎて、どこをどう直せばいいのか検討もつきません。
具体的なソースの提案までしていただけたらポイントを多めに配分しますが、そこまでではなくとも、せめてどのファイルをいじればいいのかだけでも教えていただけませんでしょうか。
(たかだかテキストエリア一つ追加したいだけなのに、何時間探しても解決法が分かりませんでした。EC-cubeって、ちょっと気軽にカスタマイズするような用途には向いていないのでしょうか・・・?)
最新バージョン(ver.2.3.4)のソースを参照しています。
商品リスト一覧画面とその商品詳細画面に、ひとことメッセージを
記入するテキストエリアを追加するカストマイズの例を示します。
まず、ソースを読み解くと下記の場所にカストマイズ対象のファイルがあることがわかります。
商品リスト一覧のテンプレート場所
/eccube-2.3.4/data/Smarty/templates/default/list.tpl
(実例)http://site.ec-cube.net/products/list.php
商品詳細のテンプレート場所
/eccube-2.3.4/data/Smarty/templates/default/detail.tpl
(実例)http://site.ec-cube.net/products/detail.php?product_id=23
※実例のサイトは若干古いバージョンのため、見た目が違うようです。
このテンプレートファイルを開くと、Smartyのテンプレート変数が所々に記述された、HTMLが表示されます。
Smartyについては下記のURLを参照してください。
http://www.phppro.jp/phpmanual/smarty/index.html
このテンプレートファイルのHTMLに、テキストエリアを追加しましょう。
一例として、商品詳細のテンプレートをカストマイズしてみます。
/eccube-2.3.4/data/Smarty/templates/default/detail.tpl
を適当なエディタで開きます。
<div id="detailrightblock"> (省略) <form name="form1" id="form1" method="post" action="<!--{$smarty.server.REQUEST_URI|escape}-->"> (省略) </form> </div>
この"form1"に囲まれた領域付近に追加すると良さそうですね。
<dl> <dt>個 数</dt> <dd> <input class="box54" type="text" style="" maxlength="8" value="1" name="quantity"/> </dd> </dl>
この下あたりにひとことメッセージを記述するテキストエリアを追加します。
<dl> <dt>個 数</dt> <dd> <input class="box54" type="text" style="" maxlength="8" value="1" name="quantity"/> </dd> </dl> <dl> <dt>ひとことメッセージ</dt> <dd> <textarea class="foobar" rows="4" cols="30" name="short_message"></textarea> </dd> </dl>
もちろんこのままでは、データベースになんの影響も与えませんから、form1のactionで指定されるURLの
phpファイルのロジック上に処理を追加する必要があります。
<!--{$smarty.server.REQUEST_URI|escape}-->
は現在のURLを意味するので、/products/detail.php?product_id=XX
にPOSTデータが渡されます。
それでは
/eccube/html/products/detail.php
を覗いてみましょう。
<?php require_once("../require.php"); require_once(CLASS_EX_PATH . "page_extends/products/LC_Page_Products_Detail_Ex.php"); $objPage = new LC_Page_Products_Detail_Ex(); register_shutdown_function(array($objPage, "destroy")); $objPage->init(); $objPage->process(); ?>
どうやら
/eccube-2.3.4/data/class_extends/page_extends/products/LC_Page_Products_Detail_Ex.php
が関係してそうですね。
開いてみると
/** * LC_Page_Products_Detail のページクラス(拡張). * * LC_Page_Products_Detail をカスタマイズする場合はこのクラスを編集する. * * @package Page * @author LOCKON CO.,LTD. * @version $Id: LC_Page_Products_Detail_Ex.php 16741 2007-11-08 00:43:24Z adachi $ */
とありますから、このクラスは親クラスの拡張用クラスであることがわかります。
それでは親クラスである
/eccube-2.3.4/data/class/pages/products/LC_Page_Products_Detail.php
のロジックを見てみましょう。
function process(){}
processメソッド内に注目してください。
$objCartSess = new SC_CartSession(); (省略) $objCartSess->addProduct(array($_POST['product_id'], $classcategory_id1, $classcategory_id2), $this->objFormParam->getValue('quantity'));
という記述が168~187行目にあります。
168行目でインスタンス化されるSC_CartSessionクラスは
/eccube-2.3.4/data/class/SC_CartSession.php
にありました。
このSC_CartSessionクラスのインスタンスメソッド、addProductに注目します。
211行目
// カートへの商品追加 function addProduct($id, $quantity, $campaign_id = "") { (省略) }
なんとなく仕組みが見えてきました。POSTされたデータはここでセッション情報として一時的に保持されているようです。
ひとことメッセージを保持するために、ここをカスタマイズする必要がありそうですね。
あとは今までと同様に処理をトレースしながら、DBへ注文データを格納する所まで追い、ひとことメッセージを適切に処理すればOKです。
かなりの長文になってしまったため、途中を端折りましたが流れは掴めたでしょうか?
もちろん、他のアプローチもあるので、色々と検討してみてください。
本当に詳細かつ具体的なご指導をいただきましてありがとうございます。
流れについてはとてもよく分かりました。
しかし私が未熟でOOPとかクラスとかいうものをよく知らないせいか、
function addProductのカスタマイズをする時点で既にどうしたらいいか狼狽しています。
しかもこの後に続く画面遷移すべて~DB格納に至るまで全部トレースしていくとなると、すごく膨大な作業となりそうですね・・・。何日もかかりそう。OOPじゃなくてベタ書きだったら、こんな簡単な改造なんて30分もあれば全部終わりそうなものなのに・・・。
OOPって良し悪しですね。自分で書いたものならともかく、他人が書いた複雑怪奇なOOPコードは読んでて眩暈がします。「コードのスパゲティ化」を避けられるのがOOPの利点だったはずですが、私から見ればクラスを何段階も継承しまくったりインクルードしまくったりのほうが、よっぽど「スパゲティ状態」に思えてしまいます。何事もやり過ぎはよくないような気が。。。 いや、OOPが悪いんじゃなくてEC-CUBEの設計が悪いのかな??
愚痴ばかり書いてしまいまして申し訳ありません。
しかしkent0608様のおかげで真っ暗闇の中に一筋の光明が見えました。
このまま頑張って改造するか、諦めて他のカートや完全自作カートにするかは分かりませんが、とにかく助かりました。
ありがとうございます。