Eu tenho alguns tipos de conteúdo que eu preciso pré-processar de diferentes maneiras. Então, template.php
no meu tema, foo
atualmente se parece com:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Eu gostaria de poder especificar uma função de pré-processo específica do Drupal que seria conectada ao nome da máquina do tipo de conteúdo. Eu tentei usar, foo_preprocess_news
mas nunca é chamado.
Existe uma maneira melhor?
foo_preprocess_node
implementando-ocall_user_func('_preprocess_' . $vars['type'], $vars);
para evitar repetir os ifs, mas provavelmente é melhor permanecer simples.hook_preprocess_node()
em um módulo personalizado e esperava que isso restringisse quando o gancho for chamado, mas não. Alguma maneira de restringir quando o gancho é chamado por tipo de conteúdo?if ($vars['node']->type == 'foo') { ...
vai conseguir o efeito que você está procurandohook_block_view_MODULE_DELTA_alter()
. Atualmente, faço o que você diz, mas gostaria que houvesse uma maneira de restringir quando o gancho é atingido.O subtema zen realiza isso adicionando isso à sua função theme_preprocess_node:
Se você tiver um tipo de conteúdo chamado 'news', poderá criar uma função chamada foo_preprocess_node_news no seu arquivo template.php.
fonte
Eu só tive um problema semelhante e é por isso que o google me trouxe a esta página: minha função de pré-processo de nó estava crescendo tão enormemente, que eu preferia dividir a função em vários arquivos.
Eu já fiz uma abordagem semelhante no meu arquivo template.php que contém todas as funções alter e, como o mesmo método funciona perfeitamente bem aqui, pensei em compartilhar minha abordagem:
configuração do arquivo dentro da pasta
MYTHEME/preprocess
:você já deveria ter
node.preprocess.inc
, os outros que você pode criar a si mesmo. como você os chama realmente é bastante arbitrário, mas é melhor dar nomes que os identifiquem bem e que se ajustem a todo o sistema de nomes drupal.em diante para o conteúdo desses arquivos!
Basicamente, alternamos o tipo do nó atual. o que você muda depende de você;
#id
,#view_mode
tudo dependendo das suas necessidades exatas.quando houver uma correspondência, ele carregará o arquivo especificado e atuará sobre seu conteúdo, como se tivesse sido escrito exatamente dentro desta função.
o conteúdo desses
included
arquivos se parece exatamente com o que você colocaria nonode.preprocess.inc
arquivo, exceto que não chamamos a função de pré-processo novamente:você pode basicamente fazer isso com quantos arquivos quiser e até mesmo alternar vários switches, por exemplo, dividindo ainda mais arquivos de pré-processamento de nós específicos, dependendo de
#view_mode
, ter um arquivo para ofull
modo de exibição e outro para oteaser
espero que isso ajude, se alguém voltar a tropeçar nessa pergunta (:
fonte
call_user_func()
não passa parâmetros por referência. Portanto, no caso de$variables
suaspreprocess_foo()
funções funcionarem apenas em cópias da matriz original; alterações em objetos não serão aplicadas durante o processo de renderização restante.fonte
Em seu hook_preprocess_node principal, implemente o código a seguir no final
Agora você teria pré-processado por tipo de nó
fonte