Современная, быстрая и удобная система управления сайтом

4. Опции

Архив записейКомментарии: 0Просмотров: 20032

Опции в MaxSite CMS представляют собой значения, которые хранятся в базе данных. Опции можно использовать для самых разных задач, например для настройки шаблона или для сохранения параметров виджетов.

Для работы с опциями существует несколько функций, основные из них три:

  • mso_add_option(ключ, значение, тип) - добавление опции
  • mso_get_option(ключ, тип, возвращаемое значение) - получение опции
  • mso_delete_option(ключ, тип) - удаление опции
В отличие от WordPress, где все опции хранятся в одной куче, в MaxSite CMS опции имеют тип - это некое условное деление. Например для основных опций используется тип general. Для опций плагинов - plugins, для шаблонов - templates.

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

Следует обратить внимание, что все опции кэшируются, поэтому получаются и обновляются одним «скопом» и на это не тратятся лишние запросы к базе данных.

Что можно хранить в опциях? Всё, что угодно. Устройство их таково, что вы можете сохранить и строчку, и число, и массив и т.д. Для сложных типов, вроде объектов и массивов выполняется т.н. серилизация. Это стандартная возможность PHP и с её помощью достигается бОльшая гибкость.

Где можно использовать опции? Везде. :-) Возьмем упрощенный пример. Например мы делаем плагин, который выводит результат в зависимости от каких-то настроек. Понятно, что эти настройки - опции. Вот примерно так их можно реализовать:

function my_custom ()
{
    // получим все опции
    $options = mso_get_option('my_custom', 'plugins', array());
    
    if ( !isset($options['header']) ) $options['header'] = 'Заголовок';
    if ( !isset($options['text']) ) $options['text'] = 'Какой-то текст';

    ...
}

Первым действием мы получаем опции по ключу «my_custom» и типу «plugins». Если таких опций нет, то будет возвращен пустой массив (третий параметр).

Обратите внимание - в этом примере $options - это массив.

Дальше мы выполняем проверку на существовании в опциях какого-то параметра. В этом примере: «header», «text». Если их нет, то присваиваем им свои дефолтные значения.

Данный пример демонстрирует возможность сохранять много настроек в одной опции. Если вы загляните в плагины, которые формируют виджеты, то увидете, что именно такой способ и используется. Однако это совсем не означает, что опции могут быть только массивом. Как я уже говорил, они могут быть любыми.

// опция из настроек шаблона
echo mso_get_option('more', 'templates', 'Читать полностью »');

Понятно, что сами по себе опции мало интересны до тех пор, пока у конечного пользователя не появится возможность их менять. А вот менять опции в MaxSite CMS можно разными способами.

Прежде всего следует отметить, что многие плагины настраиваются через админ-панель. В этом случае создается обычная форма (form) с элементами (input, textarea) и после того, как нажимается кнопка «Сохранить», обрабатывается обычный POST-запрос, анализируются полученные данные, формируется массив опций и выполняется mso_add_option, которая и сохраняет настройки. Данный пример, в виду его некоторой сложности сейчас рассматривать не будем, но если вы разбираетесь в PHP, то... в admin-плагинах именно этот подход и используется.

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

Третий способ самый простой и именно его мы рассмотрим подробней.

Но в начале немного предыстории.

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

Когда я стал делать MaxSite CMS, то за основу взял совсем другой принцип - использовать лишь описание опций, а программирование вынести в отдельную часть. Отличным решением оказалось использование INI-файла.

То есть принцип такой: создается ini-файл. В нем секции для нужных опций. Дальше все очень просто - указываем наш ini-файл в специальных функциях и, вуаля!, опции не просто отображаются, то еще и обновляются как положено.

Я посчитал, что в основном такие опции будут востребованны для настройки шаблона. Поэтому в шаблоне (default) вы найдете два файла: options.php, где выполняется подключение ini-файла, и собственно самого options.ini - где и описаны настройки.

Формат INI-файла очень простой, но для каждой секции/опции есть предопределенный синтаксис. Полностью он приведен в файле maxsite/common/ini-readme.txt.

Рассмотрим небольшой пример (мои комментарии через дефис).

[Текст для «Далее»] - заголовок опции - именно заголовок!
options_type = templates - тип опции для mso_get_option
options_key = more - имя опции для mso_get_option
type = textfield - тип отображаемого поля в форме
description = "Этот текст будет выводится в ссылке на полный текст страницы." - описание
default = "Далее..." - значение по-умолчанию

Поля «options_key» и «options_type» - именно под этими значениями будет сохранена опция.

«description» - это текстовая подсказка, которая будет выводится ниже под полем ввода/выбора

«default» - если опции нет, то будет использовано именно это значение.

«type» - тип элемента формы. Возможные значения:

  • textfield - обычный однострочный input
  • select    - выпадающий список
  • checkbox  - отметка
  • radio     - радиобоксы - выбор одного варианта из нескольких
  • textarea  - текстовое поле многострочное

Как вы наверное догадались, type - самый главный параметр, если хотите - «фишка» данного подхода. То есть вам не нужно формировать html-код и что-то там программировать. Вы просто указывает type и сразу получаете нужный элемент формы.

В зависимости от type, могут быть и другие параметры. Например для type «radio» нужно указать список возможных значений в values и дополнительно можно указать разделительный текст delimer - через него будут отображены все эти элементы:

[Выберите возраст]
options_key = my_age
options_type = template
type = radio
delimer = "<br />"
values = 0-9 # 10-19 # 20-39 # 40+
default = 10-19
description = "Выберите свой возраст"

В качестве разделителя в values всегда используется символ «#».

Обратите внимание еще на один момент: INI-файлы имеют свой синтаксис и для того, чтобы такой файл корректно обработать, необходимо значения заключать в двойные кавычки ("). Особенно это касается русского текста и там, где используются спецсимволы.

Для «checkbox» существует только два значения: 0 и 1. Это связано с особенностями HTML, поэтому учитывайте этот нюанс.

Теперь, предположим, мы хотим выводить какой-то текст на главной странице. Для этого в options.ini создадим опцию в виде такой секции:

[Мой текст]
options_type = templates
options_key = my_text
type = textarea
description = "Какой-то мой текст"
default = ""
Теперь идем в админ-панель в закладку «Настройку шаблона» и видим только что созданную опцию. Скорее всего вы увидите её подсвеченную красным цветом. Этот означает, что опция пока еще не внесена в базу данных. Лишь только после того, как вы нажмете кнопку «Сохранить», она будет помещена в таблицу опций.

Введем текст и сохраним изменения.

Можно использовать HTML.

Теперь нам следует отобразить текст. Для этого откроем файл home.php и добавим сразу после строчки:

require('main-start.php');
Вот эту:

if ( $my_text = mso_get_option('my_text', 'templates', '') ) echo $my_text;

То есть мы получаем опцию «my_text» в переменную $my_text и проверяем не пустая ли она. Если в ней есть какой-то текст, то выводим его.

Обновим главную страницу сайта и сразу увидим наш текст. Как видите, всё элементарно. :-)

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

Впрочем, как именно использовать опции зависит от вашей фантазии. В теории, конечно же можно сделать шаблон полностью настраиваемый из админ-панели. ;-)

Обсудить данную лекцию можно в google-группе MaxSite