2

次のコードを使用して、メール要素を Zend Framework 2 フォームに追加します。

$form->add(array(
    'type' => 'Zend\Form\Element\Email',
    'name' => 'email',
    'options' => array(
        'label' => 'Email'
    ),
));

デフォルトでは、この要素の getInputSpecification() メソッドは required を true に設定します。しかし、要素オブジェクトには必要なプロパティが含まれていないため、マークアップにも含まれていません。

css が必要なサフィックスを追加できるように、フォームにマークアップを追加するにはどうすればよいですか? または、少なくとも: カスタム ビュー ヘルパーはどのようにして「必要な」設定を取得できますか?

必要な属性を追加するだけでよいことに気付きましたが、内部要素の「必須」設定と同期しなくなる可能性があるため、それは適切ではありません。

4

6 に答える 6

3

Sam と Cellulosa の応答は非常に優れたソリューションですが。

ZF2 フレームワークが進歩するにつれて、これらがスケーラブルでなくなるのではないかと心配しています。Zend\Form\View\Helper\FormLabel を拡張しているにもかかわらず、重複する __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;
        }
    }
}

Application/config/module.config.php で ViewHelper を忘れずに登録してください。

'view_helpers' => array(
    'invokables'=> array(
        'formlabel' => 'Application\Form\View\Helper\RequiredMarkInFormLabel'  
    )
),  
于 2014-01-14T16:25:13.617 に答える
1

サムによって提供されたガイドラインを使用して、次のように並べ替えることができました。

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',
        ),
    );
}

これが誰かに役立つことを願っています! ;)

于 2013-08-20T12:45:16.843 に答える
1

私がしたことは、InputFilter に基づいて要素に必要な属性を動的に追加することでした。

私のフォームヘルパーで:

public function render(Traversable $fieldset)
    {
        ...
        elseif ($element instanceof ElementInterface) {
                if ($fieldset instanceof \Zend\InputFilter\InputFilterProviderInterface){
                    $ifs = $fieldset->getInputFilterSpecification();
                    $start = strrpos($element->getName(), '[')+1;
                    $end = strpos($element->getName(),']');
                    $elementName = substr($element->getName(),$start,$end-$start);
                    if (isset($ifs[$elementName]['required'])){
                        $element->setAttribute('required', $ifs[$elementName]['required']);
                    }

                }
                $form .= $elementHelper->render($element);
        ...

        return $form;
    }

ElementHelper について

public function render(ElementInterface $element){
...
$required = ($element->hasAttribute('required') ? $element->getAttribute('required') : false);
...
if (true === $required && ($label != '' || $label != null || $label != false)) {
     $label .= '*';
}

したがって、@Sam によって提案された属性と InputSpecification を追加することを心配する必要はありません。

于 2013-12-26T16:51:47.183 に答える