В случае если вы создаете Друпал-сайт с помощью build/view-модов нод, можно очень удобно разделить шаблоны и препроцессы не только по типу (что доступно по умолчанию), но и по view-моду.
Общая схема названий будет следующей.
Имена препроцессов
THEMENAME_preprocess_node_NODETYPE_VIEWMODE(&$vars, $hook) {...}
Либо, можно сделать общий препроцесс для view-мода любого контент тайпа.
THEMENAME_preprocess_node__VIEWMODE(&$vars, $hook) {...}
Имена шаблонов
node-NODETYPE-VIEWMODE.tpl.php
Аналогично для общего шаблона view-мода
node--VIEWMODE.tpl.php
/**
* Implements hook_preprocess_node() for node theming.
*/
function THEMENAME_preprocess_node(&$vars, $hook) {
$node = $vars['node'];
// Calculate build mode machine name.
switch ($node->build_mode) {
case NODE_BUILD_NORMAL:
case NODE_BUILD_PREVIEW:
$build_mode = $vars['teaser'] ? 'teaser' : 'full';
break;
case NODE_BUILD_SEARCH_RESULT:
$build_mode = 'teaser';
break;
case NODE_BUILD_RSS:
$build_mode = 'rss';
break;
default:
$build_mode = $node->build_mode;
break;
}
$vars['template_files'][] = 'node--' . $build_mode;
$vars['template_files'][] = 'node-' . $node->type . '-' . $build_mode;
$build_mode_for_preprocess = str_replace('-', '_', $build_mode);
// Defines the priority of calling preprocess fuctions for specific nodetype & build modes.
// Note: priority is calculated in reverse mode.
$preprocess = array(
'THEMENAME_preprocess_node_' . $node->type,
'THEMENAME_preprocess_node__' . $build_mode_for_preprocess,
'THEMENAME_preprocess_node_' . $node->type . '_' . $build_mode_for_preprocess,
);
// Run existing preprocesses.
foreach (array_reverse($preprocess) as $function) {
if (function_exists($function)) {
$function($vars, $hook);
// Note, that we call only one preprocess, but it could be easily changed.
break;
}
}
}
/**
* Implements hook_preprocess_node() for node theming.
*/
function THEMENAME_preprocess_node(&$vars, $hook) {
$node = $vars['node'];
$vars['theme_hook_suggestions'][] = 'node__' . $vars['view_mode'];
$vars['theme_hook_suggestions'][] = 'node__' . $node->type . '_' . $vars['view_mode'];
$build_mode_for_preprocess = str_replace('-', '_', $vars['view_mode']);
// Defines the priority of calling preprocess fuctions for specific nodetype & build modes
// Note: priority is calculated in reverse mode.
$preprocess = array(
'THEMENAME_preprocess_node__' . $node->type,
'THEMENAME_preprocess_node__' . $build_mode_for_preprocess,
'THEMENAME_preprocess_node__' . $node->type . '_' . $build_mode_for_preprocess,
);
// Run existing preprocesses.
foreach (array_reverse($preprocess) as $function) {
if (function_exists($function)) {
$function($vars, $hook);
// Note, that we call only one preprocess, but it could be easily changed.
break;
}
}
}
Общая схема названий будет следующей.
Имена препроцессов
THEMENAME_preprocess_node_NODETYPE_VIEWMODE(&$vars, $hook) {...}
Либо, можно сделать общий препроцесс для view-мода любого контент тайпа.
THEMENAME_preprocess_node__VIEWMODE(&$vars, $hook) {...}
Имена шаблонов
node-NODETYPE-VIEWMODE.tpl.php
Аналогично для общего шаблона view-мода
node--VIEWMODE.tpl.php
Есть один ньюанс для D6, что бы все заработало нужно стандартный (либо ваш переопределенный) шаблон ноды - node.tpl.php, положить в туже папку где будут лежать специфичные шаблоны, иначе они не подхватятся.
Drupal 6 версия
/**
* Implements hook_preprocess_node() for node theming.
*/
function THEMENAME_preprocess_node(&$vars, $hook) {
$node = $vars['node'];
// Calculate build mode machine name.
switch ($node->build_mode) {
case NODE_BUILD_NORMAL:
case NODE_BUILD_PREVIEW:
$build_mode = $vars['teaser'] ? 'teaser' : 'full';
break;
case NODE_BUILD_SEARCH_RESULT:
$build_mode = 'teaser';
break;
case NODE_BUILD_RSS:
$build_mode = 'rss';
break;
default:
$build_mode = $node->build_mode;
break;
}
$vars['template_files'][] = 'node--' . $build_mode;
$vars['template_files'][] = 'node-' . $node->type . '-' . $build_mode;
$build_mode_for_preprocess = str_replace('-', '_', $build_mode);
// Defines the priority of calling preprocess fuctions for specific nodetype & build modes.
// Note: priority is calculated in reverse mode.
$preprocess = array(
'THEMENAME_preprocess_node_' . $node->type,
'THEMENAME_preprocess_node__' . $build_mode_for_preprocess,
'THEMENAME_preprocess_node_' . $node->type . '_' . $build_mode_for_preprocess,
);
// Run existing preprocesses.
foreach (array_reverse($preprocess) as $function) {
if (function_exists($function)) {
$function($vars, $hook);
// Note, that we call only one preprocess, but it could be easily changed.
break;
}
}
}
Drupal 7 версия
/**
* Implements hook_preprocess_node() for node theming.
*/
function THEMENAME_preprocess_node(&$vars, $hook) {
$node = $vars['node'];
$vars['theme_hook_suggestions'][] = 'node__' . $vars['view_mode'];
$vars['theme_hook_suggestions'][] = 'node__' . $node->type . '_' . $vars['view_mode'];
$build_mode_for_preprocess = str_replace('-', '_', $vars['view_mode']);
// Defines the priority of calling preprocess fuctions for specific nodetype & build modes
// Note: priority is calculated in reverse mode.
$preprocess = array(
'THEMENAME_preprocess_node__' . $node->type,
'THEMENAME_preprocess_node__' . $build_mode_for_preprocess,
'THEMENAME_preprocess_node__' . $node->type . '_' . $build_mode_for_preprocess,
);
// Run existing preprocesses.
foreach (array_reverse($preprocess) as $function) {
if (function_exists($function)) {
$function($vars, $hook);
// Note, that we call only one preprocess, but it could be easily changed.
break;
}
}
}
У меня возникали некоторые сложности при установке шаблонов Drupal. Пробовал поставить шестую версию, но возникали проблемы с производительностью. Потом нашел шаблон Drupal 7.x https://www.templatemonster.com/ru/properties/drupal-compatibility/7-x/, для моего коммерческого проекта по дизайну экстерьеров. Прошлый опыт говорил что опять возникнут проблемы с совместимостью и ненужная возня. Но все таки попробовал установить шаблон Drupal 7.x, и был приятно удивлен, все работало нормально.
ОтветитьУдалить