Виджеты
Виджеты - это интерфейсы, которые могут быть инициализированы динамически самим администратором на любой странице.
Грубо говоря, это интерфейс с логикой, который может быть встроен на абсолютно любую страницу
Инициализация виджета
Чтобы инициализировать виджет в системе необходимо вызывать функцию widgets()->register()
внутри ServiceProvider'a (или Extension'a):
public function register(\DI\ContainerBuilder $containerBuilder): void
{
// Тут мы создаем экземпляр класса нашего виджета
widgets()->register(new ServersWidget);
}
Удаление виджета
Так же, необходимо удалить виджет при деинсталяции модуля. Это можно сделать в классе Installer
:
<?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 - это режим, при котором виджет будет подгружен уже после полной загрузки страницы. Это обеспечивает более быструю загрузку пользователям, если виджет требует много ресурсов для загрузки.
В режиме Lazyload важно определить placeholder()
для создания блоков skeleton
или другого.
Для установки параметра Lazyload достаточно обозначить его в __construct()
:
public function __construct()
{
// Мы ставим режим ленивой загрузки виджету
$this->setLazyLoad(true);
}
Перезагрузка виджета
Так же, в Lazyload виджеты встроена функция автоматической перезагрузки у пользователей. Это полезно, если вам нужно выводить актуальну ю информацию из виджета.
При перезагрузке будет вызываться метод render()
каждый цикл.
Пример установки времени перезагрузки:
public function __construct()
{
// Перезагрузка будет каждые 5 секунд
$this->setReloadTime(5000);
}