2010-09-04 13 views
5

Der Standard Dekorateur für die Zend_Form_Element_Radio istWie würde ich Zend_Form_Element_Radio formatieren, damit die Beschriftung der Eingabe folgt?

<label for="type_id-1"><input type="radio" name="type_id" id="type_id-1" value="1">Pack</label> 

Die label Tag hüllt den input-Tag. Stattdessen würde Ich mag wie schauen

<input type="radio" name="type_id" id="type_id-1" value="1"><label for="type_id-1">Pack</label> 

dachte ich, es könnte mit dem „Label“ zu tun hat, von dem Elemente, aber das ist anders. Auch mit dem folgenden Code bekomme ich immer noch das Etikett, das das Radio einhüllt. Wenn ich diesen Formularcode verwende.

public function init() 
{ 
    parent::init(); 

    $this->setName('createdomain'); 

    $type_id = new Zend_Form_Element_Radio('type_id'); 
    $type_id->setLabel('Please Choose') 
      ->setRequired() 
      ->setMultiOptions(array('m' => "male", 'f' => 'female')); 

    $this->addElement($type_id); 

    $this->setElementDecorators(array(
    'ViewHelper', 
    array('Label',array('placement' => 'APPEND')), 
));  
} 

Ich erhalte diese HTML als Folge

<form id="createdomain" enctype="application/x-www-form-urlencoded" action="" method="post"><dl class="zend_form"> 
<label for="type_id-m"><input type="radio" name="type_id" id="type_id-m" value="m">male</label><br /> 
<label for="type_id-f"><input type="radio" name="type_id" id="type_id-f" value="f">female</label> 
<label for="type_id" class="required">Please Choose</label></dl> 
</form> 

Beachten Sie, wie es eine der input Tag Einwickeln label-Tag ist?

+0

Können Sie es tun Hilfe CSS ? –

+0

Ich versuche, den Buttonset von jQuery UI zu verwenden, der erwartet, dass das Label dem Input-Tag folgt und nicht im Label-Tag enthalten ist. –

Antwort

-1

Es ist ein Problem mit jQuery und nicht das Zend Framework. Das Wrappen des Elements im Label-Tag ist perfekt, es wird nur von jQuery UI unterstützt. Ich habe eine bug report gepostet.

* Update Antwort *

aber ich denke, was Sie versuchen zu tun (wie Sie kommentiert) ist die jQuery UI buttonset zu verwenden, das ist, was ich tat, als ich über die jQuery UI Bug kam . Kurz gesagt haben Sie zwei Optionen, bis der Fehler behoben ist:

1) Verwenden Sie den benutzerdefinierten View-Helper von Dennis D., um das standardmäßige Optionsfeldelement zu überschreiben.

2) Patch der Zend Framework Optionsfeld View Helfer mit dem Code Dennis D. geschrieben hat. Es erscheint in der Datei Zend_View_Helper_FormRadio in Zeile 169 (Zend Framework Version 1.11.0).

Erstens ein neues Label erstellen und schließen Sie den Tag

// Create the label 
$label = '<label' 
. $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
. (('prepend' == $labelPlacement) ? $opt_label : '') 
. '<input type="' . $this->_inputType . '"' 
. $opt_label 
. '</label>'; 

Zweitens den Code ändern, dass das Optionsfeld erstellt:

// Create the radio button 
$radio = '<input type="' . $this->_inputType . '"' 

Drittens das Schließen des Label-Tag entfernen (wie Sie‘ Habe es schon gemacht) in der Ansicht Helfer, ändern:

Und einfach ersetzen mit:

. $endTag; 

Dann das Radio kombinieren und das Etikett mit der Platzierung Positionierung:

// Combine the label and the radio button 
if ('prepend' == $labelPlacement) { 
    $radio = $label . $radio; 
} else { 
    $radio = $radio . $label; 
} 

