1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

BD widget framework - как добавлять что-то в сайдбар

Тема в разделе "Статьи по XenForo Framework", создана пользователем akinak, 08.01.2014.

Загрузка
  1. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    http://xenforo.com/community/resources/bd-widget-framework.297/ - самый популярный и один из первых аддонов на оффе.
    Это дополнение позволяет управлять виджетами, то есть небольшими блоками в сайдбаре, где выводится какая-либо информация. Ну и поэтому если вы разработчик и вам нужно что-то вывести в сайдбаре, то правилом хорошего тона на сегодня будет использование bd widget framework. На самом деле, разработчику это не нужно, вывести в сайдбар просто и так, но зато администратору форума в дальнейшем будет проще контролировать блоки.

    Я никогда не использовал это дополнение и вот решил разобраться и рассказать. В качестве примера возьмем запрос с оффа на мониторинг игровых серверов. На самом деле есть библиотека gameQ, которая позволяет уже лет 10 осуществлять мониторинг серверов, поэтому все что требуется - связать эту библиотеку и виджет для ксена.

    Для начала необходимо создать дополнение.
    Включаем отладочный режим, идем сюда: /admin.php?add-ons/add
    и создаем

    add-addon.jpg
    Наше дополнение очень маленькое и инсталлер не нужен, поэтому оставим поля пустыми.

    Теперь нужно создать файловую структуру нашего дополнения. Тут нет единого соглашения в плане какой она должна быть. Создадим папку аддона и в ней 1 файл - Listen.php
    Содержимое файла пока такое:
    PHP:
    <?php

        
    /**
         * Listen for code events
         */
    class Akinak_GameMonitor_Listen
    {
    //Этот обработчик будет срабатывать при загрузке фреймворка виджетов
    //Пока метод ничего не делает
        
    public static function widget_framework_ready(array &$renderers)
        {
           
    $renderers[] = 'Akinak_GameMonitor_WidgetFramework_GameMonitor';
        }
    }
    Структура такая - \library\Akinak\GameMonitor\Listen.php
    Как вы знаете, имя класса должно совпадать с путем к файлу.

    Теперь нам нужно создать класс для виджета.
    Создадим папку WidgetFramework а в ней файл с таким содержимым:
    PHP:
    <?php
    class Akinak_GameMonitor_WidgetFramework_GameMonitor extends WidgetFramework_WidgetRenderer {
    //Пока класс пустой    
    }
    Теперь нам нужно создать обработчик событий.
    /admin.php?code-event-listeners/add - вот здесь.

    add-listen.jpg


    Выбираем событие widget_framework_ready и указываем имя класса и название метода, которые мы предварительно создали. В описании можно что-то написать, ну и необходимо выбрать наше дополнение чтобы связать дополнение и обработчик событий.

    Теперь нам нужно наполнить наш класс Akinak_WidgetFramework_GameMonitor
    Мы наследуем абстрактный класс WidgetFramework_WidgetRenderer и чтобы он начал работать, необходимо объявить 4 обязательных метода.
    Сразу же подключим gameQ, который предварительно был закачан в корень форума.

    PHP:
    <?php
    require_once '/gameq/GameQ.php';
    class 
    Akinak_GameMonitor_WidgetFramework_GameMonitor extends WidgetFramework_WidgetRenderer {
        
    /**
        * @return array
        */
        
    protected function _getConfiguration() {
          return array(
            
    //имя как оно отображается при редактировании виджета
            
    'name' => 'Game Server Monitor',
            );
        }
        
    /**
        * @return bool
        */
        
    protected function _getOptionsTemplate()
        {
          return 
    false//тут можно указать имя шаблона, который будет выводитяс в админке при добавлении виджета
        
    }
        
    /**
        * @param array  $widget
        * @param string $templateName
        * @param array  $params
        * @return string
        */
        
    protected function _getRenderTemplate(array $widget$templateName, array $params) {
          return 
    'gamemonitor_widget'//указываем имя шаблона, который будет выводится
        
    }
        
    /**
        * @param array  $widget
        * @param string  $templateName
        * @param array  $params
        * @param XenForo_Template_Abstract $renderTemplateObject
        * @return string
        */
        
    protected function _render(array $widget$templateName, array $paramsXenForo_Template_Abstract $renderTemplateObject)
        {
          
    $gameQ = new GameQ;
          
    $servers = array();
          
    //для дополнения надо бы вынести список серверов в настройки в удобном виде
          //но для наших учебных целей и так подойдет
          
    $servers['quakeserver'] = array('quake3''q3.playground.ru''27967');
          
    $gameQ->addServers($servers);
          
    $data $gameQ->requestData();
          
    $renderTemplateObject->setParam('servers'$data);  //передаем в шаблон переменную
          
    return $renderTemplateObject->render(); // возвращаем шаблон
        
    }
    }
    И теперь осталось создать шаблон, который будет выводится.
    Я назвал его gamemonitor_widget
    admin.php?templates/add&style_id=0 - идем сюда
    Создаем шаблон.
    add-template.jpg
    С шаблоном думаю все понятно - у нас есть переменная $servers в которой содержится полученная информация от серверов. Необходимо оформить красиво вывод информации, но это уже к дизайнерам/верстальшикам :)


    Теперь нужно создать виджет и посмотреть, что получилось.
    /admin.php?widgets/1/edit - редактируем виджет
    add-widget.jpg

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

    result.jpg

    Данные выводятся, виджет работает, все классно.
    А если добавить опции для серверов, которые надо отображать, верстку шаблона в сайдбаре и отображение расширенной инфы конкретного сервера по клику, то получится рабочее дополнение.

    Надеюсь, данная статья поможет кому-то с таким замечательным движком, как ксенфоро.
    Не стесняйтесь задать вопрос, если что-то не понятно и есть желание разобраться.
     
    Marlboro, santamo, resonansER и 3 другим нравится это.
  2. martini

    martini Местный

    Регистрация:
    10.10.10
    Сообщения:
    249
    Симпатии:
    28
    Мне практически ничего не понятно, но есть желание разобраться :)

    Установил фреймворк.

    Хочу к примеру добавить виджет, который будет выводить данные из внешней рсс-ленты.
     
  3. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Там тогда все так же, только вместо GameQ надо использовать xml парсер и curl
     
  4. martini

    martini Местный

    Регистрация:
    10.10.10
    Сообщения:
    249
    Симпатии:
    28
    Оказалось все гораздо проще. Там в наборе "из коробки" идет виджет Feed Reader , просто в него вписываешь урл рсс-канала и он выводит тебе ленту заголовков.

    НО!

    Все так и сделал, а виджета в колонке тупо нет! Позиции прописал как во всех остальных виджетах, все настроил, а виджет отсутствует полностью, даже название не выводится, не говоря уже о новостях.

    Кто-то пробовал этот виджет юзать? Он вообще рабочий?
     
  5. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Если не выводится даже название, то значит где-то не то в настройках.
    Можно поменять тип рендеринга чтобы проверить.
     
  6. martini

    martini Местный

    Регистрация:
    10.10.10
    Сообщения:
    249
    Симпатии:
    28
    просветите как ето сделать?
     
  7. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
  8. martini

    martini Местный

    Регистрация:
    10.10.10
    Сообщения:
    249
    Симпатии:
    28
    Извините, я наверное сильно туплю, но не могу найти в админке страницу, которая у вас на скриншоте. Дебаг включен. Где это искать?
    --- добавлено : 12 дек 2014 в 00:00 ---
    Точно туплю, это же в настройках виджета :) Ну в общем я другие виджеты вывел без проблем, не могу вывести именно этот Feed Reader...
     
    Последнее редактирование модератором: 19.12.2014
  9. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Проверил у себя.
    Если указать forum_list позицию, то отображается.
    Если all то нет. Интересная фича.
     
  10. martini

    martini Местный

    Регистрация:
    10.10.10
    Сообщения:
    249
    Симпатии:
    28
    Отображается лента новостей? Хотелось бы посмотреть. Можно ссылку сюда или в личку
     
  11. Hotel_la22

    Hotel_la22 Новичок

    Регистрация:
    21.10.15
    Сообщения:
    1
    Симпатии:
    0
    Версия XF:
    1.4.10
    Я не совсем понял. Если у меня есть php скрипт с кучей функций. И они возвращаются в виде status(); например. Можно ли убрать return($server) и как нибудь все это заменить?
     
  12. Marlboro

    Marlboro Местный

    Регистрация:
    20.11.17
    Сообщения:
    1
    Симпатии:
    0
    Версия XF:
    1.5.10
    немного дополню
    сюда еще можно добавить опции например как у меня

    PHP:
    <?php
    class XfAddOns_Blogs_Widget_NewInBlogs extends WidgetFramework_WidgetRenderer
    {

       protected function 
    _getConfiguration() {
          return array(
             
    'name' => '[Better Blogs] NewInBlogs',
             
    'options' => array(
                
    'limit' => XenForo_Input::UINT,
                
    'order' => XenForo_Input::STRING,
                
    'direction' => XenForo_Input::STRING,
                
    'includeSnippet' => XenForo_Input::UINT,
             ),
             
    'useCache' => false,
             
    'cacheSeconds' => XenForo_Application::getOptions()->xfa_blogs_cacheTime 3660 // cache for an hour
          
    );
       }

    protected function 
    _getOptionsTemplate() {
    //тут можно указать имя шаблона, который будет выводитяс в админке при добавлении виджета
       
    return 'xfa_blogs_wf_widget_options_new_in_blog';

    }
    теперь тут создаем шаблон для виджета /admin.php?admin-templates/

    пример моего шаблона:
    Код:
    <xen:textboxunit label="{xen:phrase xfa_blogs_wf_limit}:" name="{$namePrefix}limit" value="{$options.limit}">
       <xen:explain>{xen:phrase xfa_blogs_wf_limit_explain}</xen:explain>
    </xen:textboxunit>
    <xen:selectunit label="{xen:phrase xfa_blogs_wf_order_by}:" name="{$namePrefix}order" value="{$options.order}">
       <xen:option value="post_date">{xen:phrase xfa_blogs_wf_post_date}</xen:option>
       <xen:option value="reply_count">{xen:phrase xfa_blogs_wf_comments}</xen:option>   
       <xen:option value="view_count">{xen:phrase xfa_blogs_wf_views}</xen:option>       
       <xen:option value="likes">{xen:phrase xfa_blogs_wf_likes}</xen:option>   
    </xen:selectunit>
    <xen:selectunit label="{xen:phrase xfa_blogs_wf_order_direction}:" name="{$namePrefix}direction" value="{$options.direction}">
       <xen:option value="DESC">{xen:phrase xfa_blogs_wf_descending}</xen:option>
       <xen:option value="ASC">{xen:phrase xfa_blogs_wf_ascending}</xen:option>
    </xen:selectunit>
    <xen:checkboxunit label="" value="">
       <xen:option name="{$namePrefix}includeSnippet" value="1" selected="{$options.includeSnippet}">{xen:phrase xfa_blogs_wf_snippet}</xen:option>
    </xen:checkboxunit>
    вот что получилось при создании Виджета.

    2017-11-20_1727.png
     

Поделиться этой страницей