Имя переменной темы


Я хочу использовать шаблон, имя которого определяется во время выполнения (специализированный шаблон). Если такой шаблон не определен, используйте запасной шаблон с фиксированным именем (например node-sometype.tpl.php используется до node.tpl.php ):

return theme(
    array('my_theme_'.$node->type, 'my_theme'),
    $some_arguments 
);

Если я не объявлю специализированные шаблоны в своей теме hook_theme, а просто сделаю my_theme_page.tpl.php файлы в каталоге тем, они не используются.

Если я объявлю их (здесь темы специализированы по типу узла, так что это возможно), Drupal всегда использует их, вызывая ошибку include/call_user_func вместо использования резервной.

$themes = array(
    'my_theme' => array(
        'arguments' => array('some_arguments'=>NULL),
        'template' => 'my_theme',
        'path' => $path,
    ),
);
foreach (node_get_types() as $type => $_)
    $themes['my_theme_'.$type] = array(
        'arguments' => array('some_arguments'=>NULL),
        'template' => 'my_theme_'.$type,
        'path' => $path,
    );

Итак, вопрос в следующем:

Как объявить тему в модуле, не предоставляя реализацию, чтобы ее можно было использовать с резервным механизмом theme().

 1
Author: kiamlaluno, 2011-06-29

2 answers

Если вы хотите, чтобы у пользователей было больше шаблонов на выбор, которые являются более конкретными, например, один для всех узлов или один для каждого типа узлов, вы должны использовать то, что Drupal называет предложениями по шаблонам. Это позволит вам использовать одну функцию темы, и вам не придется очищать кэш для добавления дополнительных опций.

Вы можете прочитать больше о предложениях по шаблонам.

Что вы хотите, так это создать единую функцию темы с темой крючка:

 function module_theme() {
   return array(
     'module_theme_function' => array(
       ..
     ),
   );
 }

Затем создайте функция предварительной обработки для этой функции темы:

function template_preprocess_module_theme_function(&$vars) {
  // Add template suggestions:
  $vars['template_files'][] = 'my-template-file-' . $some_var;
}

Это позволит вам использовать файл my-template-file-X.tpl.php, где X равно добавленной вами переменной. Вы можете использовать этот метод, чтобы добавить столько предложений по шаблону, сколько вам нравится. Последние добавленные будут иметь приоритет, если определено несколько параметров.

 4
Author: googletorp, 2011-06-29 08:07:16

Для реальных шаблонов вы просто хотите определить так называемые предложения шаблонов, тогда вам вообще не нужно определять их в hook_theme(). См. Раздел Работа с предложениями шаблонов.

Для функций темы также можно задать свойство pattern в hook_theme(), см. Пример privatemsg_theme().

 1
Author: Berdir, 2011-06-29 07:54:31