В этом уроке вы узнаете, как добавить свой действие (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.
Автор: Ching Sue Hok
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.