Jak zapewnić szablon dla konkretnego trybu widoku?

46

Chcę opisać tryb wyświetlania wyników wyszukiwania szablonem.

Miałem w głowie, że nazwanie węzła pliku szablonu - artykuł - search-result.tpl.php załatwi sprawę, ale najwyraźniej się mylę.

Zdaję sobie sprawę, że mogę zrobić węzeł - artykuł.tpl.php i w ramach tej kontroli $ view_mode, ale jest to niewygodne w przypadku wszystkich innych trybów widoku, których nie chcę szablonować.

Pomysły?

artfulrobot
źródło

Odpowiedzi:

45

Dodanie sugestii zaczepienia motywu w funkcji wstępnego przetwarzania węzła powinno załatwić sprawę:

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

Po wyczyszczeniu pamięci podręcznej powinieneś być w stanie użyć node - article - search-result.tpl.php dla nazwy pliku szablonu.

NB. Możesz to również zrobić w pliku template.php kompozycji, wywołując funkcję MYTHEME_preprocess_node().

Clive
źródło
2
Znakomity! Dziękuję Ci. Właśnie miałem
artfulrobot
1
Żaden problem :) Po prostu FYI, search_resultjest już zadeklarowany jako tryb widoku, więc nie musisz go wdrażać hook_entity_info_alter()w twoim przypadku
Clive
3

Tryby widoku Podmiot moduł dodaje te propozycje szablonów automatycznie

Drupal 7 jest następcą trybów kompilacji, które pozwolą administratorom definiować niestandardowe tryby widoku dla encji. Niestandardowe encje są dodawane do rejestru encji za pomocą hook_entity_info_alter (), dzięki czemu są dostępne dla każdego kodu, który używa encji_get_info () w celu zapewnienia listy trybów wyświetlania encji. Obejmuje to pola odniesień do węzła i użytkownika, widoki itp.

Bas
źródło
2

Oto funkcja, która pozwala dynamicznie dodawać nowe. Wywołuje również odpowiednią funkcję przetwarzania wstępnego, jeśli została zadeklarowana.

Następnie zadzwoń, drush cache-clear theme-registryaby działało.

Aby z niego skorzystać, zamień TEMAT na nazwę motywu i umieść go w pliku motywów szablon.php.

np. dla motywu o nazwie Droid nazwałbyś go 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
źródło