【问题标题】:CakePHP: "add" action doesn't work with admin prefixCakePHP:“添加”操作不适用于管理员前缀
【发布时间】:2013-04-10 23:47:31
【问题描述】:

在添加管理员前缀/路由之前,一切正常...

目前,我有一个 QuestionsController.php 文件,其功能如下:

public function admin_add() {
    if ($this->request->is('post') ) {
        $this->Question->create();
        if ($this->Question->save($this->request->data)) {
            $this->Session->setFlash('Your question has been saved.');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash('Unable to add your question.');
        }
    } else {
            $this->Session->setFlash('Not post.');
    }

}

这里是/views/Questions/admin_add.php的内容:

<h2>Add a question</h2>
<?php
echo $this->Form->create('Question');
echo $this->Form->input('nickname');
echo $this->Form->input('content');
echo $this->Form->input('option1');
echo $this->Form->input('option2');
echo $this->Form->input('option3');
echo $this->Form->end('Save question');

echo $this->Html->link('Cancel', array('controller' => 'questions', 'action' => 'index'));

注意到控制器底部的 setFlash("Not post.") 了吗?每次单击“保存问题”按钮时,我都会看到该消息?为什么?

更新 我们已经确定请求方法是get,这就解释了为什么它不起作用。但现在真正的问题是为什么get。我很确定在添加管理员前缀之前是post

【问题讨论】:

  • 暂时,你可以检查一下if(!empty($this-&gt;request-&gt;data)) { - 虽然这并不能回答你关于为什么的问题。
  • 你的表单方法是 POST 吗?
  • @Dave 好主意! $this-&gt;request-&gt;data 实际上是空的。知道为什么吗?
  • @BarryChapman 我是这么认为的,但它不起作用的事实表明并非如此。
  • 您使用的是管理员前缀,对吗?而不是管理员路由?

标签: php cakephp cakephp-2.0


【解决方案1】:
<?php echo $this->Form->create('Question', array( 'type' => 'POST' ) ); ?>

试试看:)

您还可以向该$options 数组添加其他选项,例如操作、编码、默认值、url 等。

更新

从您的 cmets 来看,我认为您是在告诉我们 GET 是由控制器确定的。检查源代码中的 FORM 以查看 type="post" 是否存在,或者是否显示 type="get"

如果它正在发布,那么您将在发布时被重定向,类似于PRG 模式。这就是你失去它的地方。 POST 表单后,您最终会使用哪个 URL?

【讨论】:

  • 抱歉打错了。仍然得到
  • 在源代码中表单的方法是post。我不知道 PRG 模式。你能详细说明发生了什么吗?另外,您是否看到我对您上面关于 Config/core.php 文件中的管理路由的评论的回复?该路由是否与 admin_ 前缀冲突?
  • PRG = 重定向后获取。您正在 POST 上重定向到您的控制器。我假设您的用户未经过身份验证以发布到管理员操作?我可能是错的,但它本质上是获取您的 POST 参数并将它们转换为 GET(或者根本没有,只是简单地重定向您)。你还在用其他插件吗?
  • 我还没有安装其他插件,但我对管理员前缀和 Auth->allow/deny 之间的关系有点不稳定,所以我可能搞砸了。但是,我能够一致地触发 Auth->redirect,而这并没有发生在这里。只需重新加载同一页面。
  • 我刚刚注意到另一个我认为不相关的细节。我的 CakePHP 应用程序位于子目录 /_cake/ 中,但我有 mod_rewrite 规则,这些规则重写 url 以删除 /_cake/。如果我使用开发人员工具将表单操作更改为不包含 url 的 _cake/ 部分,则方法是 POST。所以看来 mod_rewrite 是有效果的。我不知道为什么。
【解决方案2】:

如果它到达 if 块的后半部分,则不会发布请求。

要找出它是什么,只需在 if 块之前添加以下代码:

debug(CakeRequest::method());

(假设您的调试级别为 2 用于开发模式)

然后,一旦你知道发生了什么样的请求,就检查一下。

【讨论】:

  • 我是GET!诡异的!!你知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多