logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

Views の contextual filters、relationships - 引数とリレーションシップ(関連付け)

17/04/2025, by Ivan

このレッスンでは、特に Views における引数(arguments)の扱いに焦点を当てます。引数とは URL の一部を指します。例えば:

node/15
1 番目の引数は node、2 番目は 15。
taxonomy/term/10
1 番目の引数は taxonomy、2 番目は term、3 番目は 10。
user/67
1 番目の引数は user、2 番目は 67

これらの例は十分に分かりやすく、追加の説明は不要だと思います。

引数は arg() 関数を使って取得できます:

<?php
print arg(0) . '<br />';
print arg(1);
?>

URL が node/15 だった場合、出力は次のようになります:

node
15

arg 関数における引数のインデックスは 0 から始まります。それでは、Views モジュールにどのような組み込みのソリューションがあるか見ていきましょう。

ユーザーのノードを表示する

user/1 のページにいて、uid = 1 のユーザーが作成したノードのブロックを表示したいとします。そのために、URL 引数を使います。

新しいビューを作成します。ブロックを出力し、フィールドのセクションでノードのタイトルを指定します。もちろん、公開済みのノードだけを表示し、投稿日でソートします。

Title
Title: user_nodes
Format
Format: Unformatted list | Settings
Show: Fields | Settings
Fields
Content: Title
Filter criteria
Content: Published (Yes)
Sort criteria
Content: Post date (desc)
Pager
Use pager: Display a specified number of items | 15 items
More link: No

次に、Contextual filters で Add をクリックします。次を選択します:
Content: Author uid

そして次を選択します

When the filter value is NOT available
  Provide default value
    User ID from URL
      Provide default value

Views contextual filters

ビューを保存します。ブロックを希望するリージョンに配置し、例えば user/1 にアクセスします。作成したブロックには、uid = 1 のユーザーが作成したすべてのノードが表示されるようになります。

関連ノードを表示する

それでは例をもう少し複雑にしましょう。複数のノードを 1 つに関連付けたいとします。そのために、node reference フィールドを使います。これらのリレーションシップフィールドを使うには、References モジュールとそのサブモジュール Node References が必要です。

http://drupal.org/project/references

Drupal 7 のリレーションシップフィールドを使うと、複数のユーザーと複数のノードを 1 つのノードに同時に関連付けることができます。これは Node Reference フィールドによって実装されます。Drupal 7 ではフィールドを任意のエンティティに追加できるため、今ではあらゆる種類のエンティティを関連付けることができます。

サイトには 4 つのニュース記事があり、1 番目と 3 番目の記事を、似たトピックを扱っている 2 番目の記事に関連付けたいと思います。

「News」のコンテンツタイプ管理に移動し、オートコンプリートを有効にした Node Reference フィールドを追加します。フィールド名は「Related News」とします。次に、どのコンテンツタイプを参照できるかを選び、参照可能なノード数を設定します。私は News タイプのみを選択しました。Save Field をクリックします。次に、2 番目のニュースノードを編集し、新しい Node Reference フィールドを使って関連ニュースを選択します。

Drupal reference field

もちろん、これらの関連ノードは、現在のノードに付随するリストとしてすでに表示されます。しかし、私たちの目標は View を構成することです。

ブロック形式で新しい View を作成します。

Title:
similar_news
Format:
Unformatted list | Settings
Show: Fields | Settings
Fields
Content: Title
Filter criteria
Content: Published (Yes)
Content: Type (= News)
Sort criteria
Content: Post date (desc)
Pager
Use pager: Display a specified number of items | 5 items

contextual filter を追加します:Content: Nid。今回は次を選択します:

When the filter value is NOT available
  Provide default value
    Content ID from URL

また、Relationships で新しいリレーションシップを追加します:Content: Related News (field_similar)。(フィールド名が異なる場合は、それに応じて選択してください)。同じフィールドが「reverse」というラベル付きで表示されることがある点に注意してください――これは逆方向のリレーションシップを定義することを意味します。つまり、News 3 にいる場合、News 2 が関連として表示されます(リレーションシップを定義しているのが News 2 だけであっても)。

結果には次が含まれるはずです:

Contextual filters
Content: Nid
Relationships
Content: Related News

次に、content フィールドでリレーションシップを割り当てます。「Do not use a relationship」の代わりに、リレーションシップの名前を選択します。
Fields
(field_similar) Content: Title

ビューを保存し、ブロックを希望するリージョンに配置します。

これで、News 2 のページでは、関連ニュース(News 1 と News 3)が別のブロックに表示されるようになります。