假设我有一个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>
代码工作,但我想知道是否有适当的,更舒适的方法来做到这一点?当需要更多动态 - 多值形式并且长时间没有找到更好的解决方案时,我经常遇到这个问题。
答案 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>
根据发布的表单呈现字段,验证消息仅显示在验证失败的值旁边。
帮助者的代码远非完美(我刚刚从问题中重写了这个想法),但它易于使用,可以被认为是一个很好的起点。