0

我目前正在使用 CAKEPHP 2.3,并且正在尝试编辑用户信息。但是当我提交信息时,它不会将信息更新到数据库中。相反,它会使用我插入的新信息创建一个新用户。我希望它更新用户,而不是创建一个新用户。

我的 edit.ctp 代码是:

    <h1>Edit Account information</h1>
<?php
echo $this->Form->create('User', array('action' => 'edit'));
echo $this->Form->input('username', array('value' => $this->Session->read('Auth.User.username')));
echo $this->Form->input('name', array('value' => $this->Session->read('Auth.User.name')));
echo $this->Form->end('Submit');
?>

然后我在用户控制器中的编辑功能是:

public function edit() {
//        debug($this->User->save($this->request->data));
        $this->User->id = $this->Session->read('Auth.User.id');
        $this->request->data['User']['id'];
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The User has been saved', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The User could not be saved. Please, try again.', true));
            }
        } else {
            $this->request->data = $this->User->read(null);
            isset($this->request->data['User']['password']);
        }
    }

这是进入编辑用户页面的索引。

<h1>Users Home</h1>
<p>Welcome <?php print $this->Session->read('Auth.User.name');?> <br/></p>
<table border="0" width="200" text-align="center">
<tr>
<td width="50"><?php echo $this->Html->link('Log out', array('action' => 'logout')); ?></td>
<td width="50"><?php echo $this->Html->link('Edit', array('action' => 'edit')); ?></td>
<td width="50"><?php echo $this->Html->link('Add User', array('action' => 'add')); ?></td><!-- should only show for admin -->
<td width="50"><?php echo $this->html->link('Manage Users', array('action' => 'usermanage')); ?></td><!-- should only show for admin -->
</tr>
</table>

非常感谢。

4

3 回答 3

1

在您的编辑方法中丢失 $id 。通常用户只能 - 并且只有他自己 - 编辑他自己的记录。

public function edit() {
    if ($this->request->is('post')) {
        $this->request->data['User']['id'] = $this->Session->read('Auth.User.id');
        if ($this->User->save($this->request->data)) {
        ...

并且value不适合您的表格。永远不要使用它。它会在发布和验证错误时破坏您的表单(有关“为什么”,请参见http://www.dereuromark.de/2010/06/23/working-with-forms/ - 您还将找到如何设置默认值,如果你真的需要)。

由于您通过传递数据,$this->request->data因此需要将它们保持原样:

echo $this->Form->input('username');

也失去了行动。表单将自动发布到自己!

最后但同样重要的是不要使用 read(),使用 find(first)

于 2012-12-12T17:04:09.110 回答
1

您必须指定$id要编辑的用户。在这种情况下,由于只有一个用户可以编辑他自己的个人资料,我们在控制器上进行:

public function edit() {
    $this->User->id = this->Session->read('Auth.User.id');
    //whatever...
}

如果您在编辑视图中并且 $id 由参数传递,您甚至不需要这样做,只需像这样创建表单,CakePHP 将自动为编辑操作生成表单:

echo $this->Form->create('User');

此外,您的输入似乎是错误的,您不需要该options变量:

echo $this->Form->input('username', array('value' => $this->Session->read('Auth.User.username')));
echo $this->Form->input('name', array('value' => $this->Session->read('Auth.User.name')));
于 2012-12-12T16:36:53.487 回答
0

您也可以将其包含在表单中。默认情况下,id 字段将隐藏在表单中。使用会话执行此操作更安全,但您可以对管理功能执行此操作或在保存之前对其进行验证。

 echo $this->Form->input('User.id');
于 2012-12-12T16:47:16.407 回答