2010-09-04 17 views
5

El decorador por defecto para el Zend_Form_Element_Radio es¿Cómo formatearé Zend_Form_Element_Radio para que la etiqueta siga la entrada?

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

La etiqueta label envuelve la etiqueta input. En su lugar me gustaría parecerse a

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

pensé que podría tener que ver con la "etiqueta" del elemento, pero eso es diferente. Incluso con el siguiente código, sigo recibiendo la etiqueta que envuelve la radio. Cuando uso este código de formulario.

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

puedo obtener este código HTML como resultado

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

Aviso cómo hay una etiqueta label envolver la etiqueta input?

+0

¿Puede hacerlo usando CSS ? –

+0

Estoy tratando de usar el conjunto de botones de jQuery UI, que espera que la etiqueta siga la etiqueta de entrada, no se incluya en la etiqueta. –

Respuesta

-1

Es un tema con jQuery y no el Zend Framework. El ajuste del elemento en la etiqueta de la etiqueta es perfectamente válido, solo jQuery UI no lo admite. He publicado un bug report.

* Actualización de respuesta *

Sin embargo creo que lo que está tratando de hacer (como lo comentado) es utilizar el buttonset jQuery UI, que es lo que estaba haciendo cuando me encontré con el error jQuery UI . En resumen, tiene dos opciones hasta que se solucione el error:

1) Use el asistente de visualización personalizado de Dennis D. para sobrepasar el elemento del botón de opción predeterminado.

2) Parchee el botón Zend Framework Radio view helper con el código que Dennis D. ha escrito. Aparece en el archivo Zend_View_Helper_FormRadio en la línea 169 (Zend framework Version 1.11.0).

En primer lugar crear una nueva etiqueta y cerrar la etiqueta

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

alterar segundo lugar, el código que crea el botón de radio para:

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

eliminar tercer lugar el cierre de la etiqueta de la etiqueta (como usted' ya lo he hecho) en el asistente de visualización, cambie:

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

Y simplemente reemplace con:

. $endTag; 

luego combinar la radio y la etiqueta con el posicionamiento de colocación:

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

Y eso es todo (de nuevo Dennis D ha hecho en el ayudante de vista), pero el código modificado debe ser similar (a partir en la línea 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

Acepto, jQuery debería ser un poco más flexible con el formato de la entrada y la etiqueta, pero estoy mucho más seguro editando decoradores ZF que sumergiéndome en las entrañas de jQuery UI. –

-1

Probar:

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

Salida zendcasts video about it es realmente grande. Los decoradores pueden ser realmente complicados con ZF, pero este video realmente lo explica bien.

+0

Lo siento, eso tampoco lo es. Con eso, Zend acaba de agregar otra 'etiqueta' después de las dos radios.
Estoy seguro la respuesta está en la asignación de un ViewHelper diferente al elemento de radio, pero no estoy seguro de cómo hacerlo. Gracias por la ayuda sin embargo. –

+0

@nvoyageur deberías publicar más código porque lo que publiqué en mi respuesta funciona perfectamente y hace exactamente lo que pides en tu pregunta. Entonces algo más debe estar mal. Publica tu forma completa? – Iznogood

+0

He actualizado la pregunta para incluir el código de formulario que estoy usando y el resultado HTML. Notarás que la etiqueta 'input' está rodeada por una etiqueta' label', luego ambos botones de radio son seguidos por una etiqueta para el conjunto de botones. –

3

He creado un asistente de visualización personalizado llamado MyLib_View_Helper_FormRadio (por lo que se llama automáticamente si el proceso de arranque lo hace), y reemplacé y cambié el método Zend_View_Helper_FormRadio :: formRadio() en la línea 160 (Versión 1.11), donde el botón de opción es creado.


$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

Probablemente mi mejor idea hasta el momento, es cambiar el ZF [Zend Framework] código HTML desde jQuery, por lo que se hace compatible con el formato jQuery UI.

Aquí está la solución:

en la construcción Forma ZF:

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

Lo importante aquí es el div con la clase = elemento que envolverá todas las entradas [por lo que es fácil llegar a en jQuery]

Y aquí está el código 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

Esta es t lo mejor que se puede puede hacer, lo que me encontré después de mucho dolor :))

$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); 
Cuestiones relacionadas