Виджеты панели задач

Поддержка виджетов для панели задач, была добавлена еще в релизе Ubilling 0.8.0, но как могло показаться, сделана она была настолько странным и непостижимым образом, что люди пытавшиеся их писать становились другими. Поэтому считается, что поддержки виджетов нет. А на самом деле есть, и она довольно простая и удобная если разобраться.

Зачем?

А чего вообще может делать виджет? Да в общем то все, что и любой другой модуль системы. Вплоть до полной модификации внешнего вида и поведения самой панели задач на лету(см. WIDGET_TBBLUR или скажем WIDGET_PSYCHO). Но в норме, это рассчитано, на отображение какой-то полезной статистики. Нет, мы не считаем версию PHP, модель процессора или версию Apache «полезной» в том контексте, что она должна постоянно висеть перед на панели задач и требовать постоянного мониторинга. Ага, кто-то за ночь подменил CPU и перекомпилил PHP - преступление раскрыто. Но если вам так спичит - то да, все делается в несколько строчек без проблем.

Из чего состоит?

Неожиданно, но виджет начинается с элемента таскбара, с соответствующим типом. Посмотрим на примере самого простого семплового виджета из config/modules.d/widgets/sample.ini просто выводящего какую-то строку.

sample.ini
ID="widget_sample"
CODEFILE="widget_sample.php"
NEED_RIGHT=""
NEED_OPTION="WIDGET_SAMPLE"
UNIMPORTANT=1
TYPE="widget"

Смотря на это все, не сложно заметить, что идентификатором виджета, является widget_sample, код виджета должен быть размещен в widget_sample.php, для своей работы он не требует никаких дополнительных прав и требует необязательную (UNIMPORTANT) опцию WIDGET_SAMPLE=1 для своего включения. Ну и самое главное, имеет TYPE не icon а widget, что должно сигнализировать панели задач, что тут стоит чего-то выполнять. Да, описание элемента таскбара, может лежать в какой угодно категории modules.d - ему без разницы. Просто widgets находиться по-умолчанию «сверху». Исключением является сам файл кода описанный в CODEFILE - он таки должен находиться в config/taskbar.d/widgets/.
А как же спросите вы, система узнает, что из этого самого widget_sample.php нужно выполнять? А очень просто, давайте заглянем в него:

widget_sample.php
<?php
 
class widget_sample extends TaskbarWidget {
 
    public function render() {
        $result = __('Sample text');
        return ($result);
    }
 
}
 
?>

Из чего заключаем, что базовым для всей этой механики, является наследование классом с именем widget_sample (да, это то, что описано в опции ID виджета, тоесть его внутренний уникальный идентификатор) некоего класса TaskbarWidget и переопределение работы метода render(). Да, весь вывод данных виджетом, должен происходить в виде возвращаемого значения от вызова этого самого render(). А что если нам хочется, вывести не просто голый текст, а его же, но в стандартной, и как-то красиво оформленной отдельной области? Да без проблем. Для этого стоит перед return() метода render() пропустить наши данные через уже заботливо приготовленный для вас протектэд метод widgetContainer() (да, его переопределять вам в случае надобности тоже никто не запрещает). Как это должно выглядеть в коде, и чего мы получим в результате? А вот что-то такое:

widget_sample.php
<?php
 
class widget_sample extends TaskbarWidget {
 
    public function render() {
        $result = $this->widgetContainer(__('Sample text'));
        return ($result);
    }
 
}
 
?>

И это все? Да - это все. Больше там никакой другой, крутой магии не происходит.

А подробнее?

Окей, если непонятно, как можно обойтись одним автовызываемым методом render(), для решения каких-то практических задач, давайте под шумок напишем еще какой-то виджет, скажем посылающий SMS-ки куда-то там. Заодно и пихнем его в основное дерево кода - вдруг кому-то понадобиться? ;)

Итак, как уже было упомянуто выше - виджет начинается с описания элемента таскбара в config/taskbar.d/widgets/:

fastsms.ini
ID="widget_fastsms"
CODEFILE="widget_fastsms.php"
NEED_RIGHT="SENDDOG"
NEED_OPTION="WIDGET_FASTSMS"
UNIMPORTANT=1
TYPE="widget"

Давайте проверим, чего теперь у нас на панели задач? Ухты - она нам как-бы намекает, что мы что-то забыли ;)

Окей, давайте создадим следующий config/taskbar.d/widgets/widget_fastsms.php вот с каким-то таким содержанием:

widget_fastsms.php
<?php
 
class widget_fastsms extends TaskbarWidget {
 
    /**
     * Contains system alter config as key=>value
     *
     * @var array
     */
    protected $altCfg = array();
 
