【问题标题】:How to use form view helper into custom view helper in zend framework 2如何在 zend 框架 2 中将表单视图助手用于自定义视图助手
【发布时间】:2014-09-02 15:23:32
【问题描述】:

我正在创建自定义视图助手。我想知道如何在我自己的视图助手中使用 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();
 }
}

当 i 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 的目的。

【问题讨论】:

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


    【解决方案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');
    

    【讨论】:

    • 谢谢,你解决了我的问题。我花了2天时间弄清楚问题出在哪里!你怎么知道我不应该直接实例化 $obj = new FormElement();而不是 $object = $this->getView()->plugin('form_element'); ?
    【解决方案2】:

    您可以使用自定义视图助手调用任何视图助手

    $this->getView()->anyRegisteredViewHelper();
    

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

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

    其中 $element 是您的表单元素对象(选择/文本区域/复选框等)

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多