Áú»¢¶Ä²©

±Ê°ù±ð²õ±ð²Ô³Ù²¹³¦¾±¨®

La presentaci¨® del giny forma part del m¨°dul del giny que rep les dades segons la ³¦´Ç²Ô´Ú¾±²µ³Ü°ù²¹³¦¾±¨® i les mostra al tauler en un contenidor. El contenidor de presentaci¨® de ginys es pot col¡¤locar i canviar la mida.

La vista del giny consta de dues parts opcionals:

Accions de giny

La majoria de les accions del giny empren i/o amplien la classe de controlador predeterminada CControllerDashboardWidgetView. Aquesta classe cont¨¦ m¨¨todes per a operacions amb ginys en el mode de visualitzaci¨®.

El fitxer font de la classe s'ha de posar al directori actions i s'ha d'especificar com a classe d'acci¨® al manifest.json a la ²õ±ð³¦³¦¾±¨® actions/widget.{id}.view/class.

Per exemple, s'implementa aix¨ª l'ampliaci¨® de la classe per defecte al giny natiu de Áú»¢¶Ä²© Informaci¨® del sistema:

class WidgetView extends CControllerDashboardWidgetView {
       
           protected function doAction(): void {
               $this->setResponse(new CControllerResponseData([
                   'name' => $this->getInput('name', $this->widget->getDefaultName()),
                   'system_info' => CSystemInfoHelper::getData(),
                   'info_type' => $this->fields_values['info_type'],
                   'user_type' => CWebUser::getType(),
                   'user' => [
                       'debug_mode' => $this->getDebugMode()
                   ]
               ]));
           }
       }

Vista de giny

La vista de presentaci¨® del giny es construeix amb la classe CWidgetView.

(new CWidgetView($data))
           ->addItem(
               new CTag('h1', true, $data['name'])
           )
           ->show();

El fitxer de visualitzaci¨® del giny s'ha d'ubicar al directori vistes. Si el fitxer t¨¦ un nom predeterminat widget.view.php, no cal registrar-lo al manifest.json. Si el fitxer t¨¦ un nom diferent, especifiqueu-lo a actions/widget.{id}.view/view ²õ±ð³¦³¦¾±¨® de manifest.json.

JavaScript

La classe JavaScript s'encarrega de determinar el comportament del giny, com ara actualitzar les dades del giny, canviar la mida del giny, mostrar elements del giny, etc.

Totes les operacions de JavaScript empren i/o amplien la classe b¨¤sica de JavaScript de tots els ginys del tauler - CWidget. La classe CWidget cont¨¦ un conjunt de m¨¨todes amb la implementaci¨® predeterminada per al comportament del giny. Depenent de la complexitat del giny, aquests m¨¨todes es poden utilitzar tal qual o ampliar.

La classe CWidget cont¨¦ els m¨¨todes seg¨¹ents:

  • M¨¨todes que defineixen el cicle de vida del giny: onInitialize(), onStart(), onActivate(), onDeactivate(), onDestroy(), onEdit().
  • M¨¨todes que gestionen l'actualitzaci¨® i la visualitzaci¨® de dades del giny: promiseUpdate(), getUpdateRequestData(), processUpdateResponse(response), processUpdateErrorResponse(error), setContents(response).
  • M¨¨todes que modifiquen l'aparen?a del giny: onResize(), hasPadding().

La classe JavaScript s'ha d'ubicar al directori assets/js i s'ha d'especificar al par¨¤metre assets (assets/js) al dossier manifest.json.

M¨¨todes de cicle de vida

Els m¨¨todes de cicle de vida del giny s¨®n cridats pel tauler de control i en diferents etapes del cicle de vida del giny durant la seva exist¨¨ncia dins del tauler.

El m¨¨tode onInitialize() defineix l'estat inicial i/o els valors del giny, sense fer cap HTML ni manipulaci¨® de dades. Aquest m¨¨tode es crida quan es crea un giny, normalment afegint-lo a una p¨¤gina del tauler o carregant la p¨¤gina del tauler.

