如何在Zend Framework 3中注册自定义表单视图帮助器

时间:2018-08-10 13:09:55

标签: php zend-framework3

我正在将继承的Zend Framework 2应用程序迁移到Zend Framework 3,在注册我的自定义表单视图助手时遇到了一些困难。当应用程序使用版本2时,助手将起作用,并且主要用于添加标签属性以实现可访问性。例如,这是一个自定义FormText.php帮助程序。

<?php

namespace Application\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormInput;

class FormText extends FormInput
{
    /**
     * Attributes valid for the input tag type="text"
     *
     * @var array
     */
    protected $validTagAttributes = array(
        'name'           => true,
        'autocomplete'   => true,
        'autofocus'      => true,
        'dirname'        => true,
        'disabled'       => true,
        'form'           => true,
        'list'           => true,
        'maxlength'      => true,
        'pattern'        => true,
        'placeholder'    => true,
        'readonly'       => true,
        'required'       => true,
        'size'           => true,
        'type'           => true,
        'value'          => true,
        'aria-hidden'   => true,
        'aria-invalid'   => true,
        'aria-describedby' => true,
        'aria-label' => true,
    );

    /**
     * Determine input type to use
     *
     * @param  ElementInterface $element
     * @return string
     */
    protected function getType(ElementInterface $element)
    {
        return 'text';
    }
}

在我的应用程序的第2版中,使用以下方法(仅显示1个简短的帮助程序)将帮助程序注册到Module.php中(不确定为什么不在module.config.php'中注册):

public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            // Form helpers
            'FormText' => 'Application\Form\View\Helper\FormText',

        ),
    );
}

在该应用程序的ZF3版本中,我试图在module.config.php的return语句中使用以下数组元素:

'view_helpers' => [
    'factories' => [
        View\Helper\Cdn::class => View\Helper\CdnFactory::class,
        Form\View\Helper\FormText::class => InvokableFactory::class,
    ],
    'aliases' => [
        'cdn' => View\Helper\Cdn::class,
        'FormText' => Form\View\Helper\FormText::class,
    ],

],

尽管“ cdn”帮助程序已正确注册并可以正常工作,但它不适用于表单视图帮助程序。表单视图助手不需要任何注入的依赖关系,因此我没有为其使用自定义工厂类。

我确实在application.config.php中将“ Zend / Form”作为模块列出,并且知道标准的Zend表单视图助手正在工作。

我使用SO问题中的代码示例尝试了上述代码的许多变体来注册帮助器,尽管所有问题似乎都与普通视图帮助器有关,而不是与表单视图帮助器有关。

我将非常感谢您提供有关如何使它正常工作的任何建议。

谢谢。

1 个答案:

答案 0 :(得分:3)

以我工作的公司的一个活跃项目为例。我们还有一些默认的ZF3 Form ViewHelpers被我们自己覆盖,以与前端框架进行交互。主题名称是“ Alpha”(我认为;-))

我们使用以下内容:

'view_helpers' => [
    // other stuff
    'invokables' => [
        'Zend\Form\View\Helper\FormCollection' => AlphaCollection::class,
        'Zend\Form\View\Helper\Form' => AlphaForm::class,
        'Zend\Form\View\Helper\FormRow' => AlphaRow::class,
        'Zend\Form\View\Helper\FormSelect' => AlphaSelect::class,
    ],
],

查看帮助程序本身:

// Namespace + use statements
class AlphaCollection extends FormCollection
{
    public function __construct()
    {
        parent::setWrapper('<div class="alpha-form-collection">%2$s%1$s%3$s</div>');
    }

    /**
     * @param \Zend\Form\ElementInterface $element
     * @param null $labelPosition
     * @return string
     */
    public function render(ElementInterface $element, $labelPosition = null)
    {
        $markup = parent::render($element, $labelPosition);

        $classes = 'input-field col s12 alpha-fieldset';

        if($element instanceof Collection)
        {
            $classes .= ' alpha-fieldset-collection';
        }

        $prepend = '<div class="' . $classes . '">';
        $append = '</div>';

        return $prepend . $markup . $append;
    }
}

因此,从本质上讲,我们无需创建自己的ViewHelper,而无需更改Zend Framework 3提供的视图帮助。由于我们只是在“更新”现有的ViewHelper,因此不必创建新的工厂(没有其他要求)。

Zend Framework已使用可调用的名称注册了ViewHelpers(因此您可以进行$this->formRow(...)$this->formSelect(...)。我们只是劫持了他们的配置,并用我们的类替换了所需的类这样,当我们有一个完全生成的表单(<?= $this->form($form) ?>)时,ZF会为我们完成所有工作。

.phtml中的实现:

<!-- Internally uses the invokables we've modified, so this is all we need to do :) -->
<?= $this->form($form) ?>

为了使配置更适合将来使用,我想您可以用FQCN替换现在可调用的字符串(尚未对此进行测试)

相关问题