web-dev-qa-db-ja.com

エンティティ参照フィールドを持つビューとコンテキストフィルター

ビューを表示するコンテンツタイプの参照フィールドを使用する場合、ビューブロックにコンテキストフィルターをどのように使用しますか?

ここに簡単なシナリオがあります

  1. アーティストコンテンツタイプにはいくつかの基本的なフィールドがあります
  2. 曲のコンテンツタイプには、どのアーティストを参照する参照フィールドがあります
  3. イベントコンテンツタイプには、見出しをつけているアーティストを参照する参照フィールドがあります。
  4. ビューにはフィールドを持つブロックがあります

各アーティストのコンテンツページで機能し、サイドバーにそのアーティストの曲のブロックがあります。私が使用したビューは、デフォルトのエンティティと基本的な検証を提供します(ただし、以下では機能しません)

各イベントコンテンツページで、そのアーティストの曲のブロックをサイドバーに表示します。基本的に、イベントの参照フィールドをアーティストの曲と一致させる必要があります。

パスにアクセスできないため、参照フィールドのコンテキストフィルター(およびその逆)をいじってみました。


@Jimajammaのおかげでわかったようですが、実際は非常に簡単です。

引数をソングビューに取り込むには、「コンテキストフィルター」を追加して、ソングのアーティスト参照フィールドを選択します。次に、「フィルター値が使用できない場合」の下で「デフォルト値を提供する」を選択し、PHPコード。そのPHPコードで、イベントのアーティスト参照フィールドは

$node=menu_get_object();
return $node->field_event_artistref['und'][0]['target_id'];

次に、「フィルター値IS使用可能またはデフォルトが提供されている場合)で、「検証基準の指定」と基本的な検証を選択します

簡単に言えば、これは、Songが参照するアーティストの引数を取り、それを現在のノードのアーティスト参照フィールドである、指定したデフォルト値と比較するだけです。また、@ Jimajammaが言ったように、最良の方法は、node-> typeでswitchステートメントを使用して、artistノードのようないくつかの異なるタイプのコンテンツで%artistブロックによる曲を使用できるようにすることです。

3
Will

コンテキストフィルターでは、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
}

そして、同じビューブロック表示を両方のタイプのページで使用できます。次に、このブロックをバンドページとイベントページに配置するだけで、準備は完了です。

6
Jimajamma

あなたはcanコードなしでこれを行います。方法は次のとおりです。

  1. フィールドをリストするブロックビューを作成し、「イベント」でコンテンツタイプフィルターを実行します
  2. アーティストへのエンティティ参照を追加する
  3. NIDのコンテキストフィルターを追加し、アーティストのエンティティ参照を関係として使用します
  4. 参照している曲のコンテンツである別のエンティティ参照を追加し、artistエンティティ参照を関係として使用します。
  5. 曲名(おそらくタイトルか?)のフィールドを追加して、曲の関係を使用します。

それでうまくいくはずです。基本的には、イベントから始めて、アーティストとソングの関係を構築します。

0
cdmo

このスニペットを使用して、フィールドエンティティ参照の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
}

http://drupal.org/node/1714188

0
flocondetoile

この正確な問題を解決するために、新しいサンドボックスモジュールを作成しました。

https://drupal.org/sandbox/nickurbits/2070451

現在のエンティティのフィールドを使用して、コンテキストフィルターのデフォルト値を変更できます。

0
Nick Santamaria