EC-Cube
2009年10月31日
EC-Cube&MySQL 5.0以降を利用しているときのおまじない
MySQL 5.0以降を利用しているならば、Viewが利用できるようになっているので、ぜひ、Viewを使ったほうがいいでしょう。
というのは、「規格」数が増えてきた場合や、「規格1」×「規格2」で発生するSKU(在庫管理単位)が多くなると、管理画面でタイムアウトを起こしてしまうほど、時間がかかるという問題にぶつかりました。
このような事例が、EC-Cubeの問題点で、ネット上でもちらほら見かけられますが、ハッキリ言えば、MySQLを止めて、PostgreSQLに移行するというのも一つの手なんだと思います。ただ、すでに構築しているサイトのDBを変えるというのは結構大変な作業ですし、できればなんとか回避したいと思うわけです。
具体的には、\data\class\db\dbfactory\SC_DB_DBFactory_MYSQL.php の中にある、function viewToSubQuery() を参照します。
ここで書かれている、Viewの置き換えクエリを、単純に create view するだけです。
たとえば、vw_cross_class については、DB上で、
そのうえで、このビューがプログラムのどこで使われているか、というのを個別に直すのは大変なので、
注意しなければならないのは、vw_cross_products_classにもありますが、サブクエリを含んでいる場合です。ビューでは、サブクエリを含んではいけないようです。
根本的な解決策になっていないのでは?というご指摘もごもっともで、速度向上のために(というか、タイムアウト回避のために)ビューを使うのは本末転倒ではないか、という話もわかります。
ですが、サブクエリを都度発行するよりもビューにしたほうが、私の使っているレンタルサーバでは現実的に速くなってタイムアウトしなくなりました。
OSかMySQLの実装問題なんだと思いますけど、ビューが別スレッドで処理されたりして、メモリ割当がスムーズにいっているのかなぁ、とか。
おまじないのような方法なので、推奨はしませんが、もし、EC-Cubeの商品管理画面で商品一覧表示後に、「規格」のボタンをクリックしても、いつまでたってもサーバから返答がない・・・、といったトラブルに見舞われた方、もしかすると、上の方法で解決するかもしれませんよ。
というのは、「規格」数が増えてきた場合や、「規格1」×「規格2」で発生するSKU(在庫管理単位)が多くなると、管理画面でタイムアウトを起こしてしまうほど、時間がかかるという問題にぶつかりました。
このような事例が、EC-Cubeの問題点で、ネット上でもちらほら見かけられますが、ハッキリ言えば、MySQLを止めて、PostgreSQLに移行するというのも一つの手なんだと思います。ただ、すでに構築しているサイトのDBを変えるというのは結構大変な作業ですし、できればなんとか回避したいと思うわけです。
具体的には、\data\class\db\dbfactory\SC_DB_DBFactory_MYSQL.php の中にある、function viewToSubQuery() を参照します。
ここで書かれている、Viewの置き換えクエリを、単純に create view するだけです。
たとえば、vw_cross_class については、DB上で、
create view view_cross_class as SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2;という感じで、view_cross_classというviewを作ってしまいます。(SELECT以下は、viewToSubQuery()に書かれていた内容)
そのうえで、このビューがプログラムのどこで使われているか、というのを個別に直すのは大変なので、
"vw_cross_class" => '(SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2)'のところを、
"vw_cross_class" => 'view_cross_class'としてしまえばいいわけです。
注意しなければならないのは、vw_cross_products_classにもありますが、サブクエリを含んでいる場合です。ビューでは、サブクエリを含んではいけないようです。
"vw_cross_products_class" =>'と書かれていますが、この中のサブクエリ(赤文字部分)を、まずビューにしてしまいます。DB上で、
(SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id,
T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2
FROM (SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2
FROM dtb_classcategory AS T1, dtb_classcategory AS T2 ) AS T1 LEFT JOIN dtb_products_class AS T2
ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2) '
create view view_cross_products_class_sub as SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2ということで、上記の赤文字部分は view_cross_products_class_sub になりました。その上で、
FROM dtb_classcategory AS T1, dtb_classcategory AS T2;
create view view_cross_products_class as SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id,とSQL文を実行することで、view_cross_products_clasが作成できます。もちろん、これができたら、viewToSubQuery()内で、
T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2
FROM view_cross_products_class_sub AS T1 LEFT JOIN dtb_products_class AS T2
ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2;
"vw_cross_products_class" => 'view_cross_products_class'としてしまうのがいいでしょうね。
根本的な解決策になっていないのでは?というご指摘もごもっともで、速度向上のために(というか、タイムアウト回避のために)ビューを使うのは本末転倒ではないか、という話もわかります。
ですが、サブクエリを都度発行するよりもビューにしたほうが、私の使っているレンタルサーバでは現実的に速くなってタイムアウトしなくなりました。
OSかMySQLの実装問題なんだと思いますけど、ビューが別スレッドで処理されたりして、メモリ割当がスムーズにいっているのかなぁ、とか。
おまじないのような方法なので、推奨はしませんが、もし、EC-Cubeの商品管理画面で商品一覧表示後に、「規格」のボタンをクリックしても、いつまでたってもサーバから返答がない・・・、といったトラブルに見舞われた方、もしかすると、上の方法で解決するかもしれませんよ。
2009年07月30日
EC-Cubeカスタマイズ「カテゴリー別インフォ」と「リッチエディター」
久しぶりにEC-Cubeのカスタマイズネタでも書いてみようと思います。
最新版EC-Cube Ver.2.4.1をベースにカスタマイズします。
2.4.1になって、細かいバグはみんな取れたので、どちらかというと機能増強を目指してカスタマイズしたいと思います。
まずは「EC-Cubeの学校」で紹介されている「カテゴリ毎に異なる説明文や画像を表示する」を導入します。もし、EC-Cubeのカスタマイズを行おうというのであれば、ぜひ、この「EC-Cubeの学校」のカスタマイズ方法を見ておいたほうがいいですね。class_extendsを使ったカスタマイズは、バージョンアップをしなければならないときなどに安心感があります。
こちらはほとんど問題なくカスタマイズ完了!
ありがとう、ホマン先生!!
加えて、今回はできるだけお客様にコンテンツ管理を行っていただく方向性なので、コンテンツ生成についてもリッチエディターが入れたいなぁ、と。
そこで、「EC-CUBE KnowHow Wiki」を参考にします。
こちらの「エディタのリッチ化」ページで、FCKEditorをEC-Cubeに入れ込むカスタマイズが紹介されています。
こっちはちょっとハマってしまいました。
私の失敗が後の人のためになれば、と思い、何にハマっていたかということを明記しておきます。
それはLC_Page_Admin_Products_Product.phpに対する変更で、
(EC-Cubeの学校で習った通りに実際にはclass_extendsで修正しましたが)
あくまで、http://www.shopdomain/shop/でEC-Cubeをインストールしたという前提で書かれていたので、そこを注意しなければいけなかったのですが、それに気がつかず、延々と悩んでしまいました。
でも、これでカスタマイズできて、いい感じ。
さらに、独自カスタマイズとして、カテゴリー別インフォの入力画面をリッチエディター化する、ということまでたどり着きたかったのですが、これを行うには、管理画面を作りかえる必要があるので、ひとまず中断。画面デザインを考えて再挑戦しなければいけません。
そういえば、送料カスタマイズを公開しようとしてそのままになってしまっているなぁ。お盆休みにでもVer.2.4.1への適用方法をまとめてみたいと思います。
そういえば、こんな本が発売されました。
EC-CUBE公式ガイドブック カスタマイズ編―オープンソースECサイト構築ソフト Ver2.4.0対応
著者:オレンジ 岸本
販売元:秀和システム
発売日:2009-07
クチコミを見る
また、以前からの公式本
EC‐CUBE「Ver2対応」公式ガイドブック―オープンソースECサイト構築ソフト
著者:中川 仁
販売元:秀和システム
発売日:2008-01
おすすめ度:
クチコミを見る
も、一度は読んでおくといいかも、です。
最新版EC-Cube Ver.2.4.1をベースにカスタマイズします。
2.4.1になって、細かいバグはみんな取れたので、どちらかというと機能増強を目指してカスタマイズしたいと思います。
まずは「EC-Cubeの学校」で紹介されている「カテゴリ毎に異なる説明文や画像を表示する」を導入します。もし、EC-Cubeのカスタマイズを行おうというのであれば、ぜひ、この「EC-Cubeの学校」のカスタマイズ方法を見ておいたほうがいいですね。class_extendsを使ったカスタマイズは、バージョンアップをしなければならないときなどに安心感があります。
こちらはほとんど問題なくカスタマイズ完了!
ありがとう、ホマン先生!!
加えて、今回はできるだけお客様にコンテンツ管理を行っていただく方向性なので、コンテンツ生成についてもリッチエディターが入れたいなぁ、と。
そこで、「EC-CUBE KnowHow Wiki」を参考にします。
こちらの「エディタのリッチ化」ページで、FCKEditorをEC-Cubeに入れ込むカスタマイズが紹介されています。
こっちはちょっとハマってしまいました。
私の失敗が後の人のためになれば、と思い、何にハマっていたかということを明記しておきます。
それはLC_Page_Admin_Products_Product.phpに対する変更で、
(EC-Cubeの学校で習った通りに実際にはclass_extendsで修正しましたが)
oFCKeditor.BasePath = '/shop/user_data/fckeditor/';になっている部分のこのPathの設定です。
あくまで、http://www.shopdomain/shop/でEC-Cubeをインストールしたという前提で書かれていたので、そこを注意しなければいけなかったのですが、それに気がつかず、延々と悩んでしまいました。
でも、これでカスタマイズできて、いい感じ。
さらに、独自カスタマイズとして、カテゴリー別インフォの入力画面をリッチエディター化する、ということまでたどり着きたかったのですが、これを行うには、管理画面を作りかえる必要があるので、ひとまず中断。画面デザインを考えて再挑戦しなければいけません。
そういえば、送料カスタマイズを公開しようとしてそのままになってしまっているなぁ。お盆休みにでもVer.2.4.1への適用方法をまとめてみたいと思います。
そういえば、こんな本が発売されました。
EC-CUBE公式ガイドブック カスタマイズ編―オープンソースECサイト構築ソフト Ver2.4.0対応
著者:オレンジ 岸本
販売元:秀和システム
発売日:2009-07
クチコミを見る
また、以前からの公式本
EC‐CUBE「Ver2対応」公式ガイドブック―オープンソースECサイト構築ソフト
著者:中川 仁
販売元:秀和システム
発売日:2008-01
おすすめ度:
クチコミを見る
も、一度は読んでおくといいかも、です。
2009年01月06日
2008年12月03日
EC-Cubeのカスタマイズというか、まともに使えるようにするメモ
EC-Cube(2.3.0)を使って、お客様のショッピングサイト構築を行っておりますが、いろいろ直すべきところがあって大変です。次回、忘れないように、ちょっとメモをしておきます。(そんなわけで、このBlogエントリは随時更新が予定されます。)
1.ルミーズの決済モジュールをインストールするとき
(1) コンビニ決済にトラブル(PC決済)
(2) コンビニ決済にトラブル(携帯側)
(3)携帯画面のフッター
2.送料設定
3.携帯でのセッションID問題
5.カレンダーパーツの定休日設定
6.現行バージョンまでのパッチ当て作業
本日現在では2.3.2がリリース。セキュリティ問題などが出ているので、一つ一つ修正していかねばなりません。これは、ダウンロードページを見ながら、やっていくしかないですね。
7.デフォルト設定:携帯(DoCoMo)
とまぁ、いまのところ、こんな感じ。あとは、どこまで直せばいいのやら…。もうちょっと完成度が上がってくるといいですね>EC-Cube
1.ルミーズの決済モジュールをインストールするとき
(1) コンビニ決済にトラブル(PC決済)
問題:utf-8でページが生成されていますが、Shift_JISでデータを送らねばならず、エラー発生。
解決法:/data/downloads/module/mdl_remise/remise_conveni.tplにて、<form>内に Accept-charset="Shift_JIS" を書き込み、下のNextリンクに、JavaScript埋め込み(onclick="org=document.charset; document.charset='Shift_JIS'; return fnCheckSubmit(); document.f_g.submit(); document.charset=org;")
参考→http://gont.net/gontdo/archives/000740.html
参考→http://gont.net/gontdo/archives/000740.html
(2) コンビニ決済にトラブル(携帯側)
(3)携帯画面のフッター
問題:決済モジュール内のモバイル画面のフッターが反映されない。これは、携帯画面のフッター(/data/Smarty/templates/default/mobile/footer.tpl)を変更しても、決済モジュール内のフッターが固定化されているという状況
解決法:/data/downloads/module/mdl_remise 内の remise_card_mobile.tpl と remise_conveni_mobile.tpl を変更することで解決できます。
解決法:/data/downloads/module/mdl_remise 内の remise_card_mobile.tpl と remise_conveni_mobile.tpl を変更することで解決できます。
<center>LOCKON CO.,LTD.</center>
となっているところを
<!--{include file='footer.tpl'}-->
に変更する。
2.送料設定
問題:デフォルトのままでは、送料は一注文に対して(都道府県別)設定。サイトによく載っている解決法だと、一商品ごとに「送料」×「個数」を計算してくれるが、この「送料」だと都道府県別に設定できない。
解決法:ただいまプログラム作成中につき、続報を待て。
→12/9追記 ハンパ無いカスタマイズですね。
もし、やることになってしまった人へ:DBをいじると、
SC_Helper_DB.php
SC_CartSession.php
LC_Page_Admin_Products_Product.php
product.tpl
confirm.tpl
create_table_mysql.sql(これはどうでもいいのかも)
create_view.sql(これはどうでもいいのかも)
insert_data.sql(これはどうでもいいのかも)
SC_DB_DBFactory_MYSQL.php
上記のファイルをいじる羽目に。(しかもまだ終わっていない)
死にたくなければ、あまりDBはいじらない方がいいと思う。
僕は地雷を踏みたくて踏んでいるので…。
解決法:ただいまプログラム作成中につき、続報を待て。
→12/9追記 ハンパ無いカスタマイズですね。
もし、やることになってしまった人へ:DBをいじると、
SC_Helper_DB.php
SC_CartSession.php
LC_Page_Admin_Products_Product.php
product.tpl
confirm.tpl
create_table_mysql.sql(これはどうでもいいのかも)
create_view.sql(これはどうでもいいのかも)
insert_data.sql(これはどうでもいいのかも)
SC_DB_DBFactory_MYSQL.php
上記のファイルをいじる羽目に。(しかもまだ終わっていない)
死にたくなければ、あまりDBはいじらない方がいいと思う。
僕は地雷を踏みたくて踏んでいるので…。
3.携帯でのセッションID問題
問題:携帯でセッションIDがうまく渡されずに、買い物かごや、会員登録ができない。
解決法:これは、単純に使っているサーバの問題。/html/.htaccessにて、php_flag session.use_trans_sid 1のコメントアウト(#)を外せば解決した。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=874&forum=10&post_id=2627
4.受注管理画面での納品書作成解決法:これは、単純に使っているサーバの問題。/html/.htaccessにて、php_flag session.use_trans_sid 1のコメントアウト(#)を外せば解決した。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=874&forum=10&post_id=2627
問題:納品書PDFにEC-Cubeロゴが表示されるが、設定画面では変更する箇所が無い。
解決法:/html/user_data/packages/default/img/pdf に logo.png がある。それを書き換えてしまえばよい。サイズなどを変更しなければならないとしたら、/data/class/SC_Fpdf.php あたりをいじくると良い。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2598&forum=11
解決法:/html/user_data/packages/default/img/pdf に logo.png がある。それを書き換えてしまえばよい。サイズなどを変更しなければならないとしたら、/data/class/SC_Fpdf.php あたりをいじくると良い。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2598&forum=11
5.カレンダーパーツの定休日設定
問題:カレンダーパーツの通常定休日設定画面がどこにも無い。
解決法:現在、2.4.0系での定休日設定の画面作成を行っているみたいだが、2.3.0に反映させるのは面倒。通常定休日に設定されている土日の休みを失くしてしまうためには、/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php 内のfunction lfGetCalendar にて、
解決法:現在、2.4.0系での定休日設定の画面作成を行っているみたいだが、2.3.0に反映させるのは面倒。通常定休日に設定されている土日の休みを失くしてしまうためには、/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php 内のfunction lfGetCalendar にて、
if ($this->lfCheckHoliday($month, $Day->day) || $Day->first || $Day->last) {
となっているところを
if ($this->lfCheckHoliday($month, $Day->day)) {
にしてしまう。面倒だけど、その後、個別定休日となる日を登録するのが簡単。
6.現行バージョンまでのパッチ当て作業
本日現在では2.3.2がリリース。セキュリティ問題などが出ているので、一つ一つ修正していかねばなりません。これは、ダウンロードページを見ながら、やっていくしかないですね。
7.デフォルト設定:携帯(DoCoMo)
問題点:デフォルト設定のままだとDoCoMo携帯でモバイルサイトを見ると、リンクが潰れて見えない。
解決法:/data/Smarty/templates/default/mobile/site_main.tpl の <body> タグ内の alink属性が悪さをしているので、外してしまう。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=849&forum=13
解決法:/data/Smarty/templates/default/mobile/site_main.tpl の <body> タグ内の alink属性が悪さをしているので、外してしまう。
参考→http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=849&forum=13
とまぁ、いまのところ、こんな感じ。あとは、どこまで直せばいいのやら…。もうちょっと完成度が上がってくるといいですね>EC-Cube