Laravel 5 数据表,用控制器函数初始化 table
Laravel 5 dataTables, initialise table with controller function
我正在尝试创建一个用户数据表,其中每一行都有一个下拉子行,其中包含用户权限的复选框。因此,'super' 管理员可以非常动态地点击用户并在 table.
中分配他们的权限
首先,不确定这是否是个好主意,请随时提出更好的方法。也许每行一个简单的弹出模式会更容易,但现在我认为这是一种很酷的方式,所以我继续。
尝试使用 AJAX 初始化数据表,但目前让我感到困惑。
PermissionsController.php
public function grid()
{
//retrieve data from models
$data['data'] = collect([ 'admins' => $admins, 'roles' => $roles ]);
return $data;
}
routes.php
Route::get('user-permissions', 'PermissionsController@grid');
permissions.blade
<table class="table table-striped" id="admins_table" >
<thead>
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>Email</th>
<th>Phone</th>
</tr>
</thead>
</table>
js
var oTable = $('#admins_table').dataTable( {
"sDom": "<'row'<'col-md-6'l><'col-md-6'f>r>t<'row'<'col-md-12'p i>>",
"aaSorting": [],
"oLanguage": {
"sLengthMenu": "_MENU_ ",
"sInfo": "Showing <b>_START_ to _END_</b> of _TOTAL_ entries"
},
"ajax": {
//here's where I'm trying to grab the data
"url": "http://example.app/user-permissions",
"dataSrc": "data"
},
"columns": [
{ "data": "last_name" },
{ "data": "first_name" },
{ "data": "email" },
{ "data": "phone" }
]
});
Ajax
{
"data":
{
"admins":
[{
"id":31,
"email":"example@gmail.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Gary",
"last_name":"Barlow",
"roles":[{
"id":1,"slug":"admin"
}]
}],
"roles":
[
{"id":3,"slug":"admin","name":"Admin"},
{"id":7,"slug":"accounts","name":"Accounts"},
{"id":8,"slug":"sales","name":"Sales"},
{"id":9,"slug":"superAdmin","name":"SuperAdmin"}
]
}
}
"admin" 对象包含所有通过的管理员及其已分配的角色。这些应该显示为已在子行中勾选。
"roles" 对象将包含所有当前可用的角色,以允许分配其他角色。基本上,这标识了需要出现的复选框的数量。
我已经抽象出其余部分,因为上面的内容与初始化有关。非常感谢任何帮助。
尝试使用 AJAX 我除了 "No data available in table" 什么也得不到,如果我在浏览器中输入路由路径,我会得到 JSON 对象输出。
我不确定应该如何调用路由。
url: '/user-permissions',
dataSrc: 'data.admins',
success: function (data) {
console.log(data);
}
以上内容是否足够?我真的不想调用整个 url。我什至添加了一个成功函数来尝试获取数据的控制台输出,但仍然没有。
- 正确的
dataSrc
引用应该是 data.admins
- 你错过了示例数据中的
admins[].phone
吗?
据我了解,您想要显示填充有 data.roles
的 <select>
,显示当前的 data.admins[].roles[0].id
?
您可以通过在 dataSrc
回调(或 xhr.dt
事件中)收集 data.roles
并为角色列使用 render
方法来做到这一点:
<table class="table table-striped" id="admins_table" >
<thead>
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>Email</th>
<th>Phone</th>
<th>role</th>
</tr>
</thead>
</table>
js,只有重要的
var roles,
var oTable = $('#admins_table').dataTable( {
"ajax": {
"url": "http://example.app/user-permissions",
"dataSrc" : function(json) {
roles = json.data.roles;
return json.data.admins;
}
},
"columns": [
{ "data": "last_name" },
{ "data": "first_name" },
{ "data": "email" },
{ "data": "phone" },
{ "data": "roles",
"render": function(data, type, row) {
var select = '<select>',
role = data[0].id;
for (var i=0;i<roles.length;i++) {
select+='<option value="'+roles[i].id+'"';
if (role == roles[i].id) select+=' selected';
select+='>'+roles[i].name+'</option>';
}
select+='</select>';
return select;
}
}
]
});
产生这个 table :
使用此数据:
{ "data": {
"admins": [{
"id":31,
"email":"example@gmail.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Gary",
"last_name":"Barlow",
"phone" : "123",
"roles":[{
"id":8,"slug":"sales"
}]
},{
"id":32,
"email":"example@yahoo.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Bary",
"last_name":"Garlow",
"phone" : "321",
"roles":[{
"id":7,"slug":"accounts"
}]
}],
"roles": [
{"id":3,"slug":"admin","name":"Admin"},
{"id":7,"slug":"accounts","name":"Accounts"},
{"id":8,"slug":"sales","name":"Sales"},
{"id":9,"slug":"superAdmin","name":"SuperAdmin"}
]
}
}
自从我问这个问题以来已经有一段时间了,我想我应该澄清一下我是如何解决这个问题的。首先我确保所有数据表脚本都是最新版本,不确定这是否是一个问题,但我使用了一些过时的东西。
在表格初始化中,ajax 调用变得简单:
ajax: "/user-permissions"
大部分艰苦的工作都进入了通过上述路线调用的控制器功能:
public function grid()
{
$admins = // get users with relevant roles e.g. ($user->load('roles'))
return Datatables::of($admins)->make(true)
}
我正在尝试创建一个用户数据表,其中每一行都有一个下拉子行,其中包含用户权限的复选框。因此,'super' 管理员可以非常动态地点击用户并在 table.
中分配他们的权限首先,不确定这是否是个好主意,请随时提出更好的方法。也许每行一个简单的弹出模式会更容易,但现在我认为这是一种很酷的方式,所以我继续。
尝试使用 AJAX 初始化数据表,但目前让我感到困惑。
PermissionsController.php
public function grid()
{
//retrieve data from models
$data['data'] = collect([ 'admins' => $admins, 'roles' => $roles ]);
return $data;
}
routes.php
Route::get('user-permissions', 'PermissionsController@grid');
permissions.blade
<table class="table table-striped" id="admins_table" >
<thead>
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>Email</th>
<th>Phone</th>
</tr>
</thead>
</table>
js
var oTable = $('#admins_table').dataTable( {
"sDom": "<'row'<'col-md-6'l><'col-md-6'f>r>t<'row'<'col-md-12'p i>>",
"aaSorting": [],
"oLanguage": {
"sLengthMenu": "_MENU_ ",
"sInfo": "Showing <b>_START_ to _END_</b> of _TOTAL_ entries"
},
"ajax": {
//here's where I'm trying to grab the data
"url": "http://example.app/user-permissions",
"dataSrc": "data"
},
"columns": [
{ "data": "last_name" },
{ "data": "first_name" },
{ "data": "email" },
{ "data": "phone" }
]
});
Ajax
{
"data":
{
"admins":
[{
"id":31,
"email":"example@gmail.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Gary",
"last_name":"Barlow",
"roles":[{
"id":1,"slug":"admin"
}]
}],
"roles":
[
{"id":3,"slug":"admin","name":"Admin"},
{"id":7,"slug":"accounts","name":"Accounts"},
{"id":8,"slug":"sales","name":"Sales"},
{"id":9,"slug":"superAdmin","name":"SuperAdmin"}
]
}
}
"admin" 对象包含所有通过的管理员及其已分配的角色。这些应该显示为已在子行中勾选。 "roles" 对象将包含所有当前可用的角色,以允许分配其他角色。基本上,这标识了需要出现的复选框的数量。
我已经抽象出其余部分,因为上面的内容与初始化有关。非常感谢任何帮助。
尝试使用 AJAX 我除了 "No data available in table" 什么也得不到,如果我在浏览器中输入路由路径,我会得到 JSON 对象输出。
我不确定应该如何调用路由。
url: '/user-permissions',
dataSrc: 'data.admins',
success: function (data) {
console.log(data);
}
以上内容是否足够?我真的不想调用整个 url。我什至添加了一个成功函数来尝试获取数据的控制台输出,但仍然没有。
- 正确的
dataSrc
引用应该是data.admins
- 你错过了示例数据中的
admins[].phone
吗?
据我了解,您想要显示填充有 data.roles
的 <select>
,显示当前的 data.admins[].roles[0].id
?
您可以通过在 dataSrc
回调(或 xhr.dt
事件中)收集 data.roles
并为角色列使用 render
方法来做到这一点:
<table class="table table-striped" id="admins_table" >
<thead>
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>Email</th>
<th>Phone</th>
<th>role</th>
</tr>
</thead>
</table>
js,只有重要的
var roles,
var oTable = $('#admins_table').dataTable( {
"ajax": {
"url": "http://example.app/user-permissions",
"dataSrc" : function(json) {
roles = json.data.roles;
return json.data.admins;
}
},
"columns": [
{ "data": "last_name" },
{ "data": "first_name" },
{ "data": "email" },
{ "data": "phone" },
{ "data": "roles",
"render": function(data, type, row) {
var select = '<select>',
role = data[0].id;
for (var i=0;i<roles.length;i++) {
select+='<option value="'+roles[i].id+'"';
if (role == roles[i].id) select+=' selected';
select+='>'+roles[i].name+'</option>';
}
select+='</select>';
return select;
}
}
]
});
产生这个 table :
使用此数据:
{ "data": {
"admins": [{
"id":31,
"email":"example@gmail.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Gary",
"last_name":"Barlow",
"phone" : "123",
"roles":[{
"id":8,"slug":"sales"
}]
},{
"id":32,
"email":"example@yahoo.com",
"last_login":"2015-07-27 09:50:50",
"first_name":"Bary",
"last_name":"Garlow",
"phone" : "321",
"roles":[{
"id":7,"slug":"accounts"
}]
}],
"roles": [
{"id":3,"slug":"admin","name":"Admin"},
{"id":7,"slug":"accounts","name":"Accounts"},
{"id":8,"slug":"sales","name":"Sales"},
{"id":9,"slug":"superAdmin","name":"SuperAdmin"}
]
}
}
自从我问这个问题以来已经有一段时间了,我想我应该澄清一下我是如何解决这个问题的。首先我确保所有数据表脚本都是最新版本,不确定这是否是一个问题,但我使用了一些过时的东西。
在表格初始化中,ajax 调用变得简单:
ajax: "/user-permissions"
大部分艰苦的工作都进入了通过上述路线调用的控制器功能:
public function grid()
{
$admins = // get users with relevant roles e.g. ($user->load('roles'))
return Datatables::of($admins)->make(true)
}