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

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


taskbarwidgets

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Остання ревізія По сторонах наступні версії
taskbarwidgets [2020/03/10 17:28]
taskbarwidgets [2022/09/24 14:39]
127.0.0.1 зовнішнє редагування
Рядок 1: Рядок 1:
 +====== Виджеты панели задач ======
  
 +Поддержка виджетов для панели задач, была добавлена еще в релизе Ubilling 0.8.0, но как могло показаться, сделана она была настолько странным и непостижимым образом, что люди пытавшиеся их писать становились другими. Поэтому считается, что поддержки виджетов нет. А на самом деле есть, и она довольно простая и удобная если разобраться.
 +
 +====== Зачем? ======
 +А чего вообще может делать виджет? Да в общем то все, что и [[development|любой другой модуль системы]]. Вплоть до полной модификации внешнего вида и поведения самой панели задач на лету(см. WIDGET_TBBLUR или скажем WIDGET_PSYCHO). Но в норме, это рассчитано, на отображение какой-то полезной статистики. Нет, мы не считаем версию PHP, модель процессора или версию Apache "полезной" в том контексте, что она должна постоянно висеть перед на панели задач и требовать постоянного мониторинга. Ага, кто-то за ночь подменил CPU и перекомпилил PHP - преступление раскрыто. Но если вам так спичит - то да, все делается в несколько строчек без проблем.
 +
 +====== Из чего состоит? ======
 +Неожиданно, но виджет начинается с элемента таскбара, с соответствующим типом. Посмотрим на примере самого простого семплового виджета из **config/modules.d/widgets/sample.ini** просто выводящего какую-то строку. 
 +<file ini sample.ini>
 +ID="widget_sample"
 +CODEFILE="widget_sample.php"
 +NEED_RIGHT=""
 +NEED_OPTION="WIDGET_SAMPLE"
 +UNIMPORTANT=1
 +TYPE="widget"
 +</file>
 +
 +Смотря на это все, не сложно заметить, что идентификатором виджета, является widget_sample, код виджета должен быть размещен в widget_sample.php, для своей работы он не требует никаких дополнительных прав и требует необязательную (UNIMPORTANT) опцию WIDGET_SAMPLE=1 для своего включения. Ну и самое главное, имеет TYPE не icon а widget, что должно сигнализировать панели задач, что тут стоит чего-то выполнять. Да, описание элемента таскбара, может лежать в какой угодно категории **modules.d** - ему без разницы. Просто widgets находиться по-умолчанию "сверху". Исключением является сам файл кода описанный в CODEFILE - он таки должен находиться в **config/taskbar.d/widgets/**.\\
 +А как же спросите вы, система узнает, что из этого самого widget_sample.php нужно выполнять? А очень просто, давайте заглянем в него:
 +
 +<file php widget_sample.php>
 +<?php
 +
 +class widget_sample extends TaskbarWidget {
 +
 +    public function render() {
 +        $result = __('Sample text');
 +        return ($result);
 +    }
 +
 +}
 +
 +?>
 +</file>
 +
 +Из чего заключаем, что базовым для всей этой механики, является наследование классом с именем **widget_sample** (да, это то, что описано в опции ID виджета, тоесть его внутренний уникальный идентификатор) некоего класса **TaskbarWidget** и переопределение работы метода **render()**. Да, весь вывод данных виджетом, должен происходить в виде возвращаемого значения от вызова этого самого **render()**. А что если нам хочется, вывести не просто голый текст, а его же, но в стандартной, и как-то красиво оформленной отдельной области? Да без проблем. Для этого стоит перед **return()** метода **render()** пропустить наши данные через уже заботливо приготовленный для вас протектэд метод **widgetContainer()** (да, его переопределять вам в случае надобности тоже никто не запрещает). Как это должно выглядеть в коде, и чего мы получим в результате? А вот что-то такое:
 +<file php widget_sample.php>
 +<?php
 +
 +class widget_sample extends TaskbarWidget {
 +
 +    public function render() {
 +        $result = $this->widgetContainer(__('Sample text'));
 +        return ($result);
 +    }
 +
 +}
 +
 +?>
 +</file>
 +
 +{{:widget0.png?|}}
 +
 +И это все? Да - это все. Больше там никакой другой, крутой магии не происходит. 
 +
 +====== А подробнее? ======
 +Окей, если непонятно, как можно обойтись одним автовызываемым методом **render()**, для решения каких-то практических задач, давайте под шумок напишем еще какой-то виджет, скажем посылающий SMS-ки куда-то там. Заодно и пихнем его в основное дерево кода - вдруг кому-то понадобиться? ;)
 +
 +Итак, как уже было упомянуто выше - виджет начинается с описания элемента таскбара в **config/taskbar.d/widgets/**:
 +
 +<file ini fastsms.ini>
 +ID="widget_fastsms"
 +CODEFILE="widget_fastsms.php"
 +NEED_RIGHT="SENDDOG"
 +NEED_OPTION="WIDGET_FASTSMS"
 +UNIMPORTANT=1
 +TYPE="widget"
 +</file>
 +
 +Давайте проверим, чего теперь у нас на панели задач? Ухты - она нам как-бы намекает, что мы что-то забыли ;)
 +
 +{{:widget1.png?|}}
 +
 +Окей, давайте создадим следующий **config/taskbar.d/widgets/widget_fastsms.php** вот с каким-то таким содержанием:
 +
 +<file 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);
 +    }
 +
 +}
 +
 +?>
 +</file>
 +
 +Как несложно заметить, форма отсылки SMS реагирует на значение опции WIDGET_FASTSMS и может показывать форму как в виде кнопки со всплывающим модальным окном (WIDGET_FASTSMS=1), так и напрямую сразу в таскбаре (WIDGET_FASTSMS=2). Неужели это как-то выглядит, и еще работает? Неожиданно, но да.
 +
 +{{:widgetfastsms.png?|}}
 +====== Стоковые виджеты ======
 +Вы можете повключать/повыключать какие-то из стоковых виджетов, по-очереди, либо вместе, чтобы понаблюдать как они работают.
 +
 +<file ini 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
 +</file>
taskbarwidgets.txt · Востаннє змінено: 2023/06/16 18:35 повз skybetik