2010-09-04 14 views
5

Domyślna dekorator dla Zend_Form_Element_Radio jestJak sformatować Zend_Form_Element_Radio, aby etykieta była zgodna z danymi wejściowymi?

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

Znacznik label owija tag input. Zamiast tego chciałbym wyglądać

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

Pomyślałem, że mają do czynienia z „label” elementu, ale to jest inna. Nawet z następującym kodem, nadal otrzymuję etykietę owijającą radio. Kiedy używam tego kodu formularza.

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')), 
));  
} 

otrzymuję ten kod HTML w wyniku

<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> 

zauważyć, jak tam jest label tag owijania tag input?

+0

można zrobić to za pomocą CSS ? –

+0

Próbuję użyć zestawu przycisków jQuery UI, który oczekuje, że etykieta podąża za znacznikiem wejściowym, a nie będzie dołączana do znacznika etykiety. –

Odpowiedz

-1

Jest problem z jQuery i nie Zend Framework. Owijanie elementu w znaczniku etykiety jest całkowicie poprawne, ale tylko jQuery UI go nie obsługuje. Wysłałem bug report.

* Aktualizacja Answer *

Jednak myślę, że to, co staramy się robić (jak zauważył) jest użycie buttonset jQuery UI, czyli co robię, gdy natknąłem się na błąd jQuery UI . Krótko mówiąc masz dwie opcje, dopóki bug nie zostanie naprawiony:

1) Użyj niestandardowego pomocnika widoku Dennis D., aby przejechać domyślnym elementem przycisku radiowego.

2) Popraw program pomocnika widoku Zend Framework z kodem Dennis D. został napisany. Pojawia się w pliku Zend_View_Helper_FormRadio w linii 169 (Zend Framework Version 1.11.0).

pierwsze utworzyć nową etykietę i zamknąć znacznik

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

drugie zmieniać kod, który tworzy przycisk radiowy:

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

trzecie usunąć zamknięcie Etykieta (jak ty” ve już to zrobione) w widoku pomocnika, zmień:

. $endTag 
. (('append' == $labelPlacement) ? $opt_label : '') 
. '</label>'; 

Po prostu zamień na:

. $endTag; 

Następnie połączyć radio i etykietę za pomocą pozycjonowania Umiejscowienie:

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

I to (znowu Dennis D uczynił go w widoku pomocnika), ale zmieniony kod powinien wyglądać (począwszy na linii 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

Zgadzam się, jQuery powinna być nieco bardziej elastyczna z formatem wejścia i etykiety, ale jestem o wiele bardziej pewna, że ​​edytuję dekoratory ZF niż nurkowanie w trzewiach jQuery UI. –

-1

Spróbuj:

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

Wyjazd zendcasts video about it jej naprawdę świetnie. Dekoratorzy mogą być naprawdę skomplikowani w ZF, ale ten film naprawdę dobrze to tłumaczy.

+0

Przepraszam, to też nie jest. Dzięki temu Zend po prostu dołącza kolejną "etykietę" po dwóch radiotelefonach.
Jestem pewien, że odpowiedź polega gdzieś na przypisaniu innego elementu ViewHelper do elementu radiowego, ale po prostu nie jestem pewien, jak to zrobić. Dziękuję za pomoc. –

+0

@nvoyageur powinieneś opublikować więcej kodu, ponieważ to, co napisałem w mojej odpowiedzi działa doskonale i robi exaclty to, o co prosisz w swoim pytaniu. Więc coś innego musi być nie tak. Opublikuj cały formularz? – Iznogood

+0

Zaktualizowałem pytanie, dołączając kod formularza, którego używam, i wynikowy kod HTML. Zauważycie, że znacznik 'input' jest otoczony tagiem' label', po czym oba przyciski radiowe są oznaczone etykietą zestawu przycisków. –

3

mam utworzyć niestandardowy widok pomocnika nazwie MyLib_View_Helper_FormRadio (tak nazywa się to automatycznie, jeśli bootstraping robi tak) i overrode i zmieniła sposób Zend_View_Helper_FormRadio :: formRadio() w wierszu 160 (wersja 1.11), gdzie przycisku radiowego jest tworzone.


$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

Prawdopodobnie mój najlepszy pomysł tak daleko, jest zmiana ZF [Zend Framework] kod HTML jQuery od wewnątrz, tak że staje się kompatybilny z formatem jQuery UI.

Oto rozwiązanie:

w budowie Forma ZF:

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

Ważną rzeczą jest tu div class = element, który będzie zawijać wszystkie wejścia [tak, że łatwo jest dostać się do je w jQuery]

A oto kod JS:

$(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

jest t że najlepszą rzeczą, może można to zrobić, co uważam go za dużo bólu :))

$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); 
Powiązane problemy