В этом уроке вы узнаете, как добавить свой действие (action) в админку Voyager, для управления записями.
Если вы еще новичок в Laravel Voyager, то для начала ознакомьтесь с документацией. Предполагается, что вы уже установили Laravel и Voyager с тестовыми данными и можете войти в административную панель админки.
Запускайте проект командой php artisan serve, заходите по адресу http://127.0.0.1:8000/admin и логиньтесь в систему через дефолтную админскую учетку admin@admin.com/password.
Ниже показана панель управления после входа в систему и выбора «Posts» из бокового меню или просто перехода по адресу http://127.0.0.1:8000/admin/posts.
Мы добавим еще одно действие с именем publish, создав класс действий в app/Actions/PublishAction.php, расширяющий AbstractAction Вояджера.
namespace App\Actions;
use TCG\Voyager\Actions\AbstractAction;
class PublishAction extends AbstractAction
{
public function getTitle()
{
// Название действия, которое отображается в кнопке
// в зависимости от текущего состояния
return $this->data->{'status'}=="PUBLISHED"?'Pending':'Publish';
}
public function getIcon()
{
// Значок действия, который отображается слева от кнопки
// в зависимости от текущего состояния
return $this->data->{'status'}=="PUBLISHED"?'voyager-x':'voyager-external';
}
public function getAttributes()
{
// Класс кнопки действия
return [
'class' => 'btn btn-sm btn-primary pull-left',
];
}
public function shouldActionDisplayOnDataType()
{
// Показывать или скрыть кнопку действия. Отображается только для модели Posts
return $this->dataType->slug == 'posts';
}
public function getDefaultRoute()
{
// URL-адрес для кнопки действия при нажатии кнопки
return route('posts.publish', array("id"=>$this->data->{$this->data->getKeyName()}));
}
}
Чтобы активировать вышеуказанное действие, нам нужно добавить новую строку в app/Providers/AppServiceProvider.php в метод boot().
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use TCG\Voyager\Facades\Voyager;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Включить действие для публикации записей
Voyager::addAction(\App\Actions\PublishAction::class);
}
}
Далее нам нужно добавить маршрут публикаций в routes/web.php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::group(['prefix' => 'admin'], function () {
Route::get('posts/publish','Voyager\PostController@publish')->name('posts.publish');
Voyager::routes();
});
Маршрут указывает на новый app/Http/Voyager/PostController.php расширяющий VoyagerBaseController.
namespace App\Http\Controllers\Voyager;
use TCG\Voyager\Http\Controllers\VoyagerBaseController;
use TCG\Voyager\Models\Post;
class PostController extends VoyagerBaseController
{
public function publish(){
// Получить запись по ID и переключить статус
// с PUBLISHED (Опубликовано) на PENDING (Ожидание) и наоборот.
$post = Post::where('id', \request("id"))->first();
$post->status = $post->status=="PENDING"?"PUBLISHED":"PENDING";
$post->save();
return redirect(route('voyager.posts.index'));
}
}
Теперь вы можете публиковать и отменять публикации в админке в разделе Posts прямым действием.
Спасибо за внимание! Весь код на Github.