Разрешения Laravel Entrust отключают ввод текста - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь использовать разрешение, при котором, если у него есть пользователь, он сможет редактировать текстовое поле в форме, в противном случае поле будет отключено.

Я знаю, что могу добавить отключенный параметр здесь {{ Form::text('name', ['disabled' => 'disabled']) }}

Что я должен сделать, чтобы достичь того, что мне нужно, без необходимости писать HTML-форму дважды? Вот моя форма:

 @if (Auth::user()->can(\Permission::EDIT_INFO))
        <tr>
            <th>Name 1:</th>
                <td>
                {{ Form::text('name') }}
                </td>
            <th>Name 2:</th>
                <td>
                {{ Form::text('name_ar') }}
                </td>
        </tr>
 @endif

Другими словами: (if иметь разрешение показывать нормальную форму else показывать ту же форму, но отключенные поля)

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Это не самый лучший способ сделать это, но он будет работать:

{{ Auth::user()->can(\Permission::EDIT_INFO) ? Form::text('name') : Form::text('name', ['disabled' => 'disabled']) }}

Не забудьте также проверить серверную часть для авторизации пользователя.

Я бы посоветовал вам ознакомиться со стандартными документами по авторизации, так как у него такая же кривая обучения, как и у большинства сторонних решений, но в конечном итоге он работает лучше / проще: https://laravel.com/docs/5.6/authorization

0 голосов
/ 03 мая 2018

Прямым решением было бы использование троичного оператора :

<tr>
    <th>Name 1:</th>
    <td>{{ Form::text('name', Auth::user()->can(\Permission::EDIT_INFO) ? [] : ['disabled' => 'disabled']) }}</td>
    <th>Name 2:</th>
    <td>{{ Form::text('name_ar', Auth::user()->can(\Permission::EDIT_INFO) ? [] : ['disabled' => 'disabled']) }}</td>
</tr>

При этом будет использоваться массив параметров [] в случае Auth::user()->can(\Permission::EDIT_INFO) и массив ['disabled' => 'disabled'], если у пользователя нет разрешения.

Но могут быть и более приятные способы сделать это, потому что это решение также будет создавать дублированный код, если у вас есть другие параметры, то есть когда [] не пустой, а что-то вроде ['aria-label' => 'abc', 'maxlength' => 15].


Edit:

Вы также можете создать вспомогательный метод, который упрощает использование различных типов параметров в зависимости от наличия разрешения.

Если вы впервые определяете собственный вспомогательный метод, вам понадобится место для его размещения. Для этого вам нужен простой .php файл, поэтому app/helpers.php вполне подойдет. Чтобы загрузить вспомогательные методы, вам нужно будет в какой-то момент включить файл - я рекомендую сделать это в методе AppServiceProvider::register():

/**
 * Register any application services.
 */
public function register()
{
    require_once app_path().'/helpers.php';

    // other code ...
}

Тогда вам нужно будет определить ваш вспомогательный метод в файле app/helpers.php:

<?php

if (!function_exists('merge_if_has_permission')) {
    function merge_if_has_permission(string $permission, array $base, array $optional): array
    {
        if (\Auth::user()->can($permission)) {
            return array_merge($base, $optional);
        }
        return $base;
    }
}

Затем вы можете использовать эту функцию во внешнем интерфейсе:

<td>{{ Form::text('name', merge_if_has_permission(\Permission::EDIT_INFO, ['maxlength' => 15], ['disabled' => 'disabled'])) }}</td>

Это добавит ['maxlength' => 15, 'disabled' => 'disabled'] к полю формы, если авторизованный в данный момент пользователь имеет разрешение Permission::EDIT_INFO. Если у пользователя нет этого разрешения, он добавит только ['maxlength' => 15].

Поскольку это в точности противоположно тому, что вы спрашиваете (поскольку вы хотели, чтобы поле было отключено, если у пользователя нет разрешения), вам, скорее всего, понадобится другой метод с именем merge_if_hasnt_permission() - но я думаю, вы найдете твой путь туда сам сейчас.

Более короткие имена методов имеют смысл уменьшить код ... но я подумал, что довольно сложно описать, что функция делает с меньшим количеством слов.

Кстати, вы также можете использовать этот метод для условного переопределения свойств массива $base.

...