フィールドコレクションアイテムの特定のデータ部分を抽出する


7

私はこれから数日間の大部分の間、運がなくてこれをいじっています。これが私のコレクションデータです:

コレクション名: field_video_collection

コレクション内には、次のフィールドがあります。 field_video_file_col

私のフィールドはカスタムfield-collection-item--field_video_collection.tpl.phpテンプレートで正常に印刷されます。この問題に従ってドキュメントに従ってテンプレート名を取得し、<?php print render($content['field_video_file_col']); ?>そのテンプレート内でフィールドをetc ... として印刷しました。

ここで、楽しい部分として、コレクション内の任意のノードのfidfield_video_file_col項目のを抽出し、それを印刷された変数としてレンダリングしたいと思います。私はこの質問の答えをここでスタックフォローしましたが私にはうまくいかないようです。私が行った場合:

print '<pre>';
var_dump(get_defined_vars());
print '</pre>';

私が利用できるデータの一部としてこれを持っていると思います field_video_file_col

["field_video_file_col"]=>
          array(1) {
            ["und"]=>
            array(1) {
              [0]=>
              array(12) {
                ["fid"]=>
                string(3) "888"

したがって、この場合、FIDは888であるように見え、テンプレートでそれをレンダリングしたいと考えています。私のノードの前処理関数は次のとおりです:

function MYTHEME_preprocess_node(&$vars, $hook) {

    $entity_type = 'field_collection_item';
    $bundle_name = 'field_field_video_collection'; // Field name the collection is attached to
    $field_name = 'field_video_file_col'; // Field name within the field collection
    $video_file_fid = field_info_instance($entity_type, $field_name, $bundle_name);
    if ($video_file_fid) {
      $my_fid = $video_file_fid['fid'];
    }
}

最終的に必要なのは、 field-collection-item--field_video_collection.tpl.phpテンプレートの変数を次のようにレンダリングする必要があることです。

<?php print $video_file_fid; ?>

...しかし、これは機能しないようです。私はすべてを検索して、このコードと組み合わせのさまざまな化身を試しましたが、それでも喜びはありませんでした。


MYTHEMEをテーマ名に変更しましたよね?:)
ランス

@ランス-はい、変更しました。
Danny Englander 2013

回答:


8

私はフィールドコレクションアイテムを操作するときにエンティティAPIを使用します。参照:Entity APIを使用してプログラムでフィールドコレクションを作成および更新する

フィールドコレクションを操作するには、次のようにします。

// Wrap node with Entity API
$node_wrapper = entity_metadata_wrapper('node', $node);
// Get the first item from the muli-value field collection
$raw_collection = $node_wrapper->field_video_collection[0]->value();
// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
//dsm the old value
debug($collection->field_video_file_col->value());

field_collection IDがすでにわかっている場合は、次のようにすることができます。

$collection = entity_metadata_wrapper('field_collection_item', $fid);
//dsm the old value
debug($collection->field_video_file_col->value());

更新:

上記のコードを使用して MYTHEME_preprocess_node

更新2:

したがって、あなたの場合は次のようになります:

function MYTHEME_preprocess_node(&$vars, $hook) {
  if (empty($vars['nid'])) {
    return;
  }
  // Wrap node with Entity API
  $node_wrapper = entity_metadata_wrapper('node', $vars['nid']);
  // Get the first item from the muli-value field collection
  $raw_collection = $node_wrapper->field_video_collection[0]->value();
  // Wrap field collection with Entity API
  $collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
  // print value
  $fid = $collection->field_video_file_col->value();
  debug($fid);
}

また、フィールドコレクション値の理解で答えを見つけることができます


上記のコードには多少従いますが、カスタムフィールドコレクションテンプレートで変数がどのように作成されてレンダリングされるのかわかりません。この答えが実際に役立つかどうかはわかりません。
Danny Englander 2013

1
あなたは彼のコードをあなたのMYTHEME_preprocess_node関数に貼り付け、$variablesあなたのサンプルコードがしない値にあなたの変数を入れます。彼field_collectionは、ノードからエンティティ自体への参照を取得する方法と、コレクションから問題のフィールドを取得する方法を示しています。あなたはあなたの前処理関数を取り、それに彼のコードを注入します。したがって、次の変数を記述して、プリプロセス関数に含めることができます。 $vars['video_file_fid'] = $collection->field_video_file_col->value();
テンケン2013

@tenkenありがとう。ダニーはtenkenのコメントに従います。MYTHEME_preprocess_nodeでentity_metadata_wrapperを使用するだけ
milkovsky

私が実際にこの質問を投稿する前に、あなたがリンクした投稿も読んだので、実際にそれを理解することができませんでした。上記のコードを使用して、WSODを取得していますnode_wrapper。変数がどこでも使用されていないというメッセージも表示されます。
ダニーイングランド人2013

私のUPDATE 2の例を参照してください。しかし、フィールド名( "field_video_collection"と "field_video_file_col")を確認してくださいPS PS正解です。$ nodeではなく$ node_wrapperがあったはずです。
milkovsky 2013

-1

これを試してみてください。1行目はオブジェクトを取得し、2行目はそこからfidを取得します。

$field_video_col=current(current($vars["field_video_file_col"]));
$video_file_fid=$field_video_col['fid'];

current引数を参照で取得するため、それらを別々の変数に入れる必要があります。

これは機能しませんでした。私はメッセージをUnused local variable 'video_file_fid'. The value of the variable is not used anywhere.A variable is considered unused in the following cases: * The value of the variable is not used anywhere or is overwritten immediately. * The reference stored in the variable is not used anywhere or is overwritten immediately
受け取り

このようにリファクタリングしましょう$ tmp = current($ vars ["field_video_file_col"]); $ field_video_col = current($ tmp); $ video_file_fid = $ field_video_col ['fid]; エコー($ video_file_fid);
Mauro Sardu 2013

上記の新しいコードも機能しませんでした。構文エラーがある['fid]はずですが['fid']、それは要点の外です。
Danny Englander 2013

-1

dropbucketのコードは、すべてのフィールドコレクションのデータを取得して配列に準備するのに役立ちます。

$fieldname = 'field_lorem_slides';

// Get the items
$slides = array();
foreach($vars[$fieldname] as $delta => $item_id){
    $data = field_collection_item_load($item_id['value']);
    if ($data)){
                $l = isset($data->language) ? $data->language : LANGUAGE_NONE;
        $slides[$delta] = array();

                // Get the field collection's data prepared in an array
                // Alternatively, you could do $slides[$delta] = $data; in order to get the full objects in the array 
        $slides[$delta]['lorem_image'] = '<img src="'.file_create_url($data->field_image[$l][0]['uri']).'">';
        $slides[$delta]['lorem_data'] = isset($data->field_heading[$l]) ? $data->field_heading[$l][0]['safe_value'] : null;
    }
}

// Send the information to the template file
// $vars['slides'] = $slides;

これはテンプレート前処理関数ですか?もしそうなら、それは前処理ページまたはノード機能ですか?コンテキストが表示されないので、説明なしでコードスニペットにリンクするだけではあまり役に立ちません。
Danny Englander 2013

はい、これは前処理関数で使用するためのものです。ちなみに、私が作業しているチームがフィールドコレクションと格闘しているとき、最も生産的なアプローチは、開発モジュールをインストールし、dsm()を使用してテンプレートと前処理関数の変数を調査することでした。フィールドコレクションはテーマにピッグです。これは、(誤って私の見方では)フィールドプリプロセス関数がフィールドコレクションフィールドとその中の個々のアイテムの両方に対して呼び出されるためです。
アルフレッドアームストロング

それは_preprocess_node_preprocess_page関数、その他ですか?
Danny Englander 2013

それはpreprocess_nodeです。
アルフレッドアームストロング

私はこれだけ多くの異なる方法で疲れましたが、私がやっていることのコンテキスト内でそれを機能させることができませんでした。
ダニーイングランド人2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.