5

我意识到我应该能够做到这一点,但我能说什么,我不明白。我什至 rtfm'ed 直到我的眼睛被炸了。我通过例子学得最好,而不是 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');

任何示例代码或更好的解释都会让这个菜鸟非常非常高兴。

干杯!

4

3 回答 3

24

请参阅我在邮件列表中对此主题的回复以及我的博客文章。这与 Aaron 描述的过程基本相同。

您也可以采用装饰器方式,使用 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是否可以工作,但值得一试。抱歉,我现在无法测试,我的开发盒现在坏了。如果失败,请尝试这两个链接中描述的手动装饰器渲染方法。

于 2009-03-14T13:05:55.160 回答
5

我认为您正在寻找通过视图脚本对装饰器的完全控制:

Zend 框架手册

基本上,您希望将元素的 viewScript 属性设置为脚本的路径,然后传递您想要发送的任何其他信息,可能是您正在构建的链接的链接Href 或标题。

$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 看起来像这样,我不确定所有 Helpers 是如何在 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% 控制元素,同时仍然非常干燥。

于 2009-03-13T22:51:14.863 回答
1

只是为了给 Aaron 的帖子添加一些支持,经过几个小时的头疼做一些非常简单的事情(这似乎否定了拥有一个框架的意义),如果你发现这在你的复选框上不起作用,那是因为你必须在您的 .phtml 中使用它(基于 Aaron 的示例):

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

于 2010-01-15T14:58:11.127 回答