人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

EC-cubeの改造についてお尋ねします。
EC-cubeというものを使ってショッピングカートを作りたいと思っています。
インストールまではなんとか終わりました。

ためしに、テスト商品として「花束」を入れてみました。
この「花束」をカートに入れて注文する際に、同時に「ひとことメッセージ」を入れられるようにしたいのです。現状では商品の「数量」しか変更できませんが、これにテキストエリアを加えて、「ひとことメッセージ」も自由に入力できるようにするには、どうすれば良いのでしょうか?

今までPHPスクリプトの改造は何度もやってきましたが、このEC-cubeというソフトはファイルが膨大すぎて、どこをどう直せばいいのか検討もつきません。
具体的なソースの提案までしていただけたらポイントを多めに配分しますが、そこまでではなくとも、せめてどのファイルをいじればいいのかだけでも教えていただけませんでしょうか。

(たかだかテキストエリア一つ追加したいだけなのに、何時間探しても解決法が分かりませんでした。EC-cubeって、ちょっと気軽にカスタマイズするような用途には向いていないのでしょうか・・・?)


●質問者: masimarock
●カテゴリ:インターネット ウェブ制作
✍キーワード:EC-CUBE PHP たかだか インストール エリア
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kent0608
●1000ポイント ベストアンサー

最新バージョン(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様のおかげで真っ暗闇の中に一筋の光明が見えました。

このまま頑張って改造するか、諦めて他のカートや完全自作カートにするかは分かりませんが、とにかく助かりました。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