EC-CUBE問題点の指摘

ここ1週間ほど、EC-CUBEにかかりきりだったんですが、結構苦戦していました。

データを入れてみたりして思ったのが、「思った以上にバックエンドシステムが重い」点です。

実験しているサーバはそれほど重くないものですが、それでも1商品をDBに書き込むのに1分弱かかったりします。そのままだとPHPのタイムアウトが発生してしまうため、タイムアウト時間を変更するなどの改良が必要でした。困っているのが、何千点ある商品の在庫状況をCSVで変更する状況が発生するのですが、取り込めるCSVが商品の全データからでしかできないため、そのままやると商品点数×1分かかることになります。これでは運用は無理です。

CSVのインポート・エクスポートですが、エクスポート側は項目を選べるのに、それをインポートすることが出来ないのがかなりまずいです。これについては改良が必要ではないかと思います。

それから、前回の記事にも書きましたカテゴリの件ですが、登録できない問題や初期データ作成問題のほかに、並び順問題があり、「追加したデータが上に来る」という良く分からない仕様になっているため、CSVの並び順と逆になってしまう致命的な欠点があります。また、DB内に「rank」という順番の通し番号を表すフィールドがあるのですが、これも順序が大きい順になっているので分かりにくく、また階層毎に
1,2,3…なら分かりやすいのですが、全部に対しての通し番号のため、DBに直に登録するのも
非常に難しい… おまけに、せっかく順序や階層を登録したものについて、CSVでエクスポートしても、
インポートが出来ないし、順序や階層も無かったことになってしまうし…

とにかく、CSVデータのやりとりはおまけ機能と思った方が良いです。
このままでは使えない!
この辺は独自にリファインする必要がありそうです。自分も、別の管理画面を作るか、システムの関数を直接入れ替えるかのどちらかで作り直そうと思っています。

EC-CUBE導入は前途多難…

 仕事の都合でショッピングサイトを構築しなければならなくなり、いくつかあるオープンソースのシステムを物色しています。どれも一長一短で首を縦に振れない状況なのですが、納期の関係もあるため、仕方なく「EC-CUBE」にすることにしました。

 PostgreSQL対応、テンプレートシステム対応、携帯対応、PHP4/5対応…と、好条件が揃っているのですが、いかんせん使いにくいしバグが多い! 最新安定版の2.1.2を試していましたが、まずカテゴリのCSV登録が出来なくて躓き、苦戦しているところです(この件に関しては後述)。

 とりあえず現在最もネックになっているのが、ポイントシステムの存在。システム上外すことが出来ないため、このままでは運営を変えるしかないのかもしれません。
 それから、税込・抜き・非課税を商品単位で決められないところも非常に困るところです。

 だからといってEC-CUBEを諦めるわけにもいかない訳でして…osCommerceもZenCartもPHP5では動かないため、将来的にごっそり入れ替えなければいけないことが予想されるシステムを導入することも出来ません。osCommerceは新バージョンでPHP5やテンプレートシステムに対応するようですが、まだalpha版で導入するのが怖いし、拡張モジュールもおそらく現状のものを使えないだろうから構築は大変だろうし。まあPostgreSQLが使えないのも困るんですけど。派生プロジェクトのOpenBazaarも考えたんですが、上記の問題は全て解決できそうなんですが、あまりメンテナンスされていないっぽいのと、検索してもスムーズに導入できた実績が無いようで、茨の道を進むつもりはないのでこれもパス。本当は自作したいのですが、まあこれも時間がないので…

 まああれこれ言っていても仕方がないので、とりあえずEC-CUBEを使えるものにしながら進んでいこうということで(これはこれで茨の道ですが)。そんなわけでとりあえず評価用サイトを作る必要があるので、インストールし、前述のカテゴリCSVが取り込めない不具合の解消に現在取り組んでいる次第です。

 この不具合…指定された項目の通りにCSVを作成してアップロードしても「既に同じ内容の登録が存在します」というエラーが出て先に進めない、というものなんですが、バグ情報にも具体的な解決方法が上がっていないし、ネット検索しても有力な情報を得られないため、仕方なくソースを解析しました。

 結局「記述ミス」によるバグが直接的な原因でした。
 次の箇所を修正すると「とりあえず」正しい動きをするようになります。

/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php

【誤】
            // 編集中のレコード以外に同じ名称が存在する場合
            if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $_POST['category_name']) {
                $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。<br>";
            }

【正】
             // 編集中のレコード以外に同じ名称が存在する場合
            if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $arrRet['category_name']) {
                $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。<br>";
            } 

 ところが、これ以外にも「仕様」の穴があり、サブカテゴリの設定が大変に困難です。
 CSVデータの1カラム目は「カテゴリID」がくるのですが、ここに想定したIDを書き込んでしまうと「更新」扱いになるのです。新規登録をしたい場合は、ここを空白にしなければならないのです。しかし、サブカテゴリを登録したい場合は、3カラム目に「親カテゴリのID」を指定しなければならないので、IDの無いものへの指定は出来ません。つまり、一度親カテゴリを全て登録し、カテゴリIDが確定した段階で子カテゴリに親カテゴリのIDを記述し、それを登録…という、とても面倒な手順を踏まなければなりません。カテゴリ分類のあまりいらない小規模なショップなら良いのですが、カテゴリ分けの複雑な大規模なショップをやりたい場合、これでは設定が面倒で仕方がありません。

 バックアップを想定した作りなのでしょうが、これでは使えない機能になってしまいますので、これに関しては仕様の変更をお願いしたいところです。個人的には、一度カテゴリをフラッシュし、全て最初からインサート…で良いのではないでしょうか? まあ追加目的もあるでしょうから、チェックボックスのフラグがあっても良いかもしれません。

 ソースを眺めてみても、このファイルだけでも大変に無駄が多く、なんで3回もCSVファイルをfopenして全検索する必要があるのだろう、みたいなところとか、fcloseしていないとか、恐ろしいところもいくつかあったりします。このクラス内で利用している別のクラスでは、チェックルーチンとコンバートルーチンを兼用しているところがあり、戻り値が一体どちらなのか分からないようなものもあります。正直、オープンソースであるのだから、仮に同じ処理を通すことでソースコード量の無駄が減るにしても、可読性の落ちる書き方はいただけないです(個人的には、こんな書き方だからバグが多いのだと思ったりする)。

 もう少しソースの中を覗いてから正式決定するつもりではいますけど、おそらくかなり苦戦することになりそうだと予想はしています。ああ~、ECシステムのプロジェクト立ち上げたいなーなんて思ったり。誰か、一緒にやりませんか? できればCakeベースで(笑)。
 BakesaleというCake用のカートもあるんですが、現状これも使い物にならないというのか…本当にECシステムの選定には頭を悩まされます。

 というわけで、今後EC-CUBEの情報も発信していこうと思っています。
 なんか本題にちっともかかれない首締め状況に陥っていますけど、少しでも皆様のお役に立てれば。