Как в тулбар одного компонента добавить кнопку, которую будет обрабатывать другой компонент 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'.
