Cakephp 3.x更新没有表单的记录

时间:2016-01-27 13:52:14

标签: cakephp cakephp-3.0

在我的users/index页面中,我基本上列出users表中的每个用户,执行以下操作:

    <?php foreach ($users as $user): ?>
    <tr>
        <td><?= h($user->name) ?></td>
        <td><?= h($user->email) ?></td>
        <td><?= h($user->phone_nr) ?></td>
        <td><?= h($user->role)?></td>
    </tr>
    <?php endforeach; ?>

User.role字段是enum类型,有两个选项:'user''admin'

我不需要只列出用户的角色,而是需要一个下拉列表才能立即更改它。所以基本上我需要这样的东西:

echo $this->Form->input('role', ['type' => 'select','label' => 'Role', 'options' => ['user' => 'user', 'admin' => 'admin']]);

但是,它不能在表单之外工作,表格显然不是表格。

非常感谢任何有关如何解决的帮助或指导。

修改

根据要求,我提供了用于保存用户数据的代码段(如果从表单中保存):

public function add()
{
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->data);

        if ($this->Users->save($user)) {             
            $this->Flash->success(__('The user has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The user could not be saved. Please, try again.'));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

一种非常简单的方法可以是下面描述的方法。它不使用Ajax,只是一个简单的POST请求,这意味着在更改角色时会重新加载页面。

按如下方式修改视图:

<?php foreach ($users as $user): ?>
<tr>
    <td><?= h($user->name) ?></td>
    <td><?= h($user->email) ?></td>
    <td><?= h($user->phone_nr) ?></td>
    <td><?= h($user->role)?></td>
    <td>
        <?= $this->Form->postButton('Toggle Role',
            ['controller'=>'users','action'=>'toggle_role',$user->id,$user->role])?>
    </td>
</tr>
<?php endforeach; ?>

向您的控制器添加操作:

public function toggle_role($id,$existing_role){

    $users = TableRegistry::get('Users');
    $user = $users->get($id);
    $user->role = ($existing_role == 'admin')?'user':'admin';
    $users->save($user);
    return $this->redirect($this->referer());
}

注意:代码未经过测试,缺少错误处理