【问题标题】:CakePHP dynamic form inputsCakePHP 动态表单输入
【发布时间】:2015-08-31 20:33:20
【问题描述】:

我正在使用 CakePHP 2.3.8,我正在尝试使用来自 this tutorial 的动态添加的输入创建一个表单,但我遇到了一些问题。输入的添加和删除工作得很好,但是当我提交表单时,我收到一个黑洞错误消息。在检查输入时,似乎没有正确设置键值并导致输入的 id 出现一些问题。

例如,在元素中使用此代码

//Elements/users.ctp
$key = isset($key) ? $key : '<%= key %>';

<tr>
    <td><?php echo $this->Form->input("Role.{$key}.user_id", array('options' => $users, 'label' => false)); ?></td>
    <td class="actions">
        <a href="#" class="remove">Remove User</a>
    </td>
</tr>

这是生成的选择

<select name="data[Role][0][user_id]" id="Role<%=Key%>UserId">

编辑

在 /Elements/users.ctp 上正确设置了 $key 的值。我可以创建一行并回显 $key 的输出,并且该行的数字正确显示。上面可以看到,元素的名字设置正确,但是id还是设置的很奇怪。

选择元素的名称已正确设置,但 ID 未正确设置。 是什么导致选择 ID 为 Role&lt;%=Key%&gt;UserId 而不是 Role0UserId

【问题讨论】:

  • “我正在尝试创建一个带有动态添加输入的表单......但是当我提交表单时,我收到一个黑洞错误消息” - 一般而言,这是行不通的。您不能将安全组件(不摆弄配置)与动态表单字段一起使用。不要使用表单助手来生成与 CakePHP 格式不匹配的输入(您正在尝试将变量注入 id - 而表单助手并非旨在这样做)。

标签: javascript php jquery cakephp


【解决方案1】:

问题:

如果您观察到您发布的有问题的生成选择标签,它会显示

<%=Key%>

您正在使用的教程使用的下划线库预期的变量是

<%= key %>

CakePHP 表单输入正在替换该下划线变量的 html 字符和空格,因此下划线库无法检测到它。

解决方案:

为了解决此问题,您必须对模板部分使用纯 html 代码。你的grades.ctp必须如下图(部分代码便于理解)

<?php if (isset($key)) : ?>
    <tr>
        <td>
            <?php echo $this->Form->input("Grade.{$key}.id") ?>
            <?php echo $this->Form->input("Grade.{$key}.subject", array('label' => false)); ?>
        </td>   
    </tr>
    ...rest of the code
<?php else: ?>
    <tr>
        <td>
            <input type="hidden" id="Grade<%= key %>Id" name="data[Grade][<%= key %>][id]">     
            <div class="input text required">
                <input type="text" required="required" id="Grade<%= key %>Subject" maxlength="200" name="data[Grade][<%= key %>][subject]">
            </div>
        </td>
        ...rest of the code
    </tr>
<?php endif; ?>

【讨论】:

  • 使用下划线似乎有点傻,它只是复制一个 dom 片段并更改 id/name - (即原则上它是template = $('#Grade0Id').parents('tr'); copy = template.clone().find('input').attr('id', incrementIt).attr('name', incrementThat); copy.appendTo(template.parent());)'。无论如何+1,因为这是被问到的。
  • 谢谢,就是这样!我从来没有想过表单助手可能在创建表单之前对数据进行了清理。最后,我想我是否禁用此输入的安全功能并不重要。
  • @AD7six。同意你的观点,为了这个小目的,不需要下划线,jquery就足够了,我只是回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2013-12-13
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多