Exemple:

onInitialize() {
           this._time_offset = 0;
           this._interval_id = null;
           this._clock_type = CWidgetClock.TYPE_ANALOG;
           this._time_zone = null;
           this._show_seconds = true;
           this._time_format = 0;
           this._tzone_format = 0;
           this._show = [];
           this._has_contents = false;
           this._is_enabled = true;
       }

El m¨¨tode onStart() defineix l'estructura HTML del giny, sense fer cap manipulaci¨® de dades. Aquest m¨¨tode es crida abans de la primera activaci¨® de la p¨¤gina del tauler, ¨¦s a dir, abans que el tauler i els seus ginys es mostrin completament a l'usuari.

Exemple:

onStart() {
           this._events.resize = () => {
               const padding = 25;
               const header_height = this._view_mode === ZBX_WIDGET_VIEW_MODE_HIDDEN_HEADER
                   ? 0
                   : this._header.offsetHeight;
       
               this._target.style.setProperty(
                   '--content-height',
                   `${this._cell_height * this._pos.height - padding * 2 - header_height}px`
               );
           }
       }

El m¨¨tode () fa que el giny sigui actiu i interactiu activant les escoltes d'esdeveniments personalitzats (per respondre a les accions de l'usuari) i iniciar el cicle d'actualitzaci¨® del giny (per mantindre el seu contingut actualitzat). Aquest m¨¨tode es crida quan s'activa la p¨¤gina del tauler, ¨¦s a dir, quan es mostra completament a la interf¨ªcie d'usuari.

Tingueu en compte que abans que es cridi el m¨¨tode (), el giny es troba en estat inactiu (WIDGET_STATE_INACTIVE). Despr¨¦s de la crida correcta, el giny passa a estat actiu (WIDGET_STATE_ACTIVE). En estat actiu, el giny respon, escolta els esdeveniments, actualitza el seu contingut peri¨°dicament i pot interactuar amb altres ginys.

Exemple:

onActivate() {
            this._startClock();
       
            this._resize_observer = new ResizeObserver(this._events.resize);
            this._resize_observer.observe(this._target);
       }

El m¨¨tode onDeactivate() atura qualsevol activitat i interactivitat del giny desactivant les escoltes d'esdeveniments personalitzats i aturant el cicle d'actualitzaci¨® del giny. Aquest m¨¨tode es crida quan es desactiva la p¨¤gina del tauler de control, ¨¦s a dir, es desactiva o s'esborra, o quan s'esborra el giny de la p¨¤gina del tauler.

Tingueu en compte que abans que es cridi el m¨¨tode _doDeactivate(), el giny es troba en l'estat actiu (WIDGET_STATE_ACTIVE). Despr¨¦s de la invocaci¨® correcta, el giny passa a l'estat inactiu (WIDGET_STATE_INACTIVE).

Exemple:

onDeactivate() {
           this._stopClock();
           this._resize_observer.disconnect();
       }

El m¨¨tode onDestroy() fa tasques de neteja abans que el giny s'esborri del tauler, que pot incloure el tancament d'una connexi¨® de base de dades que es va establir durant la inicialitzaci¨® del giny, netejar dades temporals per alliberar mem¨°ria del sistema i evitar fuites de recursos, anul¡¤lar el registre dels oients d'esdeveniments relacionats amb el canvi de mida dels esdeveniments o els clics de botons per evitar la gesti¨® d'esdeveniments innecessaris i les fuites de mem¨°ria, etc. Aquest m¨¨tode es crida quan s'esborra el giny o la p¨¤gina del tauler que el cont¨¦.

Tingueu en compte que abans que s'invoqui el m¨¨tode onDestroy(), un giny en estat actiu (WIDGET_STATE_ACTIVE) sempre es desactiva amb la invocaci¨® del m¨¨tode onDeactivate().

Exemple:

onDestroy() {
       
           if (this._filter_widget) {
               this._filter_widget.off(CWidgetMap.WIDGET_NAVTREE_EVENT_MARK, this._events.mark);
               this._filter_widget.off(CWidgetMap.WIDGET_NAVTREE_EVENT_SELECT, this._events.select);
           }
       }

