我使用以下代码将一个email元素添加到我的Zend Framework2表单中:
$form->add(array(
'type' => 'Zend\Form\Element\Email',
'name' => 'email',
'options' => array(
'label' => 'Email'
),
));
默认情况下,该元素的getInputSpecification()方法将required设置为true。但是element对象不包含任何必需的属性,因此标记也不包含。
如何在表单中添加标记,以便css能够添加所需的后缀?或者至少:自定义视图帮助器如何获取“必需”设置?
我意识到我可以只添加一个required属性,但这感觉并不正确,因为它可能会与内部元素的“required”设置不同步。
发布于 2014-01-15 00:25:14
虽然Sam和Cellulosa的反应是一个非常好的解决方案。
我担心随着ZF2框架的发展,这些将不是可伸缩的。尽管它们扩展了,但__invoke方法中有很多代码是重复的。当对框架和原始助手进行更改时,我们必须不断更新新的表单视图助手,以复制原始__invoke方法中的任何更改。
一种更简单的解决方案是使用提供的参数将parent::__invoke()调用到ViewHelper中,以避免重复代码。
因此,以下是解决方案:
在Application/src/Application/Form/View/Helper/RequiredMarkInFormLabel.php上创建ViewHelper
<?php
namespace Application\Form\View\Helper;
use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;
/**
* Add mark (*) for all required elements inside a form.
*/
class RequiredMarkInFormLabel extends OriginalFormLabel
{
/**
* Invokable
*
* @return str
*/
public function __invoke(ElementInterface $element = null, $labelContent = null, $position = null)
{
// invoke parent and get form label
$originalformLabel = parent::__invoke($element,$labelContent,$position);
// check if element is required
if ($element->hasAttribute('required')) {
// add a start to required elements
return '<span class="required-mark">*</span>' . $originalformLabel;
}else{
// not start to optional elements
return $originalformLabel;
}
}
}
记住在应用程序/配置/模块.config.php中注册ViewHelper
'view_helpers' => array(
'invokables'=> array(
'formlabel' => 'Application\Form\View\Helper\RequiredMarkInFormLabel'
)
),
发布于 2013-04-28 16:10:20
不过,你基本上说对了。为此,您绝对需要自己的ViewHelper。实现这一点的最简单方法是从Zend\Form\View\Helper\FormLabel
扩展并覆盖__invoke()
函数。这只是一次快速尝试,但我猜这有可能正确工作;)
public function __invoke(ElementInterface $element = null, $labelContent = null, $position = null)
{
// Implement all default lines of Zend\Form\View\Helper\FormLabel
// Set $required to a default of true | existing elements required-value
$required = ($element->hasAttribute('required') ? $element->getAttribute('required') : true);
if (true === $required) {
$labelContent = sprintf(
'<span class="im-required">(*)</span> %s',
$labelContent
);
}
return $openTag . $labelContent . $this->closeTag();
}
记住在您的Module#getViewHelperConfig()
中注册您自己的ViewHelper
,如下所示:
public function getViewHelperConfig()
{
return array(
'factories' => array(
'myFormLabel' => function($sm) {
return new Mynamespace\Form\View\Helper\MyFormLabel;
},
),
);
}
实际上,我有点惊讶这样的事情没有实现,尽管我相信这是有原因的:)
发布于 2013-08-20 20:45:17
使用Sam提供的指导原则,我设法将其分类如下:
我创建了一个Application/src/Application/Form/View/Helper/RequiredMarkInFormLabel.php
文件:
<?php
namespace Application\Form\View\Helper;
use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;
use Zend\Form\Exception;
class RequiredMarkInFormLabel extends OriginalFormLabel
{
public function __invoke(ElementInterface $element = null, $labelContent = null, $position = null)
{
...
// Set $required to a default of true | existing elements required-value
$required = ($element->hasAttribute('required') ? true : false);
if (true === $required) {
$labelContent = sprintf(
'%s<span class="required-mark">*</span>',
$labelContent
);
}
return $openTag . $labelContent . $this->closeTag();
}
}
我通过在Application/Module.php
中添加以下代码来启用它
public function getViewHelperConfig()
{
return array(
'invokables' => array(
'formlabel' => 'Application\Form\View\Helper\RequiredMarkInFormLabel',
),
);
}
希望这能对某些人有所帮助!;)
https://stackoverflow.com/questions/16260836
复制相似问题