Como fornecer modelo para o modo de exibição específico?

46

Quero tema o modo de exibição de resultados de pesquisa com um modelo.

Eu pensava que nomear um nó de arquivo de modelo - article - search-result.tpl.php faria o truque, mas obviamente estou errado sobre isso.

Sei que posso fazer o node - article.tpl.php e dentro dessa verificação $ view_mode, mas isso é estranho com todos os outros modos de exibição que não quero modelar.

Idéias?

artfulrobot
fonte

Respostas:

45

Adicionar sugestões de gancho de tema em uma função de pré-processo do nó deve executar o truque:

function MYMODULE_preprocess_node(&$vars) {
  if ($vars['node']->type == 'article' && $vars['view_mode'] == 'search_result') {
    $vars['theme_hook_suggestions'][] = 'node__article__search_result';
  }
}

Após limpar os caches, você poderá usar o node - article - search-result.tpl.php para o nome do arquivo de modelo.

NB Você também pode fazer isso no arquivo template.php do seu tema chamando a função MYTHEME_preprocess_node().

Clive
fonte
2
Brilhante! Obrigado. Estava prestes a adicionar um link para mesmo conselho aqui: mearra.com/blogs/juha-niemi/drupal-7-custom-node-view-modes
artfulrobot
1
Não tem problema :) Apenas a FYI, search_resultjá está declarada como modo de visualização, para que você não precise implementar hook_entity_info_alter()no seu caso
Clive
3

O módulo de modos de exibição de entidade adiciona essas sugestões de modelo automaticamente

O sucessor do Drupal 7 para os modos Build, que permitirá aos administradores definir modos de exibição personalizados para entidades. As entidades personalizadas são adicionadas ao registro da entidade por hook_entity_info_alter (), para que estejam disponíveis para qualquer código que use entity_get_info () para fornecer uma lista dos modos de exibição de uma entidade. Isso inclui campos de referência de nó e usuário, visualizações, etc.

Bas
fonte
2

Aqui está uma função que permite adicionar novos dinamicamente. Também chama a função de pré-processo correspondente se você tiver uma declarada.

Em seguida, ligue drush cache-clear theme-registrypara fazê-lo funcionar.

Para usá-lo, substitua THEME pelo nome do seu tema e coloque-o no arquivo template.php de temas.

por exemplo, para um tema chamado Droid, você o chamaria droid_preprocess_node(&$variables, $hook) {...

function THEME_preprocess_node(&$variables, $hook) {
  $view_mode = $variables['view_mode'];
  $content_type = $variables['type'];
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode;
  $variables['theme_hook_suggestions'][] = 'node__' . $view_mode . '_' . $content_type;

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode . '_' . $content_type;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }

  $view_mode_preprocess = 'THEME_preprocess_node_' . $view_mode;
  if (function_exists($view_mode_preprocess)) {
    $view_mode_preprocess($variables, $hook);
  }
}
Elijah Lynn
fonte