УрокИндивидуальные настройки шаблона (темы)

Любая хорошая тема, предназначенная больше чем для одного пользователя, должна быть гибко настраеваема при минимальных вмешательствах в код (в идеале - вообще без них). Поэтому сегодня я расскажу о том, как внедрять в друпал настройки своей темы.

Мне кажется, самым лучшем решением в данном случае будет показать пример интеграции своих настроек. Давайте же его и рассмотрим.

Пример своих настроек темы

Дадим пользователю возможность выбирать ширину контента - фиксированную или резину. А так же возможность включения / отключения левой и правой колонки. То есть пользователь в 3 клика может превратить двухколоночный резиновый шаблон в трёхколоночный фиксированный. Удобно, правда? Теперь к реализации.

Для начала создадим файл theme-settings.php и добавим туда такой код:

function phptemplate_settings($saved_settings) {
 
  // Задаём значения по умолчаю.
  // Наша тема по умолчанию будет иметь фиксированной дизайн
  // и включать в себя левую и правую колонку
  $defaults = array(
    'theme_fixed_or_fluent' => 'fixed',
    'theme_left_column' => 1,
    'theme_right_column' => 1,
  );
 
  // Заменяем дефолтные настройки темы
  // сохранёнными (если таковые имеются)
  $settings = array_merge($defaults, $saved_settings);
 
  // Теперь создаём небольшую форму используя Forms API
  // Почитать про них можно на api.drupal.ru
  $form['theme_fixed_or_fluent'] = array(
    '#type' => 'radios',
    '#title' => t('Fixed or fluent?'),
    '#default_value' => $settings['theme_fixed_or_fluent'],
    '#options' => array(
      'fluent' => t('Fluent'),
      'fixed' => t('Fixed'),
    ),
  );
 
  $form['theme_left_column'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable left column'),
    '#default_value' => $settings['theme_left_column'],
  );
 
  $form['theme_right_column'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable right column'),
    '#default_value' => $settings['theme_right_column'],
  );
 
  // Возвращаем нашу форму на страницу настроек нашей темы
  return $form;
}

Далее надо в файле template.php инициализировать дефолтные значения настроек темы. Добавьте следующий код куда-нибудь вверх файла:

// проверяем, заданы ли настройки темы
// если не заданы - задаём
if (is_null(theme_get_setting('theme_fixed_or_fluent'))) {  // <-- change this line
  global $theme_key;
 
  $defaults = array(
    'theme_fixed_or_fluent' => 'fixed',
    'theme_left_column' => 1,
    'theme_right_column' => 1,
  );
 
  // Получаем глобальные настройки темы
  $settings = theme_get_settings($theme_key);
 
  // Не сохранять значение переменных настройки toggle_node_info_ 
  // (есть там такой нюанс, да :) ).
  if (module_exists('node')) {
    foreach (node_get_types() as $type => $name) {
      unset($settings['toggle_node_info_' . $type]);
    }
  }
 
  // Сохраняем настройки темы по умолчанию
  variable_set(
    str_replace('/', '_', 'theme_'. $theme_key .'_settings'),
    array_merge($defaults, $settings)
  );
 
  // Принудительно очищает кэш настроек темы
  theme_get_setting('', TRUE);
}

Теперь вы можете использовать значения переменных настроек в своём template.php или файлах.tpl.php. Пример использования в page.tpl.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $language->language ?>" lang="<?php echo $language->language ?>" dir="<?php echo $language->dir ?>">
 
<head>
  <?php echo $head; ?>
  <title><?php echo $head_title; ?></title>
  <?php echo $styles; ?>
  <?php echo $scripts; ?>
</head>
 
<body>
 
<?php
  // Запихиваем значения настроек темы в переменные. В принципе, не
  // обязательно, но так сразу видно какие настройки тема имеет
  $theme_fixed_or_fluent = theme_get_setting('theme_fixed_or_fluent');
  $is_left_sidebar = theme_get_setting('theme_left_column');
  $is_right_sidebar = theme_get_setting('theme_right_column'); 
