Models Resources

Кнопки

Основы

Кнопки отображаются на страницах ресурса: на странице индекса, страницах форм (создание/редактирование) и странице детального просмотра.
Они отвечают за основные действия с элементами и являются компонентами ActionButton.

В админ-панели MoonShine существует множество методов, которые позволяют переопределить ресурс как отдельную кнопку, так и всю группу.

Более подробная информация о компоненте ActionButton.

Кнопки для создания, просмотра, редактирования, удаления и массового удаления размещены в отдельных классах, чтобы применить к ним все необходимые методы и тем самым устранить дублирование, поскольку эти кнопки также используются в HasMany, BelongsToMany и т.д.

Кнопка создания

Модификация

Метод modifyCreateButton() позволяет модифицировать кнопку для создания нового элемента.

use MoonShine\ActionButtons\ActionButton;
 
protected function modifyCreateButton(ActionButton $button): ActionButton
{
return $button->error();
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyCreateButton(ActionButton $button): ActionButton
{
return $button->error();
}

resource_button_create resource_button_create

Переопределение

Метод 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
);
}
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();
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyDetailButton(ActionButton $button): ActionButton
{
return $button->warning();
}

resource_button_detail resource_button_detail

Переопределение

Метод getDetailButton() позволяет переопределить кнопку детального просмотра элемента.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\DetailButton;
 
public function getDetailButton(bool $isAsync = false): ActionButton
{
return DetailButton::for(
$this,
isAsync: $isAsync
);
}
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');
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyEditButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.pencil-square');
}

resource_button_edit resource_button_edit

Переопределение

Метод 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
);
}
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');
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyDeleteButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.x-mark');
}

resource_button_delete resource_button_delete

Переопределение

Метод 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
);
}
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');
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyMassDeleteButton(ActionButton $button): ActionButton
{
return $button->icon('heroicons.x-mark');
}

resource_button_mass_delete resource_button_mass_delete_dark

Переопределение

Метод 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
);
}
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();
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyExportButton(ActionButton $button): ActionButton
{
return $button->secondary();
}

resource_button_export resource_button_export

Переопределение

Метод getExportButton() позволяет переопределить кнопку экспорта.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\ExportButton;
 
public function getExportButton(): ActionButton
{
return ExportButton::for($this, export: $this->export());
}
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();
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyImportButton(ActionButton $button): ActionButton
{
return $button->error();
}

resource_button_import resource_button_import

Переопределение

Метод getImportButton() позволяет переопределить кнопку импорта.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\ImportButton;
 
public function getImportButton(): ActionButton
{
return ImportButton::for($this, import: $this->import());
}
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();
}
use MoonShine\ActionButtons\ActionButton;
 
protected function modifyFiltersButton(ActionButton $button): ActionButton
{
return $button->error();
}

resource_button_filters resource_button_filters

Переопределение

Метод getFiltersButton() позволяет переопределить кнопку фильтров.

use MoonShine\ActionButtons\ActionButton;
use MoonShine\Buttons\FiltersButton;
 
public function getFiltersButton(): ActionButton
{
return FiltersButton::for($this);
}
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'])
];
}
 
//...
}
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'])
];
}
 
//...
}

resource_buttons_form_builder resource_buttons_form_builder_dark

Кнопки на странице индекса

По умолчанию на странице индекса ресурса модели есть только кнопка создания.
Метод 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'))
];
}
 
//...
}
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'))
];
}
 
//...
}

resource_buttons_actions resource_buttons_actions

Кнопки элемента

Метод 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')
];
}
 
//...
}
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()
)
];
}
 
//...
}
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()
)
];
}
 
//...
}

resource_buttons_index resource_buttons_index

Пример создания пользовательских кнопок для таблицы индекса в разделе Рецепты

Для массовых действий с элементами необходимо добавить метод bulk()

public function indexButtons(): array
{
return [
ActionButton::make('Link', '/endpoint')
->bulk()
];
}
public function indexButtons(): array
{
return [
ActionButton::make('Link', '/endpoint')
->bulk()
];
}

resource_buttons_bulk resource_buttons_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()
),
];
}
 
//...
}
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')
];
}
 
//...
}
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')
];
}
 
//...
}

resource_buttons_form resource_buttons_form

Переопределение группы

Если вы хотите полностью изменить все кнопки элемента на странице формы, то необходимо переопределить метод 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
),
];
}
 
//...
}
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')
];
}
 
//...
}
namespace MoonShine\Resources;
 
use MoonShine\ActionButtons\ActionButton;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
//...
 
public function detailButtons(): array
{
return [
ActionButton::make('Link', '/endpoint')
];
}
 
//...
}

resource_buttons_detail resource_buttons_detail

Переопределение группы

Если вы хотите полностью изменить все кнопки элемента на странице детального просмотра, то необходимо переопределить метод 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
),
];
}
 
//...
}
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
),
];
}
 
//...
}