【问题标题】:How can I dynamically create multiple checkboxes with Zend Form?如何使用 Zend Form 动态创建多个复选框?
【发布时间】:2012-02-26 19:18:08
【问题描述】:

你能帮我解决我的问题吗?
我想在使用数据库信息构建的用户列表的每一行上放置一个复选框,并添加一个验证按钮来发布我的表单。我的列表应该是这样的:-

因此,用户将选中链接到他想要验证的学生的复选框。 结果的行数是可变的,所以我不知道该怎么做。 我希望我的描述很清楚。

【问题讨论】:

  • 没有多选框这样的东西。复选框已设置或未设置。只需为数据库中的每一行创建一行,并为每一行添加一个唯一的复选框。
  • 谢谢 Markus!请告诉我如何动态地为每一行添加一个唯一的复选框。我曾经使用 zend 表单在我的应用程序中添加表单(当我已经知道要添加的复选框的数量时)。这次复选框的数量是数据库找到的行数的函数。我必须直接将它添加到我的视图文件中吗?如果是,如何?
  • 您不必在视图中执行,您可以在表单文件中执行。只需对结果数组执行 foreach 循环即可。
  • 你能给我举个例子吗?我不明白你的意思

标签: zend-framework checkbox zend-form


【解决方案1】:

您没有显示任何代码,但我假设您在控制器中的某个位置获得了学生的数量。

要使用 Zend_Form 实现您想要的效果,您需要单独渲染每个元素,但首先您需要找到一种方法将正确数量的元素添加到您的表单中。

您最好在您的表单类中执行此操作以将逻辑排除在控制器之外,但为了使这个答案简单,我将向您展示如何在您的控制器中实现这一点,然后您可以根据需要调整代码。

$numStudents = getNumberOfStudentsSomehow();
$studentForm = new yourFormClass();

for($i = 0; $i <= $numStudents; $i++){
    $checkBoxes[] = new Zend_Form_Element_Checkbox('checkBox_' . $i);
}
$studentForm->addElements($checkBoxes);
$this->view->studentForm = $studentForm;

您的表单现在包含正确数量的复选框,您可以将其传递给视图。
在视图中,您有多个用于呈现表单的选项,可以是 RockyFord 建议的部分视图、view helper (documentation here)、创建 custom view script for your form,或直接在您的视图中呈现。

为了让您开始,您可以在视图中呈现表单中的单个元素,如下所示:-

echo $this->view->studentForm->checkBox_0;

【讨论】:

    【解决方案2】:

    我认为这可能是一种情况,partialLoop() 可能是最好的解决方案。

    在您的控制器中像往常一样从模型中获取数据并将数据分配给视图

    $this->view->modelData= $data;
    

    接下来在/views/scripts 中为这个演示创建一个新的.phtml 文件,我们将其命名为_demoRow.phtml,然后为一个表格行编写html 和php(在这种情况下)。

    <tr>
        <td><?php echo $this->name ?></td>
        <td><?php echo $this->class ?></td>
        <td><?php echo $this->birth_date ?></td>
        <td><input type="checkbox" name="id" value="<?php echo $this->id ?> /></td>
    </tr>
    

    然后在您的正常视图中,只需放置静态信息并渲染部分

    <form action="/your/action/url" method="post">
      <table class="spreadsheet" cellspacing="0">
        <tr>       
            <th>Student Name</th>
            <th>Class</th>
            <th>Birth Date</th>
            <th>Select</th>
        </tr>
        <?php echo $this->partialLoop('_demoRow.phtml', $this->modelData) ?>
        <tr>
            <input type="submit" name="submit" value="valider" />
        </tr>
      </table>
    </form>
    

    这应该近似于您正在查看的内容。

    【讨论】:

    • 提交表单时会发生什么? Zend-Form 将不知道新元素,它们将不可用。
    • @vascowhite 当您点击提交按钮时,该表单使用 post 方法提交,就像任何其他表单一样。 Zend_Form 不是魔术,它只是抽象表单的构建并生成 html,它与发布表单时发生的事情无关。
    • Zend_Form 的某些方法不适用于您的解决方案:- isValid(),使用 foreach() 逐步遍历元素,getValues()getValue() 在任何添加的元素上,getValidValues() ;所有这些都适用于提交的表单。还有其他的,但我认为这足以说明我的观点。
    • @vascowhite foreach() 将适用于任何数组,isValid 属于 Zend_Validate,getValues 和 getValue() 只需将 Zend_Filter_Input 应用于 getParams() 或 getPost()。当然 Zend_Form 很方便,但它不是必需的,有时会使事情变得更加困难。
    • OP 说(暗示?)他正在使用 Zend Form。我引用的所有方法都属于Zend Form,我直接从代码中拿了例子。您的解决方案是有效的,我只是因为 OP 对 Zend Form 的引用而对其提出质疑。查看您的个人资料,您的背景似乎与我的相似:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2012-10-31
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多