使用 jQuery post 使用 Laravel 将动态数据传递给引导模式

Posted

技术标签:

【中文标题】使用 jQuery post 使用 Laravel 将动态数据传递给引导模式【英文标题】:Passing dynamic data to bootstrap modal with Laravel using jQuery post 【发布时间】:2017-10-14 03:26:46 【问题描述】:

我正在尝试将动态数据传递给引导模式。我想要做的是通过使用 jQuery 发布请求传递数据 ID。我的观点 users 包含用户列表。当我点击 details 按钮时,我想使用 jquery post 传递 id,然后使用 eloquent,检索每个用户的所有信息。

我的看法

<table class="table">
    <thead class="thead-default">
           <tr>
               <th>No.</th>
               <th>Name</th>
               <th>Actions</th>
           </tr>
           </thead>
           <tbody>
           <?php use App\User;
             $users = \App\User::where('admin',0)->get();
             $i = 1;?>
       @foreach($users as $user)
           <tr id="$user->id">
              <th scope="row">$i</th>
                <td >ucfirst($user->name)." ".ucfirst($user->surname)</td>
                <td>
                  <button class="btn btn-info infoU" 
                   data-toggle="modal" 
                   data-target="#viewUser"
                   data-id="$user->id">
                   <span class="glyphicon glyphicon-file"></span> 
                   Details</button>
                </td>
          </tr>
          <?php $i++ ?>
       @endforeach
                            </tbody>
                        </table>

我的脚本

$(document).ready(function () 

            $(".infoU").click(function (e) 
                $('#pic').attr('src',$(this).attr("data-pic"));
                $currID = $(this).attr("data-id");
                $.post("detail.blade.php", id: $currID, function (data) 
                    $('#user-data').html(data);
                    
                );
            );
        );

我的模态

<div class="modal fade" id="viewUser" role="dialog">
        <div class="modal-dialog" style="min-height: 800px">
            <div class="modal-content">
                <form method="get" action="">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <h2 class="modal-title" style="color: #BC0E91">User Details</h2>
                </div>
                <div class="modal-body">
                    <div id="user-data">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
                </div>
                </form>
            </div>
        </div>
    </div>

detail.blade.php

    <?php

if ($_REQUEST['id'])
    $id = $_REQUEST['id'];
    echo $id;

$usr = \App\User::where('id', $id)->first();

?>

我不知道为什么这不起作用,我不确定是否可以在脚本中传递路由而不是 detail.blade.php。任何帮助深表感谢。谢谢

【问题讨论】:

你需要 paas 路由而不是刀片文件的名称 我已经尝试过了,但我似乎无法让它工作 能否请您也发布您的路由文件和控制器方法? @YasenSlavov 我在下面发布了它们。谢谢 【参考方案1】:

编辑: 我的路线是:

    Route::post('/user/details/id', ['uses' => 'dataController@viewUser', 'as' => 'user.details']);

我的功能是

public function viewUser(Request $request)

    $user = User::where('id', $request->id)->first();
    $langs = Language::all();
    $children = Child::where('user_id', $request->id)->get();
    $usrlang = DB::table('language_user')->where('user_id', $request->id)->get();
    $usrhob = DB::table('user_hobbies')->where('user_id', $request->id)->get();
    $userCh = [];
    $userLang = [];
    $userHobby = [];
    $chLang = [];
    $chHobby = [];

    foreach ($usrlang as $language)
        $userLang[] = $language;
    
    foreach ($usrhob as $hobby)
        $userHobby[] = $hobby;
    
    foreach ($children as $child)
        $userCh[] = $child;
        $languagesCh = DB::table('child_language')->where('child_id', $child->id)->get();
        $hobbiesCh = DB::table('child_language')->where('child_id', $child->id)->get();
        foreach ($languagesCh as $chL)
            $chLang[] = $chL;
        
        foreach ($hobbiesCh as $chH)
            $chHobby[] = $chH;
        
    

    return view('detail', compact('user','langs', 'children', 'usrlang', 'usrhob', 'userCh', 'userLang', 'userHobby', 'chHobby', 'chLang'));

【讨论】:

【参考方案2】:

刀锋与雄辩 首先,不建议在您的刀片视图中进行有说服力的查询,因为这违背了它的最初目的。 正确的做法是说你有这个控制器:

MyController.php

...
use App\User;
class MyController extends Controller
      public function MyMethod()
             $users = User::where('admin',0)->get();
             return view('myview',['users'=>$users]);
      

然后在你的视野中myview.blade.php

<table class="table">
<thead class="thead-default">
       <tr>
           <th>No.</th>
           <th>Name</th>
           <th>Actions</th>
       </tr>
       </thead>
       <tbody>
   @foreach($users as $user)
       <tr id="$user->id">
          <th scope="row">$loop->iteration</th> -- Learn more about it at https://laravel.com/docs/5.4/blade#the-loop-variable --
            <td >ucfirst($user->name)." ".ucfirst($user->surname)</td>
            <td>
              <button class="btn btn-info infoU" 
               data-toggle="modal" 
               data-target="#viewUser"
               data-id="$user->id">
               <span class="glyphicon glyphicon-file"></span> 
               Details</button>
            </td>
      </tr>
   @endforeach
</tbody>
</table>

API 请求

要获取用户详细信息,最好的方法是通过使用控制器的 api 路由来完成。

所以创建一个控制器(或使用现有的)并尝试这个(这里将控制器命名为 UserController 用于演示目的:

public function showUser($id)
     return User::findOrFail($id);

在你的routes/api.php

Route::get('user/id', ['uses' => 'UserController@showUser']);

现在,如果您通过 curl 或 Postman 尝试您的 api 路由,您应该会获取您的数据。


Javascript

然后在你的javascript文件中,你应该把它改成这个

$.get("user/"+$currID, function (data) 
    $('#user-data').html(data);
// For debugging purposes you can add : console.log(data); to see the output of your request
);

备注

您提出的请求detail.blade.php 无法完成,因为该文件不可访问。您应该使用控制器并将您的路线指向它们。 如需进一步阅读,我推荐:Laravel Ajax post/get examples at LaracastsLaravel 5 Ajax tutorial at Kode Blog

【讨论】:

以上是关于使用 jQuery post 使用 Laravel 将动态数据传递给引导模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 将 JSON POST 到 Laravel 4

使用 Laravel 将 jQuery Ajax POST 请求作为 GET 发送

在 Laravel 5.2 中通过 RESTful 资源控制器使用 jQuery Ajax Post 方法将数据存储在数据库中

Laravel 5 分页 + 无限滚动 jQuery

如何在 Laravel 中使用 jQuery ajax 请求自动添加 X-CSRF-TOKEN

从外部站点向 Laravel 发送 POST 请求