カテゴリー : 未分類

EC-Cubeのバージョンアップ(2.0.x→2.11.x)

EC-Cubeのバージョンアップ(2.0.x→2.11.x)

EC-CubeのDB構成は古いバージョンと新しいバージョンでちょこっと変わっていて、DB移行で手こずったのでメモ。

今回のタスクはユーザテーブルのみの移行。商品データはそんなに多くなかったので手作業での移行でした。

ユーザのほうはパスワードがハッシュ化されていて手作業移行は当然できないので、ちゃんとやってあげる必要があります。

構造の違い

インストールしてみた新EC-Cubeと旧EC-Cubeのユーザテーブル(dtb_customer)の構造の違いを比べてみます。

新しいほうにはsaltという項目があって、cell01,cell02,cell03という項目が無くなっています。これらを調整します。

テーブル構成の調整方法

新EC-Cubeの認証ソースをみてみます。(class/util/SC_Utils.php)

    function sfIsMatchHashPassword($pass, $hashpass, $salt) {
        $res = false;
        if ($hashpass != '') {
            if (AUTH_TYPE == 'PLAIN') {
                if ($pass === $hashpass) {
                    $res = true;
                }
            } else {
                if (empty($salt)) {
                    // 旧バージョン(2.11未満)からの移行を考慮
                    $hash = sha1($pass . ':' . AUTH_MAGIC);
                } else {
                    $hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
                }
                if ($hash === $hashpass) {
                    $res = true;
                }
            }
        }
        return $res;
    }

上記ソースがパスワード認証しているところですが、saltが無いときには旧バージョンの認証方式をつかってくれるそうなのでsaltはブランクでも良さそうです。cell01,cell02,cell03は使ってる形跡が見つからなかったので、そのまま削除します。方針はこうなります。

  • saltはブランクで挿入
  • cell01,cell02,cell03は単純削除

旧EC-Cubeでデータバックアップ

アドミン画面>システム管理>バックアップ管理(/admin/system/bkup.php)からバックアップを作成します。

(テスト用お客様アカウントを持っていない場合は、移行後のテストのためにこの前にテストアカウントをひとつ作っておくのをおすすめします。)

できたバックアップをDLして解凍後、bkup_data.csvというファイルをテキストエディタで開きます。

このファイルにはDBダンプが特定のルールで書き込んでありますが、dtb_customerの部分だけが必要なので、その部分だけを抜き出し、正規表現等で加工します。僕はPHPで簡単なPGMをかきました。

			

			$text='  //ここにバックアップファイルからコピペ
			';
			$array=explode("\n",$text);
			foreach($array as $key=>$val){
				$rowArray = explode(",",$val);
				if($key==0){
					$keyArray = $rowArray;
				}else{
					foreach($rowArray as $tempKey=>$tempVal){
						$keyName = $keyArray[$tempKey];
						if($keyName=="cell01" or $keyName=="cell02" or $keyName=="cell03" ){
							continue;
						}elseif($keyName=="secret_key" ){
							$returnArrayOne["salt"]="";
						}
						$returnArrayOne[$keyName]=$tempVal;

					}
					$returnArray[]=$returnArrayOne;
				}
			}
			foreach($returnArray as $key=>$val){
				$rowText = "";
				foreach($val as $tempKey=>$tempVal){
					$rowText .= "$tempVal,";
				}
				$rowText=preg_replace("/,$/","",$rowText);
				$returnText .= $rowText."\n";
			}
			print($returnText);
			die();

ソースの中にテキストをコピペしちゃうあんちょこ方式ですが、これでCSV整形します。

新EC-Cubeへのデータインポート

あとはこれをphpMyAdmin等で新EC-Cubeに流し込むだけです。

ログインしてみる

バックアップ前につくっておいたテスト用お客様でログインしてみます。

、、、できないです。

ソース再確認

先ほども見た、認証ソースをみてみます。(class/util/SC_Utils.php)

                 if (empty($salt)) {
                    // 旧バージョン(2.11未満)からの移行を考慮
                    $hash = sha1($pass . ':' . AUTH_MAGIC);
                } else {
                    $hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
                }
                if ($hash === $hashpass) {
                    $res = true;
                }

