Laravel: Как динамически создавать кнопки ссылок в представлении?

Я делаю веб-сайт администрации колледжа, где профессор может войти.

У меня есть панель инструментов, на которой должна быть размещена моя динамически сгенерированная кнопка: (сейчас у нее просто фиктивные кнопки!)

dashboard Сгенерированный этим файлом представления, который мне скоро придется изменить:

<div class="container d-flex flex-column align-items-center justify-content-center">
<h1>IA DASHBOARD</h1>
<br>
    <div class="grid2">
            <a href="{{ url('/subcode/{subcode}') }}" ><button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">SUBCODE 1</button></a>
            <a href="{{ url('/subcode/{subcode}') }}" ><button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">SUBCODE 2</button></a>
            <a href="{{ url('/subcode/{subcode}') }}" ><button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">SUBCODE 3</button></a>
        </div>


Таблицы в базе данных:

  • таблица iamarks содержит данные (информация о студентах и ​​оценки), которые должны отображаться после того, как /subcode/{subcode} сужает их до записей только студентов, которые находятся в классе, назначенном текущему вошедшему в систему профессору.
  • classroom_mappers — это таблица, используемая для сопоставления профессора с классом по предмету. Это гарантирует, что в одном классе есть только один профессор по определенному предмету.

the routes currently in my web.php:

route::get('/ia', 'IAController@show')->middleware('auth');
Route::get('/subcode/{subcode}', 'IAController@showTable')->middleware('auth');

... и это методы внутри моего контроллера:

//shows buttons to the user:
public function show(){
    $subcodes = DB::table('classroom_mappers')
                    ->select('subcode')
                    ->where([['PID','=', auth()->user()->PID]])
                    ->get();
    return view('ia',compact('subcodes'));
}

//when user clicks a button, subcode is to be generated and a table is to be shown:
//it works, I tried it by manually typing in subcode value in URL.

public function showTable($subcode){
    $sem = DB::table('classroom_mappers')
               ->where([['PID','=', auth()->user()->PID],
                        ['subcode','=',$subcode]])
               ->pluck('semester');
    $division = DB::table('classroom_mappers')
                    ->where([['PID','=', auth()->user()->PID],
                             ['semester','=',$sem],
                             ['subcode','=',$subcode]])
                    ->pluck('division');
    $data = DB::table('iamarks')
                ->where([['semester','=',$sem],
                         ['division','=',$division],
                         ['subcode','=',$subcode]])
                ->get();

    return view('subcode',compact('data'));
}


Моя проблема:

Чтобы иметь возможность динамически генерировать {subcode} в URL-адресе, я хочу создать кнопки на панели инструментов, используя данные $subcodes. Контроллер передает $subcodes (массив предметных кодов, которые принадлежат вошедшему в систему профессору), которые должны быть превращены в кнопки из метода show().

Кнопки должны иметь имя {subcode} и при нажатии должны добавлять тот же код темы в URL-адрес, что и {subcode}.

  1. Как использовать $subcodes и сделать кнопки динамическими?
  2. Как сделать так, чтобы кнопки, созданные для одного пользователя, не были видны другому пользователю?

person Community    schedule 27.03.2019    source источник


Ответы (3)


Мне удалось найти решение благодаря Air Petr.

По-видимому, вы не можете вложить синтаксис блейда, такой как {{some_stuff {{ more_stuff }} }}, и он генерирует неправильный php-код. Я изменил решение Air Petr на:

<div class="grid2">
    @foreach ($subcodes as $subcode)
        <a href="<?php echo e(url('/subcode/'.$subcode->subcode));?>">
            <button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">
                <?php
                    echo e($subcode->subcode);
                ?>
            </button>
        </a>
    @endforeach
</div>

Он отлично генерирует кнопки. Кнопки одного пользователя не видны другому, так как я использую ограничение PID в запросе (['PID','=', auth()->user()->PID]).

person Community    schedule 28.03.2019

Передайте массив паролей для просмотра:

$subcodes = []; // Array retrieved from DB
return view('subcode', compact('subcodes'));

И в subcode.blade.php прокрутите каждый субкод:

<div class="grid2">
  @foreach($subcodes as $subcode)
  <a href="{{ url('/subcode/' . $subcode->subcode) }}">
    <button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">SUBCODE {{ $subcode->subcode }}</button>
  </a>
  @endforeach
</div>
person Rehmat    schedule 28.03.2019
comment
Да, это работает. Есть ли способ запретить пользователю «А» доступ к URL-адресу, который должен был быть виден только другому пользователю «Б» и наоборот? Прямо сейчас, когда пользователь «А» входит в систему, он может просто ввести URL-адрес, сгенерированный на кнопке Б, и просмотреть данные Б. - person ; 28.03.2019
comment
Вы должны изучить авторизацию Laravel (ворота и политики). laravel.com/docs/5.8/authorization - person Rehmat; 28.03.2019

  1. Вы можете зацикливать свои коды для создания кнопок. Что-то вроде этого (это для шаблонизатора "blade"):
<div class="grid2">
    @foreach ($subcodes as $subcode)
        <a href="{{ url('/subcode/'.$subcode->subcode) }}" ><button class="btn btn-outline-primary btn-custom-outline-primary btn-custom">{{ $subcode->subcode }}</button></a>
    @endforeach
</div>
  1. Поскольку вы используете ограничение PID в запросе (['PID','=', auth()->user()->PID]), вы получите кнопки для этого конкретного PID. Так что нет проблем.
person Petr    schedule 27.03.2019
comment
Не могли бы вы проверить свой синтаксис? Я получаю синтаксическую ошибку при запуске этого цикла foreach. (Я предполагаю, что это связано с ошибкой копирования и вставки в названии кнопки!) - person ; 28.03.2019
comment
Это ошибка: синтаксическая ошибка, неожиданное '}', ожидание ',' или ')' (представление: resources\views\ia.blade.php) - person ; 28.03.2019
comment
Я понял. Это была ошибка автоматической генерации php в laravel blade. Вложенные {{ {{ }} }} не работают. - person ; 28.03.2019