Drupal6からDrupal7へのアップグレード

このところ、運用中のサイトの、Drupal6からDrupal7へのアップグレードを何度も繰り返しています。HTML5やCSS3への対応はDrupal6でもできないことはないでしょうが、Drupal7にすることで、Drupal7用のテーマやモジュールの活用して、ずっと快適にHTML5やCSS3へ対応できる環境が構築でき、またより広範にグローバルな最新のテクニックを導入することが可能になるはずです。

このDrupal7へのアップグレード方法について、自分なりの備忘録を兼ねて手順をまとめてみます。

Drupal6からDrupal7へのアップグレードはDrupal5からDrupal6へのアップグレードの時と較べて、はるかに正確で楽になりましたが、それでも面倒な作業は少なくありません。データベースの移行はほぼ問題ないと思います。ViewsもViews2からViews3へ、細かい設定については個々に設定をし直す必要が生じますが、基本的な構成はきっちり移行してくれます。

問題として残るのは出力テンプレートです。変数の配列構造がDrupal6とDrupal7で大幅に異なるため、テンプレートは基本的に全部作り直しですが、それさえ覚悟できれば、できるだけ早めにDrupal7へ移行しておくのは、クライアントやユーザーの便宜の面からも大きなメリットがあるはずです。

基本的なアップグレードの流れとして、電子遊戯DG編さんのまとめがとても参考になります。特にDrupal7をクリーンインストールして、その後、Drupal6のデータベースを読み込み、データベースをアップデートするという方法はかなり確実な方法だと思います。

以下、運用中のサイトをアップグレートする場合の自分の手順です:

開発サイトの構築

  1. 運用中のサイトと同じサーバー、もしくは同一環境のサーバーに適当なサブドメインと新しいデータベースで開発サイトを構築します。ローカル環境に開発サイトを構築すると、PHPのバージョンやエクステンションの有無、MySQLのバージョンなどが異なると問題を生じかねず、運用サイトの同じサーバーに開発サイトを構築した方が確実だと思います。
  2. 開発サイトにベーシック認証等でアクセス制限をかけ、運用サイトの全てのファイルとデータベースをコピーします。この時FTPよりもできるだけunixのwgetコマンドでファイルを移動させた方がずっと高速で、ユーザーがアップロードしたファイルも正確にコピーできます。
  3. 開発サイトのDrupal6のコアと、Drupal7化後も利用する各モジュールをDrupal6の最新バージョンにアップデートしておきます。update.phpを走らせ、データベースも更新しておきます。
  4. コア以外の全てのモジュールを無効化し、テーマをGarlandに変更します。Drupal7で使わないモジュール以外は無効化だけでアンインストールしてはいけません。
  5. この時点で、全てのファイルとデータベースのバックアップを取り、全てのファイルとデータベーステーブルを削除します。filesディレクトリ(通常、sites/default/files以下)は残しておいてもいいかもしれません。
  6. 空になった開発サイトにDrupal7の最新バージョンをクリーンインストールします。
  7. 正常にインストールできたことを確認して、インストールしたばかりですが、このデータベーステーブルを全て一旦削除します。バックアップをとっておいたDrupal6のデータベースをインポートします。
  8. setting.phpを開き、$update_free_access = FALSE; を $update_free_access = TRUE; に変更して、update.phpを走らせます。Drupal6のデータベースがDrupal7の構造にアップグレードされます。よほど大きなデータでないかぎり、あっという間です。アップグレードが完了したら、上記のTRUEをFALSEに戻しておきます。
  9. 次にDrupal6で使っていたモジュールのDrupal7版をアップロード、有効化、update.phpを走らせてデータベースの更新を行います。概ね大きなエラーは起こらないかと思うのですが、ここでデータベースをアップデートできなかったら結構面倒です。上記4の段階まで戻ってやり直すか、予めDrupal6の開発サイトとDrupal7の開発サイトの2つを用意して、問題をおこすモジュールをDrupal6でアンインストールしたデーターベースをDrupla7にインポートすることになるかもしれません。
    コンテンツに直接関係のないモジュール、例えば一般的に使うモジュールではwebformやxml sitemap、mollom、develといったところはインポートする前にアンインストールしておき、Drupal7化後改めてインストールした方がいいかもしれません。
  10. CCKはDrupal7ではコアに含まれるようになったのですが、Drupal7用のCCKがあって、これにcontent migrateというモジュールが入っています。これをインストール、有効化し、Drupal6のフィールドの設定をDrupal7に移行します。
  11. admin/structure以下にMigrate Fieldの項目が追加されているので、それを開くと、移行可能なフィールドの一覧が表示されています。移行不可能なフィールドの一覧も表示されています。例えばDrupal6のCCKに入っていたnode referenceはDrupal7のコアには入っていないので、Referenceモジュールのインストールが必要になります。
  12. 移行するフィールドを全てチェックして、Migrate selected fieldsボタンを押すと移行が始まります。何度か移行を行ったのですが、今のところ上手く移行できなかった経験はありません。ゲージで移行の状況が表示されるのですが、お~、上手くいってると実感させてくれます。

