2012-12-07 15 views
13

Zajmuję się tworzeniem aplikacji przy użyciu Zend Framework 2 i używam pomocnika FormRow do renderowania etykiety, danych wejściowych i błędów (jeśli są obecne) w formularzu.Dodaj atrybut klasy do formularza Błędy

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

Gdy użytkownik przesyła formularz bez wypełnienia wymaganych Pole tekstowe tekst FormRow render's go z następującym komunikatem o błędzie:

<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> 

Jak mogę ustawić klasę na li tagu stylizować to później?

wiem, że mogę powtórzyć formElementErrors z pożądanym atrybutem klasy poprzez ..

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

..ale FormRow będzie nadal świadczył komunikat o błędzie bez klasy.

Tylko jestem odniesienia zachodzącego podmiotowi w ten sposób:

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; 
    } 

Odpowiedz

10

Ok, roztwór do mojego problemu było tuż przede mną, zamiast używać:

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

zadzwoniłem każdy element postaci indywidualnie:

//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")); 

nie wiem jeśli jest to najskuteczniejszy sposób na zrobienie tego, plz upuść linię, jeśli myślisz inaczej.

22

Zobacz the code of formElementErrors

Zasadniczo można zrobić coś takiego:

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

ale to jest zupełnie niepraktyczny ..

Lepszym rozwiązaniem byłoby rozszerzenie Zend \ Form \ View \ Helper \ FormElementErrors według własnej klasy, a następnie zarejestruj pomocnika viewEverper formElementErrors na swojej klasie. Zasadniczo masz coś takiego:

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">'; 
} 

Ostatnią rzeczą byłoby zarejestrowanie pomocnika widoku w tej nowej klasie. W tym celu podać następujący kod wewnątrz modułów Module.php

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

displaimer: Ten kod nie jest testowany, daj mi znać, jeśli istnieją pewne błędy, ale myślę, że to powinno wypracować całkiem dobrze.

+1

+1 Wystarczy, aby potwierdzić, to działa. Jeszcze raz dziękuję sam :) – webcoder

+1

To jest rodzaj starego wątku, ale żeby dodać moje dwa grosze: innym sposobem rejestracji jest dodanie wpisu do 'view_helpers => invokables' w pliku module.config.php zamiast do aktualne Module.php. Ten sam efekt, inna metoda. – blainarmstrong

2

FormRow sprawdza, czy wtyczka "form_element_errors" jest zarejestrowana. A jeśli tak, użyj go jako domyślnego, aby wyświetlać komunikaty o błędach.

Przykład Sam działa. Powinieneś przedefiniować standardową wtyczkę i poinformować o niej mvc.

Zrobiłem to w module.config.php

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

i FormRow rozpocząć błędy wyświetlania jako życzę :)

1

jako problemu, spróbuj

Zmień

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

do

//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) 

Render Błędy wiadomość jako funciton

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

używam echo $this->formElementErrors($form, array('class' => "error-messages")); aby pokazać wszystkie komunikaty o błędach w jednym miejscu:

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')); 
Powiązane problemy