ZF:表单数组字段 - 如何正确显示视图中的值

时间:2012-10-31 11:42:36

标签: zend-framework zend-form

假设我有一个Zend_Form表单,其中包含一些文本字段,例如:

$form = new Zend_Form();
$form->addElement('text', 'name', array(
    'required' => true,
    'isArray' => true,
    'filters' => array( /* ... */ ),
    'validators' => array( /* ... */ ),
));
$form->addElement('text', 'surname', array(
    'required' => true,
    'isArray' => true,
    'filters' => array( /* ... */ ),
    'validators' => array( /* ... */ ),
));

渲染后,我有以下HTML标记(简化):

<div id="people">
    <div class="person">
        <input type="text" name="name[]" />
        <input type="text" name="surname[]" />
    </div>
</div>

现在我希望能够添加尽可能多的人。我创建了一个“+”按钮,在Javascript中将div.person附加到容器中。在我提交表单之前,我有5个名字和5个姓氏,作为数组发布到服务器。一切都很好,除非有人把价值放在没有验证的领域。然后整个表单验证失败,当我想再次显示表单(有错误)时,我看到PHP警告:

htmlspecialchars() expects parameter 1 to be string, array given

在故障单中更多或更少描述:http://framework.zend.com/issues/browse/ZF-8112

然而,我提出了一个不太优雅的解决方案。我想要实现的目标:

  • 在视图中再次呈现所有字段和值
  • 仅在包含错误值的字段旁边显示错误消息

这是我的解决方案(查看脚本):

<div id="people">
<?php
$names = $form->name->getValue(); // will have an array here if the form were submitted
$surnames= $form->surname->getValue();

// only if the form were submitted we need to validate fields' values
// and display errors next to them; otherwise when user enter the page
// and render the form for the first time - he would see Required validator
// errors
$needsValidation = is_array($names) || is_array($surnames);

// print empty fields when the form is displayed the first time
if(!is_array($names))$names= array('');
if(!is_array($surnames))$surnames= array('');

// display all fields!
foreach($names as $index => $name):
    $surname = $surnames[$index];
    // validate value if needed
    if($needsValidation){
        $form->name->isValid($name);
        $form->surname->isValid($surname);
    }
?>
  <div class="person">
     <?=$form->name->setValue($name); // display field with error if did not pass the validation ?>
     <?=$form->surname->setValue($surname);?>
  </div>
<?php endforeach; ?>
</div>

代码工作,但我想知道是否有适当的,更舒适的方法来做到这一点?当需要更多动态 - 多值形式并且长时间没有找到更好的解决方案时,我经常遇到这个问题。

1 个答案:

答案 0 :(得分:0)

没有更好的想法,我创建了一个处理上述逻辑的视图助手。它可以找到here

如果帮助程序在视图中可用,则可以按以下方式使用(使用问题中的表单):

<?= 
    $this->formArrayElements(
        array($form->name, $form->surname), 
        'partials/name_surname.phtml'
    );
?>

application/views/partials/name_surname.phtml部分视图的内容为:

<div class="person">
    <?= $this->name ?>
    <?= $this->surname ?>
</div>

根据发布的表单呈现字段,验证消息仅显示在验证失败的值旁边。

帮助者的代码远非完美(我刚刚从问题中重写了这个想法),但它易于使用,可以被认为是一个很好的起点。