10

ZF2でカスタムバリデーターを使用してカスタムフォーム要素を作成するにはどうすればよいですか? jQuery を使用するカスタム カテゴリ ピッカーを作成したいのですが、この要素のコンテンツは phtml スクリプトからレンダリングする必要があります。ZF1 ではとても簡単でしたが、ZF2 ではどこから始めればよいかわかりません。

4

1 に答える 1

26

フォーム要素は を実装する必要がありますZend\Form\ElementInterface。デフォルト クラスはZend\Form\Element、ベース フォームとして使用できる です。

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}

カスタムバリデーター

要素にカスタム バリデータを直接割り当てることができます。次に、次を実装する必要がありますZend\InputFilter\InputProviderInterface

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;
use Zend\InputFilter\InputProviderInterface;
use MyModule\InputFilter\Bar as BarValidator;

class Foo extends Element implements InputProviderInterface
{
    protected $validator;

    public function getValidator()
    {
        if (null === $this->validator) {
            $this->validator = new BarValidator;
        }
        return $this->validator;
    }

    public function getInputSpecification()
    {
        return array(
            'name'       => $this->getName(),
            'required'   => true,
            'validators' => array(
                $this->getValidator(),
            ),
        );
    }
}

カスタムレンダリング

現時点では、Zend Framework がカスタム フォーム要素タイプのレンダリングを処理する方法は少し複雑です。通常、単純な<input type="text">要素を返すだけです。

1 つのオプションがあり、Zend\Form\View\Helper\FormElementヘルパーをオーバーライドする必要があります。として登録されてformelementおり、カスタム モジュールでこのビュー ヘルパーをオーバーライドする必要があります。

namespace MyModule;

class Module
{
    public function getViewHelperConfig()
    {
        return array(
            'invokables' => array(
                'formelement' => 'MyModule\Form\View\Helper\FormElement',
                'formfoo'     => 'MyModule\Form\View\Helper\FormFoo',
            ),
        );
    }
}

さらに、Zend Framework 2 のすべてのフォーム要素はビュー ヘルパーによってレンダリングされます。したがって、要素のコンテンツをレンダリングする独自の要素のビュー ヘルパーを作成します。

次に、独自のフォーム要素ヘルパー ( MyModule\Form\View\Helper\FormElement)を作成する必要があります。

namespace MyModule\Form\View\Helper;

use MyModule\Form\Element;
use Zend\Form\View\Helper\FormElement as BaseFormElement;
use Zend\Form\ElementInterface;

class FormElement extends BaseFormElement
{
    public function render(ElementInterface $element)
    {
        $renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable
            return '';
        }

        if ($element instanceof Element\Foo) {
            $helper = $renderer->plugin('form_foo');
            return $helper($element);
        }

        return parent::render($element);
    }
}

最後のステップとして、ビュー ヘルパーを作成して、この特定のフォーム要素をレンダリングします。

namespace MyModule\Form\View\Helper;

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

class Foo extends AbstractHelper
{
    public function __invoke(ElementInterface $element)
    {
        // Render your element here
    }
}

たとえば、このフォーム要素の .phtml ファイルをレンダリングする場合は、このヘルパー内にロードします。

namespace MyModule\Form\View\Helper;

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

class Foo extends AbstractHelper
{
    protected $script = 'my-module/form-element/foo';

    public function render(ElementInterface $element)
    {
        return $this->getView()->render($this->script, array(
            'element' => $element
        ));
    }
}

をレンダリングしmy-module/form-element/foo.phtml、このスクリプトに$elementは、特定のフォーム要素を含む変数があります。

于 2012-12-08T11:01:54.633 に答える