如果在postdata或Kohana中的现有用户数据中,请将复选框标记为已选中

时间:2012-02-10 15:03:03

标签: kohana kohana-3

如果已经通过db或postdata中的现有数据选择了复选框,我想标记复选框。我有一系列所有角色,$roles$user_roles包含当前角色。

foreach ($roles as $r) {

    $checked = false;

    if(isset($postdata['roles'][$r->id])){
        $checked = true;
    }
    else{
        foreach($user_roles as $ur){
            if($ur->id == $r->id){
                $checked = true;
            }
        }
    }

<input type="checkbox" name="roles[<?php echo $r->id; ?>]" <?php if($checked){ ?>checked="checked"<?php } ?> value="<?php echo $r->id; ?>" />

代码正在运行,但我想知道我是否可以整理它。我正在使用Kohana 3.2

2 个答案:

答案 0 :(得分:1)

$role_ids = $user_roles->as_array(NULL, 'id');

$checked = in_array($r->id, $role_ids) or Arr::path($postdata,"roles.$r->id");

echo Form::checkbox('roles['.$r->id.']', $r->id, $checked);

答案 1 :(得分:1)

假设您正在尝试更新db ...

中的现有用户
foreach($roles as $role){
  echo 
    Form::checkbox('roles[]', $role->id, in_array($role, $user_roles), array('id' => 'role-'.$role->id)),
    Form::label('role-'.$role->id, $role->name);
}

$ user_roles变量是来自db的用户角色数组,使用$user->roles->find_all(),或者是通过POST数据更新的用户角色。如果POST数据存在,那么我更新用户角色:

$roles = $this->request->post('roles');

foreach(ORM::factory('role')->find_all() as $role)
{
  if (in_array($role->id, $roles))
  {
    // Add roles relationship
    $user->add('roles', new Model_Role(array('id' => $role->id)));
  }
  else
  {
    // Remove roles relationship
    $user->remove('roles', new Model_Role(array('id' => $role->id)));
  }
}

然后我仍然使用$user->roles->find_all()作为视图中显示的用户角色。

这样做意味着我不必决定在视图中显示什么,(POST或DB数据),因为模型或控制器中存在条件,并且用户角色始终是最新的。 / p>