-1

カスタムバリデーターを ZF2 フォームに追加するにはどうすればよいですか? zf2 フォーム要素またはフォーム クラス自体にカスタム バリデータを追加して、複数の要素を相互に検証したいと考えています。

use Zend\Form\Form;    
class MyForm extends Form {

    public function init()
    {
        // Add some elements
        $this->add(
            $this->getFormFactory()->create(...);
        }

        // How can i add a custom validator here to the form or element?
    }

}

私の現在の解決策

非常に単純ですが効果的です。フォーム クラスまたはフィールドセットは、インターフェイスZend\InputFilter\InputFilterProviderInterfaceを実装する必要があります。

今、私はこのようなものを追加することができます:

use Zend\Form\Form;
use Zend\InputFilter\InputFilterProviderInterface;
use \PayrollAccountingValidator;
class MyForm extends Form implements InputFilterProviderInterface {

    public function init()
    {
        $this->getFormFactory()->create(
            array(
                    'name' => 'salary',
                    'type' => 'Zend\Form\Element\Number',
                    'attributes' => array(
                            'min' => 0,
                            'step' => 1
                    ),
                    'options' => array(
                            'label' => _('Salary?')
                    )
            ));
    }

    public function getInputFilterSpecification ()
    {
        return array(
                'salary' => array(
                        'validators' => array(
                                new PayrollAccountingValidator($this)
                        )
                )
        );
    }

}
4

1 に答える 1

3

私がすること:

  • フォームを作成する
  • バリデーターの依存関係を持つ入力フィルターを作成する
  • フィルターのフィールドにバリデーターを追加します
  • 工場でフォームにフィルターを設定します。

形:

ここでは、要素をフォームに追加するだけです。

class SomeForm extends Form {

   public function __construct() {
        parent::__construct('someform');

        $this->add(array(
            'type' => 'Zend\Form\Element\Textarea',
            'name' => 'somelement',
            'options' => array(
                'label' => 'Message',
            )
        ));
    }
}

フィルター:

ここでは、上記のフォームで関連する要素のフィルターを作成します。入力フィルターを作成するときに、インスタンス化で渡されたバリデーターを追加します。

namespace SomeModule\Form;

use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class SomeFormFilter implements InputFilterAwareInterface {

    protected $customValidator;

    protected $inputFilter;

    public function __construct($customValidator) {
        $this->customValidator = $customValidator;
    }

    public function setInputFilter(InputFilterInterface $inputFilter) {
        throw new \Exception("Not used");
    }

    public function getInputFilter() {
        if (!$this->inputFilter) {

            $inputFilter = new InputFilter();
            $factory = new InputFactory();

            $inputFilter->add(
                $factory->createInput(
                    array(
                        'name' => 'somelement',
                        'required' => true,
                        'filters' => array(array(
                                'name' => 'StringTrim')
                        ),
                        'validators' => array(
                            $this->customValidator
                        ),
                    )
                )
            );

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }
}

Module.php

フォームのファクトリを作成して、フィルターバリデーターの依存関係を管理し、フィルターをフォームに適用できるようになりました。

public function getServiceConfig() {
     return array(
        'factories' => array(
            'someForm' => function($sm) {
                $form = new SomeForm();
                $validator = new CustomValidator() // or $validator = $sm->get('CustomValidator');
                $formFilter = new SomeFormFilter($validator);
                $form->setInputFilter($formFilter->getInputFilter());
                return $form;
            },
        ),
    );
}

Module.php で正しい名前空間を使用するか、FQCN を指定する必要があることは明らかです。

これで、1 行のコードでコントローラーに完全に構​​成されたこのフォームを取得できます。

$form = $this->getServiceLocator()->get('SomeForm');

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-04-03T13:50:07.530 に答える