ZF2でカスタムバリデーターを使用してカスタムフォーム要素を作成するにはどうすればよいですか? jQuery を使用するカスタム カテゴリ ピッカーを作成したいのですが、この要素のコンテンツは phtml スクリプトからレンダリングする必要があります。ZF1 ではとても簡単でしたが、ZF2 ではどこから始めればよいかわかりません。
1 に答える
フォーム要素は を実装する必要があります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
は、特定のフォーム要素を含む変数があります。