Опции в MaxSite CMS представляют собой значения, которые хранятся в базе данных. Опции можно использовать для самых разных задач, например для настройки шаблона или для сохранения параметров виджетов.
Для работы с опциями существует несколько функций, основные из них три:
- mso_add_option(ключ, значение, тип) - добавление опции
- mso_get_option(ключ, тип, возвращаемое значение) - получение опции
- mso_delete_option(ключ, тип) - удаление опции
Таким образом обращаться к опциям следует по их имени и типу. Понятно, что тип может быть произволен. Например для своего плагина вы можете придумать свой.
Следует обратить внимание, что все опции кэшируются, поэтому получаются и обновляются одним «скопом» и на это не тратятся лишние запросы к базе данных.
Что можно хранить в опциях? Всё, что угодно. Устройство их таково, что вы можете сохранить и строчку, и число, и массив и т.д. Для сложных типов, вроде объектов и массивов выполняется т.н. серилизация. Это стандартная возможность 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