0

如果没有发布数据,我希望我在 CakePHP2 中创建的表单显示空白,但如果会话密钥 Person.id 存在,则使用模型中的数据填充。这是我的代码:

function about() {
    // Make session key for debug purposes
    $this->Session->write("Person.id",1);
    if($this->request->is('post')) {
        debug("post");
    } else {
        debug("not post");
        // Use the value in the session Person.id to find the 
        // record in the Person model
        $this->params->data = $this->Person->findById($this->Session->read("Person.id"));
    }
}

以上大部分作品。Person如果我在不发布任何数据的情况下访问视图,则表单将按预期使用模型中的数据填充。

not post但是,如果我发布表单,我仍然会在我期待的时候收到调试消息post

如果我注释掉分配数据的行,$this->params->data然后提交表单会给我正确的调试消息,post但我不明白为什么会这样。

如果$this->params->data填充对 Cake 的意义与表单帖子相同,那么我应该如何检查真实、真实的表单帖子?

更新:如果我更改if($this->request->is('post'))if($this->request->data)then 它完全按照我想要的方式工作......但我仍然不明白为什么。

4

1 回答 1

1

在 CakePHP2 中,当您使用 FormHelper 在视图中创建表单时,它会自动生成此字段

<input type="hidden" name="_method" value="PUT"/>

当您编辑记录时(意味着设置了它的主键)。

当您提交表单时,此隐藏字段会覆盖 HTTP 方法,您的请求不会被视为 POST,而是被视为 PUT。您可以像这样更新您的测试:

if($this->request->is('put')) {
  ...
}

或反映您使用时获得的代码bake

if($this->request->is('post') || $this->request->is('put')) {
  ...
}

如果你想自己看,只需调试请求:

debug($this->request);

然后有点跑题了,但是如果您会话中的关键“Person.id”是登录用户,您可能会使用自定义机制来登录/注销用户,并且可能值得查看AuthComponent

于 2012-06-26T07:15:06.803 回答