如何在CakePHP中的单个页面上创建多个表单?

时间:2011-03-16 21:55:50

标签: forms cakephp cakephp-1.3

我正在尝试提出一种在索引页面上为同一模型创建多个表单的标准方法。这里有一些细节。

我有一个活页夹列表,每个活页夹都显示一个备忘录。我希望备注字段可以从索引页面编辑。显然,只复制和粘贴edit_memo操作的视图是行不通的,如下所示:

<?php echo $this->Form->create('Binder');?>
    <fieldset>
        <legend><?php __('Edit Memo'); ?></legend>
    <?php
        echo $this->Form->input('id');
        echo $this->Form->input('memo');
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

但这基本上就是我要做的事情。在上下文中,我只是循环遍历索引操作中的绑定器,而备忘录是模型的一部分。

我尝试将$this->Form->create('Binder')更改为以下内容:

$this->Form->create(null,array(
    'id'=>"BinderEditMemo.$i",
    'controller' => 'binders',
    'action' => 'edit_memo',
    'id' => $binder['Binder']['id']
));

但没有运气。备忘录字段仍然获得常规ID,因此我认为我可能也需要更改它。当我提交表单时,它确实执行了操作,但是它没有保存。仅供参考,我已将id参数路由到我的路线中的动作。

我确信必须有一种标准的方法来在索引循环中呈现多个表单。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

这不是太难,但你必须更少依赖Cake的FormHelper魔法。以下作品(或至少在很多场合为我工作过):

<?php
  $baseUrl = array('controller'=>'binders','action'=>'edit');
  foreach ($binders as $_binder) {

    $url = $baseUrl; $url['id'] = $_binder['id'];

    echo $this->Form->create('Binder',array('url'=>$url));
    echo $this->Form->input('Binder.id', array('type'=>'hidden','value'=>$_binder['id']));

    echo $this->Form->input('Binder.memo', array('value'=>$_binder['memo']));

    echo $this->Form->end(__('Submit',true));
  }
?>

我不完全确定您的数据结构,所以上面需要进行一些调整,但您应该明白这一点。我不知道创建虚假模型等的目的是什么。

答案 1 :(得分:1)

我想知道这个链接是否有助于解决您的问题:http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-model

基本建议创建两个扩展基本模型的新(空)模型,表单可以独立调用。看起来它可能是一种相对轻松的方式来保持你的形式彼此不同......

答案 2 :(得分:0)

丹尼尔,你说得对!非常好。这是我最终得到的代码。这一个主要原因很重要。 HTML规范说ID必须是唯一的。所以我在表格和字段中添加了一个lil sumthin以防止出现问题。仍然有效。

<?php
$baseUrl = array('controller'=>'binders','action'=>'edit_memo');
$url = $baseUrl; 
$url['id'] = $binder['Binder']['id'];

echo $this->Form->create(null,array(
    'id'=>"BinderEditMemo-{$binder['Binder']['id']}",
    'url'=>$url
));
?>
<fieldset>
    <legend><?php __('Memo'); ?></legend>
    <?php
    echo $this->Form->input('Binder.id', array('id' => "BinderId-{$binder['Binder']['id']}", 'type'=>'hidden','value'=>$binder['Binder']['id']));
    echo $this->Form->input('Binder.memo', array('id' => "BinderMemo-{$binder['Binder']['id']}", 'value' => $binder['Binder']['memo'], 'label' => '', ));
    ?>
</fieldset>             
<?php echo $this->Form->end(__('Update Memo',true)); ?>