Работа с виджетами.
В данной заметке речь пойдет о рабте с виджетами в vB4. Классический способ размещения виджета при помощи системы лайоутов(layout) думаю в особых комментариях не нуждается. Впрочем, стоит отметить, что он работает только для CMS (по крайней мере я шире функционала не нашел). Т.е. если вы захотите разместить на форуме сайдбар, а в нем ленту публикаций из CMS, то "такой номер не пройдет".
Виджеты довольно функциональные сущности системы, посему хорошая идея с ними "дружить"(читай использовать)
Прежде всего небольшой ликбез:
Важно понимать, что виджеты в vB представлены паттерном, который называется
синглтон.
Для нас это означает, что мы не можем самостоятельно создать экземпляр класса требуемого виджета при помощи директивы new.
В теории это звучит следующим образом:
Мы должны обратится к некоторому статичному методу абстрактного класса vBCms_Widget и "попросить" его собрать для нас коллекцию, передав в качестве аргументов id виджетов.
Ну, довольно слов. К коду!
Сперва идем в админку и создаем виджет:
vBulletin CMS -> Виджеты -> Создать новый виджет
Выбираем тип виджета, даем ему имя/описание
После сохранения нажимаем на ссылку "настрйка". В зависимости от выбранного типа виджета настройки откроются разного объема, но одно поле уних будет общим - "Название шаблона"
Здесь указывается имя шаблона в который будут направлены данные. Если вы хотите кастомизировать верстку виджета, то лучше создать свой шаблон на основе указаннго по умолчанию.
Теперь перейдем к файлу или модулю в котором будем собирать виджет
Нам понадобится несколько файлов:
PHP Code:
include_once './packages/vbcms/widget.php'; //класс vBCms_Widget
include_once './packages/vbcms/widget/recentblog.php'; //класс(ы) требуемых виджетов. Я выбрал recentblog - последние сообщения блогов/дневников
Далее собираем виджет:
PHP Code:
$i_widget = 11;//или array(1,2,4);
$o_widgets = vBCms_Widget::getWidgetCollection($i_widget);
$a_widgets = vBCms_Widget::getWidgetControllers($o_widgets, true);
Первым и единственным обязательным аргументом метода getWidgetCollection является id виджета, который мы "собираем". Также, аргумент может быть массивом:
PHP Code:
vBCms_Widget::getWidgetCollection(array(1,2,3));
Как узнать id виджета?! Более "умного" способа, чем посмотреть в БД(таблица _cms_widget), я не нашел...
Результат передаем в контриоллер, где происходит рендеринг данных.
Далее магия!(мне не до конца ясно, как работать со следующим методом)
PHP Code:
// Ресурсовый комментарий к этой строке гласит: Register the templater to be used for XHTML
// Ясно, что строка настраивает шаблонизатор на XHTML вывод
vB_View::registerTemplater(vB_View::OT_XHTML, new vB_Templater_vB());
Здесь нужно запомнить, что без этого участка кода html-вывода не будет.
Собственно, мы почти у цели - осталось вывести данные, которые уже собраны для нас в $a_widgets
Если вы запрашивали один виджет, то вам сюда:
PHP Code:
$s_widget = $a_widget[$i_widget]->getPageView();
Если запрашивали коллекцию:
PHP Code:
$a_widget_result = array();
foreach($a_widgets AS $widget)
{
$a_widget_result[] = $widget->getPageView();
}
$s_widget = implode("\n", $widget_result);
Переменная $s_widget будет содержать html-код виджета. Отправляем ее в
рендер шаблона...
Общий выход кода:
PHP Code:
include './packages/vbcms/widget.php';
include './packages/vbcms/widget/recentblog.php';
$i_widget = array(1,2);
$o_widgets = vBCms_Widget::getWidgetCollection($i_widget);
$a_widget = vBCms_Widget::getWidgetControllers($o_widgets, true);
vB_View::registerTemplater(vB_View::OT_XHTML, new vB_Templater_vB());
$a_widget_result = array();
foreach($a_widget as $widget){
$a_widget_result[] = $widget->getPageView();
}
//или
//$a_widget_result[] = $a_widget[$i_widget]->getPageView();
$s_widget = implode("\n", $a_widget_result);