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
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
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!
node.preprocess.inc
, aqui estou fazendo algo parecido com isto:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
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 no node.preprocess.inc
arquivo, exceto que não chamamos a função de pré-processo novamente:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
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 o full
modo de exibição e outro para oteaser
espero que isso ajude, se alguém voltar a tropeçar nessa pergunta (:
foo_preprocess_node
implementando-ocall_user_func('_preprocess_' . $vars['type'], $vars);
para evitar repetir os ifs, mas provavelmente é melhor permanecer simples.