2015-10-05 38 views
2

我想創建一個dataTable的用戶,其中每行有一個下拉子行包含用戶權限的複選框。因此,非常動態的「超級」管理員可以點擊用戶並在表格中分配他們的權限。Laravel 5 dataTables,初始化表與控制器功能

首先,不確定這是否是一個好主意,所以請隨時提出一個更好的方法。也許每行一個簡單的彈出模式會更容易,但現在我已經認定這將是一個很酷的方式,所以我繼續前進。

嘗試使用AJAX初始化dataTable,但目前我難住了。

PermissionsController.php

public function grid() 
{ 
    //retrieve data from models 
    $data['data'] = collect([ 'admins' => $admins, 'roles' => $roles ]); 

     return $data; 
} 

routes.php文件

Route::get('user-permissions', '[email protected]'); 

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" } 
    ] 
}); 

阿賈克斯

{ 
"data": 
    { 
    "admins": 
    [{ 
     "id":31, 
     "email":"[email protected]", 
     "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"} 
    ] 
    } 
} 

「管理」 對象包括所傳遞和他們已經分配的角色的所有管理員。這些應該顯示爲已在子行內打勾。 「角色」對象將包含所有可用於允許分配其他角色的當前角色。基本上,這確定了需要出現的複選框的數量。

由於上述內容與初始化有關,我已經將其餘部分抽象出來。非常感謝任何幫助。


嘗試使用AJAX我得到什麼,但「沒有在表中的可用數據」的時候,如果我在瀏覽器中鍵入路徑路徑我得到的JSON對象輸出。

我不知道我應該如何調用路線。

url: '/user-permissions', 
dataSrc: 'data.admins', 
success: function (data) { 
    console.log(data); 
} 

以上就足夠了嗎?我真的不想打電話給整個網址。我甚至添加了一個成功函數來嘗試獲取數據的控制檯輸出,但仍然沒有任何結果。

回答

0

自從我問這個問題以來我已經有一段時間了,我想我會澄清我做了什麼來解決問題。首先,我確保所有數據表腳本都是最新版本,不確定這是否是一個問題,但我正在使用一些過時的東西。

的表中初始化Ajax調用簡直就成了:

ajax: "/user-permissions" 

大部分的辛勤工作進入被調用通過上述途徑控制器功能:

public function grid() 
{ 
    $admins = // get users with relevant roles e.g. ($user->load('roles')) 

    return Datatables::of($admins)->make(true) 
} 
1
  1. 正確dataSrc參考將data.admins
  2. 你錯過的樣品數據admins[].phone

據我瞭解,你想顯示與data.roles一個<select>稀少,顯示當前data.admins[].roles[0].id

您可以通過在dataSrc回調收集data.roles做到這一點(或在xhr.dt事件),並使用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; 
      } 
     } 
    ] 
}); 

生產此表: enter image description here

與此數據:

{ "data": { 
    "admins": [{ 
     "id":31, 
     "email":"[email protected]", 
     "last_login":"2015-07-27 09:50:50", 
     "first_name":"Gary", 
     "last_name":"Barlow", 
     "phone" : "123", 
     "roles":[{ 
      "id":8,"slug":"sales" 
     }] 
    },{ 
     "id":32, 
     "email":"[email protected]", 
     "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"} 
    ] 
    } 
} 
+1

@davidkonrad嗨。首先,感謝您的回覆!是的,我確實錯過了示例數據中的電話屬性。 我的目標實際上並不是有一個選擇框,因爲它將用戶限制爲一個角色,而是有一個包含多個複選框的子行。 子行將通過圖標切換到每行最左側。很像demo'd [這裏](https://datatables.net/examples/api/row_details.html)。 我會與你的建議一起去看看它是否解決表初始化。 –

+1

我在Ajax部分之後添加了一段,以更好地解釋信息的用途。 –

+0

@LukeVincent,我應該嘗試做一個小例子嗎?我可以用子行來做到這一點,但如果你自己想出來,這會好得多。樂於幫助。 – davidkonrad