Как в тулбар одного компонента добавить кнопку, которую будет обрабатывать другой компонент Joomla 5?
Для примера добавим в компонент стандартных материалов (com_content) кнопку из компонента очистки кэша (com_cache).
Как работают стандартные кнопки
Нажатия кнопок тулбара обычно обрабатываются компонентом, на странице которого мы находимся. Вот HTML-код кнопки «Создать» в стандартном компоненте материалов:
<joomla-toolbar-button id="toolbar-new" task="article.add">
<button class="button-new btn btn-success" type="button">
<span class="icon-new" aria-hidden="true"></span>
Создать
</button>
</joomla-toolbar-button>
Как вы видите, у тега joomla-toolbar-button
есть аттрибут task
, со значением article.add
. Когда вы нажимаете на подобную кнопку, Joomla находит на странице форму adminForm
, устанавливает в её поле с именем task
значение из атрибута и отправляет форму. По значению поля task
мы понимаем что будет вызван метод add
контроллера article
. А на компонент com_content
нам указывает атрибут action
формы.
Значит нам нужна отдельная форма
Создадим системный плагин и добавим в конец страницы форму с id 'cacheAdminForm'
:
/**
* @return void
*
* @since 1.0.0
*/
public function onAfterRender(): void
{
$app = $this->getApplication();
if (!$app->isClient('administrator'))
{
return;
}
$option = $app->getInput()->getCmd('option', '');
$view = $app->getInput()->getCmd('view', '');
if ($option == 'com_content' && $view == 'articles')
{
$buffer = $app->getBody();
$buffer .= '<form'
. ' action="' . Route::_('index.php?option=com_cache') . '"'
. ' method="post"'
. ' name="cacheAdminForm"'
. ' id="cacheAdminForm"'
. '>'
. '<input type="hidden" name="task" value="" />'
. HTMLHelper::_('form.token')
. '</form>';
$app->setBody($buffer);
}
}
А теперь добавим на тулбар нашу кнопку:
/**
* @param Event $event Event
*
* @return void
*
* @throws Exception
*
* @since 1.0.0
*
* @noinspection PhpUnused
* @noinspection PhpUnusedParameterInspection
*/
public function onBeforeRender(Event $event): void
{
$app = $this->getApplication();
if (!$app->isClient('administrator'))
{
return;
}
$option = $app->getInput()->getCmd('option', '');
$view = $app->getInput()->getCmd('view', '');
if ($option == 'com_content' && $view == 'articles')
{
/** @var Document $document */
$document = $app->getDocument();
/** @var Toolbar $toolbar */
$toolbar = $document->getToolbar();
// Метод standardButton добавляет кнопку и возвращает её
$toolbar->standardButton(
'cachedeleteall',
'PLG_SYSTEM_WISHBOXTOOLBARBUTTONTODIFFERENTCOMPONENT_BUTTON_TO_DIFFERENT_COMPONENT',
'deleteAll'
)
->icon('icon-remove')
->listCheck(false)
->buttonClass('button-remove btn btn-primary')
->form('cacheAdminForm');
}
}
Обратите внимание что в кнопку мы передали id формы 'cacheAdminForm'
.