我试图动态地将字段添加到我的CakePHP表单中,但似乎我使用的每个方法都有自己的缺点,我无法修复.这是我尝试过的:
不要添加新输入,只需用逗号分隔单个输入中的值.这似乎很容易,在尝试爆炸输入并将每个值保存在数据库中的新行时会出现一些问题.但是当我不得不编辑这些值时,我放弃了这个想法...收集所有值并将它们内插在输入中,然后当我保存时检查是否所有值仍然存在,如果没有,则从表中删除相应的行.要做很多工作.
我尝试用JS创建新的输入.但在这里,我偶然发现了两个问题:安全组件,它正在抛出黑洞尝试(我真的需要这个组件来检查表单的完整性)以及如果验证失败,我的输入将与它们的值一起消失.我必须补充说,单个模型可能有无限的字段,因此输入将是类似的name=[Model][14][field], name=[Model][17][field],因此我不能限制安全组件不验证那些特定的输入(我知道他们的ID只有当我用JS添加它们时,无论如何,安全组件构建其数据后的方式).
使用PHP添加字段(因此,在添加新字段后重新加载页面),但我似乎无法找到如何在另一个当前字段之后准确添加字段,以及如何在验证错误时维护输入数据.
任何建议都非常感谢!
谢谢!
mtn*_*rop 14
我不确定我能否给你一个完整的答案,但希望我可以给你一些想法.
在尝试为民意调查创建管理系统时,我发现自己处于类似情况.
每个Poll都有很多PollOptions,我希望能够在我的polls/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>
Run Code Online (Sandbox Code Playgroud)
$this->data在PollsController中设置.如果民意调查已经有相关的民意调查,那么他们也被列入$this->data.此外,如果表单已经提交并且存在验证错误,则在显示页面时会再次构建所有需要的PollOption字段,因为它们仍然$this->data来自控制器.
因此,确保我始终拥有视图中所需的字段.
提交表单时,我试图用简单的方法保存数据
$this->Poll->saveAll($this->data, array('atomic' => false, 'validate' => 'first'));
Run Code Online (Sandbox Code Playgroud)
(如果您不确定上述语法,可以查看CakePHP API或docs)
我使用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);
});
Run Code Online (Sandbox Code Playgroud)
你提到你自己这样做了,但如果你不尝试在表单上使用安全组件,那么你应该没有任何问题.
希望这有助于指明您正确的方向,或者可能会给您一些想法.