Как предоставить шаблон для определенного режима просмотра?

46

Я хочу связать тему режима просмотра результатов поиска с шаблоном.

У меня было в голове, что присвоение имени файлу шаблона - article - search-result.tpl.php поможет, но я явно ошибаюсь.

Я понимаю, что могу сделать node - article.tpl.php и в этой проверке $ view_mode, но это неудобно со всеми другими режимами просмотра, которые я не хочу шаблонировать.

Идеи?

artfulrobot
источник

Ответы:

45

Добавление подсказок по теме в функцию предварительной обработки узла должно помочь:

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

После очистки кешей вы сможете использовать узел - article - search-result.tpl.php для имени вашего файла шаблона.

NB. Вы также можете сделать это в файле template.php вашей темы, вызвав функцию MYTHEME_preprocess_node().

Клайв
источник
2
Brilliant! Спасибо. Собирался
artfulrobot
1
Нет проблем :) Просто FYI, search_resultуже объявлен в качестве режима просмотра, поэтому вам не нужно реализовывать hook_entity_info_alter()в вашем случае
Клайв
3

Модуль режимов просмотра Entity автоматически добавляет эти предложения шаблона

Drupal 7 наследовал режимы сборки, которые позволят администраторам определять собственные режимы просмотра для сущностей. Пользовательские сущности добавляются в реестр сущностей с помощью hook_entity_info_alter (), поэтому они доступны для любого кода, который использует entity_get_info () для предоставления списка режимов просмотра для сущности. Сюда входят поля ссылок на узлы и пользователей, представления и т. Д.

Bas
источник
2

Вот функция, которая позволяет динамически добавлять новые. Он также вызывает соответствующую функцию предварительной обработки, если она у вас объявлена.

Затем позвоните, drush cache-clear theme-registryчтобы заставить его работать.

Чтобы использовать его, замените ТЕМУ на имя вашей темы и поместите его в файл themes.php вашей темы.

Например, для темы с именем Droid вы бы назвали ее 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);
  }
}
Элайджа Линн
источник