Atualmente, estou tentando implementar um campo de imagem referenciado por nó no meu site Drupal 7 que mudará seu 'modo de exibição', dependendo da lógica programática antes da renderização. No momento, o campo está sendo renderizado em vários tipos de conteúdo por meio de suas configurações de modo de exibição, cada um usando o formatador de campo 'Nó renderizado'.
primeira tentativa
Minha primeira idéia foi implementar o seguinte, considerando que um gancho é um gancho é um 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, trocando HOOK pelo nome do meu módulo.
Realmente não importava se o item acima seria acionado antes ou depois da função original node_reference_field_formatter_view
, node_reference.module
porque eu substituiria totalmente a saída ou, esperançosamente, modificaria seus valores antes da renderização. O único problema é que o gancho acima parece funcionar apenas por módulo - ou seja, não é de todo o site, portanto, basicamente, não é acionado para o meu módulo.
Agora, obviamente, eu posso escrever meu próprio formatador de campo para gerar um nó renderizado. Mas parece um desperdício, considerando que já existe um.
outras abordagens
Minhas outras abordagens foram HOOK_preprocess_node
e, HOOK_preprocess_field
mas a primeira não contém nenhuma view_mode
informação, e a segunda contém pelo menos cinco estruturas complicadas diferentes, todas com referências a uma view_mode
propriedade em diferentes níveis - e parece um pouco invasivo ter que modificar cada uma delas. valores. Mesmo quando eu mudei certas view_mode
propriedades, a imagem resultante não muda.
questão
Alguém sabe uma maneira clara de intervir antes que um formatador de campo seja processado (de um módulo contrib) e altere suas configurações com base na solicitação por página - ou seja, não sendo necessário alterar as configurações do modo de visualização permanente do tipo de conteúdo real?
hook_field_formatter_view_alter()
ou similar há provavelmente mais de um ano, mas isso simplesmente não existe. FYIhook_preprocess_node()
definitivamente não têmview_mode
à sua disposição, está em$vars['view_mode']
, não$vars['node']->view_mode
o que você poderia ter sido tentado a experimentar.view_mode
onhook_preprocess_node
, me engane ! Pergunto-me se qualquer coisa comohook_field_formatter_view_alter()
isto existe em D8 ...Respostas:
A pergunta menciona que
hook_field_formatter_view()
é chamada apenas no módulo de origem, mas você pode assumir a propriedade do formatador de campo por meio dehook_field_formatter_info_alter()
.Você deve poder definir a
module
chave do formatador como MYMODULE como:Em seguida, você pode implementar
MYMODULE_field_formatter_view()
, alimentando opcionalmente o módulo existente que o tratou para obter um elemento para alterar.fonte
field_formatter
funcionalidade do node_reference, isto é,MYMODULE_field_formatter_settings_summary
eMYMODULE_field_formatter_settings_form
(mesmo que sejam apenas funções proxy no módulo original), caso contrário, o back- A interface do usuário final é interrompida em qualquer painel do modo de exibição, quando ele tenta encontrar esses métodos no módulo errado.Ok, então eu percebi por que minhas alterações
#view_mode
nohook_preprocess_node
ehook_preprocess_fields
não estavam funcionando. (Obrigado a Clive por apontar que eu tinha perdido totalmente a presença de#view_mode
inhook_preprocess_node
) .Meu problema surgiu do fato de que
#view_mode
já havia sido processado e convertido na#image_style
propriedade correta - algo que eu havia deixado de procurar.Mesmo assim, alterar esse valor parece muito dependente de qual gancho você o modificou. Finalmente, finalmente consegui trabalhar com um código que realmente altera a imagem renderizada:
O exposto acima ainda não parece muito eloquente, mas pelo menos funciona. Vou aceitar a palavra de Clive no fato de que esse método _alter não existe para os formatadores de campo - é uma pena, os formatadores são um recurso extremamente poderoso do D7, seria bom ter mais capacidade de aumento.
De qualquer forma, se alguém do futuro tiver idéias melhores, responda :)
fonte
A abordagem mais fácil será usar o Panelizer .
Se não usar o Panelizer, mas os modos de exibição padrão do Drupal ou o Display Suite, tente hook_field_display_alter () ou hook_field_display_ENTITY_TYPE_alter () .
Você tem entidade, exibe o contexto e todas as configurações do formatador. E você pode facilmente alterar as configurações de renderização do campo. Você pode até mudar o formatador de campo para outro.
A abordagem funciona perfeita para mim. A única desvantagem é que você pode estar confuso com diferentes configurações na interface do usuário "Gerenciar exibição".
fonte
https://www.drupal.org/node/2130757 É um bom exemplo. hook_field_formatter_third_party_settings_form () é útil para alterar a forma do formatador de campo existente.
Mas isso não funciona com grupos de campo.
fonte