Крючок для дублирования поля

15

У меня есть пользовательский модуль, который форматирует отображение поля изображения, которое может принимать несколько значений. Я хотел бы знать, какой хук я должен использовать, чтобы продублировать первое значение поля (например, «[image1]»), и добавить его обратно в начало массива ( array_unshift()я полагаю), прежде чем остальные мои функции отформатируют отображение / тема поля.

Так что же было

  • [Image1]
  • [Image2]
  • [Image3]

становится

  • [Image1]
  • [Image1]
  • [Image2]
  • [Image3]

Затем я собираюсь обсудить их отдельно, но думаю, что уже понял эту часть.

В настоящее время я использую hook_field_formatter_view(), и попытался просто добавить его в начало $itemsмассива в верхней части функции, но это не сработало. Если бы я сразу массив после этого он показывает, но только 3 вещи получить выход; Я предполагаю, что количество полей определяется в другом месте.dprint_r()$items

Шанс Г
источник
1
Если вы хотите просто скопировать изображение, может быть, Javascript это путь?
Codium
Нет, извини меня. Я использую JS для результатов, но мне нужно сделать другие вещи с данными, hook_field_formatter_viewно он запускается только один раз для каждого изображения.
Шанс G
Я посмотрел на него в отладчике и с удивлением обнаружил дополнительные дельты, добавленные в массив, которые игнорируются.
Адам С
+1 за твой вопрос, это интересная тема. Но чтобы помочь нам подумать о реальном решении, можете ли вы более конкретно указать, какова ваша основная цель (поэтому, почему вы хотите, чтобы первое изображение дублировалось)? Чем больше информации мы знаем, тем лучшие ответы вы можете получить. :)
Sk8erPeter
Я решил эту проблему с помощью JavaScript. Но чтобы ответить на ваш вопрос; Я пытался реализовать hoverzoom, который использует одно большое изображение для каждого набора, а затем миниатюры всех изображений, чтобы позволить пользователю переключать большое изображение.
Шанс G

Ответы:

1

Вы хотите hook_field_formatter_prepare_view () вместо этого. Обратите внимание, что этот хук работает с группой объектов, а не с одним.

Вот рабочий фрагмент. Некоторый массив 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;
  }
}
jonhattan
источник
0

hook_field_formatter_view()где ваш код делает вывод, который показывается пользователю, и поэтому он хочет получить рендеринг массив в качестве возвращаемого значения. Так что просто обработайте первое изображение дважды и присвойте ему другой класс 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()ожидает обновляемый массив, и так как визуализируемые массивы помечаются как визуализированные, когда они визуализируются, простое создание двух ссылок на один и тот же объект приведет к тому, что один будет отображен, помечен как визуализированный, а затем впоследствии проигнорирован в следующий раз.

Поль-м
источник
Прости, Пол, но ты прочитал мой вопрос? Я смог добавить его в начало массива элементов. Проблема заключалась в том, что он все еще не выводился.
Шанс G
hook_field_formatter_view () получает поля, и вы должны превратить их в визуализируемые массивы. Если вы просто сделаете две ссылки на один и тот же массив, этот элемент будет помечен как визуализированный и больше не будет визуализироваться. Таким образом, вы должны сделать новый рендеринг массив для каждого элемента, который вы хотите.
paul-m
Это ответ?
paul-m
Нет, я могу добавить дополнительный элемент в массив. Когда я выкидываю массив, который он показывает, он просто не печатается. Я принимаю все ответы, которые являются правильными.
Шанс G
Как я уже упоминал, система рендеринга помечает элементы как уже отрендеренные. Это означает, что если вы просто передадите второе изображение по ссылке, оно будет помечено как обработанное в первый раз, а затем НЕ обработано во второй раз, так как оно уже отмечено.
Paul-M