首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向zf2表单元素标签添加所需的后缀

向zf2表单元素标签添加所需的后缀
EN

Stack Overflow用户
提问于 2013-04-28 15:54:40
回答 6查看 3.1K关注 0票数 2

我使用以下代码将一个email元素添加到我的Zend Framework2表单中:

代码语言:javascript
运行
复制
$form->add(array(
    'type' => 'Zend\Form\Element\Email',
    'name' => 'email',
    'options' => array(
        'label' => 'Email'
    ),
));

默认情况下,该元素的getInputSpecification()方法将required设置为true。但是element对象不包含任何必需的属性,因此标记也不包含。

如何在表单中添加标记,以便css能够添加所需的后缀?或者至少:自定义视图帮助器如何获取“必需”设置?

我意识到我可以只添加一个required属性,但这感觉并不正确,因为它可能会与内部元素的“required”设置不同步。

EN

回答 6

Stack Overflow用户

发布于 2014-01-15 00:25:14

虽然Sam和Cellulosa的反应是一个非常好的解决方案。

我担心随着ZF2框架的发展,这些将不是可伸缩的。尽管它们扩展了,但__invoke方法中有很多代码是重复的。当对框架和原始助手进行更改时,我们必须不断更新新的表单视图助手,以复制原始__invoke方法中的任何更改。

一种更简单的解决方案是使用提供的参数将parent::__invoke()调用到ViewHelper中,以避免重复代码。

因此,以下是解决方案:

在Application/src/Application/Form/View/Helper/RequiredMarkInFormLabel.php上创建ViewHelper

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
'view_helpers' => array(
    'invokables'=> array(
        'formlabel' => 'Application\Form\View\Helper\RequiredMarkInFormLabel'  
    )
),  
票数 3
EN

Stack Overflow用户

发布于 2013-04-28 16:10:20

不过,你基本上说对了。为此,您绝对需要自己的ViewHelper。实现这一点的最简单方法是从Zend\Form\View\Helper\FormLabel扩展并覆盖__invoke()函数。这只是一次快速尝试,但我猜这有可能正确工作;)

代码语言:javascript
运行
复制
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,如下所示:

代码语言:javascript
运行
复制
public function getViewHelperConfig()
{
    return array(
        'factories' => array(
            'myFormLabel' => function($sm) {
                return new Mynamespace\Form\View\Helper\MyFormLabel;
            },
        ),
    );
}

实际上,我有点惊讶这样的事情没有实现,尽管我相信这是有原因的:)

票数 2
EN

Stack Overflow用户

发布于 2013-08-20 20:45:17

使用Sam提供的指导原则,我设法将其分类如下:

我创建了一个Application/src/Application/Form/View/Helper/RequiredMarkInFormLabel.php文件:

代码语言:javascript
运行
复制
<?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中添加以下代码来启用它

代码语言:javascript
运行
复制
public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            'formlabel' => 'Application\Form\View\Helper\RequiredMarkInFormLabel',
        ),
    );
}

希望这能对某些人有所帮助!;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16260836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档