Zend Framework Zend_Form dekoratörler:

5 Cevap php

Ben şöyle yarattığınız bir düğme unsuru var:

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

Bu şu HTML üretir:

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

Ben böyle bir ile düğmesinin içini sarmak istiyorum:

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

Zend_Form kullanarak bunu yapmak için en iyi yolu nedir?

5 Cevap

Ben sonuçta, aynı yaklaşımı kullanarak bunu başarmak için kendimi başarısız, denedim. Bunu yapmak için en kolay yolu yapmak olacağını görünüyor:

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

Ancak, yayılma kaçtı edilecektir. Bu etiket dekoratör ekleyerek örneğin hatalı çıktı, işler, ancak bir lable dekoratör kaçışa kapatmak için mükemmel mümkündür:

$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');

... Işler:

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

... Ki, bir kenara (kolayca düzeltilebilir) anlamsal yanlış olmaktan hala öğesinin içindeki span etiketleri kaçıyor.

So what do you do?

Peki ben iyi yaklaşım (bu Zend_Form render üzerinde sıkı kontrolü söz konusu olduğunda ve bu benim meta-tavsiyem) ViewScript dekoratör kullanmak olduğunu düşünüyorum.

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

Sonra ... * daki submitButton.phtml aşağıdakileri tanımlayın:

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

* submitButton.phtml dosya (en iyi $view->addScriptPath('/path/to/my/form/decorators') kullanarak form dekoratörler için belirli bir ekleme olabilir) bir görünüm komut dizinde olması gerekir.

Bu sizin için ne arıyorsanız işlemek gerekir. Ben sadece nedeniyle işten de yaşıyorum esneklik konularında ViewScript dekoratör bakarak başladım. Sen benim komut dosyası, esnek olmayan ve kesinlikle öğesi nesnenin üzerinde doldurulan olabilir tüm üyeler verilen BNF'de olmadığını fark edeceksiniz. Yani bu bir başlangıç ​​ve bu sorunu çözer, dedi.

Bunu yapabilirdi:

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

Ben düğmeye bir sınıf eklersiniz, sonra bir yayılma gibi hareket yapmak için CSS bu sınıf tanımlamak. Ben bir sürede sadece sopa daha yapmak isteyen eminim.

Sadece bir setAttrib () çağrısı ekleyin:

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

Sonra CSS:

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

Ben ekran ekledi: Bu bir yayılma gibi düğme hareket yapacaktır inline olarak. Bu, en azından başlamak gerekir. Açıklıklı davranış almak için inline: Tabii ki sadece ekran kullanmak, hem de düğmeye kimliği üzerinde CSS temel olabilir.

Ile deneyin

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