フィールド複製のフック


15

複数の値を受け入れることができる画像フィールドの表示をフォーマットするカスタムモジュールがあります。私は、フィールドの最初の値を複製するためにどのフックを使用する必要があるかを知りたいので(たとえば "[image1]")、array_unshift()残りの関数がフォーマットする前に(おそらく)配列の先頭に追加しますフィールドの表示/テーマ。

それで

  • [画像1]
  • [画像2]
  • [画像3]

になる

  • [画像1]
  • [画像1]
  • [画像2]
  • [画像3]

それからそれらを別々にテーマ化するつもりですが、私はすでにその部分を理解していると思います。

私は現在を使用hook_field_formatter_view()しており$items、関数の一番上にある配列の先頭にそれを追加しようとしましたが、うまくいかないようでした。この直後dprint_r()$items配列を表示すると表示されますが、出力されるのは3項目のみです。フィールドの数は他の場所で決定されると仮定しています。


1
画像をコピーしたいだけなら、Javascriptがいいでしょうか?
コディウム

申し訳ありません。結果にjsを使用していますが、データに対して他の処理を行う必要がありますが、hook_field_formatter_view画像ごとに1回だけ実行されます。
チャンスG

私はデバッガでそれを見て、無視されている配列に追加された余分なデルタを見つけて驚いた。
アダムS

あなたの質問に+1、それは興味深いトピックです。しかし、実際の解決策について考えるのを助けるために、あなたの主な目的をより具体的にすることができます(最初の画像を複製したい理由)。情報が多ければ多いほど、より良い答えが得られます。:)
Sk8erPeter

私はこの問題をjavascriptで解決することになりました。しかし、あなたの質問に答えるために; 私はhoverzoomを実装しようとしていました。これは、セットごとに1つの大きな画像を使用し、すべての画像のサムネイルを使用して、ユーザーが大きな画像を切り替えられるようにしました。
チャンスG

回答:


1

代わりにhook_field_formatter_prepare_view()が必要です。このフックは、単一のエンティティではなく、エンティティのグループで動作することに注意してください。

これが作業スニペットです。デルタは線形に維持する必要があるため、10行のいループを書き込まないようにするには、いくつかのarray-fuが必要です。

<?php

function MODULE_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
  foreach ($entities as $id => $entity) {
    $array = array(0 => $items[$id][0], 1 => $items[$id][0]);
    if (count($items[$id]) > 1) {
      array_splice($array, 2, 0, array_slice($items[$id], 1));
    }
    $items[$id] = $array;
  }
}

0

hook_field_formatter_view()は、コードがユーザーに表示される出力を作成する場所であるため、戻り値としてレンダリング可能な配列が必要です。したがって、最初の画像を2回処理して、別のcssクラスなどを指定するだけです。

何かのようなもの:

$output = array();
if (($field == 'myFieldType') && ($display == 'full')) {
  $output[] = renderFirstImage(reset($items));
  foreach ($items as $item) {
    $output[] = renderImage($item);
  }
}
return $output;

hook_field_formatter_view()レンダリング可能な配列を想定しているため、レンダリング可能な配列はレンダリング時にレンダリング済みとしてマークされるため、同じオブジェクトへの2つの参照を作成すると、一方がレンダリングされ、レンダリング済みとしてマークされ、その後、次回無視されます。


申し訳ありませんが、ポールは私の質問を読みましたか?items配列の先頭に追加できました。問題は、まだ出力されていないことでした。
チャンスG

hook_field_formatter_view()はフィールドを取得し、それらをレンダリング可能な配列に変換する必要があります。同じ配列への参照を2つだけ作成すると、そのアイテムはレンダリング済みとしてマークされ、再度レンダリングされません。そのため、必要なアイテムごとに新しいレンダリング可能な配列を作成する必要があります。
paul-m

これが答えですか?
paul-m

いいえ。追加のアイテムをアレイに追加できます。表示されている配列をdpmすると、印刷されません。私は正しい答えをすべて受け入れます。
チャンスG

既に述べたように、レンダリングシステムはアイテムを既にレンダリング済みとしてマークします。つまり、参照によって2番目の画像を単純に渡すと、最初にレンダリングされたとマークされ、既にマークされているため、2回目にはレンダリングされません。
ポールm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.