Forms 用CakePHP更新记录

Forms 用CakePHP更新记录,forms,cakephp,sql-update,cakephp-model,Forms,Cakephp,Sql Update,Cakephp Model,因此,我正在学习CakePHP,我正在尝试构建一组基本的应用程序,我可以直接用PHP构建,以了解CakePHP是如何工作的。现在我正在开发一个基本的订单管理系统——用户可以有多个订单,并且订单属于一个用户 我已经设置好了数据库,并且正确配置了CakePHP(开始页面显示每个主题都是绿色的,例如默认时区和数据库连接,但我没有安装的DebugKit除外)。我还有一个“用户列表”页面: 正如您在上面的屏幕截图中所看到的,我遇到的问题是,当我试图在/users/edit_User上编辑现有用户时:

因此,我正在学习CakePHP,我正在尝试构建一组基本的应用程序,我可以直接用PHP构建,以了解CakePHP是如何工作的。现在我正在开发一个基本的订单管理系统——用户可以有多个订单,并且订单属于一个用户

我已经设置好了数据库,并且正确配置了CakePHP(开始页面显示每个主题都是绿色的,例如默认时区和数据库连接,但我没有安装的DebugKit除外)。我还有一个“用户列表”页面:

正如您在上面的屏幕截图中所看到的,我遇到的问题是,当我试图在/users/edit_User上编辑现有用户时:

我试图为用户保存编辑,我(1)使用
$this->Form->hidden(…)
作为ID,(2)使用
public$primaryKey='ID'将主键设置为模型中表的主键

每次我尝试这样做,它只是插入一个新的记录,而不是更新现有的记录,我认为通过识别我的PK和添加要提交的ID,问题会得到解决,但我肯定遗漏了什么

以下是相关页面的代码:

模型


控制器

<?php
/**
 * app/Controller/UsersController.php
 *
 */
class UsersController extends AppController
{
    //public $scaffold;

    /* Validation */
    public $validate = array(
            'username' => array(
                    'required' => true,
                    'allowEmpty' => false,
                    'loginRule1' => array(
                        'rule' => 'alphaNumeric',
                        'message' => "Usernames must be alphanumeric!"
                                        ),
                    'loginRule2' => array(
                        'rule' => array('minLength', 4),
                        'message' => 'Usernames must be at least 4 characters.'
                                        ),
                                ),
            'password' => array(
                    'required' => true,
                    'allowEmpty' => false,
                    'passwordRule1' => array(
                        'rule' => array('minLength', 4),
                        'message' => 'Passwords must be between 4 and 8 characters.'
                                            ),
                    'passwordRule2' => array(
                        'rule' => array('maxLength', 8),
                        'message' => 'Passwords must be between 4 and 8 characters.'
                                            )
                                )
            );


    /* Actions */

    public function index()
    {
        // Grab all users
        $users = $this->User->find('all');

        // Set/Send users to View
        $this->set('users', $users);
    }

    public function new_user()
    {
        /* Has any Form data been POST'd? */
        if ($this->request->is('post'))
        {
            // Save User data to the DB
            $this->User->save($this->request->data);

            $this->redirect('/users');
        }
    }

    /*
        Accessing Args:
            (1) Direct URL Routing Method
                --> ...
            (2) Named Params Method
                --> CakeRequest['named']['[name]']
    */
    public function edit_user($id = null)
    {
        $id = $this->request['named']['currentID'];

        // Display the current data of the user
        if (!empty($id))
        {
            $userInfo = $this->User->find('all', 
                    array('conditions' => array('User.ID' => $id)));

            $this->set('userData', $userInfo);
        }
        else
            $this->set('error', '$id is empty!');

        /* Has any Form data been POST'd? */
        if ($this->request->is('post'))
        {
            // Save User data to the DB
            $this->User->save($this->request->data);

            $this->redirect('/users');
        }
    }
}

?>

查看/用户/编辑_user.ctp

<div class="row-fluid">

    <div class-"span12"></div>
    <div class="span12"></div>

    <div class="span8 offset2">

        <?php
            echo "Hidden ID Field Value: " . $userData[0]['User']['ID'];
            echo "<hr>";



            echo $this->Form->create('User');
            echo $this->Form->input('username');
                echo "  Current Name: " . 
                    $userData[0]['User']['username'];
            echo $this->Form->input('password');
                echo "  Current password: " . 
                    $userData[0]['User']['password'];

            // Hidden ID field to make save ~ an UDATE
            echo $this->Form->hidden('User', 
                    array('ID' => $userData[0]['User']['ID'],
                            'type' => 'hidden'));

            echo $this->Form->end('Save');

        ?>
    </div>

</div>

是否有人看到我没有做的事情,这将允许我编辑/更新现有记录,而不是插入全新的记录?
谢谢你的时间

问题可能与此处使用的表单元素类型有关;我建议在您的
/View/Users/edit_user.ctp
文件中尝试以下操作:

// Hidden ID field to make save an UPDATE
echo $this->Form->input('id', array('type' => 'hidden'));

有关保存编辑的更多信息,请参见。

问题可能与此处使用的表单元素类型有关;我建议在您的
/View/Users/edit_user.ctp
文件中尝试以下操作:

// Hidden ID field to make save an UPDATE
echo $this->Form->input('id', array('type' => 'hidden'));

有关保存编辑的更多信息,请参见。

您不需要在表单中回显值,CakePHP比这更聪明。改为这样做:

<?php
class UsersController {

    public function edit($id) {
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('User successfully saved.');
                $this->redirect(array('action' => 'index'));
            }
        }
        else {
            $this->request->data = $this->User->findById($id);
        }
    }
}

CakePHP将根据
$this->request->data
中的内容自动使用值填充表单字段


CakePHP食谱上的内容是掌握框架及其概念的一个很好的起点。

您不需要在表单中重复这些值,CakePHP比这更聪明。改为这样做:

<?php
class UsersController {

    public function edit($id) {
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('User successfully saved.');
                $this->redirect(array('action' => 'index'));
            }
        }
        else {
            $this->request->data = $this->User->findById($id);
        }
    }
}

CakePHP将根据
$this->request->data
中的内容自动使用值填充表单字段


CakePHP菜谱上的介绍是掌握框架及其概念的一个很好的起点。

不确定它是否会有所不同。。。但是当我使用ID输入字段来处理类似的内容时,我倾向于使用这样的内容:
echo$this->Form->input('ID',array('type'=>'hidden')就是这样!感谢您纠正我的n00b错误。:)不确定这是否会带来不同。。。但是当我使用ID输入字段来处理类似的内容时,我倾向于使用这样的内容:
echo$this->Form->input('ID',array('type'=>'hidden')就是这样!感谢您纠正我的n00b错误。:)