В настоящее время я пытаюсь реализовать поле изображения, на которое ссылаются узлы, на моем сайте Drupal 7, который изменит свой «режим просмотра» в зависимости от программной логики непосредственно перед рендерингом. В настоящее время поле отображается в нескольких типах содержимого с помощью настроек режима отображения, каждый из которых использует средство форматирования поля «Узел визуализации».
Первая попытка
Моей первой идеей было реализовать следующее, учитывая, что ловушка - это ловушка и есть ловушка:
function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
switch ($display['type']) {
case 'node_reference_node':
/* Programatical logic here to modfy field render settings */
break;
}
}
Очевидно, меняя HOOK на имя моего модуля.
Это на самом деле не имеет значения , если выше будет стрелять до или после исходной функции node_reference_field_formatter_view
в node_reference.module
потому , что я либо переопределить его вывод полностью или, надеюсь, изменить его значение перед визуализацией. Единственная проблема заключается в том, что описанный выше хук, кажется, работает только для каждого модуля, то есть он не распространяется на весь сайт, поэтому в основном он не срабатывает для моего модуля.
Теперь, очевидно, я могу написать свой собственный модуль форматирования поля для вывода визуализированного узла. Но, похоже, это пустая трата, учитывая, что она уже существует.
другие подходы
Мои другие подходы были к HOOK_preprocess_node
и , HOOK_preprocess_field
но первый не содержит какой - либо view_mode
информации, а вторая содержит , по меньшей мере , 5 различных сложных структур , которые все имеют ссылки на view_mode
собственность на разных уровнях - и он чувствует себя достаточно Hacky , чтобы изменить у каждого из них ценности. Даже когда я изменил некоторые view_mode
свойства, результирующее изображение не меняется.
вопрос
Кто-нибудь знает чистый способ сделать шаг до того, как форматировщик полей будет отображать (модуля contrib) и изменять его настройки для каждого запроса на странице, то есть не нужно изменять настройки режима постоянного просмотра фактического типа контента?
hook_field_formatter_view_alter()
или похожий, вероятно, уже больше года, к сожалению, его просто не существует. К твоему сведению,hook_preprocess_node()
безусловно , есть вview_mode
наличии, это$vars['view_mode']
не то,$vars['node']->view_mode
что ты, возможно, испытал.view_mode
наhook_preprocess_node
, глупо меня! Интересно, существует ли что-нибудь подобноеhook_field_formatter_view_alter()
в D8 ...Ответы:
В вопросе упоминается, что он
hook_field_formatter_view()
вызывается только в исходном модуле, но вы можете вступить во владение полевым форматером черезhook_field_formatter_info_alter()
.Вы должны иметь возможность установить
module
ключ форматера на MYMODULE, например:Затем вы можете реализовать
MYMODULE_field_formatter_view()
, опционально пропуская через существующий модуль, который обработал его, чтобы получить элемент для изменения.источник
field_formatter
функциональных возможностей node_reference, т. Е.MYMODULE_field_formatter_settings_summary
ИMYMODULE_field_formatter_settings_form
(даже если они являются просто прокси-функциями обратно в исходный модуль), в противном случае конец пользовательского интерфейса прерывается на любой панели режима отображения, когда он пытался найти эти методы в неправильном модуле.Хорошо , таким образом , я понял , почему мои изменения
#view_mode
ни в одномhook_preprocess_node
иhook_preprocess_fields
не работал. (Спасибо Клайву за то, что он указал, что я полностью пропустил присутствие#view_mode
вhook_preprocess_node
) .Моя проблема проистекала из того факта, что
#view_mode
он уже был обработан и преобразован в правильное#image_style
свойство - то, что я пренебрег поиском.Тем не менее, изменение этого значения кажется слишком сильно зависящим от того, в каком хуке вы его модифицировали. Тем не менее, я наконец-то получил некоторый код, работающий, который фактически изменяет отображаемое изображение:
Выше все еще не очень красноречиво, но по крайней мере это работает. Я скажу слово Клайва о том, что такого метода _alter для форматировщиков полей не существует - это позор, форматеры - чрезвычайно мощная функция D7, было бы неплохо иметь больше возможностей для расширения.
Во всяком случае, если у кого-нибудь из будущих людей появятся лучшие идеи, ответьте :)
источник
Самый простой подход будет использовать Panelizer .
Если вы не используете Panelizer, но по умолчанию используете режимы просмотра Drupal или Display Suite, попробуйте hook_field_display_alter () или hook_field_display_ENTITY_TYPE_alter () .
У вас есть сущность, контекст дисплея, а также все настройки форматера. И вы можете легко изменить настройки визуализации поля. Вы даже можете изменить форматирование поля на другое.
Подход работает идеально для меня. Единственным недостатком является то, что вы можете быть перепутаны с другими настройками в интерфейсе «Управление отображением».
источник
https://www.drupal.org/node/2130757 Это хороший пример. hook_field_formatter_third_party_settings_form () полезна для изменения формы существующего форматера полей.
Но это не работает с полевыми группами.
источник