УрокИндивидуальные настройки темы в Drupal 7

Как добавлять настройки в тему для Drupal 6 уже всем давно известно. Теперь поговорим о том, как это сделать для Drupal 7. Система этих настроек упростилась и стала более логичной и понятной. Итак, по порядку.

Первым шагом в корне темы надо создать файл theme-settings.php. В нём надо имплементировать хук, который изменяет форму с настройкой темы по умолчанию (да да, в седьмом Друпале в теме можно изменять формы при помощи alter хука!). Пример:

<?php
 
/**
 * Implements hook_form_FORM_ID_alter().
 */
function ИМЯТЕМЫ_form_system_theme_settings_alter(&$form, &$form_state) {
  $form['foo_example'] = array(
    '#type'  => 'textfield',
    '#title'  => t('Widget'),
    '#default_value' => theme_get_setting('foo_example'),
    '#description'   => t('Place this text in the widget spot on your site.'),
  );
}

Этот небольшой кусок кода добавляет к настройкам темы текстовое поле с заголовком Widget. Обращаю внимание на то, что ключ массива $form должен называться так же, как передаваемое значение в функцию theme_get_setting(). В нашем случае это foo_example.

Значение настроек по умолчанию

Если раньше их надо было генерировать в коде, а потом объединять с полученными, то теперь всё прозрачнее. Все настройки темы по умолчанию вынесены в info файл темы, в секцию settings. Для примера покажу файл garland.info из темы Garland:

name = Garland
description = A multi-column theme which can be configured to modify colors and switch between fixed and fluid width layouts.
package = Core
version = VERSION
core = 7.x
 
stylesheets[all][] = style.css
stylesheets[print][] = print.css

settings[garland_width] = fluid

В нашем случае (с foo_example) это смотрелось бы так:

settings[foo_example] = Любой текст или число

Использование настроек темы

Используются настройки просто - в любом месте вызовите функцию theme_get_setting() с нужным параметром. Пример:

/**
 * Implements template_preprocess_page()
 */
function ИМЯТЕМЫ_preprocess_page(&$vars) {
  $vars['foo_bar'] = theme_get_setting('foo_example');
}

После выполнения этих действий у вас в page.tpl.php появится переменная $foo_bar, которую можно будет менять в настройках темы по адресу admin/appearance/settings/ИМЯТЕМЫ.

Комментарии

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

Только в page.tpl.php ?

Статья интересная и нужная. Расскажите а как менять CSS файлы. Это актуальнее.

15.12.2011 15:56
Аватар пользователя Spleshka
Spleshka написал:

theme_get_setting() можно использовать в любых шаблонах. Про css позже напишу.

18.12.2011 15:12
Аватар пользователя Гость
Гость написал:

Функция theme_get_settings() была изъята из Drupal 7 API, если вы ещё не в курсе.
Вместо неё - theme_get_setting($setting_name, $theme = NULL) с извлечением только определённого параметра.

06.01.2012 06:03
Аватар пользователя Spleshka
Spleshka написал:

Я-то в курсе, случайно по привычке s дописывал. Спасибо.

06.01.2012 14:17
Аватар пользователя Гость
Гость написал:

А не могли бы вы показать, как через настройки темы загружать картинки, а потом выводить в page.tpl.php (как загружается, логотип)

26.01.2012 13:42
Аватар пользователя WarZ
WarZ написал:

Вопрос назрел. А как, допустим, создавать типы форм, отличные от простого input=text?

21.06.2012 02:05
Аватар пользователя Spleshka
Spleshka написал:

Вот так.

21.06.2012 10:28
Аватар пользователя Гость
Гость написал:

Здравствуйте. А куда нужно вставлять функцию

function ИМЯТЕМЫ_preprocess_page(&$vars) {
  $vars['foo_var'] = theme_get_setting('foo_example');
}

Написал в template.php получил пустую страницу вместо сайта.

30.09.2013 17:52
Аватар пользователя Гость
Гость написал:

понял почему получил пустую страницу. Потому что функция preprocess_page была написана уже до меня.
Добавил туда в самом низу
$vars['foo_var'] = theme_get_setting('foo_example');
но ничего не получил, написав в page.tpl.php вывод переменной $foo_var