?>
 
  <!-- Выводим значение наших настроек. В класс выведется либо 'fixed' 
       либо 'fluent'. В зависимости от этого класса, в своём css вы 
       можете реализовать резиновую или фиксированную вёрстку -->
  <div id = "wrapper" class = "<?php echo $theme_fixed_or_fluent; ?>">
 
    <!-- тут контент, лого, меню и прочее -->    
 
    <!-- Блоки левой колонки будут выведены только в том случае, 
         если в настройках темы галочкой отмечено "Выводить левую колонку" -->
    <?php if ($left_sidebar && $is_left_sidebar): ?>
      <div id = "left-sidebar">
        <?php echo $left_sidebar; ?>
      </div>
    <?php endif; ?>      
 
    <!-- Аналогичная ситуация с правой колонкой -->
    <?php if ($right_sidebar && $is_right_sidebar): ?>
      <div id = "right-sidebar">
        <?php echo $right_sidebar; ?>
      </div>
    <?php endif; ?>  
 
    <!-- тут футер какой-нибудь --> 
 
  </div><!--/wrapper-->
 
  <?php echo $closure; ?>
 
</body>
</html>

Всё, теперь вам остаётся поработать со стилями внутри своей темы - и гибкость настроек обеспечена!

С помощью такого метода можно организовывать абсолютно, казалось бы, неочевидные вещи. Например, можно настроить количество вывода материала на главной странице. Или задать заголовок для 10го по счёту материала (бесполезная вещь, конечно, но как пример пойдёт). Можно менять картинку в шапке, или подключать дополнительные файлы стилей/скриптов (css/javasript). В общем, как фантазия разгуляется. Я вам дал пищу для мозгов - а вы уже пережёвывайте :)

Комментарии

Аватар пользователя otmoroz095
otmoroz095 написал:

Вот это статья! Очень полезно, спасибо!

02.03.2011 10:23
Аватар пользователя sail
sail написал:

Сильно пригодилась идея. Спасибо

07.03.2011 10:48
Аватар пользователя dr.molekulo
dr.molekulo написал:

СПС, буду учиться статья полезная

31.03.2011 11:41
Аватар пользователя Vladimir
Vladimir написал:

Большое спасибо! Очень пригодилось.

22.10.2011 23:11
Аватар пользователя Vladimir
Vladimir написал:

Сделал нужные настройки в теме, спасибо за пост!
Возник вот такой вопрос, пытаюсь добавить в настройки поле типа textarea:

	$form['blog_page_settings']['theme_blog_page_top_body'] = array(
		'#type' => 'textarea', 
		'#title' => t('Text in top Blog page'), 
		'#default_value' => $settings['theme_blog_page_top_body'],
		'#required' => false,
	);

Все работает, но не могу подключить фильтр друпала. Искал решения пол дня, находил, но доходило обычно только до того что фильтр начинает отображаться в настройках темы но в выводе содержимого textarea изменений после сохранения никаких. То есть на выходе фильтр текст не обрабатывает. :(

Буду благодарен, если намекнете как это можно решить.

08.12.2011 04:31
Аватар пользователя Spleshka
Spleshka написал:

Вам надо чтобы после сохранения настроек текст поля обрабатывался в соответствии с фильтром, или чтобы он выводился пользователю через фильтр?

08.12.2011 14:09
Аватар пользователя Vladimir
Vladimir написал:

Спасибо за ответ.

Мне нужно было сделать возможность выбора формата ввода и в зависимости от выбранного формата обрабатывать текст на странице в которую вывожу свой textarea.

Так как не смог решить ограничился 1 форматом (Filtered HTML), сделав вывод текста через:

echo check_markup($my_text, 1);
08.12.2011 17:49
Аватар пользователя Sadchenko
Sadchenko написал:

Ништяк ништяковский!
Интересно а можно задать в настройке темы поле для загрузки картинки в качестве фона?

И можно еще вопрос, как сгрупировать поля на этой странице настроек посредством вертикальных вкладок модуля Vertical Tabs

20.03.2013 21:57

Комментировать