2012-12-07 33 views
13

我正在開發一個使用Zend Framework 2的應用程序,我使用FormRow幫助程序在表單中呈現標籤,輸入和錯誤(如果存在)。將類屬性添加到表單錯誤

<label> 
    <span>Name: </span> 
    <input class="input-error" type="text" value="" placeholder="Insert Name Here" name="Name"> 
</label> 
<ul> 
    <li>Value is required and can't be empty</li> 
</ul> 

如何設置一類爲標籤:

//within the view 
echo $this->formRow($form->get('Name')); 

當用戶提交表單沒有填寫所需的輸入文本字段FormRow與以下錯誤消息render's它事後設計?

我知道我可以經由..

<?php echo $this->formElementErrors($form->get("Name"), array('class' => "valuerequired", 'message' => "errortestmessage")); ?> 

回聲與期望的類屬性formElementErrors ..但仍然FormRow將使錯誤消息沒有類。

僅供參考I'm設置實體是這樣的:

public function getInputFilter() 
    { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 

      $factory = new InputFactory(); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'Name', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name'  => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 

      $this->inputFilter = $inputFilter; 
     } 
     return $this->inputFilter; 
    } 

回答

10

好了,解決我自己的問題就在我的面前,而不是使用:

//within the view 
echo $this->formRow($form->get('Name')); 

我叫表單的每個元素獨立:

//within the view 
    echo $this->formLabel($form->get('Name')); 
    echo $this->formInput($form->get('Name')); 
    echo $this->formElementErrors($form->get("Name"), array('class' => "some_class", 'message' => "errormessage")); 

鴕鳥政策知道如果它是最有效的方式,如果您認爲不然,請放下一條線。

22

the code of formElementErrors

基本上,你可以這樣做:

$this->formElementErrors($elem) 
    ->setMessageOpenFormat('<ul%s><li class="some-class">') 
    ->setMessageSeparatorString('</li><li class="some-class">'); 

但是,這是相當不方便.. 。

更好的解決方案是擴展Zend \ Form \ View \ Helper \ FormElementErrors通過你自己的類,然後註冊view-helper formElementErrors到你的類。所以基本上你會有這樣的事情:

namespace Mymodule\Form\View\Helper; 

use Zend\Form\View\Helper\FormElementErrors as OriginalFormElementErrors; 

class FormElementErrors extends OriginalFormElementErrors 
{ 
    protected $messageCloseString  = '</li></ul>'; 
    protected $messageOpenFormat  = '<ul%s><li class="some-class">'; 
    protected $messageSeparatorString = '</li><li class="some-class">'; 
} 

最後一件事就是註冊視圖助手這個新的類。爲此,您提供以下代碼的模塊Module.php

public function getViewHelperConfig() 
{ 
    return array(
     'invokables' => array(
      'formelementerrors' => 'Mymodule\Form\View\Helper\FormElementErrors' 
     ), 
    ); 
} 

displaimer:此代碼沒有經過測試,讓我知道,如果有一些錯誤,但我認爲這應該工作得非常好。

+1

+1只是爲了確認,這是工作。再次感謝山姆:) – webcoder

+1

這是一種古老的線程,但只是添加我的兩分錢:另一種方式來註冊這是添加一個條目到'view_helpers => invokables'在你的module.config.php文件,而不是實際的Module.php。相同的效果,不同的方法。 – blainarmstrong

2

FormRow檢查是否註冊了「form_element_errors」插件。如果是這樣,則將其用作默認值以顯示錯誤消息。

So Sam的例子工作。您應該重新定義標準插件並通知mvc。

我在module.config中完成了它。PHP

'view_helpers' => array(
'invokables' => array(
    'formElementErrors'=> 'MyModule\View\Helper\FormElementErrors', 

,正如我希望:)

1

至於你的問題,請嘗試

變化

//within the view 
echo $this->formRow($form->get('Name')); 

//within the view 
echo $this->formRow($form->get('Name'),null,false); 
// Note: add more 2 last parameters, false- for $renderErrors => will NOT render Errors Message. 
//Look original function in helper/formrow.php: function __invoke(ElementInterface $element = null, $labelPosition = null, $renderErrors = null, $partial = null) 

渲染錯誤消息爲您的功能可按

echo $this->formElementErrors($form->get('name'), array('class' => 'your-class-here')); 
0

我用echo $this->formElementErrors($form, array('class' => "error-messages"));表明在一個地方的所有錯誤消息:

echo $this->formElementErrors($form, array('class' => "error-messages"));// Print all error messagess 

echo $this->formLabel($form->get('Name')); 
echo $this->formInput($form->get('Name')); 

echo $this->formLabel($form->get('Name2')); 
echo $this->formInput($form->get('Name2'));