backpack

laravel backpack - как добавить кастомный код html

Как добавить кастомный html код на страницу админки laravel backpack, с помощью шаблона blade и как передать в шаблон параметры. И настроить ajax запросы.

Подключаем виджет

use Backpack\CRUD\app\Library\Widget;


Добавляем виджет

Widget::add([
'type' => 'view',
'view' => 'admin.forms.chats.chat',
'value_1' => 'some value',
'value_2' => 'sdfsdf'
])->to('after_content');


Создаем blade шаблон

<h1>Hellow</h1>

@php
$value_1 = $__data['widget']['value_1'];
$value_2 = $__data['widget']['value_2'];
@endphp

<p>{{ $value_1 }}</p>
<p>{{ $value_2 }}</p>


Примечание:
В документации не нашел, как передавать параметры в виджет "view". Нашёл способ благодаря этому коду (в шаблоне blade):

@php
info($__data['widget']);
$value_1 = "sdfsdf";
$sdf = get_defined_vars();
dd($sdf);
@endphp


Далее можно настроить общение с сервером через ajax запросы. 

Создаем контроллер

<?php

namespace App\Http\Controllers\Admin\Ajax;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ChatAjaxController extends Controller
{
public function getData($id, Request $request) {
$user = backpack_user();
return response()->json(['user'=>json_encode($user)]);
}
}


Создаем web роут

use App\Http\Controllers\Admin\Ajax\ChatAjaxController;


Route::controller(ChatAjaxController::class)
->prefix("admin-ajax")
->middleware("web")
->middleware('admin')
->group(
function(){
Route::post('chat/{id}/get-data','getData');

});


Примечание: роут должен быть web, а не api, иначе нельзя будет установить пользователя стандартными middleware web и admin.

Передаем в шаблон blade url и размещаем на странице js файл

Widget::add()->type('script')->content('admin_assets/js/forms/customer.js');

$current_entry_id = $this->crud->getCurrentEntry()->id;

Widget::add([
'type' => 'view',
'view' => 'admin.forms.chats.chat',
'baseUrl' => env("APP_AJAX_URL")."/admin-ajax/chat/$current_entry_id/",
])->to('after_content');


В blade шаблоне устанавливаем url для ajax запросов и устанавливаем csrf токен, для пост запросов.

<h1 class="mt-4">Hellow</h1>

@php
$csrf = csrf_token();
@endphp

<div></div>

<script>
window.csrf = '{{$csrf}}'
window.formActionUrl = '{{ $__data['widget']['baseUrl'] }}';
</script>


В js файле выполняем ajax запрос

document.addEventListener("DOMContentLoaded", (event) => {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': window.csrf
}
});
getData();
});

function getData() {
$.ajax({
url: window.formActionUrl+"get-data",
method: 'post', /* Метод запроса (post или get) */
// dataType: , /* Тип данных в ответе (xml, json, script, html). */
data: {text: 'Текст'}, /* Данные передаваемые в массиве */
success: function(data){ /* функция которая будет выполнена после успешного запроса. */
console.log("success");
console.log(data); /* В переменной data содержится ответ от index.php. */
},
error: function(error, exception) {
console.log("error");
console.log(error);
console.log("exception");
console.log(exception);
}
});
}