Create a widget (tutorial)
Šī ir soli pa solim apmācība, kurā parādīts, kā izveidot vienkāršu paneļa logrīku. Jūs varat lejupielādēt visus šī logrīka failus kā ZIP arhīvu: lesson_gauge_chart.zip.
Ko jūs izveidosiet
Šīs pamācības laikā jūs vispirms izveidosiet pamata "Hello, world!" logrīku un pēc tam pārveidosiet to par modernāku logrīku, kas attēlo vienuma vērtību kā mērinstrumenta diagrammu. Lūk, kā izskatīsies pabeigtais logrīks:

Part I - "Hello, world!"
In this section you will learn how to create the minimum required widget elements and add a new widget to Zabbix frontend.
Pievienot tukšu logrīku Zabbix lietotāja saskarnei
- Izveidojiet direktoriju
lesson_gauge_chartdirektorijāmodulessavā Zabbix lietotāja saskarnes instalācijā (piemēram, zabbix/ui/modules).
Visi pielāgotie logrīki tiek uzskatīti par ārējiem moduļiem, un tie ir jāpievieno Zabbix lietotāja saskarnes instalācijas direktorijam modules (piemēram, zabbix/ui/modules).
Direktorijs zabbix/ui/widgets ir rezervēts Zabbix iebūvētajiem logrīkiem un tiek atjaunināts kopā ar Zabbix UI.
- Izveidojiet failu
manifest.jsonar pamata logrīka metadatiem (skatiet atbalstīto parametru aprakstu).
ui/modules/lesson_gauge_chart/manifest.json
{
"manifest_version": 2.0,
"id": "lesson_gauge_chart",
"type": "widget",
"name": "Gauge chart",
"namespace": "LessonGaugeChart",
"version": "1.1",
"author": "Zabbix"
}
- Zabbix lietotāja saskarnē dodieties uz sadaļu Administration > General > Modules un noklikšķiniet uz pogas Scan directory.

- Sarakstā atrodiet jauno moduli Gauge chart un noklikšķiniet uz hipersaites "Disabled", lai mainītu moduļa statusu no "Disabled" uz "Enabled" (ja modulis nav uzskaitīts, skatiet sadaļu troubleshooting).

- Atveriet paneli, pārslēdziet to rediģēšanas režīmā un pievienojiet jaunu logrīku. Laukā Type atlasiet "Gauge chart".

- Šajā brīdī Gauge chart logrīka konfigurācijā ir tikai kopīgie logrīka lauki Name un Refresh interval. Noklikšķiniet uz Add, lai pievienotu logrīku panelim.

- Panelī jāparādās tukšam logrīkam. Noklikšķiniet uz Save changes augšējā labajā stūrī, lai saglabātu paneli.