    /**
     * UbillingSMS object placeholder
     *
     * @var object
     */
    protected $sms = '';
 
    const TASKBAR_URL = '?module=taskbar';
 
    /**
     * Creates new widget_fastsms instance
     * 
     * @return void
     */
    public function __construct() {
        $this->loadAlter();
        $this->initSMS();
    }
 
    /**
     * Loads system alter config into protected prop for further usage
     * 
     * @global object $ubillingConfig
     * 
     * @return void
     */
    protected function loadAlter() {
        global $ubillingConfig;
        $this->altCfg = $ubillingConfig->getAlter();
    }
 
    /**
     * Initalizes system SMS sending abstraction layer
     * 
     * @return void
     */
    protected function initSMS() {
        $this->sms = new UbillingSMS();
    }
 
    /**
     * Returns SMS sending form
     * 
     * @return string
     */
    protected function smsSendForm() {
        $result = '';
        $inputs = wf_TextInput('fastsmsnumber', __('Mobile'), '', true, '20');
        $inputs.= wf_TextArea('fastsmsmessage', '', '', true, '30x5');
        $inputs.= wf_CheckInput('fastsmstranslit', __('Forced transliteration'), true, true);
        $inputs.= wf_Submit(__('Create'));
        $form = wf_Form('', 'POST', $inputs, 'glamour');
 
        //displaying sending form as button or inline taskbar form
        if ($this->altCfg['WIDGET_FASTSMS'] == 1) {
            $result = wf_modalAuto(wf_img('skins/icon_mobile.gif', __('Create new SMS')) . ' ' . __('Send SMS'), __('Create new SMS'), $form, 'ubButton');
        }
 
        if ($this->altCfg['WIDGET_FASTSMS'] == 2) {
            $result = $form;
        }
 
        return ($result);
    }
 
    /**
     * Catches form sending request and performs SMS queue storing
     * 
     * @return void
     */
    protected function catchSMSSending() {
        if (wf_CheckPost(array('fastsmsnumber', 'fastsmsmessage'))) {
            $translitFlag = (wf_CheckPost(array('fastsmstranslit'))) ? true : false;
            $this->sms->sendSMS($_POST['fastsmsnumber'], $_POST['fastsmsmessage'], $translitFlag, 'WIDGET_FASTSMS');
            //preventing sms resending on page refresh
            rcms_redirect(self::TASKBAR_URL);
        }
    }
 
    /**
     * Runs and renders widget code
     * 
     * @return string
     */
    public function render() {
        $result = '';
        if ($this->altCfg['SENDDOG_ENABLED']) {
            //performs sms sending if required
            $this->catchSMSSending();
            //rendering sending form
            $result.=$this->widgetContainer($this->smsSendForm());
        } else {
            $messages = new UbillingMessageHelper();
            $result = $messages->getStyledMessage(__('SendDog') . ' ' . __('Disabled') . ' :(', 'error');
        }
        return ($result);
    }
 
}
 
?>

Как несложно заметить, форма отсылки SMS реагирует на значение опции WIDGET_FASTSMS и может показывать форму как в виде кнопки со всплывающим модальным окном (WIDGET_FASTSMS=1), так и напрямую сразу в таскбаре (WIDGET_FASTSMS=2). Неужели это как-то выглядит, и еще работает? Неожиданно, но да.

Стоковые виджеты

Вы можете повключать/повыключать какие-то из стоковых виджетов, по-очереди, либо вместе, чтобы понаблюдать как они работают.

alter.ini
;Показывает текущий аптайм системы
WIDGET_UPTIME=1
;Виджет быстрой посылки SMS, мы его там чуть выше на ходу писали. Что уже забыли?
WIDGET_FASTSMS=1
;Показывает графичек по финансовому отчету, за последний месяц
WIDGET_FINANCE=1
;Радует ваш персонал, на уровне "мама, когда меня отпустит?"
WIDGET_PSYCHO=1
;Собствено описанный выше семпловый виджет, просто выводящий строку.
WIDGET_SAMPLE=1
;Делает иконкам панели задач, эффект "зрение портиться".
WIDGET_TBBLUR=1
;Стильно черно-белит иконки панели задач.
WIDGET_TBBW=1
;Крестики-нолики, а вы чего ожидали?
WIDGET_TICTACTOE=1
;Может кому-то очень хочется постоянно мониторить суммарный трафик, утилизированный его пользователями?
WIDGET_TRAFFIC=1
;Конвертер валют.
WIDGET_CURRENCY=1
taskbarwidgets.txt · Последние изменения: 2017/10/19 18:56 — nightfly
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki