我不确定我能否给你问题的完整答案,但希望我能给你一些想法。
当我尝试创建民意调查管理系统时,我发现自己处于类似的情况。
每个民意调查都有许多 PollOptions,我希望能够在 polls/admin_edit 页面上根据需要动态添加尽可能多的民意调查选项。
我使用 CakePHP 的内置功能和一些 Javascript 来管理这个问题。
在 admin_edit 视图中构建表单时,我首先放入“投票”字段,并在其下添加了以下内容:
<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->data
在 PollsController 中设置。如果 Poll 已经有相关的 PollOptions,它们也包含在$this->data
。另外,如果表单已经提交并且存在验证错误,则当页面显示时,所有需要的 PollOption 字段都会重新构建,因为它们仍然在$this->data
来自控制器。
这样就可以确保视图中始终包含我需要的字段。
提交表单后,我尝试用简单的方法保存数据
$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);
});
您提到您自己正在执行此操作,但如果您不尝试使用表单上的安全组件,那么您应该不会遇到任何问题。
希望这可以帮助您指明正确的方向,或者给您一些想法。