如何在 Zend Framework 3 中注册自定义表单视图助手
How to register custom form view helper in Zend Framework 3
我正在将一个继承的 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 中,助手是在 Module.php 中注册的(不确定为什么不在 module.config.php' 中)使用以下方法(为简洁起见仅显示 1 个助手):
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' 帮助程序已正确注册并正常工作,但它不适用于表单视图帮助程序。表单视图助手不需要任何注入的依赖项,所以我没有使用自定义工厂 class。
我确实在 application.config.php 中将 'Zend/Form' 列为一个模块,并且知道标准的 Zend 表单视图助手正在工作。
尽管所有问题似乎都与普通视图助手相关,而不是表单视图助手,但我已尝试使用上述代码的许多变体来使用 SO 问题中的代码示例注册助手,但均未成功。
如果能给我任何建议,我将不胜感激。
谢谢。
以我工作的公司的一个活跃项目为例。我们还有一些默认的 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 提供的那些。因为我们只是 "updating" 现有的,所以我们不必创建新工厂(无额外要求)。
Zend Framework 已使用可调用名称注册了 ViewHelper(因此您可以执行 $this->formRow(...)
或 $this->formSelect(...)
。我们刚刚 劫持 它们的配置并替换了class 我们需要自己的。这样,当我们有一个完整生成的表单时 (<?= $this->form($form) ?>
),ZF 会为我们完成所有工作。
在.phtml
中实施:
<!-- Internally uses the invokables we've modified, so this is all we need to do :) -->
<?= $this->form($form) ?>
为了使配置更符合未来的需要,我认为您现在可以用 FQCN 替换可调用的字符串(尚未对此进行测试)
我正在将一个继承的 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 中,助手是在 Module.php 中注册的(不确定为什么不在 module.config.php' 中)使用以下方法(为简洁起见仅显示 1 个助手):
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' 帮助程序已正确注册并正常工作,但它不适用于表单视图帮助程序。表单视图助手不需要任何注入的依赖项,所以我没有使用自定义工厂 class。
我确实在 application.config.php 中将 'Zend/Form' 列为一个模块,并且知道标准的 Zend 表单视图助手正在工作。
尽管所有问题似乎都与普通视图助手相关,而不是表单视图助手,但我已尝试使用上述代码的许多变体来使用 SO 问题中的代码示例注册助手,但均未成功。
如果能给我任何建议,我将不胜感激。
谢谢。
以我工作的公司的一个活跃项目为例。我们还有一些默认的 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 提供的那些。因为我们只是 "updating" 现有的,所以我们不必创建新工厂(无额外要求)。
Zend Framework 已使用可调用名称注册了 ViewHelper(因此您可以执行 $this->formRow(...)
或 $this->formSelect(...)
。我们刚刚 劫持 它们的配置并替换了class 我们需要自己的。这样,当我们有一个完整生成的表单时 (<?= $this->form($form) ?>
),ZF 会为我们完成所有工作。
在.phtml
中实施:
<!-- Internally uses the invokables we've modified, so this is all we need to do :) -->
<?= $this->form($form) ?>
为了使配置更符合未来的需要,我认为您现在可以用 FQCN 替换可调用的字符串(尚未对此进行测试)