如何在另一个控制器中提交一个模型的表单?

时间:2011-05-14 16:16:19

标签: cakephp

假设我有一个帖子表和一个评论表。我希望我/ posts / view / page在同一页面上有一个表单来提交评论,就像任何典型的博客一样。我不确定我在哪里出错,但这是我尝试过的:

class PostsController extends AppController {
var $name = 'Posts';
var $uses = array('Post', 'Cmt'); 

function view($id = null) {
    ...
    if (!empty($this->data)) {
        $this->Cmt->create();
        if ($this->Cmt->save($this->data)) {
            $this->Session->setFlash(__('The cmt has been saved', true));
        } 
    }

    $this->set('post', $this->Post->read(null, $id));
}

并在视图中

<?php echo $this->Form->create('Cmt');?>
<fieldset>
<?php
    echo $this->Form->input('name');
    echo $this->Form->input('email');
    echo $this->Form->input('title');
    echo $this->Form->input('content');
?>
    <div class="input select required"><label for="CmtStpageId">Post</label>
        <select id="CmtPostId" name="data[Cmt][post_id]">
            <option value="1">postname</option>
        </select>
    </div>
</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

这里有什么不对,不允许将记录发布到cmts表中?

此外,正如您所见,我将帖子ID硬编码到该表单中,因为无论出于何种原因,选择框都不会填充帖子ID。任何帮助也将不胜感激。

4 个答案:

答案 0 :(得分:6)

创建表单时,可以使用url参数显式设置表单操作:

$this->Form->create('Cmt', array('url'=>$this->Html->url(array('controller'=>'cmts', 'action'=>'add'))));

至于帖子ID,我假设你在帖子和评论之间有一对多的关系。如果是这种情况,您应该只能在视图中执行以下操作:echo $this->Form->input('post_id', array('type'=>'hidden'));然后,在您的视图功能中,设置$this->data['Cmt']['post_id'] = $post['Post']['id'];以使其自动填充。

答案 1 :(得分:4)

我认为最好这样做......

$this->Form->create('Cmt', array('url'=>array('controller'=>'cmts', 'action'=>'add')));

选项['url']已经使用控制器和动作处理数组。

您可以在此处找到它:http://book.cakephp.org/view/1384/Creating-Forms#options-url-1387

答案 2 :(得分:1)

也可以使用

$this->Form->create('Cmt', array( 'action' => 'add' ));

因为这将带你到cmts控制器和动作添加将被调用。

答案 3 :(得分:0)

如果要为Comments提交数据,最好在CmtsController中处理它。

PostsController中的视图文件正常

<?php echo $this->Form->create('Cmt');?>

将生成表单操作“/ autogenerated_cake_base_url / cmts / view”,您可以在CmtsController处理,而不是在PostsController中处理。