Pievienot widget skatu
Widgeta skata failam jāatrodas views direktorijā (šajā pamācībā: ui/modules/lesson_gauge_chart/views/).
Ja failam ir noklusējuma nosaukums widget.view.php, tas nav jāreģistrē manifest.json failā.
Ja failam ir cits nosaukums, norādiet to manifest.json faila sadaļā actions/widget.lesson_gauge_chart.view.
-
Izveidojiet direktoriju
viewsdirektorijālesson_gauge_chart. -
Izveidojiet failu
widget.view.phpdirektorijāviews.
ui/modules/lesson_gauge_chart/views/widget.view.php
<?php
/**
* Gauge chart widget view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetView($data))
->addItem(
new CTag('h1', true, 'Hello, world!')
)
->show();
- Atsvaidziniet informācijas paneli. Tagad Gauge chart widgetā tiek rādīts "Hello, world!".

Part II - Gauge chart
Pievienot iestatījumus konfigurācijas skatam un izmantot tos logrīka skatā
Šajā sadaļā jūs uzzināsiet, kā pievienot logrīka konfigurācijas lauku un parādīt ievadīto vērtību logrīka skatā kā tekstu.
Logrīka konfigurācija sastāv no formas (Zabbix\Widgets\CWidgetForm) un logrīka formas skata (widget.edit.php).
Lai pievienotu laukus (Zabbix\Widgets\CWidgetField), jums ir jāizveido WidgetForm klase, kas paplašinās Zabbix\Widgets\CWidgetForm.
Forma satur dažādu tipu lauku kopu (Zabbix\Widgets\CWidgetField), kas tiek izmantoti lietotāja ievadīto vērtību validēšanai.
Formas lauks (Zabbix\Widgets\CWidgetField) katram ievades elementa tipam pārvērš vērtību vienotā formātā, lai to saglabātu datubāzē.
Logrīka formas failam jāatrodas includes direktorijā (šajā pamācībā: ui/modules/lesson_gauge_chart/includes/).
Ja failam ir noklusējuma nosaukums WidgetForm.php, tas nav jāreģistrē manifest.json failā.
Ja failam ir cits nosaukums, norādiet to manifest.json faila sadaļā widget/form_class.
-
Izveidojiet jaunu direktoriju
includesdirektorijālesson_gauge_chart. -
Izveidojiet failu
WidgetForm.phpdirektorijāincludes.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Zabbix\Widgets\CWidgetForm;
class WidgetForm extends CWidgetForm {
}
- Pievienojiet logrīka konfigurācijas formai lauku Description.
Tas ir parasts teksta lauks, kurā lietotājs var ievadīt jebkuru rakstzīmju kopu.
Tam var izmantot klasi
CWidgetFieldTextBox.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Zabbix\Widgets\CWidgetForm;
use Zabbix\Widgets\Fields\CWidgetFieldTextBox;
class WidgetForm extends CWidgetForm {
public function addFields(): self {
return $this
->addField(
new CWidgetFieldTextBox('description', _('Description'))
);
}
}
- Direktorijā
viewsizveidojiet logrīka konfigurācijas skata failuwidget.edit.phpun pievienojiet skatu jaunajam laukam Description. KlasesCWidgetFieldTextBoxlaukam skats irCWidgetFieldTextBoxView.
ui/modules/lesson_gauge_chart/views/widget.edit.php
<?php
/**
* Gauge chart widget form view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetFormView($data))
->addField(
new CWidgetFieldTextBoxView($data['fields']['description'])
)
->show();
-
Dodieties uz paneli un noklikšķiniet uz zobrata ikonas logrīkā, lai atvērtu logrīka konfigurācijas formu.
-
Logrīka konfigurācijas forma tagad satur jaunu teksta lauku Description. Ievadiet jebkuru vērtību, piemēram, Gauge chart description.

- Noklikšķiniet uz Apply logrīka konfigurācijas formā. Pēc tam augšējā labajā stūrī noklikšķiniet uz Save changes, lai saglabātu paneli. Ņemiet vērā, ka jaunais apraksts nekur nav redzams, un logrīks joprojām rāda "Hello, world!".
Lai jaunais apraksts parādītos logrīkā, lauka Description vērtība ir jāiegūst no datubāzes un jānodod logrīka skatam. Šim nolūkam jums ir jāizveido darbības klase.
-
Izveidojiet jaunu direktoriju
actionsdirektorijālesson_gauge_chart. -
Izveidojiet failu
WidgetView.phpdirektorijāactions. Darbības klaseWidgetViewpaplašinās klasiCControllerDashboardWidgetView.
Logrīka konfigurācijas lauku vērtības tiek glabātas darbības klases īpašībā $fields_values.
ui/modules/lesson_gauge_chart/actions/WidgetView.php
<?php
namespace Modules\LessonGaugeChart\Actions;
use CControllerDashboardWidgetView,
CControllerResponseData;
class WidgetView extends CControllerDashboardWidgetView {
protected function doAction(): void {
$this->setResponse(new CControllerResponseData([
'name' => $this->getInput('name', $this->widget->getName()),
'description' => $this->fields_values['description'],
'user' => [
'debug_mode' => $this->getDebugMode()
]
]));
}
}
- Atveriet
manifest.jsonun reģistrējietWidgetViewkā darbības klasi sadaļāactions/widget.lesson_gauge_chart.view.
ui/modules/lesson_gauge_chart/manifest.json
{
"manifest_version": 2.0,
"id": "lesson_gauge_chart",
"type": "widget",
"name": "Gauge chart",
"namespace": "LessonGaugeChart",
"version": "1.0",
"author": "Zabbix",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
}
}
- Tagad logrīka skatā varat izmantot apraksta lauka vērtību, kas atrodas
$data['description']. Atverietviews/widget.view.phpun aizstājiet statisko tekstu "Hello, world!" ar$data['description'].
ui/modules/lesson_gauge_chart/views/widget.view.php
<?php
/**
* Gauge chart widget view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetView($data))
->addItem(
new CTag('h1', true, $data['description'])
)
->show();
- Atsvaidziniet paneļa lapu. Tagad jums vajadzētu redzēt logrīka apraksta tekstu "Hello, world!" vietā.

Iegūt vienuma vērtību, izmantojot API
Logrīkam ir jāparāda lietotāja izvēlēta vienuma pēdējā vērtība. Lai to izdarītu, konfigurācijā ir jāpievieno iespēja atlasīt vienumus.
Šajā sadaļā jūs uzzināsiet, kā pievienot vienuma atlases lauku logrīka formai un kā pievienot šī lauka vizuālo daļu konfigurācijas skatā. Pēc tam logrīka kontrolleris varēs iegūt vienuma datus un tā vērtību, izmantojot API pieprasījumu. Kad vērtība būs saņemta, to varēs parādīt logrīka skatā.
- Atveriet
includes/WidgetForm.phpun pievienojietCWidgetFieldMultiSelectItemlauku. Tas ļaus konfigurācijas formā atlasīt vienumu.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Zabbix\Widgets\{
CWidgetField,
CWidgetForm
};
use Zabbix\Widgets\Fields\{
CWidgetFieldMultiSelectItem,
CWidgetFieldTextBox
};
/**
* Gauge chart widget form.
*/
class WidgetForm extends CWidgetForm {
public function addFields(): self {
return $this
->addField(
(new CWidgetFieldMultiSelectItem('itemid', _('Item')))
->setFlags(CWidgetField::FLAG_NOT_EMPTY | CWidgetField::FLAG_LABEL_ASTERISK)
->setMultiple(false)
)
->addField(
new CWidgetFieldTextBox('description', _('Description'))
);
}
}
- Atveriet
views/widget.edit.phpun pievienojiet lauka vizuālo komponentu konfigurācijas skatam.
ui/modules/lesson_gauge_chart/views/widget.edit.php
<?php
/**
* Gauge chart widget form view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetFormView($data))
->addField(
new CWidgetFieldMultiSelectItemView($data['fields']['itemid'])
)
->addField(
new CWidgetFieldTextBoxView($data['fields']['description'])
)
->show();
-
Atgriezieties informācijas panelī un noklikšķiniet uz zobrata ikonas logrīkā, lai atvērtu logrīka konfigurācijas formu.
-
Tagad logrīka konfigurācijas formā ir jauns ievades lauks Item. Atlasiet hostu "Zabbix server" un vienumu "Load average (1m avg)".

-
Noklikšķiniet uz Apply logrīka konfigurācijas formā. Pēc tam augšējā labajā stūrī noklikšķiniet uz Save changes, lai saglabātu informācijas paneli.
-
Atveriet un modificējiet
actions/WidgetView.php.
Turpmāk vienuma ID būs pieejams logrīka kontrolierī $this->fields_values['itemid'].
Kontrollera doAction() metode iegūst vienuma datus (nosaukumu, vērtības tipu, vienības) ar API metodi item.get un vienuma pēdējo vērtību ar API metodi history.get.
ui/modules/lesson_gauge_chart/actions/WidgetView.php
<?php
namespace Modules\LessonGaugeChart\Actions;
use API,
CControllerDashboardWidgetView,
CControllerResponseData;
class WidgetView extends CControllerDashboardWidgetView {
protected function doAction(): void {
$db_items = API::Item()->get([
'output' => ['itemid', 'value_type', 'name', 'units'],
'itemids' => $this->fields_values['itemid'],
'webitems' => true,
'filter' => [
'value_type' => [ITEM_VALUE_TYPE_UINT64, ITEM_VALUE_TYPE_FLOAT]
]
]);
$value = null;
if ($db_items) {
$item = $db_items[0];
$history = API::History()->get([
'output' => API_OUTPUT_EXTEND,
'itemids' => $item['itemid'],
'history' => $item['value_type'],
'sortfield' => 'clock',
'sortorder' => ZBX_SORT_DOWN,
'limit' => 1
]);
if ($history) {
$value = convertUnitsRaw([
'value' => $history[0]['value'],
'units' => $item['units']
]);
}
}
$this->setResponse(new CControllerResponseData([
'name' => $this->getInput('name', $this->widget->getName()),
'value' => $value,
'description' => $this->fields_values['description'],
'user' => [
'debug_mode' => $this->getDebugMode()
]
]));
}
}
- Atveriet
views/widget.view.phpun pievienojiet vienuma vērtību logrīka skatam.
ui/modules/lesson_gauge_chart/views/widget.view.php
<?php
/**
* Gauge chart widget view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetView($data))
->addItem([
new CTag('h1', true, $data['description']),
new CDiv($data['value'] !== null ? $data['value']['value'] : _('No data'))
])
->show();
- Atsvaidziniet informācijas paneļa lapu. Logrīks parādīs jaunāko vienuma vērtību.

Pievienot papildu konfigurācijas iestatījumus konfigurācijas skatā
Šajā sadaļā jūs uzzināsiet, kā pievienot izvēršamu/sakļaujamu Papildu konfigurācija sadaļu ar izvēles parametriem, piemēram, krāsu, minimālajām un maksimālajām vērtībām, vienībām un iepriekš izveidoto Apraksts lauku.
- Izveidojiet
Widget.phpfailu galvenajā widget direktorijālesson_gauge_chart, lai izveidotu jaunu klasiWidget.
Klase Widget paplašinās bāzes klasi CWidget, lai pievienotu/pārrakstītu noklusējuma widget iestatījumus (šajā gadījumā - tulkojumus).
Tālāk norādītais JavaScript parāda virkni "No data", ja dati nav pieejami.
Virkne "No data" ir pieejama Zabbix lietotāja saskarnes tulkojumu failos.
Ja ir kādas widget konstantes, ieteicams tās arī norādīt Widget klasē.
ui/modules/lesson_gauge_chart/Widget.php
<?php
namespace Modules\LessonGaugeChart;
use Zabbix\Core\CWidget;
class Widget extends CWidget {
public const UNIT_AUTO = 0;
public const UNIT_STATIC = 1;
public function getTranslationStrings(): array {
return [
'class.widget.js' => [
'No data' => _('No data')
]
];
}
}
- Atveriet
includes/WidgetForm.phpun pievienojiet jaunus laukus Color (krāsu izvēlne), Min (skaitliskais lauks), Max (skaitliskais lauks) un Units (izvēlne), kā arī definējiet noklusējuma krāsu paleti krāsu izvēlnei, lai to varētu izmantot nākamajās darbībās.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Modules\LessonGaugeChart\Widget;
use Zabbix\Widgets\{
CWidgetField,
CWidgetForm
};
use Zabbix\Widgets\Fields\{
CWidgetFieldColor,
CWidgetFieldMultiSelectItem,
CWidgetFieldNumericBox,
CWidgetFieldSelect,
CWidgetFieldTextBox
};
/**
* Gauge chart widget form.
*/
class WidgetForm extends CWidgetForm {
public const DEFAULT_COLOR_PALETTE = [
'FF465C', 'B0AF07', '0EC9AC', '524BBC', 'ED1248', 'D1E754', '2AB5FF', '385CC7', 'EC1594', 'BAE37D',
'6AC8FF', 'EE2B29', '3CA20D', '6F4BBC', '00A1FF', 'F3601B', '1CAE59', '45CFDB', '894BBC', '6D6D6D'
];
public function addFields(): self {
return $this
->addField(
(new CWidgetFieldMultiSelectItem('itemid', _('Item')))
->setFlags(CWidgetField::FLAG_NOT_EMPTY | CWidgetField::FLAG_LABEL_ASTERISK)
->setMultiple(false)
)
->addField(
(new CWidgetFieldColor('chart_color', _('Color')))->setDefault('FF0000')
)
->addField(
(new CWidgetFieldNumericBox('value_min', _('Min')))
->setDefault(0)
->setFlags(CWidgetField::FLAG_NOT_EMPTY | CWidgetField::FLAG_LABEL_ASTERISK)
)
->addField(
(new CWidgetFieldNumericBox('value_max', _('Max')))
->setDefault(100)
->setFlags(CWidgetField::FLAG_NOT_EMPTY | CWidgetField::FLAG_LABEL_ASTERISK)
)
->addField(
(new CWidgetFieldSelect('value_units', _('Units'), [
Widget::UNIT_AUTO => _x('Auto', 'history source selection method'),
Widget::UNIT_STATIC => _x('Static', 'history source selection method')
]))->setDefault(Widget::UNIT_AUTO)
)
->addField(
(new CWidgetFieldTextBox('value_static_units'))
)
->addField(
new CWidgetFieldTextBox('description', _('Description'))
);
}
}
- Atveriet
views/widget.edit.phpun pievienojiet lauku vizuālos komponentus konfigurācijas skatam.
ui/modules/lesson_gauge_chart/views/widget.edit.php
<?php
/**
* Gauge chart widget form view.
*
* @var CView $this
* @var array $data
*/
$lefty_units = new CWidgetFieldSelectView($data['fields']['value_units']);
$lefty_static_units = (new CWidgetFieldTextBoxView($data['fields']['value_static_units']))
->setPlaceholder(_('value'))
->setWidth(ZBX_TEXTAREA_TINY_WIDTH);
(new CWidgetFormView($data))
->addField(
(new CWidgetFieldMultiSelectItemView($data['fields']['itemid']))
->setPopupParameter('numeric', true)
)
->addFieldset(
(new CWidgetFormFieldsetCollapsibleView(_('Advanced configuration')))
->addField(
new CWidgetFieldColorView($data['fields']['chart_color'])
)
->addField(
new CWidgetFieldNumericBoxView($data['fields']['value_min'])
)
->addField(
new CWidgetFieldNumericBoxView($data['fields']['value_max'])
)
->addItem([
$lefty_units->getLabel(),
(new CFormField([
$lefty_units->getView()->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
$lefty_static_units->getView()
]))
])
->addField(
new CWidgetFieldTextBoxView($data['fields']['description'])
)
)
->show();
CWidgetFormView klases addField() metode kā otro parametru pieņem CSS klases virkni.
- Atgriezieties informācijas panelī, pārslēdzieties rediģēšanas režīmā un noklikšķiniet uz zobrata ikonas widget, lai atvērtu widget konfigurācijas formu. Tagad widget konfigurācijas forma satur jaunu izvēršamu/sakļaujamu sadaļu Papildu konfigurācija.

