エントリフィールド
エントリフィールドでは、エントリを他のエレメントに関連付けることができます。
# 設定
エントリフィールドの設定は、次の通りです。
- ソース – フィールドが、どのエントリ(または、他のエントリインデックスソース)からエントリを関連付けられるか。
- リミット – フィールドと一度に関連付けできるエントリ数の上限。(デフォルトは無制限です)
- 選択ラベル – フィールドの選択ボタンのラベルに利用されます。
# マルチサイト設定
マルチサイトがインストールされている場合、次の設定も有効になります。(「高度」のトグルボタンで表示されます)
特定のサイトから エントリ を関連付けますか? – 特定のサイトのエントリとの関連付けのみを許可するかどうか。
有効にすると、サイトを選択するための新しい設定が表示されます。
無効にすると、関連付けられたエントリは常に現在のサイトから取得されます。
サイトごとにリレーションを管理 – それぞれのサイトが関連付けられたエントリの独自のセットを取得するかどうか。
# フィールド
エントリフィールドには、現在関連付けられているすべてのエントリのリストと、新しいエントリを追加するためのボタンがあります。
「エントリを追加」ボタンをクリックすると、すでに追加されているエントリの検索や選択ができるモーダルウィンドウが表示されます。このモーダルから新しいエントリを作るには、「新しいエントリの入力」ボタンをクリックします。
# インラインのエントリ編集
関連付けられたエントリをダブルクリックすると、エントリのタイトルやカスタムフィールドを編集できる HUD を表示します。
# テンプレート記法
# エントリフィールドによるエレメントの照会
エントリフィールドを持つエレメントを照会する場合、フィールドのハンドルにちなんで名付けられたクエリパラメータを利用して、エントリフィールドのデータに基づいた結果をフィルタできます。
利用可能な値には、次のものが含まれます。
値 | 取得するエレメント |
---|---|
':empty:' | 関連付けられたエントリを持たない。 |
':notempty:' | 少なくとも1つの関連付けられたエントリを持つ。 |
100 | ID が 100 のエントリが関連付けられている。 |
[100, 200] | ID が 100 または 200 のエントリが関連付けられている。 |
['and', 100, 200] | ID が 100 と 200 のエントリが関連付けられている。 |
Entry (opens new window) オブジェクト | エントリに関連付けられている。 |
EntryQuery (opens new window) オブジェクト | 結果のエントリのいずれかに関連付けられている。 |
{# Fetch artwork entries that are related to `artist` #}
{% set works = craft.entries()
.section('artwork')
.myFieldHandle(artist)
.all() %}
# エントリフィールドデータの操作
テンプレート内でエントリフィールドのエレメントを取得する場合、エントリフィールドのハンドルを利用して、関連付けられたエントリにアクセスできます。
{% set query = entry.myFieldHandle %}
これは、所定のフィールドで関連付けられたすべてのエントリを出力するよう定義されたエントリクエリを提供します。
関連付けられたすべてのエントリをループするには、all() (opens new window) を呼び出して、結果をループ処理します。
{% set relatedEntries = entry.myFieldHandle.all() %}
{% if relatedEntries|length %}
<ul>
{% for rel in relatedEntries %}
<li><a href="{{ rel.url }}">{{ rel.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
関連付けられた最初のエントリだけが欲しい場合、代わりに one() (opens new window) を呼び出して、何かが返されていることを確認します。
{% set rel = entry.myFieldHandle.one() %}
{% if rel %}
<p><a href="{{ rel.url }}">{{ rel.title }}</a></p>
{% endif %}
(取得する必要はなく)いずれかの関連付けられたエントリがあるかを確認したい場合、exists() (opens new window) を呼び出すことができます。
{% if entry.myFieldHandle.exists() %}
<p>There are related entries!</p>
{% endif %}
エントリクエリでパラメータをセットすることもできます。例えば、news
セクションに含まれるエントリだけを取得するには、section パラメータをセットしてください。
{% set relatedEntries = clone(entry.myFieldHandle)
.section('news')
.all() %}
パラメータを調整する前に clone() ファンクションを利用してエントリクエリのクローンを作成するのは、とても良いアイデアです。それによって、テンプレートの後半でパラメータが予期しない結果をもたらすことはありません。
# 投稿フォームでエントリフィールドを保存
エントリフィールドを含む必要がある投稿フォームがある場合、フィールド値をエントリ ID のリストとして、関連付ける順番で送信する必要があります。
例えば、可能なリレーションごとにチェックボックスのリストを作成できます。
{# Include a hidden input first so Craft knows to update the existing value
if no checkboxes are checked. #}
{{ hiddenInput('fields[myFieldHandle]', '') }}
{# Get all of the possible entry options #}
{% set possibleEntries = craft.entries()
.section('galleries')
.orderBy('title ASC')
.all() %}
{# Get the currently related entry IDs #}
{% set relatedEntryIds = entry is defined
? entry.myFieldHandle.ids()
: [] %}
<ul>
{% for possibleEntry in possibleEntries %}
<li>
<label>
{{ input(
'checkbox',
'fields[myFieldHandle][]',
possibleEntry.id,
{ checked: possibleEntry.id in relatedEntryIds }
) }}
{{ possibleEntry.title }}
</label>
</li>
{% endfor %}
</ul>
チェックボックスのリストをソート可能にすれば、ユーザーが関連付けられたエントリの順序をコントロールできるようになります。