El m¨¨tode onEdit() defineix l'aparen?a i el comportament del giny quan el tauler de control passa al mode d'edici¨®. Aquest m¨¨tode s'invoca quan el tauler de control passa al mode d'edici¨®, normalment quan un usuari interacciona amb el bot¨® Editar del giny o el bot¨® Editar el tauler del tauler.

Exemple:

onEdit() {
               this._deactivateGraph();
       }
M¨¨todes d'actualitzaci¨®

Els m¨¨todes del proc¨¦s d'actualitzaci¨® del giny s¨®n els responsables de recuperar les dades actualitzades del servidor Áú»¢¶Ä²© o qualsevol altra font de dades i mostrar-les al giny.

El m¨¨tode promiseUpdate() inicia el proc¨¦s d'actualitzaci¨® de dades recuperant dades, normalment mitjan?ant peticions web o crides a l'API. Aquest m¨¨tode es crida quan es mostra una p¨¤gina del tauler i peri¨°dicament despr¨¦s, fins que la p¨¤gina del tauler es canvia a una altra p¨¤gina del tauler.

El seg¨¹ent ¨¦s un exemple de la implementaci¨® predeterminada del m¨¨tode promiseUpdate() emprat per la majoria dels ginys nadius de Áú»¢¶Ä²©. A la implementaci¨® per defecte, el m¨¨tode promiseUpdate() segueix un patr¨® general per recuperar dades del servidor. Crea un nou objecte Curl amb l'URL adequat i els par¨¤metres de sol¡¤licitud, envia una petici¨® POST mitjan?ant el m¨¨tode fetch() amb l'objecte de dades constru?t pel m¨¨tode getUpdateRequestData(), i processa la resposta (o una resposta d'error) amb processUpdateResponse(response) o processUpdateErrorResponse(error). Aquesta implementaci¨® ¨¦s adequada per a la majoria dels ginys, ja que normalment recuperen dades en format JSON i les gestionen de manera coherent.

promiseUpdate() {
           const curl = new Curl('zabbix.php');
       
           curl.setArgument('action', `widget.${this._type}.view`);
       
           return fetch(curl.getUrl(), {
               method: 'POST',
               headers: {'Content-Type': 'application/json'},
               body: JSON.stringify(this.getUpdateRequestData()),
               signal: this._update_abort_controller.signal
           })
               .then((response) => response.json())
               .then((response) => {
                   if ('error' in response) {
                       this.processUpdateErrorResponse(response.error);
       
                       return;
                   }
       
                   this.processUpdateResponse(response);
               });
           }

El m¨¨tode getUpdateRequestData() prepara les dades de petici¨® del servidor per actualitzar el giny recopilant diverses propietats i els seus valors corresponents (identificadors de giny, par¨¤metres de filtre, intervals de temps, etc.) a partir de l'estat i la ³¦´Ç²Ô´Ú¾±²µ³Ü°ù²¹³¦¾±¨® del giny, i construir un objecte de dades que representi la informaci¨® necess¨¤ria per ser enviada al servidor en la petici¨® d'actualitzaci¨®. Aquest m¨¨tode nom¨¦s s'invoca com a part del m¨¨tode predeterminat promiseUpdate(), ¨¦s a dir, durant el proc¨¦s d'actualitzaci¨® del giny.

Implementaci¨® per defecte:

getUpdateRequestData() {
           return {
               templateid: this._dashboard.templateid ?? undefined,
               dashboardid: this._dashboard.dashboardid ?? undefined,
               widgetid: this._widgetid ?? undefined,
               name: this._name !== '' ? this._name : undefined,
               fields: Object.keys(this._fields).length > 0 ? this._fields : undefined,
               view_mode: this._view_mode,
               edit_mode: this._is_edit_mode ? 1 : 0,
               dynamic_hostid: this._dashboard.templateid !== null || this.supportsDynamicHosts()
                   ? (this._dynamic_hostid ?? undefined)
                   : undefined,
               ...this._contents_size
           };
       }

El m¨¨tode processUpdateResponse(response) gestiona la resposta rebuda del servidor despr¨¦s de la petici¨® d'actualitzaci¨® i, si el proc¨¦s d'actualitzaci¨® ha tingut ¨¨xit i sense errors, esborra les dades del giny i mostra continguts nous amb el m¨¨tode setContents(). Aquest m¨¨tode nom¨¦s s'invoca com a part del m¨¨tode predeterminat promiseUpdate(), ¨¦s a dir, durant el proc¨¦s d'actualitzaci¨® del giny.

Implementaci¨® per defecte:

processUpdateResponse(response) {
           this._setHeaderName(response.name);
       
           this._updateMessages(response.messages);
           this._updateInfo(response.info);
           this._updateDebug(response.debug);
       
           this.setContents(response);
       }

El m¨¨tode processUpdateErrorResponse(error) gestiona la resposta rebuda del servidor despr¨¦s de la petici¨® d'actualitzaci¨® si la resposta ¨¦s un error i mostra el missatge d'error. Aquest m¨¨tode nom¨¦s s'invoca com a part del m¨¨tode predeterminat promiseUpdate(), ¨¦s a dir, durant el proc¨¦s d'actualitzaci¨® del giny.

Implementaci¨® per defecte:

processUpdateErrorResponse(error) {
           this._updateMessages(error.messages, error.title);
       }

El m¨¨tode setContents(response) mostra el contingut del giny si el proc¨¦s d'actualitzaci¨® del giny ha estat satisfactori i sense errors, que pot incloure la manipulaci¨® d'elements DOM, l'actualitzaci¨® de components de la interf¨ªcie d'usuari, l'aplicaci¨® d'estils o format, etc. Aquest m¨¨tode nom¨¦s es crida com a part del m¨¨tode predeterminat processUpdateResponse(response), ¨¦s a dir, durant el proc¨¦s de gesti¨® de la resposta rebuda del servidor despr¨¦s de la petici¨® d'actualitzaci¨®.

Implementaci¨® per defecte:

setContents(response) {
           this._body.innerHTML = response.body ?? '';
       }
M¨¨todes de modificaci¨® de la presentaci¨®

Els m¨¨todes de modificaci¨® de la presentaci¨® del giny s¨®n els responsables de modificar l'aparen?a del giny.

El m¨¨tode onResize() ¨¦s responsable d'ajustar els elements visuals del giny per adaptar-se a la nova mida del giny, que pot incloure reordenar elements, ajustar les dimensions dels elements, truncar el text, implementar c¨¤rrega lenta per millorar la capacitat de resposta durant el canvi de mida, etc. Aquest m¨¨tode es crida quan es canvia la mida del giny, per exemple, quan l'usuari canvia la mida manualment del giny o quan es canvia la mida de la finestra del navegador.

Exemple:

onResize() {
           if (this.getState() === WIDGET_STATE_ACTIVE) {
               this._startUpdating();
           }
       }

El m¨¨tode hasPadding() ¨¦s responsable d'aplicar un farcit vertical de 8 p¨ªxels a la part inferior del giny quan ¨¦s configurat per mostrar la seva cap?alera. Aquest m¨¨tode es crida quan s'activa la p¨¤gina del tauler, ¨¦s a dir, quan es converteix en la p¨¤gina que es mostra a la interf¨ªcie d'usuari.

Implementaci¨® per defecte:

hasPadding() {
           return this.getViewMode !== ZBX_WIDGET_VIEW_MODE_HIDDEN_HEADER;
       }

Per a alguns ginys, ¨¦s necessari emprar tot l'espai de ginys disponible per configurar, per exemple, un color de fons personalitzat. El seg¨¹ent ¨¦s un exemple de la implementaci¨® del m¨¨tode hasPadding() emprat al giny Item_value nadiu de Áú»¢¶Ä²©.

hasPadding() {
           return false;
       }