基本的なバージョンアップ手順
大抵のオープンCMSでは下記のような手順を踏みます。
- できれば、可能な限り、既存サイトでバージョンアップを行う
マイナーバージョンアップやプラグイン、エクステンションのバージョンアップが行えるようなら行っておく。
ちょっと、本末転倒の気もしますが、小さなバージョンアップ自体でトラブルになることもあるので、これを行う前にも次の項目に記載した、既存サイトのバックアップを行なっておくべきだ。 - 既存サイトのバックアップ
- データベースをバックアップ
- サーバー上のファイルをバックアップ
上記2項目は、何かあった時に、確実に元に戻すための予防策である。 - エクステンションやプラグインといった、追加プログラムの停止
これは、バージョンアップ後に、これら追加プログラムが動作するか保証がないからだ。同様に、テンプレート(テーマ)も既存、システムの付属したものに戻しておく。この時点で、データベースのバックを取り、バージョンアップ用とする。 - 別サーバーか、別の場所に新バージョンをインストールして、動作を確認する
これは、現在のサーバーの環境で、新バージョンが動作するか確認して、問題が生じた時に、環境以外の理由であることをはっきりさせるためが。
この時、データベースは新バージョン用のものを用意する。 - データベースの移設
新バージョン用のデータベースのテーブルを全て削除して、手順3で作成した、現行バージョンのデータベースを復元する - オープンCMSのバージョンアッププログラムを走らせる
- プラグイン、エクステンション、テンプレートを戻していく
この過程で、新しいプラグイン、エクセテンションを導入しなければ、ならなくなったり、テンプレートに修正を加えなければならなくなることがある。 - 現行サイトを閉じて、新バージョンのサイトと入れ替える
Wordpressの4系はすでに、ワンクリックでデータベースのアップデートが行われる。Joomlaでもマーイナーバージョンアップなら、ワンクリックで行える。
しかし、基本的には、プラグインなどが新バージョンで動くか保証の限りではないので、上記のステップを実行する方が安全だ。
上記のような、手順がブログの運営だけができる人にも可能かどうかは疑わしい。
データベースのバックアッププログラムは組み込めるはずなので、ブログが書けるだけの人でも、バージョンアップまで出来るようなオープンCMSの進化が待たれる。
バージョンアップの必要性
ところで、バージョンアップなんてしなくてよいと思っている方も多いと思いますが、残念ながら、これは避けて通れない。それは、セキュリティホールの問題があるからです。
どんなに完璧そうなプログラムを作成しても、昨今の大規模なプログラムでは、必ず、プログラムを悪用されてしまうような、保安上のほころび、穴(=ホール)があります。
ブログが悪用されても、妙な記事が書かれるだけかと、安心してはいけません。自社サイトがコンピューターウィルスを撒き散らしたり、自社ホームページ内に、詐欺サイトが知らぬ間に作られたりするかもしれません。最悪、損害賠償を求められることもないとは言い切れません。結局、バージョンアップを怠ったツケは自分に跳ね返ってきます。
今回のバージョンアップの概略
さて今回のバージョンアップはプログラムの更新もさることながら、サーバー側のシステムのバージョンアップも絡んでいます。具体的には、phpのバージョンが5.6から7系に上がったのです。
この為、前述の"基本的なバージョンアップの手順"のステップ4で、サーバー上の別の場所に新バージョンを置いても、不十分です。これでは、phpの違うバージョンでの確認ができないからです。このため、phpのバージョンが7である別環境に、サイトを立ち上げて、確認後、公開サーバーのバージョンをアップすることになりました。
弊社ではMacでの開発を行なっていますが、Mac Sierraではかなり環境づくりに手こずりました。この顛末は、また別に掲載します。
今回のシステムでは、海外のJoomlaでよく使われているK2というプラグインをしています。また、綺麗なレイアウトが組めるGantryも採用されています。
K2はコンテンツの管理プログラムでJoomlaが持っていないような自由度のある階層化と、それに付随したプログラムでさらに、レイアウトに幅が広がります。例えば、スライドショーや最近では当たり前の可変メニュなども管理できるようになります。いわば、CMSの中のCMSです。
全く表示されない
もちろん、新しく作成したサイトでは、新バージョンのサイトが動作するのですが、テンプレートをシステムデフォルトから現行に変更すると、何も表示されません。どうやら、Joomla2系から3系への更新は大幅であったことと、レイアウトを操作できるGantryもバージョンがアップしており、これが問題を引き起こしているようでした。
使用していたテンプレート(=テーマ)は、以下の要件で動作していました。
Joomla 2
Gantry 3
K2 2.5
これに対して最新は
Joomla 3
Gantry 5
K2 3
です。
最新で新サイトを構築してみると、Gantry 5ではテンプレートが認識されません。Gantry 5ではテンプレートはGantry自体で管理されますが、現行のテンプレートをGantryは識別しませんでした。
そこで、一つ古いバージョンのGantry 4を導入しました。
こちらは テンプレートが動作していたGantry 3とほとんど同じような機能で、Joomla 3でも動作します。
K2は 使用してたバージョン2.5のテーブルをそのまま移設して、動作しました。しかし、K2で動作する部分を一度削除している為、一部モジュールの作り直しが必要でした。
コンテンツはうまく移行されたのですが、スライダー、メニュー、よく読まれるページ、最近追加されたページなどK2のコンテンツを操作して表示する部分が動作しませんでした。
最初はJoomlaのエラー画面も表示されません。テンプレートをシステムデフォルトに切り替えると、表示が行われることから、テンプレートファイルに問題がありそうです。
テンプレートのindex.phpにphpのエラー設定を全部表示させるコマンドを付け加えて、様子を見ます。
具体的には下記の二行です。
ini_set( 'display_errors', 1 );
error_reporting(E_ALL);
エラー表示から、"JSite"というライブラリーが動いていません。
Gantry 4用の無料テンプレートを覗いてみると、初期化の方法が違っています。
require_once('lib/gantry/gantry.php');
から
require_once(dirname(__FILE__) . '/lib/gantry/gantry.php');
$gantry->init();
に書き換えて見ますが、動作しません。
取り急ぎ、メニューがらみだと予想がついたので、メニュ関連のプログラムの一部をコメントアウトして、動作させます。
詳細はメニューの部分で解説します。
スライダー
スライダー(スライドショー)には、K2_NivoSliderというプログラムを使用していました。NivoSliderは、美しいスライドショーが作成できるプログラムで、画像エフェクトやキャプション表示など多くのことが可能です。
しかし、最新のK2_NivoSliderは有料となっています。Joomla用に他のNivoSliderプログラムもあるのですが、K2を使って動作するようになっていません。有料でも現在の組み合わせで動作する可能性もない為、二の足を踏みました。
結局、元のプログラム(1.03)を導入して、動作しました。
K2系はバージョンアップにはかなり強いと感じました。
JSite
メニューはRokNavMenuを使用しています。当初のものは、1.12で最新版は2.09です。
導入した途端、テンプレートがエラー表示に変わりました。JSiteというライブラリーがうまく動作していません。
JSiteを調べてみると Joomla APIに JApplicatonを継承しているとあります。
http://doc.joomladev.eu/api25/
さらに、下記では、JApplicationでJSiteの関数をどのように呼ぶか記載されていました。
https://docs.joomla.org/Site
そこで、menuの呼び出し部分2カ所を下記のように書き換えてメニューが動作するようになりました。
//$menu = JSite::getMenu();
$app = JFactory::getApplication();
$menu = $app->getMenu();//$menus = &JSite::getMenu();
$menus =$app->getMenu();
JParameter
次は、JParameterでエラーとなりますた。調べると、システムから無くなったことが下記に記載されていました。
https://api.joomla.org/cms-2.5/classes/JParameter.html
JParameterはJRegistryの拡張であることがわかったので、下記のように変更して、メニューが表示されるようになりました。
// $params = new JParameter( $menu_array->params );
$params = new JRegistry( $menu_array->params );
これらの変更はテンプレートがJoomalのバージョンに対応していなかったために、生じたエラーです。
Joomlaには、Joomla APIと呼ばれる、テンプレートで使用できる各種の関数が用意されていますが、それらが、変更になったために、古いバージョンで表示されていた、テンプレートが動作しなくなったのです。
この辺りは、プログラムの知識がないと、解決はできないでしょう。
また、プログラムの知識があっても、Joomlaでは、ある程度動作すると、エラーをJoomlaのシステムが捕捉して表示しまうため、情報が非常に少なくなるため、解決が難しくなります。
Joomlaでは、phpが表示するテキスト形式のエラーより、装飾のついたエラー画面になるのですが、詳細の情報は破棄されてしまうのです。
これは、管理画面のシステム設定で、エラー表示を「デバッグ」にすることで、もう少し、詳しく情報を表示させることができますので、試してみてください。
moo tools
さて、次に、mootoolsがないというエラーが表示されました。
Google検索をかけると、Joomla3に対応しているはずのRokNavMenuでも、テンプレート側の呼び出しが対応していませんでした。
https://joomla.stackexchange.com/questions/4756/upgrade-to-j3-gives-jhtmlbehaviormootools-not-found
テンプレート内の該当箇所を指示通り修正を行うことで。
配列のエラー
さらに下記のエラーが表示されました。
[] operator not supported for strings
これは、配列の使い方の問題と予想がつきましたが、今までは、動作していたのに不思議です。どうやら、phpが7に上がったことで、配列が厳しく評価されるようです。
実際には最初に、stringを代入していた、変数に、後で、配列を追加しているためにエラーとなっていました。
phpの古いバージョンでは、下記のようにしても問題はありませんでしたが、7ではエラーとります。
$ul_css = '';
$ul_css[] = 'XXX';
これは、配列になるかどうかわからない変数の場合、便利ですが、プログラム的には、褒められたものではありません。配列でない場合は、要素1個で考えれば良いことすから、どうなるかわからないなら最初から、配列で用意するのが、妥当と思われます。今回も、下記のように変更することで動作するようになりました。
$ul_css=array();
まとめ
- Joomla 2系から3系へのバージョンアップでは、プラグイン、エクステンションやテンプレート(テーマ)が新バージョンに対応できるかが、問題になる。
- バージョンアップにはデータベースのバックアップや全ファイルのバックアップを行った上で、新バージョンでのシステムを別途作り上げる必要があり、ブログの作成・管理ができる程度の知識では、対応は難しい。
- 本体のバージョンアップはセキュリティの面からは、避けて通りれない。今まで、使用していたプラグイン、エクステンション、テンプレートが動作しなければ、代替を考えてでも、バージョンアップは行うべきである。
- プラグイン、エクステンションはそれでも各開発元が、新バージョンを用意していることが多く、まず、対応できると考えられる。一方、購入したテンプレートでは、そこまでの対応はなく、新しいバージョン用に新規テンプレートを購入するか、あるいは、改造して対応させるのか判断しなければならない。
- テンプレートでの問題は、Joomla APIがかなり大きく変わていることである。Joomla APIの情報は、joomla.orgにある。また、管理画面のシステム設定で、エラー表示を「デバッグ」にすることで、不具合箇所の切り分けができる。
- 問題の解決には、プログラムの知識が必要で、サイトの管理ができるという知識レベルとはまた別の知識が必要である。