Drupal_CCKで新しいフィールドを追加する

必要なモジュール
CCK(Content Construction Kit)

こんな目的に使います:
何のためにこんなものを作るかというと、同じタイプのページをたくさん作成したいときなどに、同じ項目をコピーペーストし続けるのは効率がよくないです。今回はデフォルトの「ページ」というコンテンツにフィールドを追加していますが、新しいコンテンツタイプを独自に作り、これにCCKでフィールドを追加すると、フォームのような編集画面ができます。例えば料理のレシピのようなページをたくさん作りたいときに、調理時間、難易度、カテゴリなどがあらかじめ項目として存在していれば、フィールドに入力するだけで簡単にページを作成できます。

コンテンツの作成をするときに、まず、「ページ」や「ストーリー」などのコンテンツタイプを選びます。「タイトル」や「本文」のようにテキストを打ち込む欄のことをフィールドといいます。CCKは、このフィールドを追加することができます。試しにページに新たなフィールドを追加してみましょう。


  1. 管理セクション/コンテンツの管理/コンテンツタイプを開きます
  2. ページの行の右端に「フィールドの管理」というリンクがあるのでクリックします
  3. デフォルトで存在するフィールドが表で現れます。この一番下に、任意のフィールドを追加します。
  4. ラベル項目の「新しいフィールド」というところに、これから作成するフィールドの名前をつけます。一度作成したら、ここは変更できませんので、慎重に入力してください。ここでは、仮にtest1と入力したとします。
  5. 次に、名前項目の欄に半角英数字で名前をつけます。これは、後にViewsで値を取り出したり、PHPを使用して値を操作するときに使用するもので、データベースのフィールド名となります。
  6. 保存するデータ型には、今から作成するフィールドにどのようなデータを入力するのか、その属性を指定します。数字のみなら「整数」、日付なら「日付」を選びます。ここでは、「テキスト」を選択します。
  7. 最後に「ウィジェットを選択」という欄には、先ほど選択した保存するデータ型のより詳しい属性を指定します。ここでは、テキストのテキストフィールドを選びます。
    ※ドロップダウンリストを表示したときに、私はスクロールがあることに気づかず、なかなか目的のテキストフィールドを探すことができませんでした。皆さんは、こんなことはないと思いますが、念のため。
  8. 全ての項目を設定したら、表下の「保存」をクリックしてください。

以上で、新しいフィールドができました。コンテンツの作成でページを選び、新しいフィールドができているか確認してみましょう。test1というフィールドが新しく増えています。ここに「てすと1」と入力して、新しいページを保存すると、test1:てすと1というテキストが作成したページの中に表示されると思います。

Drupal_CCKで作成したフィールドの値をViewsで取り出す

必要なモジュール
CCK(Content Construction Kit)
Views

こんな目的に使います
Viewsは、データベースからあらゆる条件でデータを抽出できるすばらしいモジュールですが、今回は特殊な目的のためにViewsを使用しています。
ホームページを作成するときに、皆さんは、<h1>などの見出しタグを使用すると思います。特に<h1>は、1ページのうちに1つだけしか使用が許されない(複数使えないわけではありません)、特別なタグです。SEOの観点から考えると、できればページごとに、そのページに適したテキストを入力したいところです。しかし、 ノード本文にh1を入力すると、下図の左のような配置にされてしまいます。私がh1を挿入したいのは、右図のようにヘッダーの上でしたが、図の青い部分はtheme部分に相当します。これは、どのページにも適用されるデザイン部分です。通常ページごとに異なる入力ができるのは、黄色のノード本文のみです。

blockで作ると全ページ分のブロックを作成することになり、大変な手間とボリュームになってしまいます。
そこで、利用したのがCCKとViewsです。CCKでh1用のテキストを入力するフィールドを作成し、それをViewsで抽出することにしました。

