2012-10-31 43 views
1

比方說,我有一個有幾個文本字段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> 

該代碼的工作,但我想知道是否有一個合適的,更舒適的方式來做到這一點?當需要更具動態性的多值表單時,我經常遇到這個問題,並且長時間沒有找到更好的解決方案。

+0

您已經在使用javascript來更改表單的行爲,不妨使用javascript來驗證和過濾表單。您始終可以重新驗證業務邏輯中的數據。或者,您可以使用ajax來獨立驗證表單的每個迭代。請記住,ZF還包含Dojo工具包和一些可能有用的Dojo表單元素。 – RockyFord

回答

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> 

字段根據發佈的表單呈現,並且驗證消息僅顯示在驗證失敗的值旁邊。

該幫手的代碼遠非完美(我只是重寫了這個問題的想法),但易於使用,可以被視爲一個很好的起點。

相關問題