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


Drupal предоставляет hook_theme(). Но есть ли hook_theme_alter()? Я ищу что-то вроде hook_menu_link_alter(), который переопределяет пункты меню крючка, но для темы. Я хочу изменить запись темы просмотра, чтобы указать, где искать один из моих пользовательских шаблонов. Мне не интересно указывать его через интерфейс представлений, так как он ищет шаблон темы внутри папки темы, и я хочу, чтобы мой шаблон был в функциональном модуле.

Я нашел hook_theme_registry_alter() и _theme_process_registry(). Вы можете ответить, какой из них лучше всего использовать и почему.

Какой из этих ключей я должен изменить, чтобы представление отображало шаблон из модуля?

Если я добавлю в функцию просмотры-экспорт данных-xml-заголовок -каналы Ричарда-фильмы nokia-просмотры-экспорт данных-1, представление по умолчанию будет отображаться views-data-export-xml-header.tpl.php . Если я помещу этот шаблон в слой темы, представление подхватит его (даже при наличии крючка изменения реестра).

Author: kiamlaluno, 2011-03-23

2 answers

Ваша функция должна реализовывать hook_theme_registry_alter(). Вариант использования, который вы описываете, - это именно то, для чего предназначен этот крючок. Пример кода, связанный на странице API, должен помочь вам начать работу. Основная идея состоит в том, чтобы выбрать запись, соответствующую записи, которую views_theme() вставляет в реестр, и изменить шаблон, чтобы он соответствовал шаблону в вашей функции.

 13
Author: jhedstrom, 2011-03-23 19:10:39

Это код, который я использую для объявления шаблона представления, хранящегося в папке шаблона пользовательского модуля.

/**
 * Implements hook_theme_registry_alter().
 */
function custom_module_theme_registry_alter(&$theme_registry) {
  $extension   = '.tpl.php';
  $module_path = drupal_get_path('module', 'custom_module');
  $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

  foreach ($files as $file) {
    $template = drupal_basename($file->filename, $extension);
    $theme    = str_replace('-', '_', $template);
    list($base_theme, $specific) = explode('__', $theme, 2);

    // Don't override base theme.
    if (!empty($specific) && isset($theme_registry[$base_theme])) {
      $theme_info = array(
        'template'   => $template,
        'path'       => drupal_dirname($file->uri),
        'variables'  => $theme_registry[$base_theme]['variables'],
        'base hook'  => $base_theme,
        // Other available value: theme_engine.
        'type'       => 'module',
        'theme path' => $module_path,
      );

      $theme_registry[$theme] = $theme_info;
    }
  }
}

Вы должны быть легко в состоянии изменить существующую тему вместо добавления новой. Надеюсь, это кому-то поможет.

 1
Author: Sebastien M., 2017-12-11 11:57:58