baser CMSのバージョンアップ

とあるサイトのサーバー移転を機に、baser CMSのバージョンアップをしてみました。

バージョンは2.1.2から3.0.14。

ざっくり仕様を。
・サブディレクトリで設置してある
・デザインテーマは「nada icons」(いらない要素は削除してある)
・アップローダープラグインのみインストール済み
・スマートURLはON

もちろんですが、作業はローカルで行います。
手順は「baserCMS 2.1系 から baserCMS3に移行する | baser CMS - 国産オープンソース!フリー(無料)で『コーポレートサイトにちょうどいいCMS』」に沿ってやってみました。

まずは、一気に3.0.14へしてみることに。
現在ダウンロードできる最新の「DBマイグレーター」をダウンロードして、やってみました。
結果はエラーが出てダメでした。
そして、先ほどのページのBcDbMigratorをダウンロードしてbaser CMS 3.0.0から順にアップしてみることにしました。
しかしここで問題が。
リンク先が削除されているようで、404エラーが。
にっちもさっちもいかない状況になりました。
しばらく考えた結果、名案が浮かびました。
今まで使っていたパソコンに古いデータがあるかもしれないと思い、久しぶりに電源をON。
ハードディスクを漁っていたら、ありました。
ナイス、昔の自分。
早速作業を開始し、無事にバージョンアップ完了。
次はここから3.0.14にアップデートしてみました。
もちろん、アップデート前にはバックアップをしておきます。
(ファイル,データベース,管理画面上のデータメンテナンスからもバックアップ)
結果はエラーが発生して、またにっちもさっちもいかない状況に。
構造も全然違うので諦めて、再度3.0.0をインストール、復元。
今度は順を追ってアップデートすることにして3.0.5.1までは順調に完了しました。
次は、3.0.6.1。
これ以降はエラーでアップデートできませんでした。
また、にっちもさっちもいかなくなりました。
どうしようもないので、作戦を変えて3.0.14をインストールしてから、3.0.5.1のバックアップデータから復元をしてみることにしました。
データベース構造は変更がないと思ったからです。
まず、3.0.5.1から管理画面上のデータメンテナンスからバックアップを作成。
一旦、すべて削除。(ファイル,データベース)
3.0.14をインストール。
管理画面のデータメンテナンスから復元。
アップローダーでアップしたデータをコピー。
nada iconsのカスタマイズ部分をコピー。
インストールディレクトの「/app/config/install.php」の
Configure::write('Security.salt', '文字列');
のコピペも忘れずに。
これを忘れると管理画面に入れなくなります。
一通り作業をして確認したところ、問題なく動作しているようです。
これで3.0.14へのアップデートが完了しました。

あとは本番環境で問題ないか、実際にアップしてみて確認します。
「/app/config/install.php」、「/app/config/database.php」を本番用に書き換えてアップロードします。
データベースもphpMyAdminを使用してアップしておきます。

いよいよ本番で確認し、問題なさそうなです。
今度はローカル上の古い方(2.1.2)をバックアップして、古い方を削除し、古い方のディレクトリ名に変更し、「/app/config/install.php」の
Configure::write('BcEnv.siteUrl', 'サイトのURL');
を変更します。
ローカルで問題なければ、本番用も同様に作業します。

これでまた確認して問題なさそうなので、作業終了です。

紆余曲折はありましたが、何とかバージョンアップ完了しました。

今回はあまりカスタマイズしていなかったのと、当時DBマイグレーターをダウンロードしてあったのが幸いして、何とか上手く行きました。

baser CMSは現在4.0.3が最新ですが、3系もまだメンテナンスされているので、サポート終了間近までは3系で行こうと思います。

以上、baser CMSのバージョンアップでした。

PHPでInternet Explorerのバージョンを判定する

既に多くのプログラマーさんがやっているとは思いますが、PHPでInternet Explorerのバージョンを判定するプログラムを考えてみました。
$ua = $_SERVER['HTTP_USER_AGENT'];
$uaBrowserInfo['browser'] = "";
$uaBrowserInfo['version'] = "";
if (preg_match("/Trident\/(\d{1,}\.(\d{1,})).*rv:(\d{1,}\.(\d{1,}))/", $ua, $regExpResults)) {
	$uaBrowserInfo['browser'] = "IE";
	$uaBrowserInfo['version'] = (float)$regExpResults[3];
} elseif (preg_match("/MSIE\s(\d{1,}\.\d{1,})/i", $ua, $regExpResults)) {
	$uaBrowserInfo['browser'] = substr($regExpResults[0], 2, 2);
	$uaBrowserInfo['version'] = (float)$regExpResults[1];
}
ざっくり解説。
まず、uaという変数にUser Agentの値を入れる。
uaBrowserInfoのbrowserとversionを空にする。
正規表現で、先ずはIE11の新しくなったUser Agentかどうかを判定する。
Tridentとrv:があればIEとして、uaBrowserInfoのbrowserにIEと入れ、versionにはregExpResultの4番目の値がrv:の後の値が入っているので、それをfloatに変換して入れる。
次の処理で、従来の「MSIE バージョン番号」が見つかったら、uaBrowserInfoのbrowserにregExpResultsの1番目の値からIEという文字列抜き出して入れる。
バージョンはregExpResultの2番目の値をfloatに変換して入れる。
色々なパターンを試してみたので、おそらくこれで問題はないかと思います。

【2014/8/1 14:37追記】
ちなみに、互換モードは考慮していません。