Zend Framework Zend_Form Декораторы: <span>Элемент внутри кнопки? - PullRequest
6 голосов
/ 22 апреля 2009

У меня есть элемент кнопки, который я создал так:

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

Это генерирует следующий HTML:

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

Я бы хотел обернуть внутри кнопки , например:

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

Каков наилучший способ сделать это с помощью Zend_Form?

Ответы [ 5 ]

7 голосов
/ 01 мая 2009

Я пытался и, в конечном счете, не смог достичь этого сам, используя тот же подход. Казалось бы, самый простой способ сделать это будет сделать:

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

Однако интервал будет экранирован. Вполне возможно отключить экранирование метки декоратора, однако при добавлении декоратора меток выходные данные отображаются неправильно, например:

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

... рендеринг:

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

... который, помимо семантически неверного (легко исправимого), все еще экранирует теги span внутри элемента.

Так что вы делаете?

Ну, я думаю, что лучший подход (и это мой мета-совет, когда дело доходит до жесткого контроля над рендерингом Zend_Form) - это использовать декоратор 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');

... затем в _submitButton.phtml определите следующее:

<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 должен находиться в каталоге скриптов вида (возможно, лучше всего добавить определенный для декораторов форм, используя $view->addScriptPath('/path/to/my/form/decorators')).

Это должно сделать то, что вы ищете. Я только начал смотреть на декоратор ViewScript из-за проблем с гибкостью, с которыми я сталкиваюсь в работе. Вы заметите, что мой сценарий не такой гибкий и, конечно, не в BNF, учитывая все элементы, которые могут быть заполнены в объекте element. Тем не менее, это начало, и это решает вашу проблему.

5 голосов
/ 14 марта 2010

Вы можете сделать это:

$this->addElement(new Zend_Form_Element_Button(
            'send',
            array(
                'label' => '<span>registrieren</span>',
                'class' => 'button-red',
                'type' => 'submit',
                'escape' => false,
                'required' => false,
                'ignore' => false,
            )
 ));
1 голос
/ 06 июля 2010

Просто экранирование метки работает нормально. Он ломается только тогда, когда кто-то начинает возиться с декоратором меток (обычно это происходит при настройке тегов)

Вы можете использовать функцию Zend_Form setElementDecorators () и исключить некоторые элементы из стиля. Прочитайте Пример # 3 Настройка декораторов для некоторых элементов в Руководство Zend_Form (включая Примечание!) Для получения более подробной информации.

Для тех, кто все еще в замешательстве, приведен пример кода для стилизации формы в виде таблицы и добавления кнопки, заключенной в двойной диапазон:

//(...)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'
            ));

, где $ form - это элемент Zend_Form. Надеюсь, это поможет!

0 голосов
/ 23 февраля 2013

Попробуйте с

$element->addDecorator('Label', array('tag' => 'span', 'class' => 'aClass'))
0 голосов
/ 23 апреля 2009

Я бы добавил класс к кнопке, а затем определил этот класс в вашем CSS, чтобы он действовал как промежуток. Я уверен, что вы хотите сделать больше, чем просто вставить это в промежуток.

Просто добавьте еще один вызов setAttrib ():

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

Тогда в вашем CSS:

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

Я добавил display: inline, так как это заставит кнопку работать как промежуток. Это должно как минимум начать. Конечно, вы также можете использовать CSS для идентификатора кнопки, просто используйте display: inline, чтобы получить поведение span.

...