これでひと通り開発サイトの環境が構築できました。

Drupal7の設定

  1. Drupal6から移行すると、Drupal7のコアに新しく追加された機能(特に管理面の機能)がオフの状態になっています。お好み次第ですが、Overlay、Toolbar、Shortcutといったモジュールを有効化します。
    Contextual linkもオフになっていたら有効化しておきましょう。メチャ便利です。
  2. ちなみにToolbarを有効化してもDrupal7をクリーンインストールした時に表示されるメニューが表示されないことが度々経験しました。サイトの運営には直接影響しないものの、不便です。原因も対処法も解明できておらず、とりあえずAdmin menuをインストールして代替させています。
  3. それから管理用のテーマは移行したままだとGarlandになっているはずですが、Drupal7のデフォルトテーマのSevenに変えておいた方がずっと使いやすいでしょう。

Viewsの調整

  1. 上記のモジュールのアップデートでDrupal6のViews2からDrupal7のViews3にかなりきれいに移行してくれます。Drupal5からDrupal6へ移行の時にはここが全然うまく行かず、それぞれのViewsを一から作りなおした記憶があります。
  2. CCKのフィールドの移行とViewsのアップデートの順番がひとつの原因ではないかと推測するのですが、移行したViewsの管理画面を開くと、フィールドやフィルターの一部が壊れていて、Broken handlerになってしまっている部分が少なからずあります。これはひとつひとつ再度設定し直します。

テンプレートの作成

先に触れたように、Drupal6とDrupal7でフィールド値の変数の配列構造が大きく異なります。Drupal6で作ったカスタムテーマは殆ど使えなくなるはずです。

それからDrupal6でさんざん愛用させてもらったContemplateモジュールがDrupal7に対応していません。特にContemplateの変数を探し出す機能が使えないのは痛いです。

フィールド値を変数を直接呼び出すのではなく、花岡さんの記事でも紹介されているように、field_get_itemsというAPIを使う方法が基本のようです。自分の場合、これにfield.tpl.phpをオーバライドする方法を併用し、コンテンツタイプの表示設定で並べ替え、それで間に合わない場合はjQueryで表示場所を変更する、といった方法でなんとかしのいでいます。

テーマ(PHP、CSS、JSの出力テンプレートの集合体)はDrupal6ではGarlandを参考に自分でスクラッチしたテーマを組み込んでいたのですが、レスポンシブデザイン対応もあって、BootstrapやZenのテーマをインストールし、そのサブテーマとして必要な部分だけオーバライドする方法に変えました。

サブテーマ化で、コアモジュールやサードパーティモジュールそのものはいじらない、変更するのは自分の必要な部分だけオーバライドするというDrupal活用の大原則と、その便利さ、効率の良さ、確実性を再確認した次第です。

ユーザーインターフェースの変更

Wysiwygエディタは従来TinyMCEを使っていましたが、JS周りでどうもChromeでの動作がおかしかったりして、最近はCKEditorを使うようにしています。ユーザーにも好評で、Drupal8ではコアに入るという噂を聞いたこともあります。Wysiwgモジュールは使わずにCKEditorモジュールでOKだと思います。

画像のモーダルウィンドウ表示はLightbox2からColorboxに変更、画像だけじゃなく、iframeなんかもモーダルウィンドウ化できます。

動作確認

サブテーマでテンプレートやCSS、JSができあがったら、動作確認です。特にDrupal7ではjQueryが大活躍、自分の組み込んだjQueryのスクリプトやプラグインがCoreのjQueryで動かず、jQuery Updateモジュールで新しいバージョンのjQueryを入れると、今度はViewsの管理画面のoverlay等、一部の機能が動作しなくなったりする場合があります。

これはばっかりは徹底的に動作確認する他ないでしょうね。その上でjQueryの複数のバージョンを入れてみたり、スクリプトの順番を代えてみたり、でなんとか動くようにできるはずです。

動作確認できたら、開発サイトに運用ドメインを切り替えて完成です。クライアントやユーザーのご意見ご感想が、不安でもあり楽しみとなります。

drupal.org自体まだDrupal6で運用されているように、Drupal6からDrupal7へのアップグレードはそう簡単でもありません。しかし、もうDrupal8の正式リリースもそう遠くない先のことではありません。ここは早めに対応しておくのがやっぱり正解でしょうね。