>不要添加新的输入,只需用逗号分隔单个输入中的值.这似乎很容易,当尝试爆炸输入并将数值中的每个值保存在数据库中的新行时会出现一些问题.但是当我不得不编辑这些值时,我放弃了这个想法:收集所有的值并将它们插入到输入中,然后当我保存时检查所有值是否仍然存在,如果没有,则从表中删除相应的行.做很多工作要做.
我试着用JS创建新的输入.但在这里,我偶然发现了两个问题:安全组件,这是一个黑洞尝试(我真的需要这个组件来检查表单的完整性)以及如果验证失败,我的输入将与它们的值一起消失.我必须补充说,一个模型可能有无限的字段,所以输入将像name = [Model] [14] [field],name = [Model] [17] [field],因此我不能限制安全组件不验证这些某些输入(仅当我使用JS添加它们时,我知道他们的ID,无论如何,安全组件构建其数据之后).
>使用PHP添加字段(因此,在添加新字段后重新加载页面),但是我似乎无法找到如何在另一个现有字段之后添加一个字段,以及如何在验证错误时维护输入的数据.
任何建议高度赞赏!
谢谢!
解决方法
当我尝试创建一个用于民意调查的管理系统时,我发现自己处于类似的情况.
每个投票都有很多PollOptions,我想让我可以根据需要在我的投票/ admin_edit页面上动态添加任意数量的投票选项.
我用CakePHP的内置功能加上一些Javascript来管理这个.
在admin_edit视图中构建表单时,我首先放入了Poll字段,之后添加了:
<div id="poll-options"> <?PHP if (isset($this->data['PollOption'])) { $i = 0; foreach ($this->data['PollOption'] as $opt) { echo $form->hidden("PollOption.$i.id"); echo $form->input("PollOption.$i.name",array('label' => "Option " . ($i + 1))); $i++; } } ?> </div>
$this->数据已在PollController中设置.如果投票已经有相关的PollOptions,它们也被包含在$this->数据中.此外,如果表单已经提交并且存在验证错误,则当页面显示时,所有所需的PollOption字段都被重新构建,因为它们仍然在控制器的$this->数据中.
所以这样照顾,确保我总是有我需要的领域.
当表单提交时,我尝试用简单的方式保存数据
$this->Poll->saveAll($this->data,array('atomic' => false,'validate' => 'first'));
(如果您不确定上述语法,您可以检查CakePHP API或文档)
我使用Javascript(jQuery)动态添加PollOption字段:
$('#add-option-button').click(function(event){ var optionCount = $('#poll-options > div').size() + 1; var inputHtml = '<div class="input text"><label for="PollOption' + optionCount + 'Name">Option ' + optionCount + '</label><input id="PollOption' + optionCount + 'Name" type="text" name="data[PollOption][' + optionCount + '][name]" /></div>'; event.preventDefault(); $('#poll-options').append(inputHtml); });
你提到你自己在做这件事,但如果你不尝试使用表单上的Security组件,那么你不应该有任何麻烦.
希望这可以帮助你指出正确的方向,或者给你一些想法.