Часть 1
Препроцессы нужны для того, чтобы определить, какие переменные будут доступны в шаблонах. Препроцессы мы будем складывать в sites/all/themes/mytheme/preprocess. Создадим файлы preprocess-page.inc — для страницы, preprocess-node.inc — для контента, preprocess-header.inc — для шапки, preprocess-footer.inc — для подвала, preprocess-region.inc — для регионов, preprocess-block.inc — для блоков, preprocess-comment.inc — для комментариев. Также мы можем создавать файлы типа preprocess-node-story.inc для обработки материала типа story или preprocess-block-user.inc для блока user. Это позволяет обрабатывать отдельно разные типы содержимого сайта. В основном в препроцессах я определял классы для разных регионов сайта.
Часть 3
Препроцессы
Препроцессы нужны для того, чтобы определить, какие переменные будут доступны в шаблонах. Препроцессы мы будем складывать в sites/all/themes/mytheme/preprocess. Создадим файлы preprocess-page.inc — для страницы, preprocess-node.inc — для контента, preprocess-header.inc — для шапки, preprocess-footer.inc — для подвала, preprocess-region.inc — для регионов, preprocess-block.inc — для блоков, preprocess-comment.inc — для комментариев. Также мы можем создавать файлы типа preprocess-node-story.inc для обработки материала типа story или preprocess-block-user.inc для блока user. Это позволяет обрабатывать отдельно разные типы содержимого сайта. В основном в препроцессах я определял классы для разных регионов сайта.
preprocess-page.inc
Copy Source | Copy HTML
- if ($index = array_search(preg_replace('![^abcdefghijklmnopqrstuvwxyz0-9-_]+!s', '', 'page-'. drupal_strtolower(arg( 0))), $vars['classes_array'])) {
- unset($vars['classes_array'][$index]);
- }
-
- // Определяем шаблон и переменные для шапки и подвала
- $vars['header'] = theme('header', array(
- // Имя переменной => значение
- 'front_page' => $vars['front_page'],
- 'logo' => $vars['logo'],
- 'search_box' => $vars['search_box'],
- 'header_line' => $vars['header_line'],
- ));
- $vars['footer'] = theme('footer', array(
- 'front_page' => $vars['front_page'],
- 'footer_line' => $vars['footer_line'],
- 'page_bottom' => $vars['page_bottom'],
- ));
-
- // Определяем дополнительные классы для не_главной страницы
- if (!$vars['is_front']) {
- // Добавляем уникальные классы для разных страниц
- $path = drupal_get_path_alias($_GET['q']);
- $vars['classes_array'][] = drupal_html_class('page-' . $path);
- // И для разных разделов сайта
- list($section, ) = explode('/', $path, 2);
- if (arg( 0) == 'node') {
- if (arg(1) == 'add') {
- $section = 'node-add';
- }
- elseif (is_numeric(arg(1)) && (arg(2) == 'edit' || arg(2) == 'delete')) {
- $section = 'node-' . arg(2);
- }
- }
- $vars['classes_array'][] = drupal_html_class('section-' . $section);
- }
preprocess-node.inc
Copy Source | Copy HTML
- // Создаем переменную $build_mode в зависимости от типа отображения ноды
- switch ($vars['node']->build_mode) {
- case NODE_BUILD_NORMAL:
- $vars['build_mode'] = $vars['teaser'] ? 'teaser' : 'full';
- break;
- case NODE_BUILD_PREVIEW:
- $vars['build_mode'] = 'preview';
- break;
- case NODE_BUILD_SEARCH_INDEX:
- $vars['build_mode'] = 'search_index';
- break;
- case NODE_BUILD_SEARCH_RESULT:
- $vars['build_mode'] = 'search_result';
- break;
- case NODE_BUILD_RSS:
- $vars['build_mode'] = 'rss';
- break;
- case NODE_BUILD_PRINT:
- $vars['build_mode'] = 'print';
- break;
- }
-
- // Создаем переменную $user_picture
- $vars['user_picture'] = $vars['picture'];
-
- // Специальные классы для материалов, зависящие от типа
- // Например: "node-type-page", "node-type-story", "node-type-my-custom-type"
- $vars['classes_array'][] = drupal_html_class('node-type-' . $vars['type']);
- if ($vars['promote']) {
- $vars['classes_array'][] = 'node-promoted';
- }
- if ($vars['sticky']) {
- $vars['classes_array'][] = 'node-sticky';
- }
- if (!$vars['status']) {
- $vars['classes_array'][] = 'node-unpublished';
- $vars['unpublished'] = TRUE;
- }
- else {
- $vars['unpublished'] = FALSE;
- }
- if ($vars['uid'] && $vars['uid'] == $GLOBALS['user']->uid) {
- $vars['classes_array'][] = 'node-by-viewer'; // Нода текущего пользователя.
- }
- if ($vars['teaser']) {
- $vars['classes_array'][] = 'node-teaser'; // Тизер.
- }
- if (isset($vars['preview'])) {
- $vars['classes_array'][] = 'node-preview';
- }
preprocess-header.inc, preprocess-footer.inc
Copy Source | Copy HTML
- if ($vars['elements']) {
- // Разбираем массив, пришедший из функции theme() и добавляем параметры в переменные
- foreach ($vars['elements'] as $ind => $val) {
- $vars[$ind] = $val;
- }
- unset ($vars['elements']);
- }
preprocess-region.inc
Copy Source | Copy HTML
- // Создаем переменные $content и $region
- $vars['content'] = $vars['elements']['#children'];
- $vars['region'] = $vars['elements']['#region'];
-
- // Задаем классы
- $region = 'region-' . str_replace('_', '-', $vars['region']);
- $vars['classes_array'] = array('region', $region);
-
- // И шаблон
- $vars['template_files'][] = $region;
preprocess-block.inc
Copy Source | Copy HTML
- $block = $vars['block'];
-
- // Задаем переменные $title и $content
- $vars['content'] = $block->content;
- $vars['title'] = $block->subject;
-
- // Задаем классы
- $vars['classes_array'][] = 'block-' . $block->module;
- $vars['classes_array'][] = 'region-' . $vars['block_zebra'];
- $vars['classes_array'][] = $vars['zebra'];
- $vars['classes_array'][] = 'region-count-' . $vars['block_id'];
- $vars['classes_array'][] = 'count-' . $vars['id'];
-
- $vars['edit_links_array'] = array();
preprocess-comment.inc
Copy Source | Copy HTML
- // Создаем переменную $created
- $vars['created'] = $vars['date'];
-
- // Убираем тему коммента если она откллючена
- if (variable_get('comment_subject_field_' . $vars['node']->type, 1) == 0) {
- $vars['title'] = '';
- }
-
- // Стили
- if ($vars['comment']->new) {
- $vars['classes_array'][] = 'comment-new';
- }
- if ($vars['comment']->status == COMMENT_NOT_PUBLISHED) {
- $vars['unpublished'] = TRUE;
- }
- else {
- $vars['unpublished'] = FALSE;
- $vars['classes_array'][] = $vars['status'];
- }
- // Зебра
- if ($vars['id'] == 1) {
- $vars['classes_array'][] = 'first';
- }
- if ($vars['id'] == $vars['node']->comment_count) {
- $vars['classes_array'][] = 'last';
- }
- $vars['classes_array'][] = $vars['zebra'];
- if ($vars['comment']->uid == 0) {
- // Коммент анонимного пользователя
- $vars['classes_array'][] = 'comment-by-anonymous';
- }
- else {
- if ($vars['comment']->uid == $vars['node']->uid) {
- // Коммент автора ноды
- $vars['classes_array'][] = 'comment-by-node-author';
- }
- if ($vars['comment']->uid == $GLOBALS['user']->uid) {
- // Коммент текущего пользователя
- $vars['classes_array'][] = 'comment-by-viewer';
- }
- }
Часть 3