2009-04-22 12 views
6

que tienen un elemento de botón que he creado de este modo:Zend Framework Zend_Form Decorators: <span> ¿Elemento de botón interior?

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('My Button'); 
$submit->setDecorators(array(
    'ViewHelper', 
    array('HtmlTag', array('tag' => 'li')) 
)); 
$submit->setAttrib('type', 'submit'); 

Esto genera el código HTML siguiente:

<li> 
    <label for="submit" class="optional">My Button</label> 
    <button name="submit" id="submit" type="submit">My Button</button> 
</li> 

me gustaría envolver el interior del botón con un lapso <> , como este:

<button...><span>My Button</span></button> 

¿Cuál es la mejor manera de hacer esto usando Zend_Form?

Respuesta

7

Lo he intentado y, en última instancia, no lo logré usando el mismo enfoque. Parecería que la manera más fácil de hacer esto sería hacer:

... 
$submit->setLabel('<span>My Button</span>'); 
... 

Sin embargo, se escapó del tramo. Es perfectamente posible para apagar el escape de un decorador lable, sin embargo, la adición de un decorador etiqueta hace que la salida de forma incorrecta, por ejemplo:

$decorator = array(
    array('ViewHelper'), 
    array('HtmlTag', array('tag' => 'li')), 
    array('Label', array('escape' => false)) 
); 

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('<span>My Button</span>'); 
$submit->setDecorators($decorator); 
$submit->setAttrib('type', 'submit'); 

... renders:

<label for="submit" class="optional"><span>My Button</span></label> 
<li> 
    <button name="submit" id="submit" type="submit">&lt;span&gt;My Button&lt;/span&gt</button> 
</li> 

... lo cual además de ser semánticamente incorrecto (fácil de reparar), sigue escapándose de las etiquetas de tramo dentro del elemento.

¿Qué haces?

Bueno, creo que el mejor enfoque (y este es mi consejo cuando se trata de un control estricto sobre el renderizado Zend_Form) es utilizar el decorador ViewScript.

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('My Button'); 
$submit->setDecorators(array(array('ViewScript', array('viewScript' => '_submitButton.phtml')))); 
$submit->setAttrib('type', 'submit'); 

... entonces en _submitButton.phtml defina lo siguiente:

<li> 
    <?= $this->formLabel($this->element->getName(), $this->element->getLabel()); ?> 
    <button 
    <?php 

    $attribs = $this->element->getAttribs(); 

    echo 
    ' name="' . $this->escape($this->element->getName()) . '"' . 
    ' id="' . $this->escape($this->element->getId()) . '"' . 
    ' type="' . $this->escape($attribs['type']) . '"'; 
    ?> 
    <?php 

    $value = $this->element->getValue(); 

    if(!empty($value)) 
    { 
     echo ' value="' . $this->escape($this->element->getValue()) . '"'; 
    } 
    ?> 
    > 
    <span> 
    <?= $this->escape($this->element->getLabel()); ?> 
    </span> 
    </button> 
</li> 

El _submitButton.phtml archivo tendrá que estar en un directorio script de vista (que podría ser mejor añadiendo uno específico para sus decoradores de formularios usando $view->addScriptPath('/path/to/my/form/decorators')).

Esto debería representar lo que estás buscando. Acabo de comenzar a buscar en el decorador de ViewScript debido a problemas de flexibilidad que estoy experimentando en el trabajo.Notarás que mi script no es tan flexible, y ciertamente no está en BNF, dado que todos los miembros se pueden completar en el objeto del elemento. Dicho eso, es un comienzo y resuelve tu problema.

+0

Gracias por la respuesta detallada. Soy consciente del decorador de ViewScript, pero no sabía que podría aplicarse a elementos individuales. – leek

+0

¡Esto fue muy útil! – markus

0

Agregaría una clase al botón, luego definiría esa clase en su CSS para que actúe como un lapso. Estoy seguro de que quieres hacer más que solo meterlo en un lapso.

Sólo añadir una setAttrib más llamadas():

$submit->setAttrib('class', 'submitButton'); 

Luego, en el CSS:

.submitButton { 
    display:inline; 
    font-weight:bold; /* Or whatever you're wanting to do */ 
} 

que añade display: inline ya que esto hará que el botón de actuar como un palmo. Esto debería comenzar por lo menos. Por supuesto, también puede basar su CSS en la identificación del botón, simplemente use display: inline para obtener el comportamiento de span.

+0

Mi objetivo es hacer realidad "lapso botón {display: none;}" para ocultar el texto del botón (pero me gustaría que todavía esté ahí para las personas sin CSS/JS support). – leek

+0

Aaah. ¡Sabía que había algo más! – Kekoa

5

Usted puede hacer esto:

$this->addElement(new Zend_Form_Element_Button(
      'send', 
      array(
       'label' => '<span>registrieren</span>', 
       'class' => 'button-red', 
       'type' => 'submit', 
       'escape' => false, 
       'required' => false, 
       'ignore' => false, 
      ) 
)); 
+0

¡¡GRACIAS !!!!!! – wiLLiamcastrO

1

Sólo escapar de la etiqueta funciona bien. Sólo se rompe cuando alguien comienza a jugar con el decorador etiqueta (que suele ocurrir al personalizar las etiquetas)

Puede utilizar la función de Zend_Form setElementDecorators() y excluir algunos elementos de estilo. Lea Ejemplo # 3 Configuración de decoradores para algunos elementos en Zend_Form Manual (incluida la Nota) para obtener más detalles.

Para aquellos que todavía están confundidos, aquí es un código de ejemplo para el estilo de la forma como una mesa, y tienen un botón que está encerrado en doble útil:

//(...)putting some other elements in the form first 

//now add submit button 
$form  ->addElement('button', 'submit', array(
         'label'  => '<span><span>SUBMIT</span></span>', 
         'value'  => 'submit' 
      )); 

$form 
      //set decorators for non-button elements 
      ->setElementDecorators(array(
        'ViewHelper', 
        'Errors', 
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), 
        array('Label', array('tag' => 'td')), 
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))), array('submit'), false) 
      //and then for button elements only 
      ->setElementDecorators(array(
        'ViewHelper', 
        'Errors', 
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), 
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))), array('submit'), true) 
      //and finally for the form 
      ->setDecorators(array(
        'FormElements', 
        array('HtmlTag', array('tag' => 'table')), 
        'Form' 
      )); 

donde $ forma es un Zend_Form elemento. ¡Espero que esto ayude!

0

intento con

$element->addDecorator('Label', array('tag' => 'span', 'class' => 'aClass'))