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' ) ) ));