ここからはまたノードの設定となります。前回作成したタクソノミータームに、ノードを登録するためのフィールドを、「賃貸物件」コンテンツタイプに設定します。賃貸物件のフィールド管理ページ(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「フィールドの管理」)にアクセスしてください。
右上の「行のウエイトを表示する」をクリックして、テーブルの「ウエイト」と「親」を表示してください(既に表示されている場合は、そのままで結構です)。
「フィールドを追加」のところから、ラベルに「市区町村」と入力し、親に「所在地」を選択、システム内部名称に field_ 「town」となるように入力し、保存データ形式に「ターム参照」、ウィジェットには「選択リスト」を選択します。その状態でページ下の「保存」ボタンをクリック。
フィールドの設定画面です。ボキャブラリのセレクトボックスに、前回作成した「エリアから探す」、「沿線から探す」のボキャブラリが入っています。「エリアから探す」を選択して「フィールドの設定を保存」ボタンをクリック。
ヘルプテキストに「市区町村を選択してください。」と入力し、あとはデフォルトのまま、ページ下の「設定の保存」ボタンをクリックして、設定を保存します。
フィールドの管理画面に戻ったら、テーブル右上の「行のウエイト隠す」をクリックして、移動をアイコンをドラッグして順番を「所在地」フィールドの前に持ってきます。ページ下の「保存」ボタンをクリックして、設定を保存してください。表示設定については、とりあえずそのままにしておきます。
作成した賃貸物件コンテンツの、編集画面にアクセスしてください。「所在地」のフィールドセットの中に、「市区町村」のセレクトボックスが追加されています。オプションには「エリアから探す」ボキャブラリのタクソノミータームが入っているはずです。適当なものを選択して、物件データを更新してください。
ノードテンプレートの編集のページから node--forrent.tpl.php をダウンロードして使っている方は、所在地の欄に、選択したタクソノミータームへのリンクが表示されていると思います。テンプレートを自身で作成された方は、表示したい箇所に、<?php print render($content['field_town']); ?> を追加すれば、図のように表示されます。
リンクをクリックすると、このようなページに移動します。アドレスは '/taxonomy/term/{ターム ID}' となっているはずです。これはデフォルトのタクソノミータームのページです。タームに登録されたノードが一覧で表示されます。ノードの内容が表示されていませんが、これは、賃貸物件の「表示管理」で「ティーザー」ビューモードのフィールドの表示を、すべて非表示に設定したためです(※ 「賃貸物件」コンテンツタイプの作成3の「フィールドの表示設定」を参照)。ここでは、デフォルトのタクソノミータームのページは使用しません。以下のように、カスタムのページを作成し、それを使うようにします。
'forrent/area/{県名}/{ターム ID}'
というパスで、タームに登録した「賃貸物件」を一覧で表示するようにし、同じターム ID で
'forsale/area/{県名}/{ターム ID}'
というパスでアクセスした場合には、同じタームに登録した「売買物件」を一覧で表示するようにします。
こういったことはデフォルトのタクソノミータームのページでは出来ないので、一覧ページは Views を使って作成します。タクソノミータームは、ここでは内部的に分類を行うだけです。前回、タクソノミータームにurl エイリアスを指定しないと説明したのは、タクソノミータームページは使用しないためです。
図7 で、上のようなリンクを生成するように、ここでカスタムモジュールを編集します。以前追加した custom_field_formatter_info() の中の return array() の配列に、以下のエントリを追加してください。
'custom_taxonomy_term_reference_link_bukken' => array( 'label' => t('物件用カスタムリンク'), 'field types' => array('taxonomy_term_reference'), ),
続いて以下のフックを追加してください。
/** * Implementation of hook_field_formatter_prepare_view() */ function custom_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) { if ($field['type'] == 'taxonomy_term_reference') { // タクソノミーのをそのまま使う。 taxonomy_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays); } }
続いて以前作成したフック custom_field_formatter_view() の中のスイッチ文 switch ($display['type']) { } に、以下の case を追加してください。
case 'custom_taxonomy_term_reference_link_bukken': // ノードタイプを取得 switch ($entity_type) { case 'node': $node_type = $entity->type; break; case 'field_collection_item': $node_type = $entity->hostEntity()->type; break; default: $node_type = ''; break; } foreach ($items as $delta => $item) { if ($item['tid'] == 'autocreate') { $element[$delta] = array( '#markup' => check_plain($item['name']), ); } else { $term = $item['taxonomy_term']; $parent = pos(taxonomy_get_parents($term->tid)); // 上位タームの名前とつなげて表示する if (isset($parent->name)) { $parent1_name = $parent->name; } $vocabulary = $term->vocabulary_machine_name; if (empty($parent->field_path_name)) { $parent = pos(taxonomy_get_parents($parent->tid)); } $parent_path_name = field_get_items('taxonomy_term', $parent, 'field_path_name'); $parent_path_name = $parent_path_name[0]['safe_value']; $uri = entity_uri('taxonomy_term', $term); $element[$delta] = array( '#type' => 'link', '#title' => $parent1_name .' '. $term->name, '#href' => $node_type .'/'. $vocabulary .'/'. $parent_path_name .'/'. $term->tid, '#options' => $uri['options'], ); // 「沿線から~」には「駅」を追加。 if ($vocabulary == 'route') { $element[$delta]['#title'] .= '駅'; } } } break;
モジュールの設定を再構築し、キャッシュをクリアしてください。「賃貸物件」コンテンツタイプの表示管理ページ(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)にアクセスし、「市区町村」フィールドをみると、フォーマットのセレクトボックスに「物件用カスタムリンク」というオプションが追加されています。
これを選択し、ラベルのセレクトボックスは「非表示」を選択します。ページ下の「保存」ボタンをクリックして、設定を保存してください。もういちど、賃貸物件のコンテンツのページにアクセスし、所在地のところのリンクをクリックしてください(図7)。
こんなページが表示されたでしょうか。これは、まだカスタムのタクソノミータームページを作成していないためです。アドレスは 'forrent/area/{県名}/{ターム ID}' となっているはずです。カスタムのタクソノミータームページは、カスタムタクソノミーページの作成のところで作成します。
賃貸物件のコンテンツのページをよく見ると、「市区町村」フィールドの表示だけ、少し違っていることに気が付きます(図7)。ソースをみると、マークアップ自体も他のフィールドとは違っています。これは bartik テーマの template.php の中で、ターム参照タイプのフィールドだけに適用されるテーマ関数(※1)が、定義されているためです。これを修正するため、フィールドテンプレートを使用します。
フィールドテンプレートとは、フィールドの出力を担うテンプレートファイルです。ノードテンプレートの編集によって、ノードの表示を変更出来るのと同様に、フィールドテンプレートを編集することによって、フィールドの出力を変更することができます。
フィールドテンプレート('modules/field/theme/field.tpl.php') をコピーし、サイトディレクトリのテーマのテンプレートフォルダ('sites/all/themes/bartik/templates')に配置してください。こうすると、基本的にすべてのフィールドに、このテンプレートが適用されるようになります。これを「市区町村」フィールド('field_town')だけに適用するように、field--field-town.tpl.php とリネームしてください。(field--フィールド名.tpl.php とすることで、特定のフィールドだけに適用されるようになります。)
こうすることで、「市区町村」フィールドにはこのテンプレートが優先して適用されます。
フィールドの中身は今回は編集の必要はありません(HTML コメントは削除してください)。つまりデフォルトのフィールドテンプレートを適用させます。先頭に以下の PHP コメントを追加しておきます。
<?php /** * 「市区町村」用フィールドテンプレート。 * field--フィールド名.tpl.php として適用されます。 * * 改変はありません。デフォルトのフィールドテンプレートのままです。 * template.php の bartik_field__taxonomy_term_reference() を適用しないようにするため、 * 設置しています。 */ ?>
フィールドテンプレートは油断するとどんどん増えてしまうので、こういったコメントを必ず記述するようにしておくと、あとで管理が楽になります。
テーマ管理ページ(「管理」 > 「テーマ」)にアクセスし、そのままページ下の「設定を保存」ボタンをクリックして、テーマレジストリを再構築してください。そのあとキャッシュをクリアしてください。
賃貸物件のコンテンツにアクセスすると、「市区町村」フィールドの表示が他のフィールドと同じになりました。
※1 テーマ関数とは、テンプレートファイルと同様に、ページにおける一定の範囲の出力を担う関数です。