ビューを表示するコンテンツタイプの参照フィールドを使用する場合、ビューブロックにコンテキストフィルターをどのように使用しますか?
ここに簡単なシナリオがあります
各アーティストのコンテンツページで機能し、サイドバーにそのアーティストの曲のブロックがあります。私が使用したビューは、デフォルトのエンティティと基本的な検証を提供します(ただし、以下では機能しません)
各イベントコンテンツページで、そのアーティストの曲のブロックをサイドバーに表示します。基本的に、イベントの参照フィールドをアーティストの曲と一致させる必要があります。
パスにアクセスできないため、参照フィールドのコンテキストフィルター(およびその逆)をいじってみました。
@Jimajammaのおかげでわかったようですが、実際は非常に簡単です。
引数をソングビューに取り込むには、「コンテキストフィルター」を追加して、ソングのアーティスト参照フィールドを選択します。次に、「フィルター値が使用できない場合」の下で「デフォルト値を提供する」を選択し、PHPコード。そのPHPコードで、イベントのアーティスト参照フィールドは
$node=menu_get_object();
return $node->field_event_artistref['und'][0]['target_id'];
次に、「フィルター値IS使用可能またはデフォルトが提供されている場合)で、「検証基準の指定」と基本的な検証を選択します
簡単に言えば、これは、Songが参照するアーティストの引数を取り、それを現在のノードのアーティスト参照フィールドである、指定したデフォルト値と比較するだけです。また、@ Jimajammaが言ったように、最良の方法は、node-> typeでswitchステートメントを使用して、artistノードのようないくつかの異なるタイプのコンテンツで%artistブロックによる曲を使用できるようにすることです。
コンテキストフィルターでは、phpを使用して引数を指定できます。そこで、次のようなものを入れることができます:
$node=menu_get_object();
return $node->field_headliner[0]['nid'];
どこ field_headliner
は、イベントコンテンツタイプのノード参照フィールドです。上記の正確な構文はD6ですが、D7でも同じか、少なくとも非常によく似ています。
次に、このビューブロックがイベントページ内/上に表示されている限り、上記はヘッドラインバンドのnidを返します。そのノードnidでフィルターするようにビューが設定されている場合は、設定する必要があります。
次のようなものを使って、そこに気を配ることもできます。
$node=menu_get_object();
switch ($node->type) {
case 'band':
return $node->nid;
case 'event':
return $node->field_headliner[0]['nid'];
default:
return 0; // or however you want to return an error
}
そして、同じビューブロック表示を両方のタイプのページで使用できます。次に、このブロックをバンドページとイベントページに配置するだけで、準備は完了です。
あなたはcanコードなしでこれを行います。方法は次のとおりです。
それでうまくいくはずです。基本的には、イベントから始めて、アーティストとソングの関係を構築します。
このスニペットを使用して、フィールドエンティティ参照のtarget_idを取得できます。 multipes target_idを許可します。
$ Node = menu_get_object () // we get the current node
switch ($ node->type) { // We can manage multiple scenarios with the content type
case 'type A': // For the content type A
$ Related_ids = array ();
$ Related = field_get_items ('node', $node, 'field_event_artistref') // Get the entity reference field
if ($related && is_array ($related) && sizeof ($related)> 0) {
for ($i = 0; $i <count ($related); $i++) {
$ Related_ids [] = $related [$i]['target_id'];
}
}
return implode ('+', $related_ids) / / It returns the values of the field entity reference
default:
return 0 / / default it returns 0
}
この正確な問題を解決するために、新しいサンドボックスモジュールを作成しました。
https://drupal.org/sandbox/nickurbits/2070451
現在のエンティティのフィールドを使用して、コンテキストフィルターのデフォルト値を変更できます。