Drupalの画像管理をImageFieldで

以前、画像処理はImageモジュールで、と書きました。このモジュールに依存するImage assistモジュールで画像を、コンテンツやコメント作成のbody欄や、ボキャブラリの説明欄など、色んなところから画像をアップロードし、コンテンツに関連付けることができます。

アップロードされた画像自体が一つのNode(コンテンツ)として生成されるので、フロントページに表示しない、といった処置をしておかないと、コンテンツの画像と画像コンテンツの画像が重複して表示されるようになります。

サイトの環境設定>画像で、設定しておけば色んなサイズにサムネイル化してくれるので、便利なのですが、テンプレートやViewsで画像出力したりするには、どうにも不向きと感じます。例えば画像の一覧を表示し、画像をクリックするとその画像が含まれるコンテンツを表示するといった場合です。

ということで、前にも一度チャレンジしたことがあるのですが、ImageFieldに再チャレンジしてみました。

必要なモジュール

ImageFieldでMTのカスタムフィールドの画像とほぼ同じことができるようになります。サムネイル作成にはImageCacheというモジュールが必要になります。さらにImageAPIというGDやImageMagickなど実際の画像処理とのインターフェースとなるモジュールが必要になります。一方ImageFieldをフィールドとしてもたせるCCKがインストールされていることが前提で、またテンプレート設定のためにContenmplateモジュールがあると便利です。それぞれのモジュールはDrupal.orgから入手できます。

なお、ImageFieldモジュールはImageモジュールと同じコンテンツタイプで併用することができないので注意が必要です。つまり画像フィールドを設定することによりBody欄からの画像アップロードは利用できなくなります。

PHPセーフモードの問題

前回はImageCacheで躓きました。今回じっくり原因を調べてみたのですが、作成したサムネール画像を保管するフォルダを作成したりするには、サーバーのPHPセーフモードがOnになっていることが問題と分りました。

CoreserverやXREAの場合、この設定は変えられないものの、PHPをcgiとして動かすことができますので、その設定を行いました。Drupal Japanに詳しい記事があるので参考にして下さい。

ImageCacheの設定

動作環境が整ったら、ImageCacheでサムネールサイズを設定します。プリセット名で例えばsmallという名前を設定、アクションとしてScaleを選び、幅、高さをそれぞれ100(ピクセル)に設定します。もうひとつ、プリセット名midiumという名前で幅、高さを500に設定します。

CCKでフィールドの設置

次に、コンテンツの管理>コンテンツタイプ、から画像フィールドを設置するコンテンツタイプを編集あるいは、新規作成します。フィールドを追加タブを選び、フィールド名を入力し、一番下にimageが表示されているので、それを選び、アップロードできるファイル数やファイルサイズなど詳細設定します。

次に、フィールドの表示タブを選び、作成したフィールドの出力方法を設定します。ティーザー、全文それぞれのプルダウンリストにImageCacheで作成したプリセット名があるので、それを選びます。上述の場合、ティーザー(要約文)ではsmall、全文ではmidiumを選びます。

テンプレート設定

最後にテンプレート設定しないと何も表示されません。一番簡単な方法として、Contemplate(Content Templates)を使います。該当するコンテンツタイプを選び、テンプレートを作成します。ティーザー、全文それぞれの欄の下に、Variable(変数)の一覧が表示されるので、そこから$node->field_img[0]['view']を選びます。

これでコンテンツに画像が設定したサムネイルサイズで表示されるようなるはずです。いささか設定が面倒ですが、一回やればいいことなので、トライしてみてください。

Imageモジュールとコンフリクトを起こしてしまうため、Body欄に画像を組み込むことができなくなりますが、ImageからImageFieldに移行するスクリプトなども紹介されているようなので、いずれトライしてみようと思っています。