CakePHP表单创建函数:缺少id

时间:2013-10-14 19:04:09

标签: php cakephp

(CakePHP 2.1,CentOS)嘿伙计们 - 所以我在CakePHP中做了一些简单的事情。我使用熟悉的调用在edit.ctp视图中使用FormHelper类启动一个表单:

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

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

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

这是预期的。现在,当我指定模型和网址时,就像这样,

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

再次转到mycoolsite / posts / edit / 17,我在标记中得到此表单标记,该标记缺少操作中的“/ 17”:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

然后,每个人都应该按照自己的意愿行事 - 并且记录在案。

如果你不需要,请不要使用url。它会自己发布:) 您在那里做了什么导致预期的行为:您覆盖要发布到无效的网址。

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

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

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

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

答案 1 :(得分:0)

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

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

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