我目前正在尝试在我的Drupal 7网站上实现一个节点引用的图像字段,该字段将根据渲染前的编程逻辑来更改其“查看模式”。当前,正在通过其显示模式设置在多种内容类型上呈现字段,每种内容都使用字段格式化程序“ Rendered node”。
第一次尝试
我的第一个想法是实现以下内容,考虑一个钩子就是一个钩子就是一个钩子:
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
不同级别的属性-感觉很麻烦,必须修改它们各自的属性。价值观。即使更改了某些view_mode
属性,生成的图像也不会更改。
题
是否有人知道在字段格式化程序渲染(contrib模块的)并按每页请求更改其设置之前的一种干净方法,即不必更改实际内容类型的永久视图模式设置?
view_mode
上hook_preprocess_node
,愚蠢的我!我想知道hook_field_formatter_view_alter()
D8中是否存在类似的内容……
hook_field_formatter_view_alter()
或类似的东西已经有一年多了,不幸的是它并不存在。FYIhook_preprocess_node()
绝对不会有view_mode
提供给它,它在$vars['view_mode']
,不是$vars['node']->view_mode
你可能被诱惑去尝试。