Виджеты
Виджеты — это области контента, которые пользователи могут перетаскивать по своей странице для настройки макета. Обычно они могут быть настроены их владельцем для отображения большего/меньшего количества контента и определения того, кто видит виджет. По умолчанию Elgg предоставляет плагины для настройки страницы профиля и панели управления через виджеты.
Содержание
Структура
Чтобы создать виджет, создайте два представления:
widgets/widget/editwidgets/widget/content
content.php отвечает за весь контент, который будет выводиться внутри виджета. Файл edit.php содержит любые дополнительные функции редактирования, которые вы хотите представить пользователю. Вам не нужно добавлять уровень доступа, так как это является частью фреймворка виджетов.
Примечание
Использование HTML-чекбоксов для установки флагов виджета проблематично, потому что, если они не отмечены, ввод чекбокса опускается при отправке формы. Эффект заключается в том, что вы можете только устанавливать, но не очищать флаги. Представление «input/checkboxes» не будет работать правильно в панели редактирования виджета.
Регистрация виджета
После того как вы создали страницы редактирования и просмотра, вам нужно инициализировать виджет плагина.
Самый простой способ сделать это — добавить секцию widgets в ваш конфигурационный файл elgg-plugin.php.
return [
'widgets' => [
'filerepo' => [
'context' => ['profile'],
],
]
];
В качестве альтернативы вы также можете использовать функцию для добавления виджета. Это делается в функции init() плагинов.
// Add generic new file widget
elgg_register_widget_type([
'id' => 'filerepo',
'name' => elgg_echo('widgets:filerepo:name'),
'description' => elgg_echo('widgets:filerepo:description'),
'context' => ['profile'],
]);
Примечание
Единственный обязательный атрибут — это id.
Несколько виджетов
Возможно добавить несколько виджетов для плагина. Вы просто инициализируете столько директорий виджетов, сколько вам нужно.
// Add generic new file widget
elgg_register_widget_type([
'id' => 'filerepo',
'name' => elgg_echo('widgets:filerepo:name'),
'description' => elgg_echo('widgets:filerepo:description'),
'context' => ['profile'],
]);
// Add a second file widget
elgg_register_widget_type([
'id' => 'filerepo2',
'name' => elgg_echo('widgets:filerepo2:name'),
'description' => elgg_echo('widgets:filerepo2:description'),
'context' => ['dashboard'],
]);
// Add a third file widget
elgg_register_widget_type([
'id' => 'filerepo3',
'name' => elgg_echo('widgets:filerepo3:name'),
'description' => elgg_echo('widgets:filerepo3:description'),
'context' => ['profile', 'dashboard'],
]);
Убедитесь, что у вас есть соответствующие директории в структуре представлений вашего плагина:
'Plugin'
/views
/default
/widgets
/filerepo
/edit.php
/content.php
/filerepo2
/edit.php
/content.php
/filerepo3
/edit.php
/content.php
Магическое имя и описание виджета
При регистрации виджета вы можете опустить предоставление имени и описания. Если предоставлен перевод в следующем формате, они будут использованы. Для имени: widgets:<widget_id>:name и для описания widgets:<widget_id>:description. Если вы убедитесь, что эти переводы доступны в файле перевода, у вас будет очень мало работы по регистрации виджета.
elgg_register_widget_type(['id' => 'filerepo']);
Как ограничить, где могут использоваться виджеты
Виджет может указать контекст, в котором он может использоваться (только профиль, только панель управления и т.д.).
elgg_register_widget_type([
'id' => 'filerepo',
'context' => ['profile', 'dashboard', 'other_context'],
]);
Разрешить несколько виджетов на одной странице
По умолчанию вы можете добавить только один виджет одного типа на странице. Если вы хотите больше одинаковых виджетов на странице, вы можете указать это при регистрации виджета:
elgg_register_widget_type([
'id' => 'filerepo',
'multiple' => true,
]);
Регистрация виджетов в событии
Если, например, вы хотите условно регистрировать виджеты, вы также можете использовать событие для регистрации виджетов.
function my_plugin_init() {
elgg_register_event_handler('handlers', 'widgets', 'my_plugin_conditional_widgets_event');
}
function my_plugin_conditional_widgets_event(\Elgg\Event $event) {
if (!elgg_is_active_plugin('file')) {
return;
}
$return = $event->getValue();
$return[] = \Elgg\WidgetDefinition::factory([
'id' => 'filerepo',
]);
return $return;
}
Изменение свойств виджета существующей регистрации виджета
Если, например, вы хотите изменить разрешённые контексты уже зарегистрированного виджета, вы можете сделать это, повторно зарегистрировав виджет с помощью elgg_register_widget_type, так как это переопределит уже существующее определение виджета. Если вы хотите ещё больше контроля, вы также можете использовать событие handlers, widgets для изменения определения виджета.
function my_plugin_init() {
elgg_register_event_handler('handlers', 'widgets', 'my_plugin_change_widget_definition_event');
}
function my_plugin_change_widget_definition_event(\Elgg\Event $event) {
$return = $event->getValue();
foreach ($return as $key => $widget) {
if ($widget->id === 'filerepo') {
$return[$key]->multiple = false;
}
}
return $return;
}
Виджеты по умолчанию
Если ваш плагин использует холст виджетов, вы можете зарегистрировать поддержку виджетов по умолчанию с ядром Elgg, которое обработает всё остальное.
Чтобы объявить поддержку виджетов по умолчанию в вашем плагине, зарегистрируйтесь на событие get_list, default_widgets:
elgg_register_event_handler('get_list', 'default_widgets', 'my_plugin_default_widgets_event');
function my_plugin_default_widgets_event(\Elgg\Event $event) {
$return = $event->getValue();
$return[] = [
'name' => elgg_echo('my_plugin'),
'widget_context' => 'my_plugin',
'widget_columns' => 3,
'event_name' => 'create',
'event_type' => 'user',
'entity_type' => 'user',
'entity_subtype' => ELGG_ENTITIES_ANY_VALUE,
];
return $return;
}
В обработчике события добавьте массив в возвращаемое значение, определяющий вашу поддержку виджетов по умолчанию и когда создавать виджеты по умолчанию. Массивы требуют определения следующих ключей:
name — имя страницы виджетов. Отображается на вкладке в интерфейсе администратора.
widget_context — контекст, из которого вызывается страница виджетов. (Если не установлено явно, это id вашего плагина.)
widget_columns — сколько колонок будет использовать страница виджетов.
event_name — имя события Elgg для создания новых виджетов. Обычно это
create.event_type — тип события Elgg для создания новых виджетов.
entity_type — тип сущности для создания новых виджетов.
entity_subtype — подтип сущности для создания новых виджетов. Может быть ELGG_ENTITIES_ANY_VALUE для создания для всех типов сущностей.
Чтобы виджеты создавались, вам нужно зарегистрировать следующее событие:
elgg_register_event_handler('create:after', 'object', 'Elgg\Widgets\CreateDefaultWidgetsHandler');
Когда объект вызывает событие, соответствующее переданным параметрам event, entity_type и entity_subtype, ядро Elgg найдёт виджеты по умолчанию, соответствующие widget_context, и скопирует их в owner_guid и container_guid этого объекта. Все настройки виджетов также будут скопированы.