переопределить node.tpl.php в модуле

8

Я создал модуль, который должен отображать контент определенного типа. Отображение довольно сложное, и чтобы иметь возможность отключить его и сгруппировать все вместе, я создал для этого модуль.

Но в конце он должен просто переопределить обычный файл node.tpl.php с помощью специального файла .tpl.php. Когда я помещаю файл в папку с шаблонами, он берется, и страницы отображаются в соответствии с назначением, но я не могу заставить его работать, когда файл находится в папке модуля.

Я прочитал много вещей о регистре файла .tpl и препроцесса, но ничего, что объединяло бы нужные мне части.

Это то, что я имею до сих пор

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}
Dazz
источник
1
Меня могут об этом спросить, но, по моему (не очень) скромному мнению, модуль не должен заботиться о том, как выглядит узел при отображении, все, о чем он должен заботиться, - это передача этих данных в тему, которая затем выполняет часть дисплея. Теперь, если вы хотите, чтобы ваш модуль создал пользовательский объект, который отображается в узле, это другая история, тогда вы можете создать шаблон для этого. Но если вы хотите замкнуть этот шаг, то размещение вашего node.tpl.php в каталоге темы - это единственный «правильный» способ сделать это.
Джимаджамма
Если кто-то хочет сделать это специально в Drupal 6, проверьте этот ответ: stackoverflow.com/a/6153043/1154642
bryanbraun

Ответы:

3

В вашем вопросе неясно, размещаете ли вы шаблон в sites/all/custom/modulesили в sites/all/custom/modules/the_name_of_mymodule. Это должно быть позже.

Однако, если вы:

  • Держите ваш шаблон в нужном месте.
  • Посетил admin/appearanceпуть для принудительного обновления реестра тем.
  • Очистили все кеши после.

... но все же без кубиков, вы всегда можете указать в своей реализации hook_theme () theme_pathключ:

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}
любитель бариста
источник
все еще не работает, мне нужно theme_hook_suggestions или нужно выбрать его, подобрать шаблон самостоятельно? «Приложение» - это тип контента, «Приложения» - название модуля
dazz
Возможно, проблема в том, что у вас есть имя функции темы node--app. Лучшее имя было бы node_app, и вы бы вызвали функцию создания тем, выполнив. theme('node_app', [$vars]);Я не уверен, что theme('node--app')это то, что я когда-либо видел, и почти уверен, что это не будет работать.
бариста-любитель
Также предусмотрена переменная $ path, поэтому вам не нужно выполнять танец drupal_get_path (). $ path - это местоположение модуля, который реализует hook_theme, в данном случае модуль с именем apps.
бариста-любитель
1
название темы должно быть 'node__app'(двойное подчеркивание) не'node_app'
Junaid
3

Думал, что выложу найденное решение:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}
Aronanda
источник