旧バージョンの認証ではAUTH_MAGICとパスワードからハッシュの生成をしています。なので、AUTH_MAGICを確認してみましょう。

config/config.php (新バージョン)
mtb_constants_init.php (旧バージョン)

上記ファイルにそれぞれAUTH_MAGICの定義があります。

違ってます。そりゃそうですね。旧バージョンのAUTH_MAGICの値を新バージョンのAUTH_MAGICで書き換えます。

再度テスト

ログインできました!

まとめ

EC-Cubeの古いバージョンから新しいバージョンへの移行は苦労することが多そうなので、できるかぎり手作業でやって、どうしてもできないときには中のソースを読み解く必要がありそうです。

確か2.4から2.12への移行ツールはあった気がします。(よく覚えてないけど)たしかEC-CubeのオフィシャルからDLできるはずなので、とりあえず見てみるといいかもしれません。

unixでファイルのリネームと文字列の一括置換

ファイルの文字列を変換して、拡張子も変えるスクリプト

サクラサーバーでSSI(サーバーサイドインクルード)が使えなかった為、シェルで対応。

SSIがなぜ効かなかったのかは不明。なんかもっと上手なシェルの書き方もありそうだけども。。。

for file in `find ./ -name "*.html" -print`
do
    res=`expr $file : "\(.*\).html"`
	cp $file $file.bk
done
find . -type f -name '*.html' -print0 | xargs -0 perl -i -pe 's/<\!--#include virtual=\"\/common\/ssi\/sample\.txt\"-->/<\?include(\"\/home\/sample\/www\/common\/ssi\/sample\.shtml\")\?>/g'
find . -type f -name '*.html' -print0 | xargs -0 perl -i -pe 's/<\!--#include virtual=\"\/common\/ssi\/sample2\.txt\"-->/<\?include(\"\/home\/sample\/www\/common\/ssi\/sample2\.shtml\")\?>/g'

for file in `find ./ -name "*.html" -print`
do
    res=`expr $file : "\(.*\).html"`
	mv $file $res.php
done

追記。
実は最初のfor文の中に全部いれちゃえばよかったのかも。

cake2.0系で携帯サイト対応する方法(文字化け対応)

携帯サイトを作成するとき、エンコードをSJISにする必要があるが、cakeのデフォルトエンコードはUTF-8なので、いくつか対応してあげないと文字化けする。
cake1.x系だと、下記の方法でいけそう。

[CakePHP] 携帯サイトの作り方まとめ by Sometime PHP様 

でもcake2.0になると、afterFilter() の中で、下記のように記述するという方法がそもそも使えない。

$this->output = mb_convert_kana($this->output, ‘rak’);
$this->output = mb_convert_encoding($this->output, ‘SJIS-win’, ‘UTF-8’);
…..

→$this->outputが使われなくなってしまっているため。
ちょっとソースをみてみたら、下記の方法でできそう。

$this->response->body(mb_convert_encoding($this->response->body(), ‘SJIS-win’, ‘UTF-8’));

$this->response (CakeResponseクラス)のbody関数は、引数が設定されていた場合は引数の値をbodyにセットし、引数が無い場合は今もっているbodyを返す。

と、これでテストしてみたらどうもまだ文字化けする。HTMLはSJISで渡っているものの、ブラウザがUTF8として処理をしてしまっている。
もちろん、HTML内でcharsetの設定はしている。
HTTP-HEADERをみてみると、ヘッダーでcharsetをUTF-8として送信しているよう。

今度はCakeResponse.phpをみてみたら、CakeResponseに対してcharsetの指定をしてあげないといけないらしい。
これをしないと、core.phpで指定した下記の値が引き継がれる。

Configure::write(‘App.encoding’, ‘UTF-8’);

ということで、下記にて一件落着。

function afterFilter() {
parent::afterFilter();
if($this->request->params[“prefix”]==”m”){
$this->response->body(mb_convert_encoding($this->response->body(), ‘SJIS-win’, ‘UTF-8’));
$this->response->charset(‘SHIFT-JIS’);
}
}

携帯サイト対応っていろいろ面倒ですね。