概要
商品情報に新たな項目を追加したいシーン、良くあると思うのでその手順をまとめておきたいと思います。
例によってこの記事を参考にする方は自己責任でお願いします*1 。
こうして手順をアウトプットしておくと、後でソースを追う必要も無くなるので後々とっても役立ちます。
また、公開することで同様のことをしようとする人の助けにもなるので、もしEC-CUBEのカスタマイズをすることがあったらぜひ記事にしてみてくださいね。で、良かったら記事を書いたこと、僕にトラックバックやコメントで教えてくださると大変ありがたいです。
そんな素敵な方には僕が記事を書いたときにも必ずご報告に伺いますよ 🙂
それでははじめま?す。
追加する項目を決める
まずは追加する項目を何にするのか決めましょう。
どのような用途で使うのかによってフィールド名(カラム名)とデータ型を決めます。
また、このとき入力した文字の変換*2 が必要なのかどうか、どのようなエラーチェックが必要になるのかを考えておくと後の作業が楽になります。
今回は例として、「カートに入れる」の周辺にコンテンツを置くためのフィールドを追加したいと思います。
フィールド名:cart_comment1*3
データ型:text*4
変換式:”KVa”*5
バリデーション:array(“SPTAB_CHECK”, “MAX_LENGTH_CHECK”)とarray(“HTML_TAG_CHECK”)*6
このようなフィールドを追加するということで話をすすめたいと思います。
対象となるデータベースのテーブルはdtb_productsになりますが、商品情報はこのテーブルだけじゃなくdtb_product_categoriesやdtb_products_classやdtb_recommend_productsにも存在しています。
今回はdtb_broducts以外のテーブルに入るべき項目を追加する場合の説明はしません。
また、画像に関するフィールドを追加する場合もファイルアップロードがらみで若干複雑*7 になりますので、この説明も今回は省きます。
それでは、dtb_productsに新しいカラムを追加して次の説明に進みましょう!
子クラスに親クラスのメソッドをコピー
例によって親クラスから子クラスへメソッドをコピーして子クラスを編集します*8 。
今回編集対象となるクラスは
親:LC_Page_Admin_Products_Product
子:LC_Page_Admin_Products_Product_Ex
です。今までの記事でも書いてきたと思うので今回は場所を割愛。*9
対象となるメソッドは
- lfRegistProduct
- lfConvertParam
- lfErrorCheck
の3つです。
編集を始める前に親クラスから子クラスへコピーしておいてください。
それでは張り切ってまいりましょう!
lfRegistProductの編集
まずは変数「$checkArray」に追加したフィールド名を追加します*10 。
次に配列「$sqlval[‘cart_comment1’]」に配列「$arrList[‘cart_comment1’]」を代入します。
適切な場所に書いてくださいね。わかりますね?
はい、lfRegistProductメソッドの編集はこれでおしまい!簡単でしょう?
それでは次に進みましょう。
lfConvertParamの編集
入力文字の変換式を追加しましょう。
配列「$arrConvList[‘cart_comment1’]」にあらかじめ決めておいた変換式「”KVa”」を追加しましょう。
はいおしまい。次?
lfErrorCheckの編集
あらかじめ決めておいたバリデーションを追加します。
適切な位置*11 に以下のコードを追加してください。
// fixed カートコメントのチェック式を追加 %date% $objErr->doFunc(array("カート-コメント1", "cart_comment1", LLTEXT_LEN), array("SPTAB_CHECK", "MAX_LENGTH_CHECK")); $objErr->doFunc(array("カート-コメント1", "cart_comment1", $this->arrAllowedTag), array("HTML_TAG_CHECK"));
OK。
これで処理系の修正は終わりです。
後はインターフェースの修正をすれば今回追加した項目が使えるようになります。(たぶん)
インターフェースは単純にSmartyテンプレートの修正なんで省こうかと思ったけど、気分がノッてきたのでついでに書いちゃうことにします。
product.tplの編集
例によって場所は自分で検索してくださいね。
で、適切な位置にcart_comment1用のtextareaを追加するわけなんですが…、とりあえず例として「詳細-メイン拡大画像」の後に追加してみましょう。
「詳細-メイン拡大画像」の入力欄を閉じる”</tr>”の後に下記のコードを追加
<!-- @add cart_comment1の入力欄を追加 --> カート-コメント1<span class="red">(タグ許可)</span> <span class="red12"><!--{$arrErr.cart_comment1}--></span> <textarea name="cart_comment1">background-color: <!--{$smarty.const.ERR_COLOR}--><!--{/if}-->" cols="60" rows="8" class="area60"><!--{$arrForm.cart_comment1|escape}--></textarea> <span class="red"> (上限<!--{$smarty.const.LLTEXT_LEN}-->文字)</span>
はい。保存したら管理ページから商品登録画面を開いてみてください。
カート-コメント欄が追加されましたね?
次は確認ページの編集行きますよ?。
confirm.tplの編集
場所は(ry
適切な(ry
<!-- @add cart_comment1の確認欄を追加 --> カート-コメント1 <!--{$arrForm.cart_comment1|nl2br}-->
できましたか?
これでインターフェース側の編集はおしまい。
あとはフロントエンド(お客様に見せる側)のテンプレートに今回追加したカラム「cart_comment1」のデータを出力する記述を追加するだけです。
ここまで無事に進んでこれたあなたならもう一人でできますね?
完成は間近です。
頑張ってみてくださいね。それでは。
20081201追記
今回追加したcart_comment1のデータを表示しようと思ったらできませんでしたOrz..
で、チェックしてみると商品詳細ページで$this->arrProductに商品情報を取得するときに、SC_DB_DBFactory_MYSQLクラスのviewToSubQueryメソッドを使っていることがわかったので、このメソッドにもcart_comment1を追加します*14 。
まずは例によってSC_DB_DBFactory_MYSQL_ExにSC_DB_DBFactory_MYSQLのviewToSubQueryメソッドをコピーして、SC_DB_DBFactory_MYSQL_Exの方を修正します。
viewToSubQueryは配列で値を返すので、配列の要素それぞれの値にcart_comment1を追加してください。
これでselectしてくるフィールドにcart_comment1が追加されます。
あとはビュー側(detail.tpl)で{$arrProduct.cart_comment1}でカートコメントを表示することが*15 できました。
- しつこいですよね [↩]
- 大文字小文字などmb_convert_kanaで変換できる項目について [↩]
- detailと迷ったんだけどcartにしました。最後の1は後で同様のフィールドを追加したくなったときにインクリメントできるように [↩]
- コメント関係は全部text型になっているので [↩]
- これも他のコメントにならって半角カタカナを全角に、半角濁点を一文字変換、全角英数字を半角に [↩]
- data/class/SC_CheckError.phpにバリデーションが定義されているのでそこを見て必要項目を入れてください [↩]
- カテゴリーに新たな画像フィールドを追加するよりずいぶん簡単ですのでどうしても追加したい方はカテゴリーの項目追加の記事を読んで自力でやってみてください。自己責任で [↩]
- この辺はもう説明は要りませんね?あと基底クラスとか面倒なので親子とします [↩]
- こういうのを自分で探せるようになるのも大事なことですからね。恐らくこの記事を読んでくれる方はド素人の僕よりもまだphpに慣れていない方だと思うので、なるべくこういうスタンスで文章を書くようにしようと思います。ちなみにクラスを探す際のヒントは「class %クラス名%」で検索するということでしょうか。IDEやほとんどのエディタにはgrepやプロジェクト検索があると思うのでそれを使ってね。注釈長すぎだなぁ。 [↩]
- この説明でわかりますね?array(“hoge”, “hage”, “cart_comment1”);ですよ。要素を区切る際のカンマに注意して。 [↩]
- わかりますね?適切な位置ですよ。この場合if文やfor文の中に書かなければちゃんと機能はするけど、適切な場所ということになれば似たような処理「条件無くループもしない」が書かれている場所に連ねて書くのが適切といえるでしょう [↩]
- 商品詳細ページのURL(パス)を見ればどこにあるのか検討がつきますね? [↩]
- 例えばmain_commentがどんな書き方をして出力されているかをみてそれを真似して書けばいいですよね [↩]
- EC-CUBEは第三者がカスタマイズすることをあまり考慮していない作りのような気がしてきたんですが気のせいでしょうか。。。 [↩]
- やっとこさ [↩]