Und das ist es (wieder Dennis D hat es im View Helfer getan), aber der geänderte Code sollte so aussehen (ab in Zeile 169:

// Create the label 
     $label = '<label' 
       . $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
       . $opt_label 
       . '</label>'; 

     // Create the radio button 
     $radio = '<input type="' . $this->_inputType . '"' 
       . ' name="' . $name . '"' 
       . ' id="' . $optId . '"' 
       . ' value="' . $this->view->escape($opt_value) . '"' 
       . $checked 
       . $disabled 
       . $this->_htmlAttribs($attribs) 
       . $endTag; 

     // Combine the label and the radio button 
     if ('prepend' == $labelPlacement) { 
      $radio = $label . $radio; 
     } else { 
      $radio = $radio . $label; 
     } 
     // add to the array of radio buttons 
     $list[] = $radio; 
+0

Ich stimme zu, jQuery sollte ein wenig flexibler mit dem Format der Eingabe und Label sein, aber ich bin viel sicherer ZF Dekorateure als Tauchen in den Eingeweiden von jQuery UI. –

-1

Versuchen:

$this->setElementDecorators(array(
     'ViewHelper', 
     array('Label',array('placement' => 'APPEND')), 
    )); 

Check out zendcasts video about it seine wirklich toll. Dekorateure können mit ZF sehr kompliziert sein, aber dieses Video erklärt es wirklich gut.

+0

Entschuldigung, das ist es auch nicht. Damit hängt Zend nach den beiden Radios ein weiteres "Label" an.
Ich bin mir sicher Die Antwort liegt irgendwo darin, dem Radioelement einen anderen ViewHelper zuzuweisen, aber ich bin mir nicht sicher, wie ich es machen soll. Danke für die Hilfe aber. –

+0

@nvoyageur solltest du mehr Code posten, denn was ich in meiner Antwort gepostet habe, funktioniert perfekt und macht genau das, was du in deiner Frage verlangst. Also muss etwas anderes falsch sein. Poste dein ganzes Formular? – Iznogood

+0

Ich habe die Frage aktualisiert, um den Formularcode, den ich verwende, und das Ergebnis HTML zu enthalten. Sie werden bemerken, dass das 'input'-Tag von einem' label'-Tag umgeben ist, dann folgen beide Radio-Buttons von einem Label für den Button-Set. –

3

Ich habe eine benutzerdefinierte Ansicht Helfer erstellen namens MyLib_View_Helper_FormRadio (also wird es automatisch aufgerufen, wenn Ihr bootstraping tut so) und overrode und änderte den Zend_View_Helper_FormRadio :: formradio() -Methode bei Line 160 (Version 1.11), wobei das Optionsfeld geschaffen.


$label = '<label ' . $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
       . $opt_label 
       .'</label>'; 

     // Wrap the radios in labels 
     $radio = '<input type="' . $this->_inputType . '"' 
       . ' name="' . $name . '"' 
       . ' id="' . $optId . '"' 
       . ' value="' . $this->view->escape($opt_value) . '"' 
       . $checked 
       . $disabled 
       . $this->_htmlAttribs($attribs) 
       . $endTag; 

     if ('prepend' == $labelPlacement) { 
      $radio = $label . $radio; 
     } 
     elseif ('append' == $labelPlacement) { 
      $radio .= $label; 
     } 
0

Wahrscheinlich bisher meine beste Idee ist es, die ZF [Zend Framework] HTML-Code innerhalb jQuery zu ändern, so dass es mit jQuery UI-Format kompatibel wird. Hier

ist die Lösung:

in ZF-Formular Konstruktion:

$this->setElementDecorators(array(
           'ViewHelper', 
           'Errors', 
           array(array('rowElement'=>'HtmlTag'), array('tag'=>'div', 'class'=>'element')), 
           array('Label', array('class'=>'first')), 
     )); 

Das Wichtigste hier ist die div mit class = Element, das alle Eingänge wrap [so dass es einfach ist, zu erhalten, sie in jQuery]

Und hier ist der JS-Code:

$(function() { 
    $("div.element > label").each(function() { 
     $('input', this).after('<label for="'+$(this).attr('for')+'"></label>'); 
     $('label', this).text($(this).text()); 
     var input = $('input', this).detach(); 
     var label = $('label', this).detach(); 

     var parent = $(this).parent(); 
     $(this).remove(); 
     input.appendTo(parent); 
     label.appendTo(parent); 
    }); 
    $("div.element").buttonset(); 
}); 
0

Dies ist t er Beste, was könnte man tun kann, was ich es nach viel Schmerz :) gefunden)

$radios = new Zend_Form_Element_Radio('notifications'); 
$notificationTypesArray = array(); 
foreach ($notificationTypes as $key => $value) { 
    $notificationTypesArray[$key] = $value 
$radios->removeDecorator('DtDdWrapper'); 
$radios->removeDecorator('HtmlTag'); 
$radios->setSeparator('</td></tr><tr><td class="notification_type_row">'); 
$radios->setDecorators(array(
    'ViewHelper', 
    'Errors', 
    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'notification_type_row')), 
    array('Label', array('tag' => 'span')), 
    array(array('row' => 'HtmlTag'), array('tag' => 'tr')), 
); 
$radios->addMultiOptions($notificationTypesArray);    
$this->addElement($radios);