Actualmente estoy tratando de implementar un campo de imagen de referencia de nodo en mi sitio Drupal 7 que cambiará su 'modo de vista' dependiendo de la lógica programática justo antes del render. El campo se está representando actualmente en varios tipos de contenido a través de su configuración de modo de visualización, cada uno de los cuales está utilizando el formateador de campo 'Nodo representado'.
primer intento
Mi primera idea fue implementar lo siguiente, considerando que un gancho es un gancho es un gancho:
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;
}
}
Obviamente intercambiando GANCHO por el nombre de mi módulo.
En realidad no importa si lo anterior habría disparar antes o después de la función original node_reference_field_formatter_view
en node_reference.module
porque me anular o bien de salida en su totalidad o, con suerte, modificar sus valores antes de la representación. El único problema es que el enlace anterior parece funcionar solo por módulo, es decir, no abarca todo el sitio, por lo que básicamente no se activa para mi módulo.
Ahora, obviamente, puedo escribir mi propio formateador de campo para generar un nodo renderizado. Pero parece un desperdicio teniendo en cuenta que ya existe uno.
otros enfoques
Mis otros enfoques han sido HOOK_preprocess_node
y, HOOK_preprocess_field
pero el primero no contiene ninguna view_mode
información, y el segundo contiene al menos 5 estructuras complicadas diferentes que tienen referencias a una view_mode
propiedad en diferentes niveles, y se siente bastante extraño tener que modificar cada uno de sus valores. Incluso cuando he cambiado ciertas view_mode
propiedades, la imagen resultante no cambia.
pregunta
¿Alguien sabe de una manera limpia de intervenir antes de que un formateador de campo presente (de un módulo contrib) y cambie su configuración por solicitud de página, es decir, al no tener que cambiar la configuración del modo de vista permanente del tipo de contenido real?
hook_field_formatter_view_alter()
o similar durante probablemente más de un año, desafortunadamente no existe. FYIhook_preprocess_node()
definitivamente no tienenview_mode
a su disposición, está en$vars['view_mode']
, no$vars['node']->view_mode
que pudiera haber tenido la tentación de tratar.view_mode
encendidohook_preprocess_node
, ¡tonto! Me pregunto sihook_field_formatter_view_alter()
existe algo así en D8 ...Respuestas:
La pregunta menciona que
hook_field_formatter_view()
solo se invoca en el módulo de origen, pero puede tomar posesión del formateador de campo a través dehook_field_formatter_info_alter()
.Debería poder establecer la
module
clave del formateador en MYMODULE como:Luego puede implementar
MYMODULE_field_formatter_view()
, opcionalmente, a través del módulo existente que lo manejó para obtener un elemento para modificar.fuente
field_formatter
funcionalidad de node_reference, es decir,MYMODULE_field_formatter_settings_summary
eMYMODULE_field_formatter_settings_form
(incluso si son solo funciones proxy de regreso al módulo original) de lo contrario La interfaz de usuario final se rompe en cualquier panel de modo de pantalla, cuando intenta encontrar estos métodos en el módulo incorrecto.Ok por lo que me di cuenta de por qué mis cambios
#view_mode
en cualquierahook_preprocess_node
yhook_preprocess_fields
no funcionaban. (Gracias a Clive por señalar que había extrañado totalmente la presencia de#view_mode
inhook_preprocess_node
) .Mi problema surgió del hecho de que
#view_mode
ya se había procesado y convertido a la#image_style
propiedad correcta , algo que no había buscado.Aun así, cambiar este valor parece demasiado dependiente del gancho en el que lo modificó. Sin embargo, finalmente conseguí que funcionara un código, que en realidad cambia la imagen renderizada:
Lo anterior todavía no se siente muy elocuente, pero al menos funciona. Tomaré la palabra de Clive sobre el hecho de que tal método _alter no existe para los formateadores de campo: es una pena, los formateadores son una característica extremadamente poderosa de D7, sería bueno tener una mayor capacidad de aumento.
De todos modos, si alguna persona futura tiene mejores ideas, responda :)
fuente
El enfoque más fácil será usar el Panelizer .
Si no utiliza Panelizer pero los modos de vista Drupal predeterminados o Display Suite, pruebe hook_field_display_alter () o hook_field_display_ENTITY_TYPE_alter () .
Tiene entidad, muestra el contexto y todas las configuraciones del formateador allí. Y puede cambiar fácilmente la configuración de procesamiento de campo. Incluso puede cambiar el formateador de campo a uno diferente.
El enfoque funciona perfecto para mí. La única desventaja es que puede confundirse con diferentes configuraciones en la IU "Administrar pantalla".
fuente
https://www.drupal.org/node/2130757 Da un buen ejemplo. hook_field_formatter_third_party_settings_form () es útil para alterar la forma del formateador de campo existente.
Pero esto no funciona con grupos de campo.
fuente