Це стара версія документу!
Виджеты панели задач
Поддержка виджетов для панели задач, была добавлена еще в релизе 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



