如何在zend框架2中使用表单视图助手进入自定义视图助手

时间:2014-09-02 15:23:32

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

我正在创建自定义视图助手。我想知道如何在我自己的视图帮助器中使用formElement“Zend \ Form \ View \ Helper \ FormElement”。这是我的代码。

use Zend\Form\ElementInterface;
use Zend\Form\FieldsetInterface;
use Zend\Form\View\Helper\FormElement;
use Zend\Form\View\Helper\AbstractHelper;
use Zend\View\Renderer\PhpRenderer;

class JudgeCareerViewHelper extends AbstractHelper {
    private $output;
    public function __invoke($formCollection) {
    foreach ($formCollection as $elementOrFieldset) {
        if ($elementOrFieldset instanceof FieldsetInterface) {
            $obj = new FormElement();
            $this->output .= $obj($elementOrFieldset->get('startServiceDate'));
        } elseif ($elementOrFieldset instanceof ElementInterface) {
            //set element markup
            echo 'element';
        }
    };
    echo $this->output;

    die();
 }
}

当我echo时,FormElement的输出结果为空。所以我打开了zend“Zend \ Form \ View \ Helper \ FormElement”库以找出问题所在。所以我发现,下面的代码返回空。我不知道$renderer = $this->getView();的目的是什么以及如何获得观点。

$renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable
            return '';
        }

创建自定义视图助手以生成我自己的标记(HTML)而非zend buitin html的目的。

2 个答案:

答案 0 :(得分:1)

  

所以我发现,代码$renderer = $this->getView()返回空。

您需要确保不使用new直接实例化视图助手,而是通过Zend\View\HelperPluginManager调用。

怀疑该问题是因为它没有在服务管理器中正确注册为invokable类。

// Module.php
public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            'JudgeCareer'
                => 'FooModule\Form\View\Helper\JudgeCareerViewHelper',  
        ),
    );
 }

这是为了确保Zend\View\Renderer\PhpRenderer is injected as the view

JudgeCareerViewHelper拥有“观看次数”'注入后,它将能够调用其他视图插件,并通过HelperPluginManager再次正确加载。

该行:

$obj = new FormElement();

应该是

$object = $this->getView()->plugin('form_element');

答案 1 :(得分:0)

您可以使用

从自定义视图助手中调用任何视图助手
$this->getView()->anyRegisteredViewHelper();

因此,在您的情况下调用ZF2内置表单呈现视图助手,您将使用:

$this->getView()->formElement($element);

其中$ element是您的表单元素对象(选择/ Textarea / Checkbox等)

您当然也可以为特定元素调用显式助手:

$this->getView()->formTextarea($textareaElement);