- Izvēršiet sadaļu Papildu konfigurācija, lai redzētu papildu widget konfigurācijas laukus. Ņemiet vērā, ka laukam Color vēl nav krāsu izvēlnes. Tas ir tāpēc, ka krāsu izvēlne ir jāinicializē ar JavaScript, kas tiks pievienots nākamajā sadaļā - Pievienot JavaScript widget.

Pievienojiet JavaScript sīkrīkam
Šajā sadaļā jūs uzzināsiet, kā pievienot mēraparāta diagrammu, kas izveidota, izmantojot JavaScript, un kas parāda, vai jaunākā vērtība ir normāla vai pārāk augsta/pārāk zema.
- Izveidojiet failu
widget.edit.js.phpdirektorijāviews.
JavaScript būs atbildīgs par krāsu izvēlnes inicializēšanu konfigurācijas skatā.
ui/modules/lesson_gauge_chart/views/widget.edit.js.php
<?php
use Modules\LessonGaugeChart\Widget;
?>
window.widget_lesson_gauge_chart_form = new class {
init({color_palette}) {
this._unit_select = document.getElementById('value_units');
this._unit_value = document.getElementById('value_static_units');
this._unit_select.addEventListener('change', () => this.updateForm());
colorPalette.setThemeColors(color_palette);
for (const colorpicker of jQuery('.<?= ZBX_STYLE_COLOR_PICKER ?> input')) {
jQuery(colorpicker).colorpicker();
}
const overlay = overlays_stack.getById('widget_properties');
for (const event of ['overlay.reload', 'overlay.close']) {
overlay.$dialogue[0].addEventListener(event, () => { jQuery.colorpicker('hide'); });
}
this.updateForm();
}
updateForm() {
this._unit_value.disabled = this._unit_select.value == <?= Widget::UNIT_AUTO ?>;
}
};
- Atveriet
views/widget.edit.phpun pievienojiet failuwidget.edit.js.phpar JavaScript konfigurācijas skatam. Lai to izdarītu, izmantojiet metodiincludeJsFile(). Lai pievienotu iekļauto JavaScript, izmantojiet metodiaddJavaScript().
ui/modules/lesson_gauge_chart/views/widget.edit.php
<?php
/**
* Gauge chart widget form view.
*
* @var CView $this
* @var array $data
*/
use Modules\LessonGaugeChart\Includes\WidgetForm;
$lefty_units = new CWidgetFieldSelectView($data['fields']['value_units']);
$lefty_static_units = (new CWidgetFieldTextBoxView($data['fields']['value_static_units']))
->setPlaceholder(_('value'))
->setWidth(ZBX_TEXTAREA_TINY_WIDTH);
(new CWidgetFormView($data))
->addField(
(new CWidgetFieldMultiSelectItemView($data['fields']['itemid']))
->setPopupParameter('numeric', true)
)
->addFieldset(
(new CWidgetFormFieldsetCollapsibleView(_('Advanced configuration')))
->addField(
new CWidgetFieldColorView($data['fields']['chart_color'])
)
->addField(
new CWidgetFieldNumericBoxView($data['fields']['value_min'])
)
->addField(
new CWidgetFieldNumericBoxView($data['fields']['value_max'])
)
->addItem([
$lefty_units->getLabel(),
(new CFormField([
$lefty_units->getView()->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
$lefty_static_units->getView()
]))
])
->addField(
new CWidgetFieldTextBoxView($data['fields']['description'])
)
)
->includeJsFile('widget.edit.js.php')
->addJavaScript('widget_lesson_gauge_chart_form.init('.json_encode([
'color_palette' => WidgetForm::DEFAULT_COLOR_PALETTE
], JSON_THROW_ON_ERROR).');')
->show();
- Atgriezieties informācijas panelī, noklikšķiniet uz zobrata ikonas sīkrīkā, lai atvērtu sīkrīka konfigurācijas formu. Pēc tam izvērsiet sadaļu Advanced configuration, lai redzētu inicializēto krāsu izvēlni. Aizpildiet laukus ar vērtībām un izvēlieties mēraparāta diagrammas krāsu.

