Forms CakePHP:将字段添加到表单(动态)

Forms CakePHP:将字段添加到表单(动态),forms,cakephp,Forms,Cakephp,我试图动态地将字段添加到我的CakePHP表单中,但似乎我使用的每个方法都有自己的缺点,我无法修复。以下是我尝试过的: 不要添加新输入,只需用逗号分隔单个输入中的值。这看起来很简单,在尝试分解输入并将每个值保存到数据库的新行时出现了一些问题。但当我不得不编辑这些值时,我放弃了这个想法……收集所有值并在输入中内爆它们,然后在保存时检查所有值是否仍然存在,如果没有,则从表中删除相应的行……要做的工作很多 我尝试用JS动态创建新的输入。但在这里,我偶然发现了两个问题:安全组件,它抛出了一个黑洞尝试(我

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

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

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

  • 使用PHP添加字段(因此,在添加新字段后重新加载页面),但我似乎不知道如何在另一个当前字段之后添加字段,以及如何在验证错误时维护输入数据

  • 非常感谢您的任何建议


    谢谢大家!

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

    我发现自己在尝试创建投票管理系统时也遇到了类似的情况

    每个民意测验都有许多民意测验选项,我希望能够根据需要在我的民意测验/管理编辑页面上动态添加尽可能多的民意测验选项

    我通过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>
    
    (如果不确定上述语法,可以检查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);
    });
    
    $(“#添加选项按钮”)。单击(函数(事件){
    var optionCount=$('#poll options>div').size()+1;
    var inputtml='Option'+optionCount
    + '';
    event.preventDefault();
    $(“#轮询选项”).append(inputtml);
    });
    
    您提到您自己在做这件事,但是如果您不尝试在表单上使用安全组件,您应该不会遇到任何问题


    希望这有助于为您指明正确的方向,或者给您一些想法。

    在某些情况下,此解决方案:

     var optionCount = $('#poll-options > div').size() + 1;
    
    在db中查找现有id(optionCount)时,可以覆盖场景中的旧数据。
    如果你要添加新的数据,迭代索引应该由uniq generator生成。

    不能肯定,但我认为不可能使用安全组件并向表单中添加字段。保护表单的整个要点是对表单进行校验和,并确保不添加或删除任何字段。您是否可以尝试在不使用安全组件的情况下执行此操作,并找到另一种方法来确保表单被锁定?好的,假设我不使用安全组件。那么如何验证所有添加的字段,并在表单未验证时检索它们的值呢?这就是表单验证,在模型中完成。与安全组件的功能非常不同。我会把安全组件放在一边,除非你的应用程序绝对必须有它,然后只验证模型中的表单输入。这里有更多关于验证输入的信息:问题是我的表单中有一个主模型,然后是所有相关的类别。此外,这些类别可以包含多个值,因此要保存的类别数量是动态的,我不知道如何准确检索填充的类别及其id(
    Model.0.field
    Model.1.field
    ,…,
    Model.n.field
    )听起来像我需要的。我的逻辑更复杂,但我相信我会在你详细的例子之后处理它。非常感谢,这是我所需要的!表单生成是使用jquery手动完成的(硬编码),而不是使用cake表单助手,这在生成大型/多个表单时会有点混乱。我在想-有没有办法使用Js帮助程序和表单帮助程序来实现同样的效果?Ankan,我也在想同样的问题,我有一些非常复杂的表单,一直在使用jQuery的.clone()方法复制Cake的自动生成表单字段,然后使用.replace()编辑ID等,但我觉得它不是很健壮,我更希望FormHelper或JsHelper中有一个功能来支持多个关系条目。动态添加字段如何使用cakephp验证规则?因为如果您这样做,jquery生成的输入(客户端大小)将不会有任何验证规则。当然,您可以创建客户端验证规则,但我们知道它不是那么安全。
     var optionCount = $('#poll-options > div').size() + 1;