[comment]: # aside:1

[comment]: # ({0a11f1a9-f7477fb0})
# Konfiguracja

Konfiguracja widżetu jest częścią modułu widżetu, która pozwala użytkownikowi definiować ustawienia widżetu dla [prezentacja](/prezentacja). Ta strona opisuje klasy, które mogą być użyte do stworzenia formularza konfiguracji widżetu z niestandardowymi polami.

[comment]: # ({/0a11f1a9-f7477fb0})

[comment]: # ({68bbd84a-adf59b13})
### Widżet

Główna klasa widżetu, rozszerzająca bazową klasę wszystkich widżetów pulpitu - *CWidget*.
Wymagana do nadpisania domyślnego zachowania widżetu.


Klasa Widget powinna znajdować się w katalogu głównym widżetu (na przykład, zabbix/ui/modules/my_custom_widget).

Przykład Widget.php

```php
<?php

namespace Modules\MyCustomWidget;

use Zabbix\Core\CWidget;

class Widget extends CWidget {

    public const MY_CONSTANT = 0;

    public function getTranslationStrings(): array {
        return [
            'class.widget.js' => [
                'No data' => _('No data')
            ]
        ];
    }
}
```

[comment]: # ({/68bbd84a-adf59b13})

[comment]: # ({e5aad37e-1ff26877})
### WidgetForm

