Користувальницькькі налаштування

Налаштування сайту


Сайдбар

Розділи

Загальний опис
Історія змін
Рекомендації до оновлення
Плани на майбутнє
Відомі проблеми
Онлайн демо
Допомога проекту
Люди
Трохи про безпеку

FAQ



Редагувати сайдбар

taskbarwidgets

Це стара версія документу!


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

Поддержка виджетов для панели задач, была добавлена еще в релизе 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_TBDRAG=1
; Крестики-нолики, а вы чего ожидали?
WIDGET_TICTACTOE=1
; Может кому-то очень хочется постоянно мониторить суммарный трафик, утилизированный его пользователями?
WIDGET_TRAFFIC=1
; Конвертер валют.
WIDGET_CURRENCY=1
; С шансом 10% орет про meabeab-а в поисках BONK-a!
; https://www.youtube.com/watch?v=m0i8IBZklZg
WIDGET_MEABEAB=1
taskbarwidgets.1664019551.txt.gz · Востаннє змінено: 2022/09/24 14:39 повз 127.0.0.1