ここでは、上記を目的としたViewsの使い方について説明します。Viewsは、非常に拡張性が高く、様々な使い方ができるため、いわゆる「スタンダードな使い方」が存在しません。設定項目が多く、直感で設定することが困難なため、始めは手を出しにくいモジュールと言えます。ここでは、手順を一つずつ追っていきます。

  1. 管理セクション/サイトの構築/ビューを開いてください
  2. 新しいビューを作成するので、タブの「追加」をクリックしてください。
  3. この表の項目をひとつずつ設定し、抽出条件を指示していきます。全て触らなくても大丈夫です。まず、基本設定ですが、設定したもののみを次に記します。
    • 名前:h1(①)
    • タイトル:h1(②)
    • 表示アイテム数:1(③)
    • ブロックへのフォームの表示:はい(④)
  4. ここからが重要です。先にフィールドの設定をします。ここで設定するフィールドとは、データベースから「どの値」を抽出するかを指定します。例えば、データベースの中にある「A」という値を引っ張りたい、というときに、ここで「A」と指定するということです。表中央のフィールドという項目の「+」(⑤)をクリックしてください。


  5. たくさんのフィールド値が並んでいると思いますが、今回は、CCKで作成したh1というフィールドです。「コンテンツh1」というフィールドがあるので、これにチェックを入れます。(⑥)

  6. 更に、このフィールドをどのように表示するかを細かく設定できます。

    今回は、ほとんど触りません。一番最後の「ラベル:なし」と「フォーマット:プレーンテキスト」のみを設定します。

    設定が終わったら、「更新」ボタンをクリックしてください。
  7. 次に、引数の設定をします。

    先ほど設定した、フィールドの上に設定欄があります。ここの「+」をクリックしてください。ここでは、ノード:NIDにチェックを入れます。(⑦)

    ノード:NIDとは、Drupalの変数$node->nidを指すもので、意味は「現在表示中のページ番号」です。Drupalは、作成したコンテンツに識別番号を振っています。URLエイリアスなどで任意のURLを指定していなければ、作成したページのURLの末尾に番号が付きます。それが$node->nidです。

    この引数で、なぜ$node->nidを指定するかというと、私がほしいのは、現在表示中のページで入力したh1というフィールドの値です。エクセルのvlookup関数であるキーとなる値を軸にデータベースからキーとマッチする値を引っ張るように、ここでも抽出条件としてのキーを設定するのです。


    現在表示中のページ($node->nid)にマッチするh1の値を選びます。引数が存在しない場合の動作:デフォルト引数を提供(⑧)を選択し、デフォルト引数のタイプにURL に含まれるノード ID(⑨)を選びます。

  8. 抽出条件の指定は、ここまでで終了です。次に、抽出したデータを表示するための設定をします。私は、抽出したデータをブロックに入れて、page.tpl.phpのh1を表示したい場所にリージョンを設けました。従って、このveiwsをブロックに書き出さなければいけません。

    views 「h1」のトップページの左上にプルダウンメニューがあります。ここで「ブロック」を選び、ディスプレイの追加をしてください。すると、先ほど設定していた各種項目の下に同じような表示がひとつ増えると思います。この増えたディスプレイの左下を見てください。

    「ブロック設定」という項目があります。ここの「管理」(⑩)をクリックして、ブロックの名前を入力してください。ここでは「h1」とします。ここまで出来たら、viewsの設定は終わりです。

    最後に「保存」(⑪)をクリックしてください。これをしないと、viewsは設定されたことにはなりませんので、要注意です。

  9. それでは、viewsをあとにして、再び管理セクションに戻りましょう。先ほど作成したブロック「h1」が出来ているはずなので、ブロックを見てください。
  10. 「h1」という名前のブロックがブロックリストの「無効」の中にリストアップされていると思います。ここで、このブロックを表示する場所を「リージョン」で選びます。

    しかし、デフォルトのリージョンの中には、h1を設置したい場所がありません。なので、リージョンを作成します。
  11. リージョン(領域)を追加するには、次の設定が必要です。
    1. 現在使用しているテーマファイルにある、「テーマ名.info」ファイルにregions[h1] = h1という記述を加えます。同様に、template.phpにも、'h1' => t('h1')という記述を加えます。どちらもブロックの領域をあらわす記述で、これがないとdrupalが新しい領域を認識しません。
    2. このh1ブロックを表示したい場所をpage.tpl.phpに記述します。書き方は、他のブロックと同様で、<?php print $h1; ?>です。私はこのテキストをh1にしたいので、<h1>で囲みました
  12. 再び、管理セクションからブロックに戻ります。先ほどのh1ブロックのリージョンに作成したリージョンh1を選んでください。
  13. ブロックの保存をします。
  14. 実際にページを更新してみて見ましょう。ノード編集画面で入力したh1テキストが、viewsで抽出され、ブロックで表示されています。

そもそもh1用のテキストを入力するフィールドは、CCKで作成しますが、使用する全てのコンテンツタイプにh1用のフィールドを作成する必要があります。でないと、pageで作成したコンテンツには、h1用のフィールドがあるけど、blogで作成したページにはh1用のフィールドがない、ということになります。

使用する全てのコンテンツタイプにフィールドを作成したら、当然、viewsの抽出フィールドも増やさなければいけません。図のフィールド欄に「コンテンツh1」が4つ並んでいますが、これはコンテンツタイプごとにh1テキストを抽出した結果です。