Klasa *WidgetForm* rozszerza domyślną klasę *CWidgetForm* i zawiera zestaw pól [*CWidgetField*](#cwidgetfield),
które są wymagane do zdefiniowania struktury przechowywania konfiguracji widgetu w bazie danych oraz obsługi walidacji danych wejściowych.

Klasa *WidgetForm* powinna znajdować się w katalogu *includes*.
Jeśli klasa ma inną nazwę, należy ją określić w parametrze [*widget/form_class*](/devel/modules/file_structure/manifest#widget) w pliku *manifest.json*.

**Przykład pliku includes/WidgetForm.php**

```php
<?php

namespace Modules\MyCustomWidget\Includes;

use Modules\MyCustomWidget\Widget;

use Zabbix\Widgets\{
    CWidgetField,
    CWidgetForm
};

use Zabbix\Widgets\Fields\{
    CWidgetFieldMultiSelectItem,
    CWidgetFieldTextBox,
    CWidgetFieldColor
};


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 CWidgetFieldTextBox('description', _('Description'))
            )
            ->addField(
                (new CWidgetFieldColor('chart_color', _('Color')))->setDefault('FF0000')
            );
    }
}
```

[comment]: # ({/e5aad37e-1ff26877})

[comment]: # ({3ca7a0e4-61f06fc3})
### CWidgetFormView

Klasa *CWidgetFormView* jest wymagana do określenia logiki prezentacji pól zdefiniowanych w klasie *WidgetForm*,
określając ich wygląd i zachowanie podczas renderowania w widoku konfiguracji.

Klasa *CWidgetFormView* obsługuje następujące metody:

-   *addField()* - przyjmuje jako parametr instancję klasy *CWidgetFieldView*;
    każda klasa [*CWidgetField*](#cwidgetfield) ma odpowiadającą jej klasę *CWidgetFieldView* do użycia w widoku konfiguracji widgetu.
-   *addFieldset()* - przyjmuje instancję klasy *CWidgetFieldsGroupView*, która łączy pola w zwijany kontener.
-   *addFieldsGroup()* - przyjmuje instancję *CWidgetFormFieldsetCollapsibleView*, która wizualnie (za pomocą obramowania) łączy pola w grupę.
-   *includeJsFile()* - umożliwia dodanie pliku JavaScript do widoku konfiguracji widgetu.
-   *addJavaScript()* - umożliwia dodanie osadzonego kodu JavaScript, który zostanie wykonany natychmiast po załadowaniu widoku konfiguracji widgetu.

Klasa *CWidgetFormView* powinna znajdować się w katalogu *views*.

**Przykład views/widget.edit.php**

```php
<?php

/**
 * Widok formularza mojego niestandardowego widgetu.
 *
 * @var CView $this
 * @var array $data
 */

use Modules\MyCustomWidget\Includes\WidgetForm;

(new CWidgetFormView($data))
    ->addField(
        (new CWidgetFieldMultiSelectItemView($data['fields']['itemid']))->setPopupParameter('numeric', true)
    )
    ->addFieldset(
        (new CWidgetFormFieldsetCollapsibleView(_('Konfiguracja zaawansowana')))
            ->addField(
                new CWidgetFieldTextBoxView($data['fields']['description'])
            )
            ->addField(
                new CWidgetFieldColorView($data['fields']['chart_color'])
            )
    )
    ->includeJsFile('widget.edit.js.php')
    ->addJavaScript('my_custom_widget_form.init('.json_encode([
        'color_palette' => WidgetForm::DEFAULT_COLOR_PALETTE
    ]).');')
    ->show();
```

[comment]: # ({/3ca7a0e4-61f06fc3})

[comment]: # ({d7c94075-d1c62429})
### JavaScript

Klasa JavaScript może być użyta do dodania dynamicznego zachowania i interaktywności do widoku konfiguracji widżetu.
Na przykład, można zainicjować selektor kolorów, zdefiniowany w klasie [*CWidgetFormView*](#cwidgetformview).

Klasa JavaScript powinna zostać załadowana wraz z formularzem, dlatego należy odwołać się do niej w klasie [*CWidgetFormView*](#cwidgetformview) za pomocą metod *includeJsFile()* i *addJavaScript()*.

W poniższym przykładzie instancja klasy singleton jest natychmiast tworzona i przechowywana pod nazwą *window.my_custom_widget_form*.
W ten sposób otwarcie formularza po raz drugi spowoduje ponowne utworzenie instancji.

Klasa JavaScript powinna znajdować się w katalogu *views*.

**views/widget.edit.js.php example**

```php
<?php

use Modules\MyCustomWidget\Widget;

?>

window.my_custom_widget_form = new class {

    init({color_palette}) {
        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'); });
        }
    }
};
```

[comment]: # ({/d7c94075-d1c62429})

[comment]: # ({e70cf9fd-708ecb6b})
### CWidgetField

Klasa *CWidgetField* jest klasą bazową, po której dziedziczą wszystkie klasy pól formularza (*CWidgetFieldCheckBox*, *CWidgetFieldTextArea*, *CWidgetFieldRadioButtonList* itd.).
Klasy rozszerzające *CWidgetField* odpowiadają za odbieranie, zapisywanie i walidację wartości konfiguracji widżetu.

Dostępne są następujące klasy *CWidgetField*.

|CWidgetField class|Database field type|Description|
|----|----|----------|
|*CWidgetFieldCheckBox*|int32|Pojedyncze pole wyboru.|
|*CWidgetFieldCheckBoxList*|array of int32|Wiele pól wyboru w ramach jednego pola konfiguracji.|
|*CWidgetFieldColor*|string|Pole wyboru koloru.|
|*CWidgetFieldDatePicker*|string|Pole wyboru daty.|
|*CWidgetFieldIntegerBox*|int32|Pole do wprowadzania liczby całkowitej. Może służyć do konfigurowania wartości minimalnej i maksymalnej.|
|*CWidgetFieldLatLng*|string|Pole tekstowe umożliwiające wprowadzenie oddzielonych przecinkami wartości: szerokości geograficznej, długości geograficznej i poziomu powiększenia mapy.|
|*CWidgetFieldMultiSelect*|-|Klasa bazowa dla pól wielokrotnego wyboru, rozszerzana przez wszystkie klasy *CWidgetFieldMultiSelect\**.|
|*CWidgetFieldMultiSelectAction*|ID|Pole wielokrotnego wyboru do wybierania działań z listy działań zdefiniowanych w *Alerts → Actions*.|
|*CWidgetFieldMultiSelectGraph*|ID|Pole wielokrotnego wyboru do wybierania niestandardowych wykresów.|
|*CWidgetFieldMultiSelectGraphPrototype*|ID|Pole wielokrotnego wyboru do wybierania prototypów niestandardowych wykresów.|
|*CWidgetFieldMultiSelectGroup*|ID|Pole wielokrotnego wyboru do wybierania grup hostów.|
|*CWidgetFieldMultiSelectHost*|ID|Pole wielokrotnego wyboru do wybierania hostów.|
|*CWidgetFieldMultiSelectHostInventory*|array of int32|Pole wielokrotnego wyboru do wybierania pól inwentarza hosta.|
|*CWidgetFieldMultiSelectItem*|ID|Pole wielokrotnego wyboru do wybierania pozycji.|
|*CWidgetFieldMultiSelectItemPrototype*|ID|Pole wielokrotnego wyboru do wybierania prototypów pozycji.|
|*CWidgetFieldMultiSelectMap*|ID|Pole wielokrotnego wyboru do wybierania map.|
|*CWidgetFieldMultiSelectMediaType*|ID|Pole wielokrotnego wyboru do wybierania typów mediów.|
|*CWidgetFieldMultiSelectOverrideHost*|ID|Pole wielokrotnego wyboru do wybierania źródła danych dla hostów z dashboardu lub innego widżetu.|
|*CWidgetFieldMultiSelectService*|ID|Pole wielokrotnego wyboru do wybierania usług.|
|*CWidgetFieldMultiSelectSla*|ID|Pole wielokrotnego wyboru do wybierania SLA.|
|*CWidgetFieldMultiSelectUser*|ID|Pole wielokrotnego wyboru do wybierania użytkowników.|
|*CWidgetFieldNavTree*|array of (multiple mixed)|Przechowuje strukturę drzewa nawigacji map do użycia w widżecie *Map navigation tree*.|
|*CWidgetFieldNumericBox*|string|Pole do wprowadzania liczby zmiennoprzecinkowej.|
|*CWidgetFieldPatternSelect*|-|Klasa bazowa dla pól wyboru wzorców, rozszerzana przez wszystkie klasy *CWidgetPatternSelect\**.|
|*CWidgetFieldPatternSelectHost*|string|Pole wielokrotnego wyboru do wybierania hostów. Obsługuje wzorce nazw hostów.|
|*CWidgetFieldPatternSelectItem*|string|Pole wielokrotnego wyboru do wybierania pozycji. Obsługuje wzorce nazw pozycji.|
|*CWidgetFieldRadioButtonList*|int32|Grupa przycisków radiowych składająca się z jednego lub większej liczby przycisków radiowych.|
|*CWidgetFieldRangeControl*|int32|Suwak do wybierania wartości typu całkowitego.|
|*CWidgetFieldReference*|string|Przechowuje unikalny identyfikator tego widżetu na dashboardzie; używany do komunikacji między widżetami.|
|*CWidgetFieldSelect*|int32|Rozwijane pole wyboru.|
|*CWidgetFieldSeverities*|array of int32|*CWidgetFieldCheckBoxList* z ustawionymi domyślnie poziomami ważności wyzwalaczy.|
|*CWidgetFieldSparkline*|array of (multiple mixed)|Umożliwia konfigurację wykresu sparkline.|
|*CWidgetFieldTags*|array of (string, int32, string)|Umożliwia konfigurację jednego lub większej liczby wierszy filtra tagów.|
|*CWidgetFieldTextArea*|string|Pole tekstowe do wprowadzania wielowierszowego tekstu.|
|*CWidgetFieldTextBox*|string|Pole tekstowe do wprowadzania jednoliniowego tekstu.|
|*CWidgetFieldThresholds*|array of (string, string)|Umożliwia konfigurację par kolorów i liczb.|
|*CWidgetFieldTimePeriod*|array of string|Pole wyboru okresu czasu.|
|*CWidgetFieldTimeZone*|string|Rozwijana lista stref czasowych.|
|*CWidgetFieldUrl*|string|Pole tekstowe umożliwiające wprowadzanie adresów URL.|

::: noteclassic
Maksymalna długość pól `int32` wynosi 10 znaków, pól `ID` 20 znaków, a pól `string` 2048 znaków.
W przypadku typów złożonych (np. `array of (string, int32, string)`) limit dotyczy każdego elementu osobno.
Ograniczenia długości specyficzne dla danego pola można ustawić za pomocą metod takich jak `setMaxLength()`.
:::

[comment]: # ({/e70cf9fd-708ecb6b})
