2015-04-22 83 views
1

形式複選框存儲數據明白了,我掙扎在Laravel 5.解決獲取和使用Laravel 5

所以基本上我所試圖做的是呼籲所有角色的用戶具有成形式的問題涉及編輯用戶。其中一部分是先循環訪問角色,然後用複選框顯示所有角色。

然後它應該填充所有的用戶角色,即如果用戶具有管理員和VIP的角色,那麼應該勾選這些框。如果檢查其他角色或者實際上未選中,則需要將更改傳回控制器進行更新。

所以我有一個用戶 - 角色 - 用戶 - 角色模型和關聯的表。主軸設置爲一個(用戶)至許多(角色)。所有這一切都工作得很好。

我所說的編輯用戶表單使用以下控制器內:

public function edit($id) 
{ 
    // 
    $user = User::with('roles')->findOrFail($id); 

    return view('admin.users.edit')->with('user', $user); 
} 

不來煩你了整個表格,除了這部分,我一直在擺弄所有這些工作正常。

<div class="form-group"> 
    @foreach (App\Http\Models\Role::all() as $role) 
     {!! Form::Label('name', $role->name) !!} 
     {!! Form::checkbox('role[]', $role->id, @if($user->hasRole($role 
     ->id) true @endif, ['class' => 'form-control']) !!} 
    @endforeach 
</div> 

這確實會返回表中的所有角色,每個角色都有複選框。

我已經將ID設置爲role-> id以確保我可以將它帶回控制器。我正在努力處理的有問題的元素是根據用戶當前角色設置值,這會返回錯誤。

@if($user->hasRole($role->id) true @endif 

在我的用戶模型中,我有這樣的「hasRole」方法,以便了解用戶是否具有角色。

public function hasRole($id) 
{ 
    foreach ($this->roles as $role) 
    { 
     if ($role->id == $id) return true; 
    } 

    return false; 

} 

我不確定是否有什麼非常明顯的我在這裏失蹤或如果我從完全錯誤的方式看它。我還沒有設置角色的同步,在這個階段,我只是試圖讓角色正確填充,然後以這種方式更新用戶記錄。

感謝您的任何幫助。

解決方案

好了,這裏是我應該已經進入。

{!! Form::checkbox('userrole[]', $role->id, $user->hasRole($role->id),  
['class' => 'field']) !!} 

這創造了一個數組與UserRole的用戶角色[]和在foreach走進去,檢查用戶hasRole以及是否設置複選框爲true。

請記住,設置的方式是,當我調用$ user-> hasRole時,它訪問User類中的hasRole方法。

$ role-> id確保數組知道我們所指的角色表中的哪個角色。

編輯記錄的用戶可以選中附加或取消勾選勾選的角色,數組在提交時會進行更改。由於該數組將具有檢查的角色ID,當然也知道用戶ID。

當返回用戶角色的所述陣列的用戶添加或刪除角色我然後使用Laravel同步選項的usersController內,像這樣後:

$user->roles()->sync(Input::get('userrole')); 

這將將同步,與所述陣列的UserRole用戶的角色〔 ],它在提交表單時從Input獲得。

回答

1

它是根據用戶的當前角色設定值使複選框的第二參數是「值」

{!! Form::checkbox('agree', yes, null, ['class' => 'field']) !!} 

的將輸出作爲;

<input class="field" name="agree" type="checkbox" value="yes"> 

第三個參數可以是'true',這將使複選框,默認選中。

+0

得到了解決,並把它添加到我原來的問題。希望它能幫助別人。 – Holo

1

在HTML中

<input class="field" name="agree" type="checkbox" value="yes"> 

在laravel GET或POST方法

dd(Input::get('agree'));