Subform (Fieldset) in XML-Config-Datei - Zend Framework

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Subform (Fieldset) in XML-Config-Datei - Zend Framework

    Hi Mädels,

    ich suche schon seit einiger Zeit eine Möglichkeit in einer Config-Datei eingelesen mit Zend_Config Subforms, also quasi Formular-Elemente in einem Fieldset, in der Config-Datei so zu speichern, dass Zend_Form sie dann auch wie alle anderen Elemente automatisch in ein Formular lädt. Wie müsste diese Angabe in etwa aussehen? Hat da irgendwer bisher Erfahrungen mit machen können?

    Gruß
    Lemmi

    PS: Falls ich mich undeutlich ausgedrückt haben sollte: framework.zend.com/manual/de/z…nd.form.quickstart.config
  • Was für ein Zufall, damit wollte ich mich die Tage auch beschäftige :)
    Ich steck noch in der Doku, aber dort steht doch eigentlich alles drin? (Punkt 21.2.7)

    Die Xml Datei würde ich genau so aufbauen wie die Ini Datei.

    Quellcode

    1. <development>
    2. <user>
    3. <login>
    4. <action>/user/login</action>
    5. <method>post</method>
    6. </login>
    7. <elements>
    8. ...
    9. </elements>
    10. </user>
    11. </development>
    Alles anzeigen


    Und dann natürlich nicht Zend_Config_Ini sondern Zend_Config_Xml nutzen :P


    Mit praktischen Erfahrungen kann ich dir leider nicht dienen.
  • So, falls es irgendwen noch interessiert. Das Zend-Framework ist sicherlich genial. Jedenfalls in vielerlei Hinsicht. Ausnahme bildet da meiner Meinung nach Zend_Form. Ich habe noch nie so viel Arbeit damit gehabt, ein Formular eines Frameworks in ein gewünschtes Layout einzuarbeiten.

    Die Lösung, die ich nun in der DevZone von Zend fand, ist im Grunde noch ein Stück simpler. Jedenfalls bei Zend. Ich hab nun einfach eine Klasse für jedes Formular, dass wieder eine eigene Klasse (in meinem Fall Virb_Form) erbt, die wiederrum die Zend_Form Klasse erbt. Mit ein Paar Veränderungen in den add-Funktionen (Elements, Subforms, DisplayGroups), konnte ich so meine gewünschten Decoratoren einarbeiten, ohne mich mit eigenen Abzumühen oder die Config-Datei zu benutzen (was ich bis dato immer noch nicht geschafft habe).
    Für alle, die es interessiert, hier die Virb_Form-Klasse. Sie ist natürlich noch nicht ausgereift und auch noch nicht wirklich ausführlich getestet. Auch die Decoratoren können momentan nur über das direkte Ändern der Klassenvariable geändert werden. Naja, ihr kennt das sicherlich. Sowas entwickelt sich mit der Zeit. Ach und bevor ich es vergesse: Kommentare fehlen natürlich auch noch. Aber da sich die meisten Funktionen auch selbst erklären, ist das in diesem Kontext denke ich erstmal nicht so wichtig.

    Die Virb_Form-Klasse aus meinem sich noch entwickelnden ACP:
    (Die Klasse hat noch zwei feine Extra. Ich weiß nicht, wie man so unkomfortabel entwickeln kann, naja, leider sind jegliche Buttons ganz nach System in einem einzellnen Container. So stellt das Framework also nicht die Möglichkeit, Buttons zum Absenden und Zurücksetzen, wie man es zum Beispiel auch hier im Forum hat, nebeneinander darzustellen. Das wird hier je nach Name des Elements erledigt und per DisplayGroup umgesetzt. Des Weiteren bekommt jeder Container eines Formular-Elements im HTML-Tag nicht nur eine spezifische Klasse (wie im Folgenden "element"), sondern darüber hinaus auch noch typspezifische Klassen-Angaben. So kann jedes Element je nach Typ formatiert werden. Zum Beispiel: submit-button - <div class="element button submit">)

    Quellcode

    1. <?php
    2. class Vipanel_Form extends Zend_Form
    3. {
    4. public $element_decorators = array(
    5. 'ViewHelper',
    6. 'Errors',
    7. array(array('data' => 'HtmlTag'), array('tag' => 'div', 'class' => 'element')),
    8. 'Label',
    9. array(array('row' => 'HtmlTag'), array('tag' => 'div', 'class' => 'container'))
    10. );
    11. public $button_decorators = array(
    12. 'ViewHelper'
    13. );
    14. public $button_group_decorators = array(
    15. 'FormElements',
    16. array(array('data' => 'HtmlTag'), array('tag' => 'div', 'class' => 'element buttons')),
    17. array(array('row' => 'HtmlTag'), array('tag' => 'div', 'class' => 'container')),
    18. );
    19. public $display_group_decorators = array(
    20. 'FormElements',
    21. array(array('group' => 'HtmlTag'), array('tag' => 'div', 'class' => 'display-group')),
    22. );
    23. public $subform_decorators = array(
    24. 'FormElements',
    25. 'Fieldset'
    26. );
    27. public $form_decorators = array(
    28. 'FormElements',
    29. array('HtmlTag', array('tag' => 'div', 'class' => 'vipanel-form')),
    30. 'Form',
    31. );
    32. private $__button_group_for = array(
    33. 'submit', 'reset', 'button', 'image'
    34. );
    35. private $__button_group_id = 'buttons';
    36. protected $_element_groups = array(
    37. 'button' => array('image', 'reset', 'submit'),
    38. 'image' => array('captcha'),
    39. 'multielements' => array('checkbox', 'multi', 'multicheckbox', 'multiselect', 'radio'),
    40. 'multirows' => array('select', 'multiselect', 'textarea'),
    41. 'input' => array('password', 'text')
    42. );
    43. private $__element_types = array();
    44. public function addElement($element, $name = null, $options = null)
    45. {
    46. parent::addElement($element, $name, $options);
    47. if($element instanceof Zend_Form_Element) {
    48. $name = $element->getName();
    49. $type = strtolower($element->getType());
    50. $type = substr($type, 18);
    51. }else {
    52. $type = $element;
    53. $element = $this->getElement($name);
    54. }
    55. $decorator = $this->element_decorators;
    56. if(in_array($type, $this->__button_group_for)
    57. && (null !== $name && '_button' == substr($name, -7))) {
    58. $decorator = $this->button_decorators;
    59. $display_group = $this->getDisplayGroup($this->__button_group_id);
    60. if(null === $display_group) {
    61. $group_options['decorators'] = $this->button_group_decorators;
    62. $this->addDisplayGroup(array($name), $this->__button_group_id, $group_options);
    63. }else {
    64. if($this->removeElement($name)) {
    65. $display_group->addElement($element);
    66. }
    67. }
    68. }
    69. if(empty($options['decorators'])) {
    70. $element->setDecorators($decorator);
    71. }
    72. $row_decorator = $element->getDecorator('data');
    73. if(false !== $row_decorator) {
    74. $class_names = array($row_decorator->getOption('class'));
    75. foreach($this->_element_groups as $group_name => $group_types) {
    76. foreach($group_types as $group_type) {
    77. if($type == $group_type) {
    78. $class_names[] = $group_name;
    79. continue 1;
    80. }
    81. }
    82. }
    83. $class_names[] = $type;
    84. $row_decorator->setOption('class', implode(' ', $class_names));
    85. }
    86. return $this;
    87. }
    88. public function addDisplayGroup(array $elements, $name, $options = null)
    89. {
    90. if(empty($options['decorators'])) {
    91. $options['decorators'] = $this->display_group_decorators;
    92. }
    93. return parent::addDisplayGroup($elements, $name, $options);
    94. }
    95. public function addSubForm(Zend_Form $form, $name, $order = null)
    96. {
    97. $decorators = $form->getDecorators();
    98. if(empty($decorators)) {
    99. $form->setDecorators($this->subform_decorators);
    100. }
    101. return parent::addSubForm($form, $name, $order);
    102. }
    103. public function loadDefaultDecorators()
    104. {
    105. $this->setDecorators($this->form_decorators);
    106. }
    107. }
    Alles anzeigen


    So kann jedes Formular mit einer separaten Klasse erstellt werden:

    Quellcode

    1. <?php
    2. class Auth_Login extends Vipanel_Form
    3. {
    4. public function init()
    5. {
    6. $this->addElement('text', 'username', array(
    7. 'label' => 'Username',
    8. 'required' => true
    9. ));
    10. $this->addElement('password', 'password', array(
    11. 'label' => 'Password',
    12. 'required' => true
    13. ));
    14. $submit = $this->createElement('submit', 'login_button', array(
    15. 'label' => 'Anmelden'
    16. ));
    17. $this->addElement($submit);
    18. $reset = $this->createElement('reset', 'reset_button', array(
    19. 'label' => 'Zurücksetzen'
    20. ));
    21. $this->addElement($reset);
    22. }
    23. }
    Alles anzeigen


    So brauche ich einfach nur die Klasse aufrufen und rendern. Soweit das einfachste, was ich finden konnte.

    Gruß
    Lemmi