使用Laravel 5

时间:2015-04-22 21:34:25

标签: php forms laravel-5

我在Laravel 5中遇到了一个难以解决的问题。

基本上我要做的就是将用户拥有的所有角色调用到与编辑用户相关的表单中。部分原因是首先循环遍历角色,然后使用复选框显示所有角色。

然后它应该填充所有用户角色,即如果用户具有admin和VIP角色,那么应该勾选这些框。如果检查了其他角色或确实未选中,则需要将更改传递回控制器以进行更新。

所以我拥有的是User - Roles_User - Roles模型和关联表。枢轴设置为一个(用户)到多个(角色)。所有这一切都很好。

我使用以下命令在控制器中调用编辑用户表单:

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-&gt; 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进入并检查用户是否具有alter并将复选框设置为true。

请记住设置方式,当我调用$ user-&gt; hasRole时,它会访问User类中的hasRole方法。

$ role-&gt; id确保数组知道我们所指的角色表中的哪个角色。

编辑记录的用户可以检查附加或取消选中已检查的角色,阵列将在提交时进行这些更改。由于数组将同时具有已检查的角色ID,并且当然知道用户ID。

在用户添加或删除角色后返回用户角色数组时,我会使用usersController中的Laravel同步选项,如下所示:

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

这会将用户角色与数组userroles []同步,后者在提交表单时从Input获取。

2 个答案:

答案 0 :(得分:1)

根据用户当前角色设置值因为复选框的第二个参数是'value'

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

将输出为;

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

第三个参数可以是'true',这将使复选框默认选中。

答案 1 :(得分:1)

在Html中

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

在laravel get或post方法

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