0

(CakePHP 2.1,CentOS)大家好——所以我在 CakePHP 中做一些简单的事情。我使用熟悉的调用从我的 edit.ctp 视图中使用 FormHelper 类启动一个表单:

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

当我去 mycoolsite/posts/edit/17 标记包含

<form action="/posts/edit/17"

这是意料之中的。现在,当我像这样指定模型和 url 时,

echo $this->Form->create('Post', array('url' =>  '/posts/edit'));

再次转到 mycoolsite/posts/edit/17,我在标记中得到了这个表单标签,它在操作中缺少“/17”:

<form action="/newsite/posts/edit"

这是正常的吗?我可以发誓,即使您明确指定了 url 参数,create 函数也会自动将记录 ID 附加到操作中。

4

2 回答 2

1

不要忘记在表单中添加 id:

echo $this->Form->create('Post');
echo $this->Form->input('id');
...

然后一切都按其应有的方式工作-并且已记录在案。

如果不需要,请不要破坏 url。它会自行发布:) 你在那里做什么会导致预期的行为:你用无效的 URL 覆盖要发布的 URL。

另请注意,为了灵活性,您应该始终更喜欢数组语法而不是字符串。不,它不会神奇地将 ids/strings 添加到字符串 URL。

编辑:如果每个操作有多个表单,则不必使用不同的 url 发布到。只有不同的表单/ID 才能使它们独一无二(可能还包含一个唯一的表单字段,其中包含它应该执行的“操作”并区分表单)。但是,如果您真的想要不同的目标 URL,请确保以有效的方式生成它们:

echo $this->Form->create('Post', array('url' => array('action' => 'edit', $id)));

$id 是从您读取记录的控制器传递的值,并在此处使用其 id 值来填充包含缺失 id 的完整 url 的表单。

于 2013-10-14T19:17:56.347 回答
0

答:在深入研究 FormHelper 类的源代码后,我确定这是预期的行为。如果 url 没有通过 FormHelper 的 create() 函数中的选项数组传入,代码会通过这个方便的调用确定表单的操作:

$this->url( $this->request->here(false) )

您可以在对 FormHelper 类所做的任何扩展中使用此代码,这就是我正在做的事情。无论如何,这就是解决我的问题的原因。

于 2013-10-15T16:46:26.200 回答