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' ) )
        ));
Zend_Form – legend dla fieldset
Tagged on:             

Leave a Reply

Your email address will not be published. Required fields are marked *

Social Widgets powered by AB-WebLog.com.