Ergebnis 1 bis 8 von 8

Thema: Dekorator für MultiCheckbox

  1. #1
    Neuer Benutzer Avatar von stuermer
    Registriert seit
    11.02.2009
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Dekorator für MultiCheckbox

    Kann mir jemand einen Tip geben, wie man über einen Dekrator an die Labels der einzelnen Optionen kommt?

    Und würde das einem Radio Element dan genauso funktionieren?

    So sieht mein Dekorator aus:
    Code:
     
    $element->setDecorators(array(
    array( 'Description', array('tag' => 'div', 'class' => 'description')),
      'ViewHelper', 
      'Errors',
      array( 'HtmlTag', array('tag' => 'dd') ),
      array( 'Label', array('tag' => 'dt') ),
    ));
    Und das macht das ZF zur Zeit draus

    Code:
     
    <dt><label for = "mcb" class = "required">Label MultiCheckbox</label>
    </dt>
    <dd><div class = "description">
      Description MultiCheckbox
    </div>
    <label style = "white-space: nowrap;"><input type = "checkbox" name = "mcb[]" id = "mcb-foo" value = "foo" />
    Foo Option</label>
    <br />
    <label style = "white-space: nowrap;"><input type = "checkbox" name = "mcb[]" id = "mcb-bar" value = "bar" />
    Bar Option</label>
    <br />
    <label style = "white-space: nowrap;"><input type = "checkbox" name = "mcb[]" id = "mcb-baz" value = "baz" />
    Baz Option</label>
    <br />
    <label style = "white-space: nowrap;"><input type = "checkbox" name = "mcb[]" id = "mcb-bat" value = "bat" />
    Bat Option</label>
    </dd>
    Und das hätte ich gern für eine einzelen Option

    Code:
     
    <div class="MCB">
      <label class="MCBLABEL" style = "white-space: nowrap;">
        <input class="MCBOPTION" type = "checkbox" name = "mcb[]" id = "mcb-foo" value = "foo" />Foo Option
      </label>
    </div>
    Ich vermute ich muß das dem ViewHelper mit auf dem Weg geben, aber ich weis nicht wie.

    Warum das ganze? Ich möchte das Aussehen über CSS definieren können.

    Danke für eure Hilfe

  2. #2
    Benutzer Avatar von Mr.Smoke
    Registriert seit
    07.02.2009
    Beiträge
    99
    Thanks
    1
    Thanked 0 Times in 0 Posts

    Standard

    Du bekommst einen String in dem die Ausgabe steht/stehen wird und die entsprechenden Elemente uebergeben. Je nach Reihenfolge der Dekoratoren kannst du dann daraus machen was du willst. Wie genau die Elemente uebergeben weiss ich aus dem Gedaechtnis aber gerade nicht.
    Aspirin gabs nicht, da hab ich dir Zigaretten mitgebracht.

  3. #3
    Neuer Benutzer Avatar von stuermer
    Registriert seit
    11.02.2009
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Das Prinzip ist mir schon klar, ich finde nur nicht die Stelle in der Doku wo die Schraube auch benannt ist. Ich habe verschiedensten Kostrukten experimentiert, teilweise inspiriert von Beiträgen hier im Forum, bin aber zu keine Lösung gekommen.

    Code:
    $element->setDecorators(array(
      array( 'Description', array('tag' => 'div', 'class' => 'description')),
      array( 'ViewHelper',  array('separator' => '', 'label_class' => 'xxx')),
      'Errors',
      array( 'HtmlTag', array('tag' => 'dd') ),
      array( 'Label', array('tag' => 'dt') ),
    ));
    Die enfernt das "<br/>": 'separator' => ''. Ok aber ich habe immer noch kein umschließendes div tag.

    'label_class' => 'xxx' habe ich hier im Forum gefunden. Klang plausibel, hat aber nicht funktioniert.

  4. #4
    Benutzer Avatar von Mr.Smoke
    Registriert seit
    07.02.2009
    Beiträge
    99
    Thanks
    1
    Thanked 0 Times in 0 Posts

    Standard

    Dann überschreib den HtmlTag Decorator mit einer eigenen Klasse (zum Beispiel einer Ableitung des vorhandenen Dekorators) und implementier es auf deine Weise.

    Als Beispiel:

    PHP-Code:
    <?php
    class Custom_Form_Decorator_HtmlTag extends Zend_Form_Decorator_HtmlTag
    {

    }
    ?>
    PHP-Code:
    <?php
    class Custom_Form_Element_Text extends Zend_Form_Element_Text
    {
        public function 
    __construct($spec$options null)
        {
            
    parent::__construct($spec$options);

            
    $this->setAttrib("class""text");

            
    $decorators $this->getDecorators();
            
    $decorators["Zend_Form_Decorator_HtmlTag"] = new Custom_Form_Decorator_HtmlTag();
            
    $this->setDecorators($decorators);
        }

        public function 
    setLabel($label)
        {
            
    $translator Zend_Registry::get("Zend_Translate");
            
    $label $translator->translate($label);
            return 
    parent::setLabel($label);
        }
    }
    ?>
    siehe __construct() und das Decorator-Handling.

    Jetzt kannst du in Custom_Form_Decorator_HtmlTag - oder wie auch immer du deine Klasse nennen magst - die Methoden von Zend_Form_Decorator_HtmlTag überschreiben - konkret render($content). Hauptsache eben deine Klasse implementiert Zend_Form_Decorator_Interface. Ganz 100% sicher, dass der Übeltäter *_HtmlTag ist bin ich nicht, notfalls überschreibst du eben die anderen Decorator auf ähnliche Weise.
    Aspirin gabs nicht, da hab ich dir Zigaretten mitgebracht.

  5. #5
    Neuer Benutzer Avatar von stuermer
    Registriert seit
    11.02.2009
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Ist wohl ein kleiner bug im zf

    Nach intensiven Studium der Quellen, denke ich das dies ein Bug ist.

    FormRadio ist in der Lage z.B. label_class richtig zu verarbeiten, erhält die notwendigen Attribute aber nicht.

    nach einem simplen patch in Zend_Form_Decorator_ViewHelper::render(...)

    alt:
    $attribs = $this->getElementAttribs();

    neu:
    $attribs = array_merge($this->getElementAttribs(),$this->getOptions());


    funktionierte alles sehr einfach

    z.B. setzen der "label class" mittels

    array('ViewHelper',array('label_class'=>'myclass') ),

    Ich habe zur Zeit zf 1.7.4.

    Kann mir jemand sagen wohin man sowas bei Zend schicken kann? Gibt es da irgendwo eine "Ich melde einen Bug" Seite für das ZF. Ich habe keine gefunden.

  6. #6
    Erfahrener Benutzer
    Registriert seit
    12.04.2007
    Beiträge
    1.045
    Thanks
    0
    Thanked 3 Times in 2 Posts

  7. #7
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.121
    Thanks
    2
    Thanked 321 Times in 252 Posts

    Standard

    Zitat Zitat von stuermer
    FormRadio ist in der Lage z.B. label_class richtig zu verarbeiten, erhält die notwendigen Attribute aber nicht.
    Du musst es nur richtig anwenden:
    PHP-Code:
    $form->addElement(
        
    'radio',
        
    'example',
        array(
            
    'label_class' => 'meinCssKlasseFuerDasRadioLabel',
        )
    ); 
    oder
    PHP-Code:
    $element->setOptions(
        array(
            
    'label_class' => 'meinCssKlasseFuerDasRadioLabel',
        )
    ); 
    Stand aber auch so hier im Forum.

  8. #8
    Neuer Benutzer Avatar von stuermer
    Registriert seit
    11.02.2009
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Hallo Kaiuwe,

    Vielleicht irre ich mich aber das passt doch nicht zur Logik der Dekoratoren. Alle Tags werden im Allgemeine über Dekoratoren gesetzt, es ist ziemlich unlogisch die plötzlich als Eigenschaft des Elementes anzugeben.

    Letztendlich erreicht man auf unseren beiden Wegen genau das gleiche. Bei Dir ohne zu patchen, aber ich denke trotzdem es ist um den Fehler drumherum gefahren.

    Du bist mit Sicherheit fitter im ZF als ich zumal ich mich erst seit 6-8 Wochen damit beschäftige, aber vielleicht habe ich deswegen auch noch einen anderen Blick weil ich die Wege suchen muß die du schon gut kennst.

    Ich denke ein eigener Dekorator für Multi-Optionen wäre eine echte Lösung die ins Konzept passt. Hast du sowas schonmal irgenwo gesehen?

    Ciao
    Ralph

Ähnliche Themen

  1. DijitElement Dekorator problem
    Von Nerosmeel im Forum Javascript + RIA
    Antworten: 3
    Letzter Beitrag: 02.10.2009, 11:08
  2. MultiCheckBox und addError
    Von ice-breaker im Forum Formulare
    Antworten: 4
    Letzter Beitrag: 06.01.2009, 14:17
  3. Default Dekorator überschreiben
    Von rainman1983 im Forum Formulare
    Antworten: 1
    Letzter Beitrag: 30.12.2008, 09:00
  4. Captcha wie Dekorator erstellen?
    Von rainman1983 im Forum Formulare
    Antworten: 0
    Letzter Beitrag: 20.11.2008, 19:43
  5. Leerzeile mittels Dekorator wegbekommen
    Von kerim77 im Forum MVC
    Antworten: 5
    Letzter Beitrag: 04.09.2008, 17:11

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •