EC-cubeの改造についてお尋ねします。

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

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

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

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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/03/06 01:22:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kent0608 No.1

回答回数220ベストアンサー獲得回数23

ポイント1000pt

最新バージョン(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です。

かなりの長文になってしまったため、途中を端折りましたが流れは掴めたでしょうか?

もちろん、他のアプローチもあるので、色々と検討してみてください。

id:masimarock

本当に詳細かつ具体的なご指導をいただきましてありがとうございます。

流れについてはとてもよく分かりました。

しかし私が未熟でOOPとかクラスとかいうものをよく知らないせいか、

function addProductのカスタマイズをする時点で既にどうしたらいいか狼狽しています。

しかもこの後に続く画面遷移すべて~DB格納に至るまで全部トレースしていくとなると、すごく膨大な作業となりそうですね・・・。何日もかかりそう。OOPじゃなくてベタ書きだったら、こんな簡単な改造なんて30分もあれば全部終わりそうなものなのに・・・。

OOPって良し悪しですね。自分で書いたものならともかく、他人が書いた複雑怪奇なOOPコードは読んでて眩暈がします。「コードのスパゲティ化」を避けられるのがOOPの利点だったはずですが、私から見ればクラスを何段階も継承しまくったりインクルードしまくったりのほうが、よっぽど「スパゲティ状態」に思えてしまいます。何事もやり過ぎはよくないような気が。。。 いや、OOPが悪いんじゃなくてEC-CUBEの設計が悪いのかな??

愚痴ばかり書いてしまいまして申し訳ありません。

しかしkent0608様のおかげで真っ暗闇の中に一筋の光明が見えました。

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

ありがとうございます。

2009/03/05 12:08:18
  • id:kn1967
    興味が沸いたのでダウンロードして調べてみた・・・。

    (0)マニュアルの所在確認
    [http://wiki.ec-cube.net/index.php?EC-CUBE%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB%A5%B5%A5%A4%A5%C8:title=EC-CUBEマニュアルサイト]
       ↓
    (1)データベースの対応状況
    [http://wiki.ec-cube.net/index.php?%B6%A6%C4%CC%2F3_%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%2F03_%A5%C7%A1%BC%A5%BF%A5%D9%A1%BC%A5%B9%B9%BD%C0%AE:title=データベース構成]
    受注テーブル(dtb_order)にて汎用項目(memo01からmemo10)が既に用意されているのでデータベースの改変は無くてもよさそう・・・。
       ↓
    (2)プログラム構成
    [http://wiki.ec-cube.net/index.php?%B6%A6%C4%CC%2F3_%A5%AB%A5%B9%A5%BF%A5%DE%A5%A4%A5%BA%2F02_%A5%D5%A5%A1%A5%A4%A5%EB%B9%BD%C0%AE%2F02_html%A5%D5%A5%A9%A5%EB%A5%C0%C6%E2%A4%CE%A5%D5%A5%A1%A5%A4%A5%EB%B9%BD%C0%AE:title=フォルダ内のファイル構成]
    html\admin\order\ 下の6つのphpファイルを覗けばよさそう・・・。
       ↓
    (3)プログラム詳細
       ↓
    ・・・・って調べていったら、管理画面(あるいはテキストエディタ)で
    テンプレート(ファイル名だとpayment.tpl)を編集して
    「その他お問い合わせ事項がございましたら、こちらにご入力ください。」の部分を
    書き換えればいいじゃんと思えてしまったのでコメント欄で・・・。
  • id:masimarock
    masimarock 2009/03/04 22:02:57
    kn1967様、コメントありがとうございます。
    できればカートに入れるタイミングの時点で、商品一つごとにテキストエリアを確保したいと思っております。
    また、「テキストエリア一つ追加したい」というのはあくまでテスト用の例でして、他にも今後セレクトボッ
    クスやら何やら付けたくなったりもすると思います。

    ですので、kn1967様がお調べになって何か分かった点・アドバイスなどありましたらぜひ教えていただけましたら幸いです。なにしろ私だけの力ではまったく徒手空拳で、途方に暮れております。きちんとポイントを差し上げたいので、どうぞ普通の回答欄にてご回答くださいませ。
  • id:kn1967
    (3)プログラム詳細
    カートに入れる時点でということであれば
      products/list.php
    カートの中に入った時点でということであれば
      cart/index.php
    どこから探っていけば良いかは動かしてみれば、それがヒント・・・。

    途中の画面への項目追加も必要だから
      shopping/confirm.php
    も訂正対象。

    ※沢山ファイルは存在するけれど、ほとんどはclassなどの共用パーツなので
    フロントエンドの部分だけ訂正すればお望みのようなことはできそう・・・。
    (フロントエンドだけであれば管理画面からでも行えるはずだし、失礼ながら
    解析する能力がまだ不足するようであれば、エディタによる直接変更は危険だと思う)

    ※テストできる環境を整える時間も、余っている設備も無いので、この辺で失礼。
  • id:masimarock
    masimarock 2009/03/05 00:50:39
    >kn1967様
    >フロントエンドだけであれば管理画面からでも行えるはず

    そうなんですか!?
    いろいろ見てみましたが、管理画面もイマイチ意味が分かりにくくて、それらしき項目は今のところ見つかりません・・・。

    でももうちょっと頑張って解析してみます。
    お忙しいところありがとうございました。
  • id:kent0608
    >しかもこの後に続く画面遷移すべて~DB格納に至るまで全部トレースしていくとなると、すごく膨大な作業となりそうですね・・・。何日もかかりそう。OOPじゃなくてベタ書きだったら、こんな簡単な改造なんて30分もあれば全部終わりそうなものなのに・・・。
    ----
    私はvim使いなので、
    :vimgrep /pattern/ **/*.php | cwin
    で調べたいメソッドを検索しています。
    単純に処理を追うならこの方法でよろしいかと思います。
    (他にも色々と方法はありますが)

    それとベタ書きは個人でやる場合には問題ありませんが
    ある程度の規模のプロジェクトになるとOOPもといフレームワークは必須です。
    理由はこちらのブログがよくまとまっていました。
    http://phpc2.seesaa.net/category/3717199-1.html

    >function addProductのカスタマイズをする時点で既にどうしたらいいか狼狽しています。
    ----
    どうしても自力での改造ができないという場合には、EC-CUBEの開発コミュニティに投げるか
    http://xoops.ec-cube.net/
    再度はてなで質問してください。




  • id:masimarock
    masimarock 2009/03/06 01:21:24
    >kent0608様

    ありがとうございます。
    私は「PHPエディタ」を使っていますので、プロジェクト横断検索などでメソッドを追いかけています。
    それにしても、一つの小さな改造をするだけでも、いくつものファイルを見ていかないといけないのは、やっぱり苦痛です(^^;
    ベタ書きの即興的な感じに慣れきってしまった私には、OOPはまどろっこしくてツライです。
    たしかに組織での開発にはOOPとかフレームワークが必須だと思いますが、個人~少人数ならば、EC-CUBE程度の規模のアプリだったらベタ書きのほうが楽なような気がします。(もちろんよく使う処理の関数化くらいはしますが)

    フレームワーク入門のURLも教えていただいてありがとうございました。
    今から早速読んでみます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません