Перейти к основному содержимому

Виджеты

Виджеты - это интерфейсы, которые могут быть инициализированы динамически самим администратором на любой странице.

Грубо говоря, это интерфейс с логикой, который может быть встроен на абсолютно любую страницу

Инициализация виджета

Чтобы инициализировать виджет в системе необходимо вызывать функцию widgets()->register() внутри ServiceProvider'a (или Extension'a):

public function register(\DI\ContainerBuilder $containerBuilder): void
{
// Тут мы создаем экземпляр класса нашего виджета
widgets()->register(new ServersWidget);
}

Удаление виджета

Так же, необходимо удалить виджет при деинсталяции модуля. Это можно сделать в классе Installer:

Installer.php
<?php

class Installer extends AbstractModuleInstaller
{
/** Метод install() */

public function uninstall(\Flute\Core\Modules\ModuleInformation &$module) : bool
{
// Тут мы удаляем наш виджет из системы, давая в аргумент путь до класса
widgets()->unregister(ServersWidget::class);

return true;
}
}

Структура виджета

У виджетов нет таковой готовой структуры. Самое главное, чтобы виджет имел под собой класс, отвечающий за его инициализацию в системе. Пример:

<?php

namespace Flute\Modules\Monitoring\Widgets;

use Flute\Core\Database\Entities\Server;
use Flute\Core\Widgets\AbstractWidget;
use Flute\Modules\Monitoring\database\Entities\TestEntity;
use Flute\Modules\Monitoring\Services\ServersMonitorService;
use Nette\Utils\Html;

class ServersWidget extends AbstractWidget
{
/**
* Конструктор, в котором вы можете добавить загрузку ассетов виджета и пр.
*/
public function __construct()
{
$this->setAssets([
mm('Monitoring', 'Resources/assets/js/monitoring.js'),
mm('Monitoring', 'Resources/assets/scss/monitoring.scss'),
]);
}

/**
* Функция рендера виджета
*/
public function render(array $data = []): string
{
return render('Modules/Monitoring/Resources/Views/servers');
}

/**
* Только для режима LazyLoad!
*
* Функция показывающая HTML placeholder'а виджета. Может ничего не возвращать
*/
public function placeholder(array $settingValues = []): string
{
$row = Html::el('div');
$row->addClass('row gx-4 gy-4');

$col = Html::el('div');
$col->addClass('col-md-4');

$placeHolder = Html::el('div');
$placeHolder->addClass('skeleton');
$placeHolder->style('height', '200px');

$col->addHtml($placeHolder);

$row->addHtml($col);
$row->addHtml($col);
$row->addHtml($col);

return $row->toHtml();
}

/**
* Функция отдающая название виджета
*/
public function getName(): string
{
return 'Monitoring widget';
}
}

Настройки виджета

Flute позволяет создавать настройки у виджетов, и автоматически генерировать под них интерфейс. Для того, чтобы создать настройки, достаточно написать:

public function getDefaultSettings(): array
{
$setting = new WidgetSettings;
$setting->name = 'type';
$setting->description = 'some.phrase';
$setting->type = 'select';
$setting->setValue([
'items' => [
'default',
'table'
]
]);

return [
'type' => $setting
];
}

В этом примере рассмотрен пример создания настроек с выбором. Все настройки будут переданы в качестве аргумента в функции placeholder и register. Типы настроек могут отличаться. Чтобы узнать какие еще типы существуют, смотрите в модель WidgetSettings и в уже реализованные модули.

Прочее

В виджете существует множество других функций для своей настройки, но вот основные:

Установка изображения

Это изображение будет видно в модальном окне редактора страниц:

public function __construct()
{
$this->setImage('путь_до_картинки.webp');
}

Установка режима LazyLoad

Режим Lazyload - это режим, при котором виджет будет подгружен уже после полной загрузки страницы. Это обеспечивает более быструю загрузку пользователям, если виджет требует много ресурсов для загрузки.

warning

В режиме Lazyload важно определить placeholder() для создания блоков skeleton или другого.

Для установки параметра Lazyload достаточно обозначить его в __construct():

public function __construct()
{
// Мы ставим режим ленивой загрузки виджету
$this->setLazyLoad(true);
}

Перезагрузка виджета

Так же, в Lazyload виджеты встроена функция автоматической перезагрузки у пользователей. Это полезно, если вам нужно выводить актуальную информацию из виджета.

примечание

При перезагрузке будет вызываться метод render() каждый цикл.

Пример установки времени перезагрузки:

public function __construct()
{
// Перезагрузка будет каждые 5 секунд
$this->setReloadTime(5000);
}