Zend 1到Zend 2,正在使用装饰器,我现在怎样才能实现相同的行为?

时间:2015-06-19 20:45:59

标签: zend-framework zend-framework2 zend-form zend-view

问题的标题并不是不言自明的,因为有很多关于将Zend 1应用程序迁移到Zend 2应用程序的问题,所以我会根据我的问题细节。

首先,我们在视图文件中使用decorators表单元素,如下所示:

$element = new Zend_Form_Element_Text('element');
$element->setLabel('Element');
$element->setRequired();
$element->setDecorators(array(new Nti_Form_Decorator_Item()) );
print $element;

new Nti_Form_Decorator_Item()部分是有问题的装饰者。此类接收元素并添加一些自定义html以在视图内呈现。因此,我们不是使用简单的标签/输入,而是使用包含整个事物的自定义类来获得一些不错的div。

class Nti_Form_Decorator_Item extends Zend_Form_Decorator_Abstract {
...
...
public function render($content) {
    $element = $this->getElement();
    // Build all the html here, using some methods of 
    // the Zend_Form_Decorator_Abstract class.
    return html_entity_decode($html);
}

这就是我们在Zend 1中做到的方式,这是一个很好的旧装饰师 现在团队决定更新框架,我们的观点有很多麻烦,显然decorator事情早已不复存在,我们没有找到一种快速简便的方法来实现相同的结果在所有视图文件的自定义方面(我们视图中的每个表单元素都使用装饰器进行标准设计)。

我已经查看了ViewHelper等内容,但无法理解如何操作。

有人可以就我们如何做到这一点向我提供一些建议吗?

1 个答案:

答案 0 :(得分:2)

如果要在每个元素周围使用相同的标记,最简单的方法是覆盖formRow()帮助器。定义您自己的此助手版本:

namespace Nti\Form\View\Helper;

use Zend\Form\View\Helper\FormRow as ZfFormRow;
use Zend\Form\ElementInterface;

class FormRow extends ZfFormRow
{
    /**
     * @param  ElementInterface $element
     * @throws \Zend\Form\Exception\DomainException
     * @return string
     */
    public function render(ElementInterface $element)
    {
        // build your markup here
        $html = '<div>';
        $html .= parent::render($element);
        $html .= '</div>';

        return $html;
    }
}

并将其作为可调用的内容添加到module.config.php

'view_helpers' => array(
    'invokables' => array(
        'form-row' => 'NtiForm\Form\View\Helper\FormRow'
    )
)