ZEND_Form und die Decoratoren

Hallo Community,
arbeite mich gerade in das Zend_Form Prinzip ein, und habe ein paar kleine Denkprobleme.
Momentan nutze ich das layout.phtml in dem der Content eingebunden ist.
Hier werden dann ja die benötigten Views, welche unter view/scripts liegen eingebunden.
Hier habe ich bisher immer den HTML Code geschrieben ud dann via <Php echo $this->test ?> eingebunden usw.. usw.. Funtioniert bisher alles auch super.
Jetzt möchte ich gerne Zend_Form einsetzen um mich einfach mit der Materie auch mal auseinander zu setzen.
Problem sind die Decoratoren...
unter Zuhilfenahme der Decoratoren kann ich ja jetzt auch dd,dl usw auch zu einem table, tr, td umsetzen und somit nicht den standard nutzen.
Wie stelle ich es jedoch an, wenn ich die Struktur wie folgt abbilden möchte...
Beispiel: form, div, table, tr, td
bekomme alles hin, ausser den div

Kennt jemand ein gutes Tutorial (bitte nicht die Zend API), oder hat jemand ein zwei zeilen code parat??
 
um allgemein mal noch Quellen für Zend-Framework-HowTos zu erwähnen:

ich finde, Ralf Eggert schreibt immer sehr schön verständlich.

hab mich auch mit seinem Travello-Blog-Tutorial damals in die Thematik Zend Framework eingearbeitet. (bzw. mit einer aktualisierten Version, die auf seinem Tut basierte)

Zum Zend_Form hat er z.B. auch was geschrieben, hab jetzt aber leider gerade nicht die Zeit, mir selbst den ganzen Artikel durchzulesen, aber vielleicht hilft's dir ja:
http://it-republik.de/php/artikel/E...Form-Komponente-des-Zend-Frameworks-1904.html
 
Mmmmh...
Habe jetzt den gewünschten Erfolg erzielt. Und dachte es auch verstanden zu haben.
PHP:
class Application_Form_Test extends Zend_Form {
    
    public function _construct( $options = null ) {
        parent::_construct( $options );
    }
    
    public function init() {
        
          $lastName =  $this->createElement('text', 'Nachname');
          $lastName->setLabel('Nachname:')
                 ->setAttrib('size', 25)
                 ->addValidator('StringLength', false,array(3,50))
                 ->setValue('')
                 ->setRequired(true);
                
          $givenName =  $this->createElement('text', 'Vorname');
          $givenName->setLabel('Vorname:')
                  ->setAttrib('size', 25)
                  ->addValidator('StringLength', false,array(3,50))
                  ->setValue( '' )
                  ->setRequired(true);
                
           $street =  $this->createElement('text', 'Strasse');
           $street->setLabel('Strasse:')
               ->setAttrib('size', 25)
               ->addValidator('StringLength', false,array(3,50))
               ->setValue('')
               ->setRequired(true);

           $postalcode = $this->createElement('text', 'Plz');
           $postalcode->setLabel('Plz:')
                   ->setAttrib('size', 5)
                   ->addValidator('StringLength', false,array(5,5))
                   ->setValue('')
                   ->setRequired(true);
                  
        $city =  $this->createElement('text', 'Wohnort');
           $city->setLabel('Wohnort:')
             ->setAttrib('size', 50)
             ->addValidator('StringLength', false,array(1,50))
             ->setValue('')
             ->setRequired(true);
             
         
        
        $this->addElements( array (
                            $lastName,
                            $givenName,
                            $street,
                            $postalcode,
                            $city,
                            $password,
                            $confirmPassword,
                            )
        );
        
        $this->addDisplayGroup(array(
                        'Nachname',
                        'Vorname',
                        'Strasse',
                        'Plz',
                        'Wohnort',
            ),'contact', array('legend' => 'Contact Information')
        );

        $this->setElementDecorators(array(
                    'viewHelper',
                    'Errors',
                    array(array('contact'=>'HtmlTag'),array('tag'=>'td')),
                    array('Label',array('tag'=>'td')),
                    array(array('row'=>'HtmlTag'),array('tag'=>'tr'))
        ));
                
        $contact = $this->getDisplayGroup( 'contact' );
        $contact->setDecorators(array(
                    'FormElements',
                    array('HtmlTag',array('tag'=>'table','style'=>'')),
        ));
                
        $this->setDecorators(array(
                'FormElements',
                array(array('contact'=>'HtmlTag'),array('tag'=>'div')),
                'Form'
        ));
    }
    
}
Um mein eigenes Verständnis zu testen :wink: dachte ich jetzt dass der contact in einem Fieldset abgebildet werden soll

