如何在CakePHP的单个页面上创建多个表单?
我试图想出一个标准的方法来在索引页上为同一模型创建多个表单。这里有更多的细节。如何在CakePHP的单个页面上创建多个表单?
我有一个活页夹列表,每个活页都显示一个备忘录。我希望备忘录字段可以从索引页面进行编辑。显然,它不工作只是复制和粘贴视图的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参数路由到行动。
我确定在索引循环中必须有一种标准方式来呈现多个表单。有什么想法吗?
这不是太困难,但您必须少依赖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));
}
?>
我不完全相信你的数据结构,所以它上面会需要一些调整,但你应该明白。我不知道目的是通过创建假模型等服务。
我不知道这个链接将有助于解决您的问题:http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-model
基本它表明创建扩展您的基本模型,您的形式可以单独调用两个新的(空)的模型。似乎它可能是一个相对无忧无虑的方式来保持您的窗体彼此不同...
丹尼尔,你是完全正确的!非常好。这是我结束的代码。这是重要的一个主要原因。 HTML规范说ID必须是唯一的。因此,我在表格中添加了一个小数字,以防止出现问题。仍然有效。
<?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)); ?>
完美。最终代码发布为答案。不知道这是否是在这里做事的最佳方式。谢谢! – dbme 2011-03-17 03:11:50
没问题。随意上船以及接受。 /无耻;) – 2011-03-17 03:32:17