Search code examples
formslaraveleloquententrustlaravelcollective

Getting relating model attributes to populate multi-select


I'm using Laravel 5.3, Entrust for permissions, LaravelCollective for Form functionality and Chosen for to manipulate the select boxes.

I've bound my form to a model and my form is populating correctly, however I'm struggling to populate the multi select with the values associated with that role(model)

I'm leveraging Entrust's built in relationships. I want to make the permissions associated with the role appear as selected values in the multi select.

So something like $role->permissions->name , but that doesn't seem to work. The null value, in the form parameters is the default value, but I can't seem to get it to display anything that I want.

Here is my Form:

                {!! Form::model($role, ['method' => 'PATCH', 'route' => ['settings.access.update_role', $role->id]]) !!}
                <div class="form-group">
                    {!! Form::label('Name') !!}
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-plus-circle" aria-hidden="true"></i></div>
                        {!! Form::date('name', $role->name, ['class' => 'form-control']) !!}
                    </div>
                </div>
                <div class="form-group">
                    {!! Form::label('Display Name') !!}
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-plus-circle" aria-hidden="true"></i></div>
                        {!! Form::date('display_name', $role->display_name, ['class' => 'form-control']) !!}
                    </div>
                </div>
                <div class="form-group">
                    {!! Form::label('Description') !!}
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-plus-circle" aria-hidden="true"></i></div>
                        {!! Form::date('description', $role->description, ['class' => 'form-control']) !!}
                    </div>
                </div>
                <div class="form-group">
                    {!! Form::label('Permissions') !!}
                    <script type="text/javascript">
                        $(document).ready(function() {
                            $(".permissions").chosen({width: "100%"})
                        });
                    </script>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-user-plus" aria-hidden="true"></i></div>
                        {!! Form::select('permissions[]', $permissions, null, ['multiple' => 'multiple', 'class' => ' form-control permissions']) !!}
                    </div>
                </div>
                <div class="form-group">
                    <br/>
                    <div class="input-group">
                        <span class="input-group-btn">
                            <button class="btn btn-success" type="submit" name="add_user">Update</button>
                        </span>
                    </div>
                </div>
                {!! Form::close() !!}

Here is the part of my form in question:

            <div class="form-group">
                {!! Form::label('Permissions') !!}
                <script type="text/javascript">
                    $(document).ready(function() {
                        $(".permissions").chosen({width: "100%"})
                    });
                </script>
                <div class="input-group">
                    <div class="input-group-addon"><i class="fa fa-user-plus" aria-hidden="true"></i></div>
                    {!! Form::select('permissions[]', $permissions, null, ['multiple' => 'multiple', 'class' => ' form-control permissions']) !!}
                </div>
            </div>

Here is my Controller function which sends info to the form:

public function edit_role($id)
{
    $permissions = Permission::pluck('name', 'id');
    $role = Role::where('id', $id)->first();
    return view('settings.access.edit', compact('role', 'permissions'));
}

Solution

  • I managed to fix my problems, albeit in a bit of a hacky way.

    My edit_role Controller now looks like this:

    public function edit_role($id)
    {
        $permissions = Permission::pluck('name', 'id');
        $role = Role::where('id', $id)->first();
        $role_permissions = Role::with('perms')->get();
        $items = array();
        foreach($role_permissions as $role_permission)
        {
            foreach($role_permission->perms as $permission){
                $items[] = $permission->id;
            }
        }
    
        return view('settings.access.edit_role', compact('role', 'permissions', 'items'));
    }
    

    Basically what I have done is get all the permissions associated with a role and then cast each permission's 'id' to an array, I then use that array('$items') to populate the selects default value(null) as follows:

                        <div class="form-group">
                            {!! Form::label('Permissions') !!}
                            <script type="text/javascript">
                                $(document).ready(function() {
                                    $(".permissions").chosen({width: "100%"})
                                });
                            </script>
    
                            <div class="input-group">
                                <div class="input-group-addon"><i class="fa fa-user-plus" aria-hidden="true"></i></div>
                                {!! Form::select('permissions[]', $permissions  ,$items, ['multiple' => 'multiple', 'class' => ' form-control permissions']) !!}
                            </div>
                        </div>