УрокИндивидуальные настройки шаблона (темы)
Любая хорошая тема, предназначенная больше чем для одного пользователя, должна быть гибко настраеваема при минимальных вмешательствах в код (в идеале - вообще без них). Поэтому сегодня я расскажу о том, как внедрять в друпал настройки своей темы.
Мне кажется, самым лучшем решением в данном случае будет показать пример интеграции своих настроек. Давайте же его и рассмотрим.
Пример своих настроек темы
Дадим пользователю возможность выбирать ширину контента - фиксированную или резину. А так же возможность включения / отключения левой и правой колонки. То есть пользователь в 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). В общем, как фантазия разгуляется. Я вам дал пищу для мозгов - а вы уже пережёвывайте :)
- Spleshka
- 17.02.2011
- 13638
Комментарии
Вот это статья! Очень полезно, спасибо!
Сильно пригодилась идея. Спасибо
СПС, буду учиться статья полезная
Большое спасибо! Очень пригодилось.
Сделал нужные настройки в теме, спасибо за пост!
Возник вот такой вопрос, пытаюсь добавить в настройки поле типа textarea:
Все работает, но не могу подключить фильтр друпала. Искал решения пол дня, находил, но доходило обычно только до того что фильтр начинает отображаться в настройках темы но в выводе содержимого textarea изменений после сохранения никаких. То есть на выходе фильтр текст не обрабатывает. :(
Буду благодарен, если намекнете как это можно решить.
Вам надо чтобы после сохранения настроек текст поля обрабатывался в соответствии с фильтром, или чтобы он выводился пользователю через фильтр?
Спасибо за ответ.
Мне нужно было сделать возможность выбора формата ввода и в зависимости от выбранного формата обрабатывать текст на странице в которую вывожу свой textarea.
Так как не смог решить ограничился 1 форматом (Filtered HTML), сделав вывод текста через:
Ништяк ништяковский!
Интересно а можно задать в настройке темы поле для загрузки картинки в качестве фона?
И можно еще вопрос, как сгрупировать поля на этой странице настроек посредством вертикальных вкладок модуля Vertical Tabs
Комментировать