Права в Laravel 5. Часть 2.

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

 

Один комментарий к “Права в Laravel 5. Часть 2.”

  1. Здравствуйте. Хотел вас поблагодарить за такую статью, в том числе и за первую часть.
    Актуальная или нет еще данная статья, но наткнулся на нее в яндексе. У меня небольшая проблема, при обращению к файлу permissions/get, в логах идет 500 ошибка. С 419 я справился, а вот эту никак побороть не могу. Уже сделал как у вас и все равно эта ошибка появляется.
    Буду премного благодарен за подсказку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.