• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Beste Art der Formgenerierung

-iis-

New member
Hallo,

kann mir jemand sagen, was die beste Art ist, Forms zu definieren?
In meiner Anwendung habe ich Formelemente, die teilweise dynamisch generiert werden müssen. Je nach angemeldetem Benutzer, kann ein Dropdown-Menü unterschiedliche Items enthalten. Ich muss also die Formgenerierung dynamisieren können.

Ich findes sowas:
PHP:
$loginname = new Zend_Form_Element_Text('loginname');
$loginname->setLabel ('Login name: ')
      ->setValue('')
      ->setRequired();
 $loginpassword = new Zend_Form_Element_Password('loginpassword');
 $loginpassword -> setLabel("Password: ")
      -> setRequired();
$bntSubmit = new Zend_Form_Element_Submit('login');
$bntSubmit->setLabel("Login");
$this->addElements(array($loginname, $loginpassword, $bntSubmit));
        $this->setMethod('post');
        $this->setAction(Zend_Controller_Front::getInstance()->getBaseUrl() . '/authorization/login');
und ich habe auch sowas schon gesehen:

PHP:
$this->addElement(
                'ComboBox',
                'createUserTitle',
                array(
        
                        'label' => 'Title',
                        'checkedValue'=>'0',
                        'unCheckedValue'=>'1',
                        'checked' => true,
                        'class' => 'settingsinputfield',
                        'multiOptions' => array(
                                'n/a' => 'n/a',
                                '1' => 'Mag.',
                                '2' => 'Prof..',
                                '3' => 'Dipl.Inf..',
                                '4' => 'Dipl.Ing..',
                        )
                ));
Daneben gibt es ja auch noch die Möglichkeit, Forms in der View deklarativ zu erstellen, etwa so:

PHP:
 <div data-dojo-type="dijit.layout.BorderContainer" design="headline" persist="false" gutters="true" style="min-width: 1em; min-height: 1px; position: absolute; z-index: 900; width: 300px; height: 300px; left: 266px; top: 65px;">
<div data-dojo-type="dijit.layout.ContentPane" extractContent="false" preventCache="false" preload="false" refreshOnShow="false" region="center" splitter="false" maxSize="Infinity" doLayout="false">
<label id="lbLoginSite" style="left: 7.999998701171875px; top: 13.300003051757812px; width: 100px;">
RIS site</label>
<select data-dojo-type="dijit.form.Select" id="ddStation" title="Station Login " type="text" name="ddRisSite" value="Station A" intermediateChanges="false" emptyLabel="&#160;" required="required" scrollOnFocus="true" autoWidth="true" style="left: 57.00033000000002px; top: 95.00032999999999px; width: 150px;" class="userInput">
<option value="Station A">Station A</option>
<option value="Station 
B">
Station B</option>
<option value="Station C">
Station C</option>
</select>
<br style="left: 241.88333px; top: 17.88333px;"></br>
<label id="lblLoginName" style="left: 217.88333px; top: 24.88333px; width: 100px;">
Login name</label>
<input type="text" data-dojo-type="dijit.form.TextBox" id="tbLoginName" name="tbLoginName" intermediateChanges="false" trim="false" uppercase="false" lowercase="false" propercase="false" selectOnClick="false" style="left: 56.88333px; top: 137.88333px; width: 150px;" class="userInput" title="Login Name"></input>
<br style="position: absolute; z-index: 900; left: 227.88333px; top: 20.88333px;"></br>
<label id="lblLoginPassword" style="left: -7.11667px; top: 67.88333px; width: 100px;">
Password</label>
<input type="password" data-dojo-type="dijit.form.TextBox" id="tbLoginPassword" name="tbLoginPassword" intermediateChanges="false" trim="false" uppercase="false" lowercase="false" propercase="false" selectOnClick="false" style="left: 57.88333px; top: 176.88333px; width: 150px;" class="userInput" title="Login Password"></input>
</div>
Letzteres ist vermutlich der schlechteste Weg, da ich hier die Businesslogik , die Elemente dynamisch einfügt oder ausblendet in die View packen müsste.

Wie würdet ihr vorgehen?
 

Kaiuwe

Super-Moderator
kann mir jemand sagen, was die beste Art ist, Forms zu definieren?
In meiner Anwendung habe ich Formelemente, die teilweise dynamisch generiert werden müssen. Je nach angemeldetem Benutzer, kann ein Dropdown-Menü unterschiedliche Items enthalten. Ich muss also die Formgenerierung dynamisieren können.
Die ersten beiden Codeauszüge unterscheiden sich doch nur die Schreibweise, mehr ist es nicht. Deinen mögen die erste Variante, weil sie eine automatische Codevervollständigung erhalten, und die Anderen mögen lieber die Array-schreibweise, weil es übersichtlicher für sie ist.
Den letzten Auszug kann doch keiner lesen? Zurück auf Anfang würde ich hier sagen!