30.09.2013 18:43
Аватар пользователя Alex_88
Alex_88 написал:

Разобрался с проблемой, но не до конца. В page.tpl.php вывел переменную. Но не получается вывести её в ноде при редактировании материала. Включил обработчик php в формате ввода в редакторе. Но переменная не выводится. Как быть?

30.09.2013 20:03
Аватар пользователя Alex_88
Alex_88 написал:

Решение подсказали на drupal.ru. В редакторе вызываем theme_get_setting('ИМЯ_ТЕМЫ_course_price');

30.09.2013 20:21
Аватар пользователя svovik1
svovik1 написал:

Спасибо за статью. Помогло (добавлял чек-бокс в настройки своей темы). Только внизу одна опечатка "у вас в page.tpl.php появится переменная $foo_bar$foo_var
, "

23.10.2013 15:58
Аватар пользователя Рома
Рома написал:

Добрый день. прошу прощения. но у меня не работает поле изображения.

вот мой файл theme-settings.php

function basic_form_system_theme_settings_alter(&$form, &$form_state, $form_id = NULL)  {
  // Work-around for a core bug affecting admin themes. See issue #943212.
  if (isset($form_id)) {
    return;
  }
 
 
  $form['other'] = array(
    '#type' => 'fieldset',
    '#title' => 'Дополнительные настройки',
    '#weight' => 5,
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );
 
 
 
  // Чтобы получить картинку, мы делаем следующее:
  // $image = theme_get_setting('background_image');
  // $image_url = file_create_url('background_image', file_load($image)->uri);
  // В $image_url будет привычная всем ссылка на картинку.
  $form['other']['loader'] = array(
    '#title' => "Загрузчик",
    '#type' => 'managed_file',
    '#required' => FALSE,
    '#description' => "Картинка для загрузчика.",
    '#default_value' => theme_get_setting('loader'),
    '#upload_location' => 'public://',
    '#upload_validators' => array(
      'file_validate_extensions' => array('gif png jpg jpeg'),
    ),
  );
 
  // Сохраняем картинку, если ей присвоен статус "временно".
  $image_custom_index = theme_get_setting('loader');
  if ($image_custom_index) {
    // Берем файл ID.
    $fid = theme_get_setting('loader');
    // Грузим наш файлик.
    $file = file_load($fid);
    // Если статус действительно "Временно", то...
    if ($file->status == 0) {
      // Устанавливаем нормальный статус.
      $file->status = FILE_STATUS_PERMANENT;
      // Сохраняем наш файл.
      file_save($file);
    }
  }
}

поле в настройках темы выводится. я выбираю изображение. сохраняю. все хорошо.
но. если я в следующий раз захожу на страницу настроек темы, и меняю какие-то другие настройки, мне пишет
Используемый в поле Загрузчик файл не может быть использован.

подскажите, пожалуйста, что это может быть?

31.01.2014 17:32
Аватар пользователя skeef
skeef написал:

У меня Ваш код прекрасно работает. Однако проблема в другом: при удалении файла он остается на диске и запись в БД также сохраняется. Т.е. не отрабатывает file_delete() - или не вызывается. Почему-то не вижу ajax запросы в Firefox. Подскажите кто сталкивался с подобным?

05.02.2014 13:12
Аватар пользователя Denis Evgenievich
Denis Evgenievich написал:

Добрый день. Опишу проблему - У меня мультидоменость, и в каждом домене своя информация - свои цены, свои онлайн калькуляторы, свои контакты и тд. Реализовано это в теме - ну к примеру я в настройки темы ввожу номер телефона, домен acess делает индивидуальные настройки темы для каждого под домена и всё работает.
делаю это в
theme-setings.php
function ssv5_form_system_theme_settings_alter(&$form, $form_state) {
$form['sv5_settings']['phone_number'] = array(
'#type' => 'textfield',
'#title' => t('Номер телефона'),
'#default_value' => theme_get_setting('phone_number','sv5'),
);
Всё отлично работает, но как задать значение для темы о дефолту? '#default_value' то уже занят. А с цчётом что у меня очень много таких переменных, и много подоменов, задача нужная

15.08.2014 08:01

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