# Основы
Кнопки отображаются на страницах ресурса: индексная страница, страницы с формой (создание / редактирование)
и детальная страница.
Они отвечают за основные действия с элементами и являются компонентами
ActionButton
.
В админ-панели MoonShine есть множество методов позволяющих переопределить у ресурса как отдельную кнопку , так и целую группу .
Более подробная информация о компоненте ActionButton .
Кнопки создания, просмотра, редактирования, удаления и массового удаления вынесены в отдельные классы, чтобы применить к ним все необходимые методы и тем самым исключить дублирование, так как эти кнопки еще используются в HasMany, BelongsToMany и тд.
# Кнопка создания
Метод modifyCreateButton()
позволяет модифицировать кнопку создания нового элемента.
use MoonShine\ActionButtons\ActionButton; protected function modifyCreateButton(ActionButton $button): ActionButton{ return $button->error();}
Метод getCreateButton()
позволяет переопределить кнопку создания нового элемента.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\CreateButton; public function getCreateButton(?string $componentName = null, bool $isAsync = false): ActionButton{ return CreateButton::for( $this, componentName: $componentName, isAsync: $isAsync );}
# Кнопка просмотра
Метод modifyDetailButton()
позволяет модифицировать кнопку детального просмотра элемента.
use MoonShine\ActionButtons\ActionButton; protected function modifyDetailButton(ActionButton $button): ActionButton{ return $button->warning();}
Метод getDetailButton()
позволяет переопределить кнопку детального просмотра элемента.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\DetailButton; public function getDetailButton(bool $isAsync = false): ActionButton{ return DetailButton::for( $this, isAsync: $isAsync );}
# Кнопка редактирования
Метод modifyEditButton()
позволяет модифицировать кнопку редактирования элемента.
use MoonShine\ActionButtons\ActionButton; protected function modifyEditButton(ActionButton $button): ActionButton{ return $button->icon('heroicons.pencil-square');}
Метод getEditButton()
позволяет переопределить кнопку редактирования элемента.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\EditButton; public function getEditButton(?string $componentName = null, bool $isAsync = false): ActionButton{ return EditButton::for( $this, componentName: $componentName, isAsync: $isAsync );}
# Кнопка удаления
Метод modifyDeleteButton()
позволяет модифицировать кнопку удаления элемента.
use MoonShine\ActionButtons\ActionButton; protected function modifyDeleteButton(ActionButton $button): ActionButton{ return $button->icon('heroicons.x-mark');}
Метод getDeleteButton()
позволяет переопределить кнопку удаления элемента.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\DeleteButton; public function getDeleteButton( ?string $componentName = null, string $redirectAfterDelete = '', bool $isAsync = false): ActionButton { return DeleteButton::for( $this, componentName: $componentName, redirectAfterDelete: $isAsync ? '' : $redirectAfterDelete, isAsync: $isAsync );}
# Кнопка массового удаления
Метод modifyMassDeleteButton()
позволяет модифицировать кнопку массового удаления.
use MoonShine\ActionButtons\ActionButton; protected function modifyMassDeleteButton(ActionButton $button): ActionButton{ return $button->icon('heroicons.x-mark');}
Метод getMassDeleteButton()
позволяет переопределить кнопку массового удаления.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\MassDeleteButton; public function getMassDeleteButton( ?string $componentName = null, string $redirectAfterDelete = '', bool $isAsync = false): ActionButton { return MassDeleteButton::for( $this, componentName: $componentName, redirectAfterDelete: $isAsync ? '' : $redirectAfterDelete, isAsync: $isAsync );}
# Кнопка экспорта
Метод modifyExportButton()
позволяет модифицировать кнопку экспорта.
use MoonShine\ActionButtons\ActionButton; protected function modifyExportButton(ActionButton $button): ActionButton{ return $button->secondary();}
Метод getExportButton()
позволяет переопределить кнопку экспорта.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\ExportButton; public function getExportButton(): ActionButton{ return ExportButton::for($this, export: $this->export());}
# Кнопка импорта
Метод modifyImportButton()
позволяет модифицировать кнопку импорта.
use MoonShine\ActionButtons\ActionButton; protected function modifyImportButton(ActionButton $button): ActionButton{ return $button->error();}
Метод getImportButton()
позволяет переопределить кнопку импорта.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\ImportButton; public function getImportButton(): ActionButton{ return ImportButton::for($this, import: $this->import());}
# Кнопка фильтры
Метод modifyFiltersButton()
позволяет модифицировать кнопку фильтры.
use MoonShine\ActionButtons\ActionButton; protected function modifyFiltersButton(ActionButton $button): ActionButton{ return $button->error();}
Метод getFiltersButton()
позволяет переопределить кнопку фильтры.
use MoonShine\ActionButtons\ActionButton;use MoonShine\Buttons\FiltersButton; public function getFiltersButton(): ActionButton{ return FiltersButton::for($this);}
# Кнопки формы
Метод getFormBuilderButtons()
позволяет добавить дополнительные
кнопки
в форму создания или редактирования.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function getFormBuilderButtons(): array { return [ ActionButton::make('Back', fn() => $this->indexPageUrl())->customAttributes(['class' => 'btn-lg']) ]; } //...}
# Кнопки на индексной странице
По умолчанию на индексной странице ресурса модели присутствует только кнопка для создания.
Метод actions()
позволяет добавить дополнительные
кнопки
.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Enums\JsEvent;use MoonShine\Resources\ModelResource;use MoonShine\Support\AlpineJs; class PostResource extends ModelResource{ //... public function actions(): array { return [ ActionButton::make('Refresh', '#') ->dispatchEvent(AlpineJs::event(JsEvent::TABLE_UPDATED, 'index-table')) ]; } //...}
# Кнопки элемента
Метод buttons()
позволяет задать дополнительные кнопки,
которые будут отображаться в индексной таблице, в формах создания и редактирования,
а так же на детальной странице, если они не переопределены для страниц соответствующими методами
indexButton()
,
formButtons()
и
detailButtons()
.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function buttons(): array { return [ ActionButton::make('Link', '/endpoint') ]; } //...}
# Кнопки в индексной таблице
Для добавления кнопок в индексную таблицу используется метод indexButtons()
.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function indexButtons(): array { return [ ActionButton::make( 'Link', fn(Model $item) => '/endpoint?id=' . $item->getKey() ) ]; } //...}
Пример создания кастомных кнопок у индексной таблицы в разделе Recipes
Для массовых действий с элементами, необходимо добавить метод bulk()
public function indexButtons(): array{ return [ ActionButton::make('Link', '/endpoint') ->bulk() ];}
Если требуется полностью изменить все кнопки элемента в индексной таблице,
то необходимо в ресурсе переопределить метод getIndexItemButtons()
.
namespace MoonShine\Resources; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function getIndexItemButtons(): array { return [ ...$this->getIndexButtons(), $this->getDetailButton( isAsync: $this->isAsync() ), $this->getEditButton( isAsync: $this->isAsync() ), $this->getDeleteButton( redirectAfterDelete: $this->redirectAfterDelete(), isAsync: $this->isAsync() ), $this->getMassDeleteButton( redirectAfterDelete: $this->redirectAfterDelete(), isAsync: $this->isAsync() ), ]; } //...}
# Кнопки на странице с формой
Для добавления кнопок страницу с формой используется метод formButtons()
.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function formButtons(): array { return [ ActionButton::make('Link')->method('updateSomething') ]; } //...}
Если требуется полностью изменить все кнопки элемента на странице формы,
то необходимо в ресурсе переопределить метод getFormItemButtons()
.
namespace MoonShine\Resources; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function getFormItemButtons(): array { return [ ...$this->getFormButtons(), $this->getDetailButton(), $this->getDeleteButton( redirectAfterDelete: $this->redirectAfterDelete(), isAsync: false ), ]; } //...}
# Кнопки на детальной странице
Для добавления кнопок на детальной странице используется метод detailButtons()
.
namespace MoonShine\Resources; use MoonShine\ActionButtons\ActionButton; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function detailButtons(): array { return [ ActionButton::make('Link', '/endpoint') ]; } //...}
Если требуется полностью изменить все кнопки элемента на детальной странице,
то необходимо в ресурсе переопределить метод getDetailItemButtons()
.
namespace MoonShine\Resources; use MoonShine\Resources\ModelResource; class PostResource extends ModelResource{ //... public function getDetailItemButtons(): array { return [ ...$this->getDetailButtons(), $this->getEditButton( isAsync: $this->isAsync(), ), $this->getDeleteButton( redirectAfterDelete: $this->redirectAfterDelete(), isAsync: false ), ]; } //...}