Как избавиться от тегов Zend_Form dl, dt, dd? - PullRequest
3 голосов
/ 20 декабря 2009

Я бы хотел избавиться от формата списка определений моего Zend_Form. Это макет, который я собираюсь:

<form>
    <p>
        <label for="email" class="required">Your email address:</label>
        <input type="text" name="email" id="email" value="">
    </p>
    <p>
        <input type="submit" name="submit" id="submit" value="Subscribe">
    </p>
    <input type="hidden" name="active" value="true" id="active">
    <input type="hidden" name="signupDate" value="" id="signupDate">
</form>

Что мне нужно сделать с моей формой, чтобы получить этот макет?

class Default_Form_Subscribe extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        $this->addElement('text', 'email', array(
            'label'      => 'Email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array('EmailAddress')
        ));

        $this->addElement('submit', 'submit', array(
            'label'    => 'Subscribe',
            'ignore'   => true
        ));

        $this->addElement('hidden', 'active', array(
            'value'=>'true'
        ));
        $this->addElement('hidden', 'signupDate', array(
            'value' => Zend_Date::now()->toString('YYYY-MM-dd')
        ));
    }
}

Ответы [ 3 ]

11 голосов
/ 20 декабря 2009

Ах, обыграй меня ... Я пошел с подходом к созданию пользовательского определения, которое может быть применено к определенным элементам. Также пришлось сбросить декораторы на самой форме, чтобы удалить оболочку «dl» по умолчанию, похоже, делает именно то, что вам нужно:

class Default_Form_Subscribe extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        // reset form decorators to remove the 'dl' wrapper
        $this->setDecorators(array('FormElements','Form'));

        // custom decorator definition for form elements
        $customElementDecorators = array(
            'ViewHelper',
            'Errors',
            array(
                'Description',
                array('tag' => 'p','class' => 'description')
            ),
            array(
                'Label',
                array('separator' => ' ')
            ),
            array(
                array('data' => 'HtmlTag'),
                array('tag' => 'p')
            )
        );

        $this->addElement('text', 'email', array(
            'label'      => 'Email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array('EmailAddress'),
            'decorators' => $customElementDecorators
        ));

        $this->addElement('submit', 'submit', array(
            'label'    => 'Subscribe',
            'ignore'   => true,
            'decorators' => $customElementDecorators
        ));

        $this->addElement('hidden', 'active', array(
            'value'=>'true',
            'decorators' => array('ViewHelper')
        ));
        $this->addElement('hidden', 'signupDate', array(
            'value' => Zend_Date::now()->toString('YYYY-MM-dd'),
            'decorators' => array('ViewHelper')
        ));
    }
}
2 голосов
/ 30 октября 2013

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

//after adding all the form elements
//all form elements in a loop
foreach ($this->getElements() as $el) {
    $el->setDecorators( 
        array('ViewHelper', 'Errors', array('HtmlTag', array('tag' => 'p') 
    );
}
//form itself
$this->setDecorators( array('FormElements', 'Form') );

это мне кажется, в вашем случае вам также следует отфильтровать элементы по типу в поиске тех, которые вообще не нуждаются во внешнем html

1 голос
/ 20 декабря 2009

Вы должны настроить декораторы ваших Zend_Form элементов. Проверьте это учебник .

В вашем случае это будет что-то похожее на это:

$form->setElementDecorators(array(
    'ViewHelper',
    'Errors',
    array('Label', array('tag' => 'label', 'placement' => 'prepend'),
    array(array('data' => 'HtmlTag'), array('tag' => 'p')),
));

Это устанавливает декораторы для всех элементов формы. Вы также можете настроить отдельные элементы (например, скрытые кнопки и кнопки).

Можно также формировать группы отображения и украшать их по отдельности.

...