Tworząc formularze z użyciem Zend_Form mamy możliwość grupowania pól w różne obszary – fieldset. Jak zapewne wiecie, dla każdego obszaru mamy możliwość ustawienia etykiety. W kodzie html wygląda to następująco:
<form action="/register" method="post">
<div>
<div class="form-group">
<fieldset id="fieldset-basic">
<legend>Dane użytkownika</legend>
<div class="form-element">
<label class="required" for="name">Imię:</label>
<input id="name" type="text" name="name" value="" />
</div>
<div class="form-element">
<label class="required" for="surname">Nazwisko:</label>
<input id="surname" type="text" name="surname" value="" />
</div>
<!-- kolejne pola tej grupy -->
</fieldset>
</div>
</div>
</form>
Aby uzyskać efekt grupowania w formularzu, jego kod będzie wyglądał następująco:
class SmartGroup_Form_Register extends SmartGroup_Model_Form {
protected function _renderForm() {
$this->setMethod('post');
$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel('Imię:');
$surname = new Zend_Form_Element_Text( 'surname' );
$surname->setLabel('Nazwisko:');
$this->addElements( array( $name, $surname ) );
$this->addDisplayGroup( array( 'name', 'surname' ), 'basic' );
}
}
W linii 14 powyższego kodu dla instancji obiektu Zend_Form wywołujemy metodę “addDisplayGroup”, która nam tworzy sekcję fieldset, a w niej umieszcza wskazane elementy (w tym wypadku name oraz surname). Elementy, które mają być dodane do grupy przekazujemy w postaci tablicy jako pierwszy parametr metody addDisplayGroup. Drugi parametr to string, który posłuży do stworzenia identyfikatora grupy w postaci “fieldset-basic” dla powyższego przykładu.
W tym momencie pojawia się kwestia, jak dodać element legend do danej grupy pól formularza. Gdy skorzystamy z funkcji podpowiadania kodu w naszym IDE, łatwo można zauważyć, że mamy dostępną metodę setLegend(). Oczywiście pierwszym krokiem jest wykorzystanie tej metody i po odświeżeniu strony… zaskoczenie. Element legend nie został wyrenderowany.
Jak więc można rozwiązać ten problem? Otóż wystarczy wykorzystać trzeci parametr metody “addDisplayGroup”, który jest opisany jako “$options”. Wywołajmy więc tą metodę z następującymi parametrami:
$this->addDisplayGroup( array( 'name', 'surname' ), 'basic', array('legend' => 'Dane użytkownika' ) );
W tym momencie wszystko zadziała tak, jak się spodziewaliśmy. Z małą jednak różnicą, że fieldset zostanie umieszczony w tagach dt, dd. Jeżeli chcemy tego uniknąć, wystarczy w klasie nadrzędnej (w moim przypadku SmartGroup_Model_Form opisana w poprzednim poście), dodać następujący kod w metodzie _replaceViewDecorators:
$this->setDisplayGroupDecorators(array(
array('FormElements'),
array('Fieldset'),
array( 'HtmlTag', array( 'tag' => 'div', 'class' => 'form-group' ) )
));
