Zend表单:添加文本字段右侧的链接

时间:2009-03-13 17:21:17

标签: php zend-framework zend-form

我意识到我应该能够做到这一点,但我能说什么,我不得到它。我甚至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>

除了输入后的额外LINK外,它全部都是香草味。是的,它在dd内部,就在链接旁边,这就是我无法实现的。

以下是我用于创建上述HTML

的(略微修改过的)代码
$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel( 'Name' );        
$this->addElements( $name );
$this->addDisplayGroup( array( 'name' ), 'people');

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

干杯!

3 个答案:

答案 0 :(得分:24)

请参阅我在邮件列表中对this thread的回复以及我对blog post的回复。这基本上与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是否可行,但值得一试。对不起,我现在无法测试,我的开发盒目前已被打破。如果失败,请尝试在这两个链接中描述的手动装饰器渲染方法。

答案 1 :(得分:5)

我认为您正在寻找通过View Script完全控制装饰器:

Zend Framework Manual

基本上,您希望将元素的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看起来像这样,我不确定所有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%控制元素,同时仍然非常干净。

答案 2 :(得分: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>

OPTIONS!选择!选择!当我需要找到你的时候你在哪里?!因此,如果您使用复选框,请不要忘记将以下内容添加到帮助程序中:

$this->element->options

适用于添加条款和条件复选框以及 Zend_Form_Element_Checkbox (适用于搜索引擎优化)