public function update(Model $role, array $input)
{
//See if the role has all access, administrator always has all access
if ($role->id == 1) {
$all = true;
} else {
$all = $input['associated-permissions'] == 'all' ? true : false;
}
if (!isset($input['permissions'])) {
$input['permissions'] = [];
}
//This config is only required if all is false
if (!$all) {
//See if the role must contain a permission as per config
if (config('access.roles.role_must_contain_permission') && count($input['permissions']) == 0) {
throw new GeneralException(trans('exceptions.backend.access.roles.needs_permission'));
}
}
$role->name = $input['name'];
$role->sort = isset($input['sort']) && strlen($input['sort']) > 0 && is_numeric($input['sort']) ? (int) $input['sort'] : 0;
//See if this role has all permissions and set the flag on the role
$role->all = $all;
DB::transaction(function () use($role, $input, $all) {
if (parent::save($role)) {
//If role has all access detach all permissions because they're not needed
if ($all) {
$role->permissions()->sync([]);
} else {
//Remove all roles first
$role->permissions()->sync([]);
//Attach permissions if the role does not have all access
$permissions = [];
if (is_array($input['permissions']) && count($input['permissions'])) {
foreach ($input['permissions'] as $perm) {
if (is_numeric($perm)) {
array_push($permissions, $perm);
}
}
}
$role->attachPermissions($permissions);
}
event(new RoleUpdated($role));
return true;
}
throw new GeneralException(trans('exceptions.backend.access.roles.update_error'));
});
}