Виджет (widget), в классическом понимании, это некий блок, который выводится в боковой панели сайта (сайдбар, sidebar). Пожалуй, самая важная особенность виджетов состоит в том, что они настраиваются и размещаются через админ-панель. Виджеты как правило имеют свои настройки и их можно располагать в произвольном порядке в сайдбарах.
В MaxSite CMS виджеты - это обычные плагины, просто в них используются предопределенные функции, которые выполняют «цикл жизни» виджета. Любой виджет имеет ряд особенностей:
- Может иметь свои настройки.
- Может выводиться много раз и каждая копия будет иметь свои настройки.
- Обслуживанием виджета занимается MaxSite CMS на основе предопределенных функций.
- Для виджетов можно указывать условия отображения.
- Виджеты не обязательно могут располагаться в сайдбарах: технически это обычные php-функции, которые можно вызвать откуда угодно.
Работа с виджетами в админ-панели
Настройка сайдбаров в админке MaxSite CMS выполнена в «спартанском виде», поскольку сами сайдбары представляют собой обычные текстовые поля. Для любителей WordPress, это может показаться странным, но для этого есть весьма весомые причины. Дело в том, что виджеты в сайдбарах могут иметь самые разные параметры и их удобно указывать именно в текстовом варианте.
Из-за того, что виджетов одного плагина может быть множество, то их следует как-то именовать. Например нам нужны два текстовых виджета. Делается это так:
text_block_widget баннер text_block_widget счетчики
Название виджета или его номер могут быть произвольными. Главное - это следить, чтобы название в пределах одного плагина были уникальными.
Теперь, предположим, мы хотим сделать, чтобы текстовый виджет с баннером распогалался только на главной странице, а для остальных нужно использовать другой баннер.
text_block_widget баннер is_type('home') text_block_widget баннер_на_вторых !is_type('home') text_block_widget счетчики
То есть мы прямо в сайдбаре прописываем условия отображения виджета. Сами условия оформляются как это принято в PHP, со всеми скобками, AND, OR и т.п.
Если например нужно вывести виджет только на определенной странице, например about, то можно использовать такое условие:
text_block_widget баннер is_type_slug('page', 'about')
Для отображения на страницах определенной рубрики, можно использовать такое условие:
text_block_widget баннер is_page_cat('news')
Кроме того здесь доступны уже привычная mso_segment(), а также можно указывать условия с использованием глобальной переменной $page, которая является массивом, содержащим всю информацию о текущей странице (тип page).
Таким образом, в MaxSite CMS виджеты в сайдбарах настраиваются очень гибко.
Настройки виджетов
После того, как настроены сайдбары, можно выполнить настройки каждого виджета индивидуально. Тут давать рекомендации бессмысленно, потому что все виджеты разные.
Пожалуй стоит отметить два момента. Первый - многие виджеты многофункциональные. Это позволяет не плодить их под каждый «чих», а использовать единое универсальное рашение.
Второй момент - все виджеты сохраняются одновременно. Это просто удобно и не нужно переключаться с одного на другой и между сайдбарами.
Заготовка для виджетов
В каталоге плагинов вы найдете файл template for widgets.php, который представляет собой уже готовый плагин с виджетом. Выполните нужные замены и у вас будет сразу же рабочий виджет. Как пользоваться этими заготовками вы уже знаете из предыдущих статей.
Регистрация виджета
При автозагрузке плагина нужно зарегистрировать одну из функций как виджет. Делается это с помощью функции mso_register_widget(). В ней мы указываем функцию, которая выводит содержимое виджета; и название виджета.
Теперь, когда система будет выводить сайдбары, то будет произведен поиск функции виджета и её выполнение.
Обычно, функция виджета может использоваться где-то еще, например в ушке. По этой причине я предпочитаю выделять «базовую» функцию виджета отдельно в виде «виджет_widget_custom» таким образом, чтобы эта функция могла работать с произвольными входящими параметрами, а не только теми, которые задаются в настройках виджета.
Удаление виджета
При деинсталяции плагина есть смысл удалять и все опции виджета. Тут особенностью является то, что у виджета может быть множество разных опций под разными именами. У нас ведь виджетов одного плагина может быть сколько угодно, поэтому на этапе создания виджета, мы не знает какие именно опции будут использоваться на сайте.
Поэтому мы можем задать некую маску для удаления. Скажем все опции виджета будут начинаться с «виджет_widget_», значит и удалять мы будем все опции, начинающиеся с этой фразы. Например для плагина/виджета demo это будет так:
mso_delete_option_mask('demo_widget_', 'plugins');
Вывод виджета
Как я уже сказал за вывод отвечает функция «виджет_widget». Обычно в ней нужно получить опции виджета и дальше передать их в «виджет_widget_custom», в которой и сделать непосредственно вывод.
Работа с опциями в виджетах ничем не отличается от других случаев. Используется стандартная mso_get_option(). Если в виджете происходит обращение к базе данных или функция ресурсозтратная, то желательно сделать её кэширование.
Форма виджета
Каждый виджет может иметь множество опций. Технически это делается через обычную html-форму. То есть когда вы настраиваете виджет, то для него выводится своя индивидуальная форма.
Сама форма (точнее только поля формы!) оформляется в виде функции вида «виджет_widget_form». В ней выполняется два действия.
Первое - получаются текущие опции виджета. Второе - генерация самой формы.
Строго говоря, поля формы могут быть полностью произвольными, но обычно все делается по несложному шаблону. Для этого используется CodeIgniter в виде хелпера form, а html-разметка задается на обычных div'ах с предопределенными css-классами.
Обработка формы
Когда в админ-панели обновляются настройки виджетов, MaxSite CMS автоматически определяет обработчик для каждого виджета. Для этого используется предопределенное именование функции: «виджет_widget_update». Если такая функция существует, то она выполняется.
В этой функции нужно вначале получить текущие опции, после этого с помощью специальной функции mso_widget_get_post() новые значения и если новые опции не равны старым,- обновить их.
Общая схема работы виджета
Теперь кратко обрисую общую схему работы любого виджета.
- Регистрируем виджет в виджет_autoload() с помощью mso_register_widget().
- Вывод виджета осуществляется в виде зарегистрированной функции виджет_widget().
- Для удаления опций виджета используется mso_delete_option_mask().
- Форма для настроек виджета задается в функции виджет_widget_form().
- Обработчик формы задается в функции виджет_widget_update.
Регистрация сайдбаров
Поскольку виджеты выводятся в сайдбарах, то нам достаточно лишь прописать вызов функций сайдбаров в нужном месте шаблона. Для этого используется функция mso_show_sidebar().
Но сайдбары должны быть известны не только шаблону, но и админ-панели, потому что могут быть уникальными и быть в разном количестве. Для этих целей используется шаблонный functions.php. Особенностью этого файла является то, что он подключается всегда при инициализации системы. Тами образом, если есть какие-то функции, которые должны быть известны на уровне админ-панели, то их нужно указать в этом файле.
В нашем случае мы выполняем регистрацию сайдбаров:
mso_register_sidebar('1', 'Первый сайдбар'); mso_register_sidebar('2', 'Второй сайдбар');
Вот теперь в админ-панели появятся указанные сайдбары.
Оформление виджетов на сайте
Как правило на сайтах все виджеты оформляются в едином стиле. Для них используется единый html-каркас со своей css-разметкой. Но что делать, если нужно оформить каждый виджет индивидуально?
Для этих целей в функции mso_show_sidebar() можно указать два параметра, которые отвечают за html-код до вывода виджета и после. Но это еще не все. В этих текстах можно использовать спецзамены:
- [SB] - меняется на номер сайдбара
- [NUMW] - меняется на номер/название виджета
- [FN] - меняется на функцию виджета
- [NUMF] - меняется на номер функции виджета
Если мы зададим в сайдбарах:
$do = '<div class="widget widget_[SB]_[NUMW] [FN] [FN]_[NUMF]">'; $posle = '</div>'; mso_show_sidebar('1', $do, $posle );
Для виджета «login_form» (первый в первом сайдбаре) получим:
<div class="widget widget_1_1 login_form_widget login_form_widget_0"> ... </div>
Я уже раньше приводил этот код, но думаю, лишним он здесь не будет.
Таким образом вебмастеру останется только задать стили для нужного виджета.
В заключении отмечу, что сайдбар обычно используется только как боковые панели на сайтах, хотя нет никаких сложностей использовать их и для любых произвольных блоков. Например на этом сайте на главной вывод записей из моего twitter'а осуществляется именно через виджет. Для этого я разместил еще один сайдбар вверху страниц и теперь, при необходимости можно выполнить настройки прямо через админ-панель.
Комментариев: 5 RSS
1Jack06-03-2010 19:39
Никак не получается отобразить виджет ссылок только на странице гостевой книги.
Конструкция links_widget отзывы is_type('guestbook') не работает.
2Аноним06-03-2010 19:46
Потому что такого типа нет. Попробуйте использовать mso_segment():
3Женя07-08-2010 09:01
не сохраняются настройки виджетов для сапы.
То есть ставлю например три виджета - в верхнем блоке, первом и втром сайдбаре. Затем в настройке виджетов при нажатии на sape.ru любого блока, открываются только настройки блока из верхнего сайдбара. И даже там, введя количество ссылок и название виджета, нажав "сохранить" написано, что изменения сохранены, но при нажатии на sape.ru опять открываются настройки только для виджета первого сайдбара и в нем НЕТ НИКАКИХ ИЗМЕНЕНИЙ. То есть заголовок отсутствует, количество ссылок - 0.
4Аноним07-08-2010 10:31
А прочитать текст инструкции в сайдбарах слабо?
5Аноним18-10-2012 19:54
а как получить и вывести заголовок виджета? только самому в шаблоне прописывать?