§¿§ä§à §á§à§ê§Ñ§Ô§à§Ó§à§Ö §â§å§Ü§à§Ó§à§Õ§ã§ä§Ó§à, §Ü§à§ä§à§â§à§Ö §á§à§Ü§Ñ§Ù§í§Ó§Ñ§Ö§ä, §Ü§Ñ§Ü §ã§à§Ù§Õ§Ñ§ä§î §á§â§à§ã§ä§à§Û §Ó§Ú§Õ§Ø§Ö§ä §Ú§ß§æ§à§â§Þ§Ñ§è§Ú§à§ß§ß§à§Û §á§Ñ§ß§Ö§Ý§Ú. §£§í §Þ§à§Ø§Ö§ä§Ö §ã§Ü§Ñ§é§Ñ§ä§î §Ó§ã§Ö §æ§Ñ§Û§Ý§í §ï§ä§à§Ô§à §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ó §Ó§Ú§Õ§Ö ZIP-§Ñ§â§ç§Ú§Ó§Ñ: lesson_gauge_chart.zip.
§£ §ç§à§Õ§Ö §ï§ä§à§Ô§à §å§â§à§Ü§Ñ §Ó§í §ã§ß§Ñ§é§Ñ§Ý§Ñ §ã§à§Ù§Õ§Ñ§Õ§Ú§ä§Ö basic "Hello, world!" §Ó§Ú§Õ§Ø§Ö§ä, §Ñ §Ù§Ñ§ä§Ö§Þ §á§â§Ö§à§Ò§â§Ñ§Ù§å§Û§ä§Ö §Ö§Ô§à §Ó §Ó§Ú§Õ§Ø§Ö§ä more advanced, §Ü§à§ä§à§â§í§Û §à§ä§à§Ò§â§Ñ§Ø§Ñ§Ö§ä §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Ó §Ó§Ú§Õ§Ö §Õ§Ú§Ñ§Ô§â§Ñ§Þ§Þ§í. §£§à§ä §Ü§Ñ§Ü §Ò§å§Õ§Ö§ä §Ó§í§Ô§Ý§ñ§Õ§Ö§ä§î §Ô§à§ä§à§Ó§í§Û §Ó§Ú§Õ§Ø§Ö§ä:
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §Ú§Ù§å§é§Ú§ä§Ö, §Ü§Ñ§Ü §ã§à§Ù§Õ§Ñ§ä§î §Þ§Ú§ß§Ú§Þ§Ñ§Ý§î§ß§à §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§í§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§í §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ú §Õ§à§Ò§Ñ§Ó§Ú§ä§î §ß§à§Ó§í§Û §Ó§Ú§Õ§Ø§Ö§ä §Ó §Ú§ß§ä§Ö§â§æ§Ö§Û§ã Áú»¢¶Ä²©.
§£§ã§Ö §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§î§ã§Ü§Ú§Ö §Ó§Ú§Õ§Ø§Ö§ä§í §â§Ñ§ã§ã§Þ§Ñ§ä§â§Ú§Ó§Ñ§ð§ä§ã§ñ §Ü§Ñ§Ü §Ó§ß§Ö§ê§ß§Ú§Ö §Þ§à§Õ§å§Ý§Ú §Ú §Õ§à§Ý§Ø§ß§í §Ò§í§ä§î §Õ§à§Ò§Ñ§Ó§Ý§Ö§ß§í §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô modules §Ó§Ñ§ê§Ö§Û §å§ã§ä§Ñ§ß§à§Ó§Ü§Ú §Ó§Ö§Ò-§Ú§ß§ä§Ö§â§æ§Ö§Û§ã§Ñ Áú»¢¶Ä²© (§ß§Ñ§á§â§Ú§Þ§Ö§â, zabbix/ui/modules). §¬§Ñ§ä§Ñ§Ý§à§Ô zabbix/ui/widgets §Ù§Ñ§â§Ö§Ù§Ö§â§Ó§Ú§â§à§Ó§Ñ§ß §Õ§Ý§ñ §Ó§ã§ä§â§à§Ö§ß§ß§í§ç §Ó§Ú§Õ§Ø§Ö§ä§à§Ó Áú»¢¶Ä²© §Ú §à§Ò§ß§à§Ó§Ý§ñ§Ö§ä§ã§ñ §Ó§Þ§Ö§ã§ä§Ö §ã §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§î§ã§Ü§Ú§Þ §Ú§ß§ä§Ö§â§æ§Ö§Û§ã§à§Þ Áú»¢¶Ä²©.
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": "Áú»¢¶Ä²©"
}
§¶§Ñ§Û§Ý view §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Õ§à§Ý§Ø§Ö§ß §ß§Ñ§ç§à§Õ§Ú§ä§î§ã§ñ §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö views (§Õ§Ý§ñ §ï§ä§à§Ô§à §â§å§Ü§à§Ó§à§Õ§ã§ä§Ó§Ñ ui/modules/lesson_gauge_chart/views/). §¦§ã§Ý§Ú §æ§Ñ§Û§Ý §Ú§Þ§Ö§Ö§ä §Ú§Þ§ñ §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð widget.view.php, §Ó§Ñ§Þ §ß§Ö §ß§å§Ø§ß§à §â§Ö§Ô§Ú§ã§ä§â§Ú§â§à§Ó§Ñ§ä§î §Ö§Ô§à §Ó §æ§Ñ§Û§Ý§Ö manifest.json. §¦§ã§Ý§Ú §æ§Ñ§Û§Ý §Ú§Þ§Ö§Ö§ä §Õ§â§å§Ô§à§Ö §Ú§Þ§ñ, §å§Ü§Ñ§Ø§Ú§ä§Ö §Ö§Ô§à §Ó §â§Ñ§Ù§Õ§Ö§Ý§Ö actions/widget.lesson_gauge_chart.view §æ§Ñ§Û§Ý§Ñ manifest.json.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §Ü§Ñ§ä§Ñ§Ý§à§Ô views §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö lesson_gauge_chart.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §æ§Ñ§Û§Ý widget.view.php §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö 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();
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §å§Ù§ß§Ñ§Ö§ä§Ö, §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ú§ä§î §á§à§Ý§Ö §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ú §à§ä§à§Ò§â§Ñ§Ù§Ú§ä§î §Ó§Ó§Ö§Õ§Ö§ß§ß§à§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ó §Ó§Ú§Õ§Ö §ä§Ö§Ü§ã§ä§Ñ.
§¬§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§ñ §Ó§Ú§Õ§Ø§Ö§ä§Ñ §ã§à§ã§ä§à§Ú§ä §Ú§Ù §æ§à§â§Þ§í (Áú»¢¶Ä²©\Widgets\CWidgetForm) §Ú §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§ñ §æ§à§â§Þ§í §Ó§Ú§Õ§Ø§Ö§ä§Ñ (widget.edit.php). §¹§ä§à§Ò§í §Õ§à§Ò§Ñ§Ó§Ú§ä§î §á§à§Ý§ñ (Áú»¢¶Ä²©\Widgets\CWidgetField), §Ó§Ñ§Þ §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à §ã§à§Ù§Õ§Ñ§ä§î §Ü§Ý§Ñ§ã§ã WidgetForm, §Ü§à§ä§à§â§í§Û §Ò§å§Õ§Ö§ä §â§Ñ§ã§ê§Ú§â§ñ§ä§î Áú»¢¶Ä²©\Widgets\CWidgetForm.
§¶§à§â§Þ§Ñ §ã§à§Õ§Ö§â§Ø§Ú§ä §ß§Ñ§Ò§à§â §á§à§Ý§Ö§Û (Áú»¢¶Ä²©\Widgets\CWidgetField) §â§Ñ§Ù§Ý§Ú§é§ß§í§ç §ä§Ú§á§à§Ó, §Ü§à§ä§à§â§í§Ö §Ú§ã§á§à§Ý§î§Ù§å§ð§ä§ã§ñ §Õ§Ý§ñ §á§â§à§Ó§Ö§â§Ü§Ú §Ó§Ó§Ö§Õ§Ö§ß§ß§í§ç §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§Ö§Þ §Ù§ß§Ñ§é§Ö§ß§Ú§Û. §±§à§Ý§Ö §æ§à§â§Þ§í (Áú»¢¶Ä²©\Widgets\CWidgetField) §Õ§Ý§ñ §Ü§Ñ§Ø§Õ§à§Ô§à §ä§Ú§á§Ñ §Ó§ç§à§Õ§ß§à§Ô§à §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §á§â§Ö§à§Ò§â§Ñ§Ù§å§Ö§ä §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §Ó §Ö§Õ§Ú§ß§í§Û §æ§à§â§Þ§Ñ§ä §Õ§Ý§ñ §ã§à§ç§â§Ñ§ß§Ö§ß§Ú§ñ §Ö§Ô§à §Ó §Ò§Ñ§Ù§Ö §Õ§Ñ§ß§ß§í§ç.
§¶§Ñ§Û§Ý form §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Õ§à§Ý§Ø§Ö§ß §ß§Ñ§ç§à§Õ§Ú§ä§î§ã§ñ §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö includes (§Ó §Õ§Ñ§ß§ß§à§Þ §â§å§Ü§à§Ó§à§Õ§ã§ä§Ó§Ö ui/modules/lesson_gauge_chart/includes/). §¦§ã§Ý§Ú §æ§Ñ§Û§Ý §Ú§Þ§Ö§Ö§ä §Ú§Þ§ñ §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð WidgetForm.php, §Ó§Ñ§Þ §ß§Ö §ß§å§Ø§ß§à §â§Ö§Ô§Ú§ã§ä§â§Ú§â§à§Ó§Ñ§ä§î §Ö§Ô§à §Ó §æ§Ñ§Û§Ý§Ö manifest.json. §¦§ã§Ý§Ú §æ§Ñ§Û§Ý §Ú§Þ§Ö§Ö§ä §Õ§â§å§Ô§à§Ö §Ú§Þ§ñ, §å§Ü§Ñ§Ø§Ú§ä§Ö §Ö§Ô§à §Ó §â§Ñ§Ù§Õ§Ö§Ý§Ö widget/form_class §æ§Ñ§Û§Ý§Ñ manifest.json.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §ß§à§Ó§í§Û §Ü§Ñ§ä§Ñ§Ý§à§Ô includes §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö lesson_gauge_chart.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §æ§Ñ§Û§Ý WidgetForm.php §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö includes.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Áú»¢¶Ä²©\Widgets\CWidgetForm;
class WidgetForm extends CWidgetForm {
}
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Áú»¢¶Ä²©\Widgets\CWidgetForm;
use Áú»¢¶Ä²©\Widgets\Fields\CWidgetFieldTextBox;
class WidgetForm extends CWidgetForm {
public function addFields(): self {
return $this
->addField(
new CWidgetFieldTextBox('description', _('Description'))
);
}
}
ui/modules/lesson_gauge_chart/views/widget.edit.php
<?php
/**
* §±§â§à§ã§Þ§à§ä§â §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Õ§Ú§Ñ§Ô§â§Ñ§Þ§Þ§í §ã §å§Ü§Ñ§Ù§Ñ§ä§Ö§Ý§Ö§Þ.
*
* @var CView $this
* @var array $data
*/
(new CWidgetFormView($data))
->addField(
new CWidgetFieldTextBoxView($data['fields']['description'])
)
->show();
§±§Ö§â§Ö§Û§Õ§Ú§ä§Ö §ß§Ñ §á§Ñ§ß§Ö§Ý§î §Ú §ß§Ñ§Ø§Þ§Ú§ä§Ö §ß§Ñ §Ù§ß§Ñ§é§à§Ü §ê§Ö§ã§ä§Ö§â§Ö§ß§Ü§Ú §Ó §Ó§Ú§Õ§Ø§Ö§ä§Ö, §é§ä§à§Ò§í §à§ä§Ü§â§í§ä§î §æ§à§â§Þ§å §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ.
§¶§à§â§Þ§Ñ §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §ä§Ö§á§Ö§â§î §ã§à§Õ§Ö§â§Ø§Ú§ä §ß§à§Ó§à§Ö §ä§Ö§Ü§ã§ä§à§Ó§à§Ö §á§à§Ý§Ö §°§á§Ú§ã§Ñ§ß§Ú§Ö. §£§Ó§Ö§Õ§Ú§ä§Ö §Ý§ð§Ò§à§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§Ö, §ß§Ñ§á§â§Ú§Þ§Ö§â §°§á§Ú§ã§Ñ§ß§Ú§Ö §Õ§Ú§Ñ§Ô§â§Ñ§Þ§Þ§í §Õ§Ñ§ä§é§Ú§Ü§à§Ó.
§¹§ä§à§Ò§í §ß§à§Ó§à§Ö §à§á§Ú§ã§Ñ§ß§Ú§Ö §á§à§ñ§Ó§Ú§Ý§à§ã§î §Ó §Ó§Ú§Õ§Ø§Ö§ä§Ö, §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §á§à§Ý§ñ §°§á§Ú§ã§Ñ§ß§Ú§Ö §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à §á§à§Ý§å§é§Ú§ä§î §Ú§Ù §Ò§Ñ§Ù§í §Õ§Ñ§ß§ß§í§ç §Ú §á§Ö§â§Ö§Õ§Ñ§ä§î §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ö §Ó§Ú§Õ§Ø§Ö§ä§Ñ. §¥§Ý§ñ §ï§ä§à§Ô§à §Ó§Ñ§Þ §ß§å§Ø§ß§à §ã§à§Ù§Õ§Ñ§ä§î §Ü§Ý§Ñ§ã§ã §Õ§Ö§Û§ã§ä§Ó§Ú§Û.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §ß§à§Ó§í§Û §Ü§Ñ§ä§Ñ§Ý§à§Ô actions §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö lesson_gauge_chart.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §æ§Ñ§Û§Ý WidgetView.php §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö actions. §¬§Ý§Ñ§ã§ã §Õ§Ö§Û§ã§ä§Ó§Ú§ñ WidgetView §â§Ñ§ã§ê§Ú§â§Ú§ä §Ü§Ý§Ñ§ã§ã CControllerDashboardWidgetView.
§©§ß§Ñ§é§Ö§ß§Ú§ñ §á§à§Ý§Ö§Û §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §ç§â§Ñ§ß§ñ§ä§ã§ñ §Ó §ã§Ó§à§Û§ã§ä§Ó§Ö $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()
]
]));
}
}
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": "Áú»¢¶Ä²©",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
}
}
ui/modules/lesson_gauge_chart/views/widget.view.php
<?php
/**
* §±§â§à§ã§Þ§à§ä§â §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Õ§Ú§Ñ§Ô§â§Ñ§Þ§Þ§í §ã §å§Ü§Ñ§Ù§Ñ§ä§Ö§Ý§Ö§Þ.
*
* @var CView $this
* @var array $data
*/
(new CWidgetView($data))
->addItem(
new CTag('h1', true, $data['description'])
)
->show();
§£§Ú§Õ§Ø§Ö§ä §Õ§à§Ý§Ø§Ö§ß §à§ä§à§Ò§â§Ñ§Ø§Ñ§ä§î §á§à§ã§Ý§Ö§Õ§ß§Ö§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §á§à §Ó§í§Ò§à§â§å §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§ñ. §¥§Ý§ñ §ï§ä§à§Ô§à §Ó§Ñ§Þ §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§à §Õ§à§Ò§Ñ§Ó§Ú§ä§î §Ó§à§Ù§Þ§à§Ø§ß§à§ã§ä§î §Ó§í§Ò§à§â§Ñ §ï§Ý§Ö§Þ§Ö§ß§ä§à§Ó §Õ§Ñ§ß§ß§í§ç §Ó §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ.
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §å§Ù§ß§Ñ§Ö§ä§Ö, §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ú§ä§î §á§à§Ý§Ö §Ó§í§Ò§à§â§Ñ §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §Ó §æ§à§â§Þ§å §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ú §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ú§ä§î §Ó§Ú§Ù§å§Ñ§Ý§î§ß§å§ð §é§Ñ§ã§ä§î §ï§ä§à§Ô§à §á§à§Ý§ñ §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ö §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú. §©§Ñ§ä§Ö§Þ §Ü§à§ß§ä§â§à§Ý§Ý§Ö§â §Ó§Ú§Õ§Ø§Ö§ä§Ñ §ã§Þ§à§Ø§Ö§ä §á§à§Ý§å§é§Ñ§ä§î §Õ§Ñ§ß§ß§í§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §Ú §Ö§Ô§à §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §é§Ö§â§Ö§Ù §Ù§Ñ§á§â§à§ã API. §±§à§ã§Ý§Ö §á§à§Ý§å§é§Ö§ß§Ú§ñ §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §Þ§à§Ø§ß§à §à§ä§à§Ò§â§Ñ§Ù§Ú§ä§î §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ.
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Áú»¢¶Ä²©\Widgets\{
CWidgetField,
CWidgetForm
};
use Áú»¢¶Ä²©\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'))
);
}
}
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();
§£§Ö§â§ß§Ú§ä§Ö§ã§î §ß§Ñ §á§Ñ§ß§Ö§Ý§î §Ú §ß§Ñ§Ø§Þ§Ú§ä§Ö §ß§Ñ §Ù§ß§Ñ§é§à§Ü §ê§Ö§ã§ä§Ö§â§Ö§ß§Ü§Ú §Ó §Ó§Ú§Õ§Ø§Ö§ä§Ö, §é§ä§à§Ò§í §à§ä§Ü§â§í§ä§î §æ§à§â§Þ§å §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ.
§¶§à§â§Þ§Ñ §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §ä§Ö§á§Ö§â§î §ã§à§Õ§Ö§â§Ø§Ú§ä §ß§à§Ó§à§Ö §á§à§Ý§Ö §Ó§Ó§à§Õ§Ñ §¿§Ý§Ö§Þ§Ö§ß§ä §Õ§Ñ§ß§ß§í§ç. §£§í§Ò§Ú§â§Ñ§Ö§Þ §ç§à§ã§ä "§³§Ö§â§Ó§Ö§â Áú»¢¶Ä²©" §Ú §á§å§ß§Ü§ä "§³§â§Ö§Õ§ß§ñ§ñ §ß§Ñ§Ô§â§å§Ù§Ü§Ñ (1§Þ §Ó §ã§â§Ö§Õ§ß§Ö§Þ)".
§¯§Ñ§Ø§Þ§Ú§ä§Ö §±§â§Ú§Þ§Ö§ß§Ú§ä§î §Ó §æ§à§â§Þ§Ö §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ. §©§Ñ§ä§Ö§Þ §ß§Ñ§Ø§Þ§Ú§ä§Ö §³§à§ç§â§Ñ§ß§Ú§ä§î §Ú§Ù§Þ§Ö§ß§Ö§ß§Ú§ñ §Ó §á§â§Ñ§Ó§à§Þ §Ó§Ö§â§ç§ß§Ö§Þ §å§Ô§Ý§å, §é§ä§à§Ò§í §ã§à§ç§â§Ñ§ß§Ú§ä§î §á§Ñ§ß§Ö§Ý§î.
§°§ä§Ü§â§à§Û§ä§Ö §Ú §Ú§Ù§Þ§Ö§ß§Ú§ä§Ö actions/WidgetView.php.
§³ §ï§ä§à§Ô§à §Þ§à§Þ§Ö§ß§ä§Ñ §Ú§Õ§Ö§ß§ä§Ú§æ§Ú§Ü§Ñ§ä§à§â §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §Ò§å§Õ§Ö§ä §Õ§à§ã§ä§å§á§Ö§ß §Ó §Ü§à§ß§ä§â§à§Ý§Ý§Ö§â§Ö §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ó $this->fields_values['itemid']. §®§Ö§ä§à§Õ §Ü§à§ß§ä§â§à§Ý§Ý§Ö§â§Ñ doAction() §ã§à§Ò§Ú§â§Ñ§Ö§ä §Õ§Ñ§ß§ß§í§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ (§Ú§Þ§ñ, §ä§Ú§á §Ù§ß§Ñ§é§Ö§ß§Ú§ñ, §Ö§Õ§Ú§ß§Ú§è§í §Ú§Ù§Þ§Ö§â§Ö§ß§Ú§ñ) §ã §á§à§Þ§à§ë§î§ð §Þ§Ö§ä§à§Õ§Ñ API item.get §Ú §á§à§ã§Ý§Ö§Õ§ß§Ö§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §ã §á§à§Þ§à§ë§î§ð §®§Ö§ä§à§Õ API 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()
]
]));
}
}
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();
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §å§Ù§ß§Ñ§Ö§ä§Ö, §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ú§ä§î §â§Ñ§Ù§Ó§à§â§Ñ§é§Ú§Ó§Ñ§Ö§Þ§í§Û/§ã§Ó§à§â§Ñ§é§Ú§Ó§Ñ§Ö§Þ§í§Û §â§Ñ§Ù§Õ§Ö§Ý §²§Ñ§ã§ê§Ú§â§Ö§ß§ß§Ñ§ñ §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§ñ §ã §Õ§à§á§à§Ý§ß§Ú§ä§Ö§Ý§î§ß§í§Þ§Ú §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ§Þ§Ú, §ä§Ñ§Ü§Ú§Þ§Ú §Ü§Ñ§Ü §è§Ó§Ö§ä, §Þ§Ú§ß§Ú§Þ§Ñ§Ý§î§ß§à§Ö §Ú §Þ§Ñ§Ü§ã§Ú§Þ§Ñ§Ý§î§ß§à§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§ñ, §Ö§Õ§Ú§ß§Ú§è§í §Ú§Ù§Þ§Ö§â§Ö§ß§Ú§ñ §Ú §á§à§Ý§Ö §°§á§Ú§ã§Ñ§ß§Ú§Ö, §ã§à§Ù§Õ§Ñ§ß§ß§à§Ö §â§Ñ§ß§Ö§Ö.
§¬§Ý§Ñ§ã§ã Widget §â§Ñ§ã§ê§Ú§â§Ú§ä §Ò§Ñ§Ù§à§Ó§í§Û §Ü§Ý§Ñ§ã§ã CWidget, §é§ä§à§Ò§í §Õ§à§Ò§Ñ§Ó§Ú§ä§î/§á§Ö§â§Ö§à§á§â§Ö§Õ§Ö§Ý§Ú§ä§î §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð (§Ó §Õ§Ñ§ß§ß§à§Þ §ã§Ý§å§é§Ñ§Ö ¡ª §á§Ö§â§Ö§Ó§à§Õ§í). JavaScript, §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§ß§í§Û §ß§Ú§Ø§Ö, §à§ä§à§Ò§â§Ñ§Ø§Ñ§Ö§ä §ã§ä§â§à§Ü§å "§¯§Ö§ä §Õ§Ñ§ß§ß§í§ç" §Ó §ã§Ý§å§é§Ñ§Ö §à§ä§ã§å§ä§ã§ä§Ó§Ú§ñ §Õ§Ñ§ß§ß§í§ç. §³§ä§â§à§Ü§Ñ "§¯§Ö§ä §Õ§Ñ§ß§ß§í§ç" §á§â§Ú§ã§å§ä§ã§ä§Ó§å§Ö§ä §Ó §æ§Ñ§Û§Ý§Ñ§ç §á§Ö§â§Ö§Ó§à§Õ§Ñ Áú»¢¶Ä²© UI.
§¦§ã§Ý§Ú §Ö§ã§ä§î §Ü§Ñ§Ü§Ú§Ö-§Ý§Ú§Ò§à §Ü§à§ß§ã§ä§Ñ§ß§ä§í §Ó§Ú§Õ§Ø§Ö§ä§Ñ, §â§Ö§Ü§à§Þ§Ö§ß§Õ§å§Ö§ä§ã§ñ §ä§Ñ§Ü§Ø§Ö §å§Ü§Ñ§Ù§Ñ§ä§î §Ú§ç §Ó §Ü§Ý§Ñ§ã§ã§Ö Widget.
ui/modules/lesson_gauge_chart/Widget.php
<?php
namespace Modules\LessonGaugeChart;
use Áú»¢¶Ä²©\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')
]
];
}
}
ui/modules/lesson_gauge_chart/includes/WidgetForm.php
<?php
namespace Modules\LessonGaugeChart\Includes;
use Modules\LessonGaugeChart\Widget;
use Áú»¢¶Ä²©\Widgets\{
CWidgetField,
CWidgetForm
};
use Áú»¢¶Ä²©\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'))
);
}
}
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();
§®§Ö§ä§à§Õ addField() §Ü§Ý§Ñ§ã§ã§Ñ CWidgetFormView §á§â§Ú§ß§Ú§Þ§Ñ§Ö§ä §ã§ä§â§à§Ü§å §Ü§Ý§Ñ§ã§ã§Ñ CSS §Ó §Ü§Ñ§é§Ö§ã§ä§Ó§Ö §Ó§ä§à§â§à§Ô§à §á§Ñ§â§Ñ§Þ§Ö§ä§â§Ñ.
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §å§Ù§ß§Ñ§Ö§ä§Ö, §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ú§ä§î §Ú§ß§Õ§Ú§Ü§Ñ§ä§à§â§ß§í§Û §Ô§â§Ñ§æ§Ú§Ü, §ã§à§Ù§Õ§Ñ§ß§ß§í§Û §ã §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ß§Ú§Ö§Þ JavaScript, §Ü§à§ä§à§â§í§Û §á§à§Ü§Ñ§Ù§í§Ó§Ñ§Ö§ä, §ñ§Ó§Ý§ñ§Ö§ä§ã§ñ §Ý§Ú §á§à§ã§Ý§Ö§Õ§ß§Ö§Ö §Ù§ß§Ñ§é§Ö§ß§Ú§Ö §ß§à§â§Þ§Ñ§Ý§î§ß§í§Þ §Ú§Ý§Ú §ã§Ý§Ú§ê§Ü§à§Þ §Ó§í§ã§à§Ü§Ú§Þ/§ß§Ú§Ù§Ü§Ú§Þ.
JavaScript §Ò§å§Õ§Ö§ä §à§ä§Ó§Ö§é§Ñ§ä§î §Ù§Ñ §Ú§ß§Ú§è§Ú§Ñ§Ý§Ú§Ù§Ñ§è§Ú§ð §Ó§í§Ò§à§â§Ñ §è§Ó§Ö§ä§Ñ §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ú §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú.
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 ?>;
}
};
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();
§¯§Ñ§Ø§Þ§Ú§ä§Ö §ß§Ñ §±§â§Ú§Þ§Ö§ß§Ú§ä§î §Ó §æ§à§â§Þ§Ö §ß§Ñ§ã§ä§â§à§Û§Ü§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ. §©§Ñ§ä§Ö§Þ §ß§Ñ§Ø§Þ§Ú§ä§Ö §ß§Ñ §³§à§ç§â§Ñ§ß§Ú§ä§î §Ú§Ù§Þ§Ö§ß§Ö§ß§Ú§ñ §Ó §á§â§Ñ§Ó§à§Þ §Ó§Ö§â§ç§ß§Ö§Þ §å§Ô§Ý§å, §é§ä§à§Ò§í §ã§à§ç§â§Ñ§ß§Ú§ä§î §á§Ñ§ß§Ö§Ý§î.
§°§ä§Ü§â§à§Û§ä§Ö actions/WidgetView.php §Ú §à§Ò§ß§à§Ó§Ú§ä§Ö §Ü§à§ß§ä§â§à§Ý§Ý§Ö§â.
§³§Ó§à§Û§ã§ä§Ó§à $this->fields_values §ä§Ö§á§Ö§â§î §ã§à§Õ§Ö§â§Ø§Ú§ä §Ù§ß§Ñ§é§Ö§ß§Ú§ñ §Ó§ã§Ö§ç §á§à§Ý§Ö§Û §²§Ñ§ã§ê§Ú§â§Ö§ß§ß§à§Û §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú. §©§Ñ§Ó§Ö§â§ê§Ú§ä§Ö §ß§Ñ§ã§ä§â§à§Û§Ü§å §Ü§à§ß§ä§â§à§Ý§Ý§Ö§â§Ñ, §é§ä§à§Ò§í §à§Ò§Ö§ã§á§Ö§é§Ú§ä§î §á§Ö§â§Ö§Õ§Ñ§é§å §Ü§à§ß§æ§Ú§Ô§å§â§Ñ§è§Ú§Ú §Ú §Ó§í§Ò§â§Ñ§ß§ß§à§Ô§à §Ù§ß§Ñ§é§Ö§ß§Ú§ñ §ï§Ý§Ö§Þ§Ö§ß§ä§Ñ §Õ§Ñ§ß§ß§í§ç §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ö §Ó§Ú§Õ§Ø§Ö§ä§Ñ.
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()
]
]));
}
}
§£§Ñ§Þ §ß§å§Ø§ß§à §ã§à§Ù§Õ§Ñ§ä§î §Ü§à§ß§ä§Ö§Û§ß§Ö§â §Õ§Ý§ñ §Ú§ß§Õ§Ú§Ü§Ñ§ä§à§â§ß§à§Ô§à §Ô§â§Ñ§æ§Ú§Ü§Ñ, §Ü§à§ä§à§â§í§Û §Ó§í §ß§Ñ§â§Ú§ã§å§Ö§ä§Ö §ß§Ñ §ã§Ý§Ö§Õ§å§ð§ë§Ú§ç §ï§ä§Ñ§á§Ñ§ç, §Ú §Ü§à§ß§ä§Ö§Û§ß§Ö§â §Õ§Ý§ñ §à§á§Ú§ã§Ñ§ß§Ú§ñ.
§¹§ä§à§Ò§í §á§Ö§â§Ö§Õ§Ñ§ä§î §Ù§ß§Ñ§é§Ö§ß§Ú§ñ §Ó JavaScript §Ó §Ó§Ú§Õ§Ö JSON-§à§Ò§ì§Ö§Ü§ä§Ñ, §Ú§ã§á§à§Ý§î§Ù§å§Û§ä§Ö §Þ§Ö§ä§à§Õ 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();
§³§à§Ù§Õ§Ñ§Û§ä§Ö §ß§à§Ó§å§ð §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§ð assets §Ó §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§Ú lesson_gauge_chart. §¿§ä§Ñ §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§ñ §Ò§å§Õ§Ö§ä §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î§ã§ñ §Õ§Ý§ñ §ç§â§Ñ§ß§Ö§ß§Ú§ñ JavaScript, CSS §Ú, §Ó§à§Ù§Þ§à§Ø§ß§à, §Õ§â§å§Ô§Ú§ç §â§Ö§ã§å§â§ã§à§Ó, §ä§Ñ§Ü§Ú§ç §Ü§Ñ§Ü §ê§â§Ú§æ§ä§í §Ú§Ý§Ú §Ú§Ù§à§Ò§â§Ñ§Ø§Ö§ß§Ú§ñ.
§¥§Ý§ñ JavaScript, §Ú§ã§á§à§Ý§î§Ù§å§Ö§Þ§à§Ô§à §Ó §á§â§Ö§Õ§ã§ä§Ñ§Ó§Ý§Ö§ß§Ú§Ú §Ó§Ú§Õ§Ø§Ö§ä§Ñ, §ã§à§Ù§Õ§Ñ§Û§ä§Ö §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§ð js §Ó §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§Ú assets.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §æ§Ñ§Û§Ý class.widget.js §Ó §Õ§Ú§â§Ö§Ü§ä§à§â§Ú§Ú assets/js.
§¿§ä§à§ä JavaScript-§Ü§Ý§Ñ§ã§ã §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ò§å§Õ§Ö§ä §â§Ñ§ã§ê§Ú§â§ñ§ä§î §Ò§Ñ§Ù§à§Ó§í§Û JavaScript-§Ü§Ý§Ñ§ã§ã §Ó§ã§Ö§ç §Ó§Ú§Õ§Ø§Ö§ä§à§Ó §á§Ñ§ß§Ö§Ý§Ú - CWidget.
§±§Ñ§ß§Ö§Ý§î §á§à§Ý§Ñ§Ô§Ñ§Ö§ä§ã§ñ §ß§Ñ §á§â§Ñ§Ó§Ú§Ý§î§ß§å§ð §â§Ö§Ñ§Ý§Ú§Ù§Ñ§è§Ú§ð §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ú §á§Ö§â§Ö§Õ§Ñ§Ö§ä §Ý§ð§Ò§å§ð §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ§å§ð §Ú§ß§æ§à§â§Þ§Ñ§è§Ú§ð §Ó§Ú§Õ§Ø§Ö§ä§å, §Ó§í§Ù§í§Ó§Ñ§ñ §ã§à§à§ä§Ó§Ö§ä§ã§ä§Ó§å§ð§ë§Ú§Ö JavaScript-§Þ§Ö§ä§à§Õ§í. §±§Ñ§ß§Ö§Ý§î §ä§Ñ§Ü§Ø§Ö §à§Ø§Ú§Õ§Ñ§Ö§ä, §é§ä§à §Ó§Ú§Õ§Ø§Ö§ä §Ò§å§Õ§Ö§ä §Ô§Ö§ß§Ö§â§Ú§â§à§Ó§Ñ§ä§î §ã§à§Ò§í§ä§Ú§ñ §á§â§Ú §Ó§Ù§Ñ§Ú§Þ§à§Õ§Ö§Û§ã§ä§Ó§Ú§Ú. §´§Ñ§Ü§Ú§Þ §à§Ò§â§Ñ§Ù§à§Þ, §Ü§Ý§Ñ§ã§ã CWidget §ã§à§Õ§Ö§â§Ø§Ú§ä §ß§Ñ§Ò§à§â §Þ§Ö§ä§à§Õ§à§Ó §ã §â§Ö§Ñ§Ý§Ú§Ù§Ñ§è§Ú§Ö§Û §á§à§Ó§Ö§Õ§Ö§ß§Ú§ñ §Ó§Ú§Õ§Ø§Ö§ä§Ñ §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð, §Ü§à§ä§à§â§í§Ö §Þ§à§Ô§å§ä §Ò§í§ä§î §ß§Ñ§ã§ä§â§à§Ö§ß§í §á§å§ä§Ö§Þ §â§Ñ§ã§ê§Ú§â§Ö§ß§Ú§ñ §Ü§Ý§Ñ§ã§ã§Ñ.
§£ §Õ§Ñ§ß§ß§à§Þ §ã§Ý§å§é§Ñ§Ö §ä§â§Ö§Ò§å§Ö§ä§ã§ñ §à§á§â§Ö§Õ§Ö§Ý§Ö§ß§ß§Ñ§ñ §ß§Ñ§ã§ä§â§à§Û§Ü§Ñ, §á§à§ï§ä§à§Þ§å §á§à§Ý§î§Ù§à§Ó§Ñ§ä§Ö§Ý§î§ã§Ü§Ñ§ñ §Ý§à§Ô§Ú§Ü§Ñ §Ò§å§Õ§Ö§ä §â§Ö§Ñ§Ý§Ú§Ù§à§Ó§Ñ§ß§Ñ §Õ§Ý§ñ §ã§Ý§Ö§Õ§å§ð§ë§Ö§Ô§à §á§à§Ó§Ö§Õ§Ö§ß§Ú§ñ §Ó§Ú§Õ§Ø§Ö§ä§Ñ:
§¥§Ý§ñ §Õ§â§å§Ô§Ú§ç §Ñ§ã§á§Ö§Ü§ä§à§Ó §Ó§Ú§Õ§Ø§Ö§ä§Ñ §Ú§ß§Õ§Ú§Ü§Ñ§ä§à§â§ß§à§Ô§à §Ô§â§Ñ§æ§Ú§Ü§Ñ §Ò§å§Õ§Ö§ä §Ú§ã§á§à§Ý§î§Ù§à§Ó§Ñ§ä§î§ã§ñ §â§Ö§Ñ§Ý§Ú§Ù§Ñ§è§Ú§ñ §á§à§Ó§Ö§Õ§Ö§ß§Ú§ñ §Ó§Ú§Õ§Ø§Ö§ä§Ñ §á§à §å§Þ§à§Ý§é§Ñ§ß§Ú§ð. §¹§ä§à§Ò§í §å§Ù§ß§Ñ§ä§î §Ò§à§Ý§î§ê§Ö §à JavaScript-§Þ§Ö§ä§à§Õ§Ñ§ç §Ü§Ý§Ñ§ã§ã§Ñ CWidget, §ã§Þ. JavaScript.
§±§à§ã§Ü§à§Ý§î§Ü§å §ï§ä§à§ä JavaScript §ß§Ö§à§Ò§ç§à§Õ§Ú§Þ §Õ§Ý§ñ §à§ä§à§Ò§â§Ñ§Ø§Ö§ß§Ú§ñ §Ó§Ú§Õ§Ø§Ö§ä§Ñ, §à§ß §Õ§à§Ý§Ø§Ö§ß §Ò§í§ä§î §Ù§Ñ§Ô§â§å§Ø§Ö§ß §Ó§Þ§Ö§ã§ä§Ö §ã§à §ã§ä§â§Ñ§ß§Ú§è§Ö§Û §á§Ñ§ß§Ö§Ý§Ú. §¹§ä§à§Ò§í §Ó§Ü§Ý§ð§é§Ú§ä§î §Ù§Ñ§Ô§â§å§Ù§Ü§å JavaScript, §Ó§Ñ§Þ §á§à§ä§â§Ö§Ò§å§Ö§ä§ã§ñ §à§Ò§ß§à§Ó§Ú§ä§î §á§Ñ§â§Ñ§Þ§Ö§ä§â§í assets/js §Ú js_class §Ó §æ§Ñ§Û§Ý§Ö manifest.json, §Ü§Ñ§Ü §á§à§Ü§Ñ§Ù§Ñ§ß§à §Ó §ê§Ñ§Ô§Ö 10.
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);
}
}
§¬§Ý§Ñ§ã§ã WidgetLessonGaugeChart §ä§Ö§á§Ö§â§î §Ò§å§Õ§Ö§ä §Ñ§Ó§ä§à§Þ§Ñ§ä§Ú§é§Ö§ã§Ü§Ú §Ù§Ñ§Ô§â§å§Ø§Ñ§ä§î§ã§ñ §Ó§Þ§Ö§ã§ä§Ö §ã §á§Ñ§ß§Ö§Ý§î§ð.
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": "Áú»¢¶Ä²©",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
},
"widget": {
"js_class": "WidgetLessonGaugeChart"
},
"assets": {
"js": ["class.widget.js"]
}
}
§£ §ï§ä§à§Þ §â§Ñ§Ù§Õ§Ö§Ý§Ö §Ó§í §å§Ù§ß§Ñ§Ö§ä§Ö, §Ü§Ñ§Ü §Õ§à§Ò§Ñ§Ó§Ý§ñ§ä§î §ã§à§Ò§ã§ä§Ó§Ö§ß§ß§í§Ö §ã§ä§Ú§Ý§Ú CSS, §é§ä§à§Ò§í §Ó§Ú§Õ§Ø§Ö§ä §Ó§í§Ô§Ý§ñ§Õ§Ö§Ý §Ò§à§Ý§Ö§Ö §á§â§Ú§Ó§Ý§Ö§Ü§Ñ§ä§Ö§Ý§î§ß§à.
§¥§Ý§ñ §ã§ä§Ú§Ý§Ö§Û §Ó§Ú§Õ§Ø§Ö§ä§à§Ó §ã§à§Ù§Õ§Ñ§Û§ä§Ö §ß§à§Ó§í§Û §Ü§Ñ§ä§Ñ§Ý§à§Ô css §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö assets.
§³§à§Ù§Õ§Ñ§Û§ä§Ö §æ§Ñ§Û§Ý widget.css §Ó §Ü§Ñ§ä§Ñ§Ý§à§Ô§Ö assets/css. §¹§ä§à§Ò§í §ã§ä§Ú§Ý§Ú§Ù§à§Ó§Ñ§ä§î §ï§Ý§Ö§Þ§Ö§ß§ä§í §Ó§Ú§Õ§Ø§Ö§ä§Ñ, §Ú§ã§á§à§Ý§î§Ù§å§Û§ä§Ö §ã§Ö§Ý§Ö§Ü§ä§à§â div.dashboard-widget-{widget id}. §¹§ä§à§Ò§í §ß§Ñ§ã§ä§â§à§Ú§ä§î CSS §Õ§Ý§ñ §Ó§ã§Ö§Ô§à §Ó§Ú§Õ§Ø§Ö§ä§Ñ, §Ú§ã§á§à§Ý§î§Ù§å§Û§ä§Ö §ã§Ö§Ý§Ö§Ü§ä§à§â form.dashboard-widget-{idget 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;
}
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": "Áú»¢¶Ä²©",
"actions": {
"widget.lesson_gauge_chart.view": {
"class": "WidgetView"
}
},
"widget": {
"js_class": "WidgetLessonGaugeChart"
},
"assets": {
"css": ["widget.css"],
"js": ["class.widget.js"]
}
}