CakePHP:向表单添加字段(动态)

2024-01-05

我正在尝试动态地将字段添加到我的 CakePHP 表单中,但似乎我使用的每种方法都有其自己无法修复的缺点。这是我尝试过的:

  1. 不要添加新的输入,只需用逗号分隔单个输入中的值即可。这看起来很简单,但在尝试分解输入并将每个值保存在数据库中的新行中时存在一些问题。但当我不得不编辑这些值时,我放弃了这个想法...收集所有值并将它们内爆在输入中,然后当我保存时检查所有值是否仍然存在,如果不存在,则从表中删除相应的行。 .还有很多工作要做。

  2. 我尝试使用 JS 动态创建新的输入。但在这里,我偶然发现了两个问题:安全组件,它引发了黑洞尝试(我确实需要这个组件来检查表单的完整性),以及如果验证失败,我的输入将与其值一起消失。我必须补充一点,单个模型可能具有无限的字段,因此输入将类似于name=[Model][14][field], name=[Model][17][field],因此我不能限制安全组件不验证这些特定输入(只有当我用 JS 添加它们时我才知道它们的 ID,无论如何,在安全组件构建其数据之后)。

  3. 使用 PHP 添加字段(因此,在添加新字段后重新加载页面),但我似乎无法找出如何在另一个现有字段之后准确添加字段,以及如何在验证错误时维护输入的数据。

任何建议都将受到高度赞赏!

谢谢你!


我不确定我能否给你问题的完整答案,但希望我能给你一些想法。

当我尝试创建民意调查管理系统时,我发现自己处于类似的情况。

每个民意调查都有许多 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);
});

您提到您自己正在执行此操作,但如果您不尝试使用表单上的安全组件,那么您应该不会遇到任何问题。

希望这可以帮助您指明正确的方向,或者给您一些想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CakePHP:向表单添加字段(动态) 的相关文章

随机推荐