-
Sīkrīka konfigurācijas formā noklikšķiniet uz Apply. Pēc tam augšējā labajā stūrī noklikšķiniet uz Save changes, lai saglabātu informācijas paneli.
-
Atveriet
actions/WidgetView.phpun atjauniniet kontrolieri.
Rekvizīts $this->fields_values tagad satur visu Advanced configuration lauku vērtības.
Pabeidziet kontrolieri, lai konfigurāciju un atlasītā vienuma vērtību varētu nodot sīkrīka skatam.
ui/modules/lesson_gauge_chart/actions/WidgetView.php
<?php
namespace Modules\LessonGaugeChart\Actions;
use API,
CControllerDashboardWidgetView,
CControllerResponseData;
class WidgetView extends CControllerDashboardWidgetView {
protected function doAction(): void {
$db_items = API::Item()->get([
'output' => ['itemid', 'value_type', 'name', 'units'],
'itemids' => $this->fields_values['itemid'],
'webitems' => true,
'filter' => [
'value_type' => [ITEM_VALUE_TYPE_UINT64, ITEM_VALUE_TYPE_FLOAT]
]
]);
$history_value = null;
if ($db_items) {
$item = $db_items[0];
$history = API::History()->get([
'output' => API_OUTPUT_EXTEND,
'itemids' => $item['itemid'],
'history' => $item['value_type'],
'sortfield' => 'clock',
'sortorder' => ZBX_SORT_DOWN,
'limit' => 1
]);
if ($history) {
$history_value = convertUnitsRaw([
'value' => $history[0]['value'],
'units' => $item['units']
]);
}
}
$this->setResponse(new CControllerResponseData([
'name' => $this->getInput('name', $this->widget->getName()),
'history' => $history_value,
'fields_values' => $this->fields_values,
'user' => [
'debug_mode' => $this->getDebugMode()
]
]));
}
}
- Atveriet un modificējiet
views/widget.view.php.
Jums ir jāizveido konteiners mēraparāta diagrammai, kuru zīmēsiet nākamajās darbībās, un konteiners aprakstam.
Lai nodotu vērtības JavaScript kā JSON objektu, izmantojiet metodi setVar().
ui/modules/lesson_gauge_chart/views/widget.view.php
<?php
/**
* Gauge chart widget view.
*
* @var CView $this
* @var array $data
*/
(new CWidgetView($data))
->addItem([
(new CDiv())->addClass('chart'),
$data['fields_values']['description']
? (new CDiv($data['fields_values']['description']))->addClass('description')
: null
])
->setVar('history', $data['history'])
->setVar('fields_values', $data['fields_values'])
->show();
-
Izveidojiet jaunu direktoriju
assetsdirektorijālesson_gauge_chart. Šī direktorija tiks izmantota JavaScript, CSS un, iespējams, citu resursu, piemēram, fontu vai attēlu, glabāšanai. -
Sīkrīka skata JavaScript izveidojiet direktoriju
jsdirektorijāassets. -
Izveidojiet failu
class.widget.jsdirektorijāassets/js.
Šī JavaScript sīkrīka klase paplašinās visu informācijas paneļa sīkrīku bāzes JavaScript klasi - CWidget.
Informācijas panelis paļaujas uz pareizu sīkrīka implementāciju un nodod sīkrīkam visu būtisko informāciju, izsaucot attiecīgās JavaScript metodes.
Informācijas panelis arī sagaida, ka sīkrīks ģenerēs notikumus, kad notiek kāda mijiedarbība.
Tādēļ klase CWidget satur metožu kopu ar sīkrīka uzvedības noklusējuma implementāciju, ko var pielāgot, paplašinot klasi.
Šajā gadījumā ir nepieciešama noteikta pielāgošana, tāpēc pielāgota loģika tiks ieviesta šādai sīkrīka uzvedībai:
- sīkrīka inicializācija, kas ir atbildīga par sīkrīka sākotnējā stāvokļa definēšanu (skatiet metodi
onInitialize()); - sīkrīka satura attēlošana (tas ir, mēraparāta diagrammas zīmēšana), ja sīkrīka atjaunināšanas process ir bijis veiksmīgs un bez kļūdām (skatiet metodi
processUpdateResponse(response)un saistītās metodes_resizeChart()un_updatedChart()) - sīkrīka izmēra maiņa (skatiet metodi
onResize()un saistīto metodi_resizeChart())
Pārējiem mēraparāta diagrammas sīkrīka aspektiem tiks izmantota sīkrīka uzvedības noklusējuma implementācija.
Lai uzzinātu vairāk par klases CWidget JavaScript metodēm, skatiet: JavaScript.
Tā kā šis JavaScript ir nepieciešams sīkrīka skatam, tas ir jāielādē kopā ar informācijas paneļa lapu.
Lai iespējotu JavaScript ielādi, jums būs jāatjaunina parametri assets/js un js_class failā manifest.json, kā parādīts 10. darbībā.
ui/modules/lesson_gauge_chart/assets/js/class.widget.js
class WidgetLessonGaugeChart extends CWidget {
static UNIT_AUTO = 0;
static UNIT_STATIC = 1;
onInitialize() {
super.onInitialize();
this._refresh_frame = null;
this._chart_container = null;
this._canvas = null;
this._chart_color = null;
this._min = null;
this._max = null;
this._value = null;
this._last_value = null;
this._units = '';
}
processUpdateResponse(response) {
if (response.history === null) {
this._value = null;
this._units = '';
}
else {
this._value = Number(response.history.value);
this._units = response.fields_values.value_units == WidgetLessonGaugeChart.UNIT_AUTO
? response.history.units
: response.fields_values.value_static_units;
}
this._chart_color = response.fields_values.chart_color;
this._min = Number(response.fields_values.value_min);
this._max = Number(response.fields_values.value_max);
super.processUpdateResponse(response);
}
setContents(response) {
if (this._canvas === null) {
super.setContents(response);
this._chart_container = this._body.querySelector('.chart');
this._chart_container.style.height =
`${this._getContentsSize().height - this._body.querySelector('.description').clientHeight}px`;
this._canvas = document.createElement('canvas');
this._chart_container.appendChild(this._canvas);
this._resizeChart();
}
this._updatedChart();
}
onResize() {
super.onResize();
if (this._state === WIDGET_STATE_ACTIVE) {
this._resizeChart();
}
}
_resizeChart() {
const ctx = this._canvas.getContext('2d');
const dpr = window.devicePixelRatio;
this._canvas.style.display = 'none';
const size = Math.min(this._chart_container.offsetWidth, this._chart_container.offsetHeight);
this._canvas.style.display = '';
this._canvas.width = size * dpr;
this._canvas.height = size * dpr;
ctx.scale(dpr, dpr);
this._canvas.style.width = `${size}px`;
this._canvas.style.height = `${size}px`;
this._refresh_frame = null;
this._updatedChart();
}
_updatedChart() {
if (this._last_value === null) {
this._last_value = this._min;
}
const start_time = Date.now();
const end_time = start_time + 400;
const animate = () => {
const time = Date.now();
if (time <= end_time) {
const progress = (time - start_time) / (end_time - start_time);
const smooth_progress = 0.5 + Math.sin(Math.PI * (progress - 0.5)) / 2;
let value = this._value !== null ? this._value : this._min;
value = (this._last_value + (value - this._last_value) * smooth_progress - this._min) / (this._max - this._min);
const ctx = this._canvas.getContext('2d');
const size = this._canvas.width;
const char_weight = size / 12;
const char_shadow = 3;
const char_x = size / 2;
const char_y = size / 2;
const char_radius = (size - char_weight) / 2 - char_shadow;
const font_ratio = 32 / 100;
ctx.clearRect(0, 0, size, size);
ctx.beginPath();
ctx.shadowBlur = char_shadow;
ctx.shadowColor = '#bbb';
ctx.strokeStyle = '#eee';
ctx.lineWidth = char_weight;
ctx.lineCap = 'round';
ctx.arc(char_x, char_y, char_radius, Math.PI * 0.749, Math.PI * 2.251, false);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = `#${this._chart_color}`;
ctx.lineWidth = char_weight - 2;
ctx.lineCap = 'round';
ctx.arc(char_x, char_y, char_radius, Math.PI * 0.75,
Math.PI * (0.75 + (1.5 * Math.min(1, Math.max(0, value)))), false
);
ctx.stroke();
ctx.shadowBlur = 2;
ctx.fillStyle = '#1f2c33';
ctx.font = `${(char_radius * font_ratio)|0}px Arial`;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(`${this._value !== null ? this._value : t('No data')}${this._units}`,
char_x, char_y, size - char_shadow * 4 - char_weight * 2
);
ctx.fillStyle = '#768d99';
ctx.font = `${(char_radius * font_ratio * .5)|0}px Arial`;
ctx.textBaseline = 'top';
ctx.textAlign = 'left';
ctx.fillText(`${this._min}${this._min != '' ? this._units : ''}`,
char_weight * .75, size - char_weight * 1.25, size / 2 - char_weight
);
ctx.textAlign = 'right';
ctx.fillText(`${this._max}${this._max != '' ? this._units : ''}`,
size - char_weight * .75, size - char_weight * 1.25, size / 2 - char_weight
);
requestAnimationFrame(animate);
}
else {
this._last_value = this._value;
}
};
requestAnimationFrame(animate);
}
}
- Atveriet
manifest.jsonun pievienojiet:
- faila nosaukumu (
class.widget.js) masīvamassets/jssadaļā; - klases nosaukumu (
WidgetLessonGaugeChart) parametramjs_classsadaļāwidget.
Klase WidgetLessonGaugeChart tagad tiks automātiski ielādēta kopā ar informācijas paneli.
ui/modules/lesson_gauge_chart/manifest.json
{
"manifest_version": 2.0,
"id": "lesson_gauge_chart",
"type": "widget",
"name": "Gauge chart",
"namespace": "LessonGaugeChart",
"version": "1.0",
"author": "Zabbix",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
},
"widget": {
"js_class": "WidgetLessonGaugeChart"
},
"assets": {
"js": ["class.widget.js"]
}
}
Pievienojiet CSS stilus vienumam
Šajā sadaļā jūs uzzināsiet, kā pievienot pielāgotus CSS stilus, lai vienums izskatītos pievilcīgāks.
-
Vienuma stiliem izveidojiet jaunu direktoriju
cssdirektorijāassets. -
Izveidojiet failu
widget.cssdirektorijāassets/css. Lai noformētu vienuma elementus, izmantojiet selektorudiv.dashboard-widget-{widget id}. Lai konfigurētu CSS visam vienumam, izmantojiet selektoruform.dashboard-widget-{widget id}
ui/modules/lesson_gauge_chart/assets/css/widget.css
div.dashboard-widget-lesson_gauge_chart {
display: grid;
grid-template-rows: 1fr;
padding: 0;
}
div.dashboard-widget-lesson_gauge_chart .chart {
display: grid;
align-items: center;
justify-items: center;
}
div.dashboard-widget-lesson_gauge_chart .chart canvas {
background: white;
}
div.dashboard-widget-lesson_gauge_chart .description {
padding-bottom: 8px;
font-size: 1.750em;
line-height: 1.2;
text-align: center;
}
.dashboard-grid-widget-hidden-header div.dashboard-widget-lesson_gauge_chart .chart {
margin-top: 8px;
}
- Atveriet
manifest.jsonun pievienojiet CSS faila nosaukumu (widget.css) masīvam sadaļāassets/css. Tas ļaus CSS stiliem, kas definētiwidget.css, ielādēties kopā ar informācijas paneļa lapu.
ui/modules/lesson_gauge_chart/manifest.json
{
"manifest_version": 2.0,
"id": "lesson_gauge_chart",
"type": "widget",
"name": "Gauge chart",
"namespace": "LessonGaugeChart",
"version": "1.0",
"author": "Zabbix",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
},
"widget": {
"js_class": "WidgetLessonGaugeChart"
},
"assets": {
"css": ["widget.css"],
"js": ["class.widget.js"]
}
}
- Atsvaidziniet informācijas paneļa lapu, lai redzētu vienuma pabeigto versiju.
