====== Віджети панелі завдань ======
Підтримка віджетів для панелі завдань, була додана ще в релізі Ubilling 0.8.0, але як могло здатися, зроблена вона була настільки дивним і незбагненним чином, що люди, які намагалися їх писати, ставали іншими. Тому вважається, що підтримки віджетів немає. А насправді є, і вона досить проста і зручна, якщо розібратися.
====== Навіщо? ======
А чого взагалі може робити віджет? Та загалом усе, що й [[development|будь-який інший модуль системи]]. Аж до повної модифікації зовнішнього вигляду і поведінки самої панелі завдань на льоту (див. WIDGET_TBBLUR або скажімо WIDGET_PSYCHO). Але в нормі, це розраховано на відображення якоїсь корисної статистики. Ні, ми не вважаємо версію PHP, модель процесора або версію Apache "корисною" в тому контексті, що вона повинна постійно висіти перед на панелі завдань і вимагати постійного моніторингу. Ага, хтось за ніч підмінив CPU і перекомпілював PHP - злочин розкрито. Але якщо вам так спичить - то так, все робиться в кілька рядків без проблем.
====== З чого складається? ======
Несподівано, але віджет починається з елемента таскбара, з відповідним типом. Подивимося на прикладі найпростішого семплового віджета з **config/modules.d/widgets/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** (так, це те, що описано в опції ID віджету, тобто його внутрішній унікальний ідентифікатор) якогось класу **TaskbarWidget** і перевизначення роботи методу **render()**. Так, усе виведення даних віджетом має відбуватися у вигляді значення, що повертається від виклику цього самого **render()**. А що якщо нам хочеться вивести не просто голий текст, а його ж, але в стандартній, і якось красиво оформленій окремій області? Та без проблем. Для цього варто перед **return()** методу **render()** пропустити наші дані через уже дбайливо приготований для вас протектед метод **widgetContainer()** (так, його перевизначати вам у разі потреби теж ніхто не забороняє). Який вигляд це має мати в коді, і що ми отримаємо в результаті? А ось щось таке:
widgetContainer(__('Sample text'));
return ($result);
}
}
?>
{{:widget0.png?|}}
І це все? Так - це все. Більше там ніякої іншої, крутої магії не відбувається.
====== А детальніше? ======
Окей, якщо незрозуміло, як можна обійтися одним автовикликуваним методом **render()**, для розв'язання якихось практичних завдань, давайте під шумок напишемо ще якийсь віджет, скажімо такий, що надсилає SMS-ки кудись там. Заодно і пхнемо його в основне дерево коду - раптом комусь знадобитися? ;)
Отже, як уже було згадано вище - віджет починається з опису елемента таскбара в **config/taskbar.d/widgets/**:
ID="widget_fastsms"
CODEFILE="widget_fastsms.php"
NEED_RIGHT="SENDDOG"
NEED_OPTION="WIDGET_FASTSMS"
UNIMPORTANT=1
TYPE="widget"
Давайте перевіримо, чого тепер у нас на панелі завдань? Ухти - вона нам ніби натякає, що ми щось забули ;)
{{:widget1.png?|}}
Окей, давайте створимо наступний **config/taskbar.d/widgets/widget_fastsms.php** ось із якимось таким змістом:
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). Невже це якось виглядає, і ще працює? Несподівано, але так.
{{:widgetfastsms.png?|}}
====== Стокові віджети ======
Ви можете увімкнути/вимкнути якісь зі стокових віджетів, по черзі або разом, щоб поспостерігати, як вони працюють.
; Показує поточний аптайм системи
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