比方說,我有一個有幾個文本字段Zend_Form的形式,例如:ZF:表陣列場 - 如何在視圖中顯示的值正確
$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>
該代碼的工作,但我想知道是否有一個合適的,更舒適的方式來做到這一點?當需要更具動態性的多值表單時,我經常遇到這個問題,並且長時間沒有找到更好的解決方案。
您已經在使用javascript來更改表單的行爲,不妨使用javascript來驗證和過濾表單。您始終可以重新驗證業務邏輯中的數據。或者,您可以使用ajax來獨立驗證表單的每個迭代。請記住,ZF還包含Dojo工具包和一些可能有用的Dojo表單元素。 – RockyFord