2012年5月4日金曜日

EC-CUBEのハマリポイント

みなさんGWをどうお過ごしでしょうか。
僕は初めてのEC-CUBEの案件で苦労続きで前半戦はずっとドタバタしてました(´・ω・`)
今はやっと落ち着き初めましたがそんな苦い思い出のいっぱい詰まったEC-CUBEさん。
国産のメジャーなCMSな割にはコアな部分の情報は少なくて、更にバージョンによって対応も随分違ったりと大変なので自分の備忘録のためにもここにハマリポイント(ハマりそうなとこ、実際ハマったとこ)を列挙しときます。
スマートな対応じゃないとこもいっぱいあるので、もし代案があるなら是非是非教えてください!

まず前提条件として自分が担当したEC-CUBEのバージョンは2.11.4です。
そしてインフラの環境はLAMPです。
またECCUBEの基本的なディレクトリ構成(data、htmlの関係とかphpとテンプレートの関係とか )は他のサイトとソースを見て頑張ってくださいw
自分はSmartyも初めてだったのでこの本を自炊してOCRかけて使いました。
こういう技術書(特にポケットリファレンスとか)を自炊してOCRは便利ですのでオススメです。





それではいくつか。

1 ログイン認証
ソースを読むと分かるんですがpasswordは

    /data/class/util/SC_Utils.php

のメソッドで確認してます。
基本的には

$res = hash_hmac(PASSWORD_HASH_ALGOS, $str . ":" . AUTH_MAGIC, $salt);

でハッシュ化した文字列とDBの文字列がマッチすればOKです。
そこで問題になるのがそれぞれの引数。
これは

    /data/config/config.php



    define ('AUTH_MAGIC', 'ECCUBEのインストール時に生成されて保存される');
    define ('PASSWORD_HASH_ALGOS', 'sha256');

となっており、これを使われます。
また$saltは既存のユーザはDBの

    dtb_customer

にユーザ毎に保存されており、それぞれ取得して使います。
つまり検証環境と本番環境でそれぞれECCUBEをインストールして、DBだけを移行した場合はAUTH_MAGICがマッチせずログインできなくなります。
対策としてはユーザのpasswordの再設定か上記の定数をマッチしてください。
でここまではソースを見ればすぐわかる話。
俺がハマったのはさらに環境としてリバースプロクシを使ってた時。
ログインの時にログイン時のホスト名を確認しており

    $_SERVER['HTTP_HOST']

の値と

    define ('HTTP_URL', 'http://soudai.zannen);

が一致しない場合に蹴られます。
なのでリバースプロクシを使ってる環境では上記のconfig.phpの最初で

    $_SERVER['HTTP_HOST'] =  'soudai.zannen';

としてやりました。
これと同じことはwwwを標準ではつけてるけどリンクにwww無しで記載してたりしてURLがマッチしない時も起こるのでFQDNは要注意です。

2 mysqlでのシーケンスの取得
ECCUBEは受注番号や会員番号などの順番を

    table名.seq

と言うtableで管理しています。
mysqlはPostgresのように複数tableをまたがるシーケンス用の仕組みを用意してないので(むしろあったら是非教えてください!)tableでシーケンスを管理するのはよく見る手法ではあります。
で自分がよく見るのはtableの中のカラムの値をselectで取得して

update table_sequence set seq_num = LAST_INSERT_ID(seq_num+ 1) where column_name = 'zannen_num';

などで使った後は増やしてやる方法。
こうすることでtableの中の対象のカラムの中の数字がそのままシーケンスになります。
ECCUBEも一見すると同様にtableの中のカラムにシーケンスナンバーが入ってます。
ですが実際に取得してるのは

    Autoindexの値

なのでカラムの中の値を変えただけではシーケンスは変わりません!
つまりサーバ移行などで会員情報や商品情報を直接DBにINSERTしたり消した時は

    ALTER TABLE テーブル名 AUTO_INCREMENT = 目的の数字

で数を増やしてやったり減らしてやる必要があります。
初期化する場合はTRUNCATEしてやればカラムと一緒にAutoindexも初期化されます。
なのでデータ移行後にID発行が出来なくてエラーが出た場合はここを確認してみてください。
(つかシーケンス取得するたびにINSERTとDeleteしてるってことだよね?どうなのそれ...)

3 納品書のPDF生成
受注管理画面からPDFを吐き出せる機能は

    /data/class/SC_Fpdf.php

に直書きされてます。
つまりこれをそのまま弄るとバージョンアップの際の鬼門になります。
ですがそれ以上にLAMPの環境だとPDFの生成時にエラーを吐いたりします。
クライアント側がMACの場合文字化けたりします。
これは

    /data/module/fpdi/japanese.php

の中で文字コードのArialを指定してるところがあります。
Linuxだと当然サーバ側にArialなぞありません。
またMac側にもArialはないのでMacの場合はそもそも表現が出来ないので文字化けします。
なのでここの文字コードの指定を外してやって対応してます。
つかPDF関係はかなり元の実装が残念なので結構大変だと思います・・・


とまだまだECCUBEのハマリポイントはあるんですが長くなるのでこのへんで。
また元気があればちょいちょい書いて行きたいとおもいます。