суббота, 6 октября 2012 г.

Организация шаблонов/препроцессов нод

В случае если вы создаете Друпал-сайт с помощью 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


Есть один ньюанс для 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;
    }
  }
}



1 комментарий:

  1. У меня возникали некоторые сложности при установке шаблонов Drupal. Пробовал поставить шестую версию, но возникали проблемы с производительностью. Потом нашел шаблон Drupal 7.x https://www.templatemonster.com/ru/properties/drupal-compatibility/7-x/, для моего коммерческого проекта по дизайну экстерьеров. Прошлый опыт говорил что опять возникнут проблемы с совместимостью и ненужная возня. Но все таки попробовал установить шаблон Drupal 7.x, и был приятно удивлен, все работало нормально.

    ОтветитьУдалить