В предыдущей статье ссылка, было написано как создать распределение прав пользователей и использование в роуторе и шаблоне. В этой стать хочу написать о том как присваивать пользователю права, а так же пример использования плагина jsTree для построения дерева прав.
Подключение плагина, используем CDN.
@push('styles')
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
@endpush
@push('scripts')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
@endpush
Получение списка прав.
Роутер.
Route::post('permissions/get', ['as' => 'perms.get', 'uses' => 'PermissionsController@getPermissions']);
Route::post('permissions/set', ['as' => 'perms.set', 'uses' => 'PermissionsController@setPermissions']);
В нужном шаблоне прописываем.
<div class="permissions" data-id="2"></div>
где «data-id» — id пользователя.
<script>
function updatePermissions(id, li) {
var items = [];
/* Формирует массив прав к отправке */
for (var i = 0; i < li.length; i++) {
items.push(parseInt(li[i].id));
}
if (items.length) {
$.ajax({
type: 'post',
url: '{{ url('permissions/set') }}',
data: {
user: id,
data: items
},
success: function (data) {
}
});
}
}
$(document).ready(function () {
/**
* Получение прав пользователя, проходит по всем элементам с классом permissions
**/
$('.permissions').each(function (ind, el) {
var id = $(el).data('id'); // получение id пользователя
$.post('{{ url('permissions/get') }}', {user: id}, function (data) { // запрос на получение прав
/* Построение дерева прав */
$('.permissions').jstree({
'plugins': [
"wholerow",
"checkbox"
],
"checkbox": {
"real_checkboxes": false,
"three_state": true
},
'core': {
"themes": {
"icons": false
},
'data': data
}
})
.on('deselect_node.jstree', function (e, data) {
updatePermissions(id, data.instance.get_selected(true));
})
.on('select_node.jstree', function (e, data) {
updatePermissions(id, data.instance.get_selected(true));
})
.on('ready.jstree', function () {
$(this).jstree("close_all");
});
});
});
})
</script>
deselect_node.jstree — событие при снятии галки
select_node.jstree — событие при выборе
data.instance.get_selected(true) — выбранные права
Функция updatePermissions получает id пользователя и выбранные чекбоксы и отправляет список прав.
Пропущу моменты создание контроллера, просто приложу код который получился.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Permission;
use App\Models\User;
use phpDocumentor\Reflection\Types\Object_;
class PermissionsController extends Controller
{
/**
* Получение списка прав пользователя.
* @param Request $request
* @return array
*/
public function getPermissions(Request $request)
{
$permissions = Permission::select('id', 'parent', 'name', 'display_name', 'description')->get(); // надо бы вынести в модель
$data = [];
$items = [];
$i = 0;
if ($request->get('user')) {
$id = $request->get('user');
$user = User::find($id);
foreach ($user->permissions as $permission) {
$items[] = $permission->id;
}
foreach ($permissions as $permission) {
$state = new Object_(); // испольщование объектов
$state->selected = false; // выбран ли пункт
// $state->opened = false;
$id = $permission->id;
if ($permission->parent == 0) $permission->parent = '#'; // проверка на родителя
if (in_array($id, $items)) $state->selected = true;
$data[$i]['id'] = $id;
$data[$i]['parent'] = $permission->parent;
$data[$i]['text'] = $permission->display_name;
$data[$i]['state'] = $state;
$i++;
}
}
return $data;
}
/**
* Присваивание прав пользователю.
* @param Request $request
* @return int
*/
public function setPermissions(Request $request)
{
$user = User::find($request->get('user'));
$permissions = $request->get('data');
$user->permissions()->detach();
$user->permissions()->attach($permissions);
return 1;
}
}
Здравствуйте. Хотел вас поблагодарить за такую статью, в том числе и за первую часть.
Актуальная или нет еще данная статья, но наткнулся на нее в яндексе. У меня небольшая проблема, при обращению к файлу permissions/get, в логах идет 500 ошибка. С 419 я справился, а вот эту никак побороть не могу. Уже сделал как у вас и все равно эта ошибка появляется.
Буду премного благодарен за подсказку.