В предыдущей статье ссылка, было написано как создать распределение прав пользователей и использование в роуторе и шаблоне. В этой стать хочу написать о том как присваивать пользователю права, а так же пример использования плагина 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 я справился, а вот эту никак побороть не могу. Уже сделал как у вас и все равно эта ошибка появляется.
Буду премного благодарен за подсказку.