Отметьте флажок как установленный, если в postdata или в существующих пользовательских данных в Kohana - PullRequest
0 голосов
/ 10 февраля 2012

Я хочу отметить флажки, если они были выбраны с помощью существующих данных из базы данных или в постданных. У меня есть массив всех ролей, $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 ]

1 голос
/ 11 февраля 2012

Предполагается, что вы пытаетесь обновить существующего пользователя в базе данных ...

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 является либо массивом пользовательских ролей из базы данных, используя $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), поскольку это условие существует в модели или контроллере, а роли пользователей всегда актуальны.

1 голос
/ 10 февраля 2012
$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);
...