2016-04-11 81 views
1

如何在我的表單行中包裝fieldset標籤,以及如何在元素無法驗證時向場集添加has-danger類?ZF2渲染窗體驗證上的自定義類錯誤

我想我需要創建一個viewhelper,檢查一個特定的formelement是否有一個驗證消息,並用fieldset包裝行,但我不確定這是正確的方法還是如何去做。

輸出我想驗證錯誤:

<fieldset class="has-danger"><label for="username">Username</label> 
<input type="text" name="username" id="username" class="form-control 
input-error" value="f"><ul><li>Needs to be 5-20 characters long</li> 
</ul></fieldset> 

register.phtml:

<?php 
$form = $this->registerForm; 
$form->prepare(); 
echo $this->form()->openTag($form); 

echo $this->formHidden($form->get('secret')); 
echo $this->formRow($form->get('username')); 
echo $this->formRow($form->get('password')); 
echo $this->formRow($form->get('email')); 
echo $this->formRow($form->get('confirm-email')); 
echo $this->formSubmit($form->get('submit')); 
echo $this->form()->closeTag($form); 
+0

你好@ user1989781你能粘貼*一個.phtml代碼更精度? – jbrtrnd

+1

可能的答案在這裏http://stackoverflow.com/questions/24183321/in-zf2-how-to-add-a-error-css-class-on-validation-failed – dixromos98

回答

0

好吧,你應該使用,而不是formRow()formLabel()formElement()formElementErrors()視圖助手。

根據我的ZF2知識,formRow()視圖助手不會讓您輕鬆控制HTML輸出。它在一行代碼中顯示完整的輸入HTML(標籤+輸入+錯誤)。

爲了簡單地實現自己的目標,一個輸入您的PHTML結構必須如下:

// NAME_OF_YOUR_FILE.phtml 
<?php 
    $userNameInput  = $form->get('username'); 
    $userNameInputErrors = $this->formElementErrors($userNameInput); 
?> 
<fieldset class="<?= $userNameInputErrors ? 'has-danger' : '' ?>" > 
    <?= $this->formLabel($userNameInput) ?> 
    <?= $this->formElement($userNameInput) ?> 
    <?= $userNameInputErrors ?> 
</fieldset> 

這是一項艱苦的工作,爲在形式上每個領域做到這一點,所以我建議你把這個視圖助手中的邏輯。

// MyFormRow.php 
<?php 
    namespace Your\Namespace; 

    use Zend\View\Helper\AbstractHelper; 

    class MyFormRow extends AbstractHelper 
    { 
     protected $formLabelViewHelper; 
     protected $formElementViewHelper; 
     protected $formElementErrorsViewHelper; 

     public function __construct($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper) 
     { 
      $this->formLabelViewHelper   = $formLabelViewHelper; 
      $this->formElementViewHelper  = $formElementViewHelper; 
      $this->formElementErrorsViewHelper = $formElementErrorsViewHelper; 
     } 

     public function __invoke($formElement) 
     { 
      $html = ''; 

      $errors = $this->formElementErrorsViewHelper->__invoke($formElement);  

      $html .= '<fieldset class=" . ($errors ? 'has-danger' : '') . ">';  
       $html .= $this->formLabelViewHelper->__invoke($formElement); 
       $html .= $this->formElementViewHelper->__invoke($formElement); 
       $html .= $errors; 
      $html .= '</fieldset>'; 

      return $html; 
     } 
    } 
?> 

聲明它在你的Module.php

// In your Module.php 
<?php 

    ... 

    public function getViewHelperConfig() 
    { 
     return [ 
      'factories' => [ 
       'myFormRow' => function (HelperPluginManager $helperPluginManager) { 
        $formLabelViewHelper  = $helperPluginManager->get('formLabel'); 
        $formElementViewHelper  = $helperPluginManager->get('formElement'); 
        $formElementErrorsViewHelper = $helperPluginManager->get('formElementErrors'); 

        return new MyFormRow($formLabelViewHelper, $formElementViewHelper, $formElementErrorsViewHelper); 
       }, 
      ], 
     ]; 
    } 
?> 

現在在你的PHTML文件,只需:

// NAME_OF_YOUR_FILE.phtml 

... 

<?= echo $this->myFormRow($form->get('username')) ?> 

... 
+0

謝謝! :) 出於某種原因,我不得不調用我的視圖助手中的invoke方法,如: $ html。= $ this-> formLabelViewHelper - > __ invoke($ formElement); btw當實例化$ errors時,你寫了錯誤的方法名稱。 – user1989781