Zend Form: добавить ссылку справа от текстового поля - PullRequest
5 голосов
/ 13 марта 2009

Я понимаю, что я должен быть в состоянии сделать это, но что я могу сказать, я не понимаю . Я даже играл до тех пор, пока мои глаза не зажарились. Лучше всего я учусь на примерах, а не на глубоких объяснениях, которые дают документы Zend, или на типичных ответах «использовать декораторы», которые обычно дают вопросы такого типа. Мне нужна вот такая разметка:

<dt>
    <label for="name">Name</label>
</dt>
<dd>
    <input type="text" name="name" id="name" value="">
    <a href="#">My Link</a>
</dd>

Это все ванильно, кроме дополнительной ССЫЛКИ после ввода. Да, это внутри dd, прямо рядом с ссылкой, и это то, чего я не могу добиться.

Вот (слегка измененный) код, который я использовал для создания приведенного выше HTML

$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel( 'Name' );        
$this->addElements( $name );
$this->addDisplayGroup( array( 'name' ), 'people');

Любой пример кода или лучшее объяснение сделало бы этого нуба очень и очень счастливым.

Ура!

Ответы [ 3 ]

24 голосов
/ 14 марта 2009

Смотрите мой ответ на эту тему в списке рассылки и мой пост в блоге об этом. По сути, это тот же процесс, который описал Аарон.

Вы также можете пойти по пути декоратора, используя свойство description для удержания ссылки (не проверено):

<?php
$foo = new Zend_Form_Element_Text('name');
$foo->setLabel('Name')
    ->setDescription('<a href="#">Link</a>')
    ->setDecorators(array(
        'ViewHelper',
        array('Description', array('escape' => false, 'tag' => false)),
        array('HtmlTag', array('tag' => 'dd')),
        array('Label', array('tag' => 'dt')),
        'Errors',
      ));
$form->addElement($foo);

Я не уверен, сработает ли 'tag'=>false в Description декораторе, но стоит попробовать. Извините, я не могу проверить это сейчас, моя коробка разработки в данный момент не работает. Если это не удалось, попробуйте метод рендеринга декоратора вручную, описанный в этих двух ссылках.

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

Я думаю, что вы ищете полный контроль над декоратором с помощью скрипта просмотра:

Руководство по Zend Framework

По сути, вы хотите установить в свойстве viewScript этого элемента путь к вашему сценарию, а затем передать любую дополнительную информацию, которую вы хотите отправить, например, linkHref или заголовок создаваемой ссылки.

$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel( 'Name' );   
$name->viewScript = 'path/to/viewScript.phtml';
$name->decorators = array('ViewScript', array('linkHref' => '#',
                                              'linkTitle' => 'My Link');
$this->addElements( $name );
$this->addDisplayGroup( array( 'name' ), 'people');

Тогда ваш viewScript будет выглядеть следующим образом, я не уверен, как все помощники находятся в экземпляре Zend_Form_Element, но это примерно так:

<dt><?= $this->formLabel($this->element->getName(),
                     $this->element->getLabel()) ?></dt>
<dd><?= $this->{$this->element->helper}(
                     $this->element->getName(),
                     $this->element->getValue(),
                     $this->element->getAttribs()
                ) ?>
<a href="<?= $this->linkHref; ?>"><?= $this->linkTitle; ?></a>
<?= $this->formErrors($this->element->getMessages()) ?>

</dd>

Иногда, делать это в viewScript лучше, потому что он дает вам 100% контроль над элементом, оставаясь при этом довольно СУХИМ.

1 голос
/ 15 января 2010

Просто чтобы добавить некоторую поддержку посту Аарона, после нескольких часов избиений головой сделать что-то ДЕЙСТВИТЕЛЬНО простое (это, кажется, сводит на нет смысл наличия фреймворка), если вы обнаружите, что это не работает на ваших флажках, то это потому что вы должны использовать это в своем .phtml (на примере Аарона):

<dt><?= $this->formLabel($this->element->getName(),
                     $this->element->getLabel()) ?></dt>
<dd><?= $this->{$this->element->helper}(
                     $this->element->getName(),
                     $this->element->getValue(),
                     $this->element->getAttribs(),
                     $this->element->options
                ) ?>
<a href="<?= $this->linkHref; ?>"><?= $this->linkTitle; ?></a>
<?= $this->formErrors($this->element->getMessages()) ?>

</dd>

ВАРИАНТЫ! ОПЦИИ! ОПЦИИ! Где ты был, когда мне нужно было тебя найти ?! Поэтому не забудьте добавить следующее к вашему помощнику, если вы используете флажки:

$this->element->options

Это хорошо работает для добавления Положений и условий флажок с Zend_Form_Element_Checkbox (это для SEO)

...