【问题标题】:Laravel: How to create link buttons on a view dynamically?Laravel:如何在视图上动态创建链接按钮?
【发布时间】:2019-03-27 14:52:50
【问题描述】:

我正在创建一个教授可以登录的大学管理网站。

我有一个仪表板,应该放置动态生成的按钮:(现在它只有虚拟按钮!)

由此视图文件生成,我将很快对其进行修改:

<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 是用于将教授映射到具有主题的教室的表格。它可确保一间教室只有一名教授负责特定学科。

目前在我的 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'));
}


我的问题:

为了能够在 URL 中动态生成 {subcode},我想使用数据 $subcodes 在仪表板中创建按钮。控制器移交$subcodes(属于已登录教授的主题代码数组),这些代码将通过show()方法制成按钮。

按钮的名称应为 {subcode},单击时应在 URL 中附加与 {subcode} 相同的主题代码。

  1. 如何使用$subcodes 并动态制作按钮?
  2. 如何确保为一位用户制作的按钮对另一位用户不可见?

【问题讨论】:

    标签: laravel laravel-blade laravel-5.8


    【解决方案1】:

    感谢 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])。

    【讨论】:

      【解决方案2】:

      传递密码数组以查看:

      $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>
      

      【讨论】:

      • 是的,行得通。有没有办法可以限制用户“A”访问只应该对另一个用户“B”可见的 URL,反之亦然?现在,当用户'A'登录时,他只需输入在B的按钮中生成的URL,就可以看到B的数据。
      • 您应该查看 Laravel 授权(Gates 和策略)。 laravel.com/docs/5.8/authorization
      【解决方案3】:
      1. 您可以循环代码来创建按钮。像这样的东西(它用于“刀片”模板引擎):
      <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()-&gt;user()-&gt;PID]),您将获得该特定 PID 的按钮。所以没有问题。

      【讨论】:

      • 你能检查一下你的语法吗?运行该 foreach 循环时出现语法错误。 (我猜这是由于按钮名称的复制粘贴错误!)
      • 这是错误:“语法错误,意外'}',期待','或')'(查看:resources\views\ia.blade.php)”
      • 我明白了。这是 laravel Blade 的自动 php 生成错误。嵌套的 {{ {{ }} }} 不起作用。
      猜你喜欢
      • 1970-01-01
      • 2017-05-23
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多