sprich --> div,fieldset,legend,table,tr,td

bekomme auch das fieldset hin

PHP:
 $this->setDecorators(array(
                'FormElements',
                   array( 'HtmlTag',array('tag'=>'fieldset','style'=>'')),
                array(array('contact'=>'HtmlTag'),array('tag'=>'div')),
                'Form'
        ));
Wie kann ich dem Fieldset jetzt die legend zuweisen???
 
So, ich für meinen Teil bekommen dass jetzt soweit umgesetzt. Für die, die eventuelle die gleichen Probleme haben ein zwei Beispiele...
Am Beispiel <table>

Einen Decorator als Eigenschaft definieren

PHP:
    public $tableDecorators = array(
        'ViewHelper',
        'Errors',
        array( array( 'data' => 'HtmlTag' ), array( 'tag' => 'td' ) ),
        array( 'label', array( 'tag' => 'td' ) ),
        array( array( 'row' => 'HtmlTag' ), array( 'tag' => 'tr', 'style' => 'vertical-align:top;' ) ),
    );
Unsere Form sowie die dazugehörigen Element in der init Methode initialisieren

PHP:
$this->setAction( 'index/index' )
       ->setMethod( 'post' );
        
        $feld1= $this->createElement( 'textarea', 'feld1',  array('rows' => 3, 'cols' => 40, 'readonly' => 'readonly' ) );
        $feld1->setDecorators( $this->tableDecorators );
        $this->addElement( $feld1 );
        
$feld2= $this->createElement( 'textarea', 'feld2',  array('rows' => 3, 'cols' => 40 ) );
         $feld2->setDecorators( $this->tableDecorators );
        $this->addElement( $feld2 );        $feld2->setDecorators( $this->tableDecorators );
        $this->addElement( $feld2 );
Jetzt nur noch die sachen in eine gruppr fassen, sodass wir das ergebnis
<tr><td><label></label><textarea ...></textarea></td></tr>
<tr><td><label></label><textarea ...></textarea></td></tr>
erhalten

Nun brauchen wir nur noch den table, sodass wir die gruppe jetzt an den table einfach anhängen

PHP:
$this->addDisplayGroup(array(
                       'feld1',
                           'feld2',
            ),'testgruppe', array( 'tag' => 'table' )
        );
                
        $testgruppe = $this->getDisplayGroup( 'testgruppe' );
           $testgruppe->setDecorators(array(
               'FormElements',
            array( 'HtmlTag', array( 'tag' => 'table', 'class' => 'table'))
        ));
Sollte noch ein separater table benötigt werden einfach das gleich mit anderen Bezeichner definieren und zum schluss alle FormElements der Form hinzufügen.

PHP:
 $this->setDecorators(array(
            'FormElements',
            array( 'HtmlTag', array( 'tag' => 'div', 'class' => 'div' ) ),
            'Form'
        ));
Um den Standard decorator hier nicht zu verwenden, geben wir der Form einfach eoinen div mit in dem der table dann eingebettet werden soll

Okili Dokili

P.S. Wie ich den Errordecorator umgestalte bin ich gerade selber am herausfinden, also wenn jemand da weiterhelfen kann würde mich freuen...
 
Zurück
Oben