2010-03-04 19 views
5

Actualizar Pude hacer que esto funcionara al crear un decorador de etiquetas personalizado, que extendía Zend/Form/Decorator/Label.php. Agregué un método setTagClass() y sobreescribí el método de render para crear la etiqueta adjunta con la clase deseada. Puede haber una forma más elegante de hacerlo, pero parece que funciona.Zend Form - Establecer clase en un dt de etiqueta

Estoy buscando información sobre cómo configurar la clase en el elemento dt de una etiqueta usando un decorador. La tercera línea de código a continuación establece la clase en la etiqueta y la etiqueta en una etiqueta dt. Quiero saber cómo puedo configurar la clase en la etiqueta dt.

$txtLangPrefOther = $this->createElement('text','langPrefOther'); 
$txtLangPrefOther->setLabel('Language Preference Other:')); 
$txtLangPrefOther->getDecorator('Label')->setOptions(array('tag' => 'dt', 'class' => 'other')); 

Esto produce una salida como

<dt id="langPrefOther-label"> 
    <label for="langPrefOther" class="other">Language Preference Other:</label> 
</dt> 

<dd id="langPrefOther-element"> 
    <input type="text" id="langPrefOther" name="langPrefOther" "> 
</dd> 

quiero que se vea como

<dt id="langPrefOther-label" class="other"> 
    <label for="langPrefOther">Language Preference Other:</label> 
</dt> 

<dd id="langPrefOther-element"> 
    <input type="text" id="langPrefOther" name="langPrefOther" "> 
</dd> 

Respuesta

4

Debido a que es una forma no decorador elemento decorador. Prueba esto:

$this->setDecorators(
array(
'FormElements', 
array('HtmlTag', array('tag' => 'dl', 'class' => 'theclass')), 
'Form' 
)); 
+0

quiero solamente de ciertos dt tengan el 'otro' conjunto de clases, no todos ellos. – Chris

+1

Entonces, puedes usar jquery. $ ('# idOfFormElement') más cercano ('dt'). AddClass ('className'); – cnkt

+2

O puede hacer $ form-> element-> setDecorator ('HtmlTag', array ('tag' => 'dl', clase => 'la clase')) –

0

Probablemente hay una forma más limpia de hacer esto, pero aquí está mi decorador personalizado para lograr esto (Nota: necesita extender la clase Zend_Form_Decorator_Label):

/** 
* Class for HTML tag surrounding label 
* @var string 
*/ 
protected $_tagClass; 

/** 
* Set HTML tag's class 
* 
* @param string $tag 
* @return Zend_Form_Decorator_Label 
*/ 
public function setTagClass($tagClass) 
{ 
    if (empty($tagClass)) { 
     $this->_tagClass = null; 
    } else { 
     $this->_tagClass = (string) $tagClass; 
    } 

    $this->removeOption('tagClass'); 

    return $this; 
} 

/** 
* Get HTML tag's class, if any 
* 
* @return void 
*/ 
public function getTagClass() 
{ 
    if (null === $this->_tagClass) { 
     $tagClass = $this->getOption('tagClass'); 
     if (null !== $tagClass) { 
      $this->removeOption('tagClass'); 
      $this->setTagClass($tagClass); 
     } 
     return $tagClass; 
    } 

    return $this->_tagClass; 
} 

/** 
* Render a label 
* 
* @param string $content 
* @return string 
*/ 
public function render($content) 
{ 
    $element = $this->getElement(); 
    $view = $element->getView(); 
    if (null === $view) { 
     return $content; 
    } 

    $label  = $this->getLabel(); 
    $separator = $this->getSeparator(); 
    $placement = $this->getPlacement(); 
    $tag  = $this->getTag(); 
    $tagClass = $this->getTagClass(); 
    $id  = $this->getId(); 
    $class  = $this->getClass(); 
    $options = $this->getOptions(); 


    if (empty($label) && empty($tag)) { 
     return $content; 
    } 

    if (!empty($label)) { 
     $options['class'] = $class; 
     $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options); 
    } else { 
     $label = '&#160;'; 
    } 

    if (null !== $tag) { 
     require_once 'Zend/Form/Decorator/HtmlTag.php'; 
     $decorator = new Zend_Form_Decorator_HtmlTag(); 
     $decorator->setOptions(array('tag' => $tag, 
            'id' => $id . '-label', 
            'class' => $tagClass)); 

     $label = $decorator->render($label); 
    } 

    switch ($placement) { 
     case self::APPEND: 
      return $content . $separator . $label; 
     case self::PREPEND: 
      return $label . $separator . $content; 

    } 
} 
5

Hay una propiedad del decorador Label llamada tagClass!

Trate de hacer esto:

$element->addDecorators(array( 
'ViewHelper', 
'Description', 
'Errors', 
array('HtmlTag', array('tag' => 'dd', 'class' => $class)), 
array('Label', array('tag' => 'dt', 'class' => $class, 'tagClass' => $class)) 
)); 
Cuestiones relacionadas