Pergunta

Eu tenho vários arquivos .tpl.php para nós, campos CCK e temas de visualizações.Esses arquivos de modelo possuem muita lógica para mover coisas, remover links, criar novos links, etc.Eu entendo que este é um desenvolvimento ruim e não "O jeito Drupal".

Se bem entendi, "The Drupal Way" é usar funções de pré-processador em seu template.php arquivo para manipular variáveis ​​e adicionar novas variáveis.Algumas perguntas sobre isso:

  • Existe uma convenção de nomenclatura para criar uma função de pré-processador para um tema específico?Por exemplo, se eu tiver um modelo de campo CCK chamado content-field-field_transmission_make_model.tpl, como eu nomearia a função do pré-processador?
  • Posso usar funções de pré-processador de modelo para modelos de nó, modelos de campo CCK e modelos de visualizações?Eles têm métodos diferentes para modificar variáveis ​​de modelo ou adicionar novas?
Foi útil?

Solução

Para uma visão geral, você deve leia sobre como manipular variáveis ​​dentro de funções de pré-processamento.


Com relação à convenção de nomenclatura, normalmente isso é bastante simples, mas há um problema no seu exemplo atual (veja abaixo):

Uma assinatura de funções de pré-processo precisa ser

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

portanto, implementar um para o modelo de página dentro de um arquivo template.php de temas resultaria em

themeName_preprocess_page(&$variables)

Na maioria das vezes, o nome da função do tema será o nome do arquivo *.tpl.php, sem a terminação .tpl.php e com sublinhados em vez de hífens. Mas há um porém se o arquivo de modelo for selecionado na base de sugestões de modelos, já que a função de pré-processamento só pode ser implementada para o nome base, não para sugestões adicionais!(As sugestões para arquivos de modelo alternativos são adicionadas nas próprias funções de pré-processamento.)

Seu exemplo atual é um desses casos, como content-field-field_transmission_make_model.tpl.php é uma sugestão, com o nome base sendo content-field.tpl.php, e a função de tema correspondente sendo content_field.Então você teria que implementar uma função de pré-processamento chamada yourThemeName_preprocess_content_field(&$variables), e dentro disso inspecione as entradas disponíveis no array $variables para verificar se você realmente foi chamado para o 'field_transmission_make_model', e não para um campo CCK completamente diferente, por exemplo:

function yourThemeName_preprocess_content_field(&$variables) {
  // Are we called for the right field?
  if ('field_transmission_make_model' == $variables['field_name']) {
    // Yes, add/manipulate entries within the variables array
    $variables['new_entry'] = 'A useless new variable';
    $variables['label'] = 'A useless change of the existing label variable';
  }
}

(Observação:Código não testado, cuidado com erros de digitação)

Depois disso, deve haver uma nova variável $new_entry estando disponível em seu arquivo de modelo e o conteúdo do $label variável deveria ter mudado (todas as entradas de nível superior dentro do array $variables serão transformadas em variáveis ​​separadas para o arquivo de modelo, nomeado após o índice do array).


Quanto à sua segunda pergunta, o uso básico das funções de pré-processamento é o mesmo para todos os arquivos de modelo, mas esteja ciente:

  • As funções de pré-processamento estão disponíveis apenas para chamadas de tema que usam arquivos *.tpl.php, não para funções de tema
  • O conteúdo do array $variables varia muito, dependendo do tema
  • Outros módulos também podem implementar as funções de pré-processamento e serão chamados um após o outro, portanto, se você quiser alterar algo que foi adicionado por outro módulo, você só poderá fazê-lo se sua implementação for chamada depois disso (o que não será problema no seu caso, já que as implementações dentro de um tema são chamadas depois de todas as implementações dentro dos módulos - só queria mencionar que pode haver muitas implementações ao mesmo tempo)

Outras dicas

Para descobrir como nossa função de pré-processamento deve ser nomeada, precisamos saber de qual arquivo de modelo ou função de tema vem alguma saída, e uma ótima maneira de fazer isso é usar o desenvolvedor de tema módulo.

Aqui está um vídeo que explica isso em detalhes - http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-preprocessing-functions

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top