Mach es dir selber nicht so schwer: Du hast doch schon eine Klasse, welche von „Zend_Form“ abgeleitet ist und die kannst du doch ganz einfach mit weiteren Methoden erweitern, z.B. „setUserRole“ und schon kannst du in der Klasse entsprechend damit arbeiten.
Sollen z.B. die Werte für die Auswahlliste aus der Datenbank kommen, könntest du auch folgendes schreiben:
PHP:
$form = Application_Form_Foo();
$form->myElement->setMultiOptions($optionsFromDatabase);
Um das „action“-Attribut für dein Formular zu setzen, reicht im Kontroller:
PHP:
$form->setAction($this->getHelper('url')->url(array(), 'routeName'));
Vergiss den Quatsch mit der „BaseUrl“!
 
Zuletzt bearbeitet:

-iis-

New member
Mach es dir selber nicht so schwer: Du hast doch schon eine Klasse, welche von „Zend_Form“ abgeleitet ist und die kannst du doch ganz einfach mit weiteren Methoden erweitern, z.B. „setUserRole“ und schon kannst du in der Klasse entsprechend damit arbeiten.
PHP:
$form = Application_Form_Foo();
$form->myElement->setMultiOptions($optionsFromDatabase);
Das habe ich noch nicht ganz verstanden... Kannst Du mir das bitte nochmal erläutern? Der Beispiel-Code ist für den Controller, oder? Und was soll dann in der Form passieren?




Die Dritte Variante hat Maqetta erzeugt: http://app.maqetta.org/maqetta/
Das wäre einfach zu Designen. Aber vermutlich ja eh nicht gescheit zu dynamisieren....

P.S. Innerhalb der Form-Klasse kommt das in die init-Methode, oder?
 

Kaiuwe

Super-Moderator
Das habe ich noch nicht ganz verstanden... Kannst Du mir das bitte nochmal erläutern? Der Beispiel-Code ist für den Controller, oder? Und was soll dann in der Form passieren?
PHP:
$form->myElement->setMultiOptions($optionsFromDatabase);
// ist das Gleiche wie:
$form->getElement('myElement')->setMultiOptions($optionsFromDatabase);
Und es werden die Optionen für deine Auswahlliste gesetzt. (Nach deinem Beispiel wären das „Mag.“, „Prof.“, …)


Die Dritte Variante hat Maqetta erzeugt: http://app.maqetta.org/maqetta/
Was soll das sein?
Das wäre einfach zu Designen.
Ganz im Gegenteil, denn es wurde eine Direktformatierung verwendet und das erzeugte HTML beinhaltet eine Menge nicht gültige Attribute.

Aber vermutlich ja eh nicht gescheit zu dynamisieren....
Geht schon, aber das ist überhaupt nicht sinnvoll.

P.S. Innerhalb der Form-Klasse kommt das in die init-Methode, oder?
Nee, wieso?
Bitte nicht vergessen, dass alles nach wie vor reines PHP ist. Also auch so schreiben:

PHP:
class Application_Form_Foo extends Zend_Form
{
    public function init()
    {
         // …
    }

    public function setUserRole($role)
    {
        // …
    }
}
 

crash

New member
Zwei Vorteile fallen mir noch für Array-Methode ein, die für mich ausschlaggebend sind,
a) geringere direkte Abhängigkeit der Klasse von anderen Klassen
b) woher die Felder geladen werden lässt sich besser steuern, so kann man z.B. 'text' einfach durch etwas eigenes ersetzen.
 

Kaiuwe

Super-Moderator
Habe grade noch eine weitere Variante gesehen: Ablage einer Formbeschreibung als XML.

Was haltet Ihr davon?
Du kannst alle Formaten verwenden, die „Zend_Config“ unterstützt.
Mit einer echten Form-Klasse bekommst du eine entsprechende Codeunterstützung in deiner IDE und du kannst die Klasse ganz schnell und einfach nach deinen Wünschen/Anforderungen anpassen. Du sparst auch die zusätzliche Verarbeitung der Konfigurationsdateien.
 

-iis-

New member
Hat jemand schon auf die programmatische Art und Weise Tooltips erzeugt?

PHP:
$this->addElement(
                'Tooltip',
....
funktioniert bei mir nicht...
 
Oben