1

'required'値が"false"に設定されているInputFilterを持つForm\Elementがあります。特定の状況下では、ElementはController内から「required」値を「true」に設定する必要があります。

コントローラでZend\InputFilter setRequired(true)を設定すると、$ form-> isValid()メソッドが呼び出されたときにそれが尊重されないようです。ただし、Zend \ InputFilterで「required」が「true」の場所にフィルターが設定されている場合(コントローラー内で動的に設定されていない場合)、期待どおりに機能しますが、このフォームを使用していくつかのフィルターを使用するため、これは望ましい解決策ではありません場所やフィールドが必要な場合とそうでない場合があります。

私のコントローラーには、次のものがあります。

$form = new UserDataForm();
$request = $this->getRequest();

if ($request->isPost()) {
    $update = new UserFilter();
    // The following doesn't seem to be respected
    $update->getInputFilter()->get('userName')->setRequired(true);

    $form->setInputFilter($update->getInputFilter());
    $form->setData($request->getPost());

    if($form->isValid()) {
        //The result is true even when the 'userName' var is not set in the POST data.
        echo("Is Valid");
    } else {
        echo($form->getMessages());
    }

UserDataForm()クラスを次のように設定しました。

class UserDataForm extends Form
{
public function __construct($name = null, array $userTypes) {
    parent::__construct('user');
    $this->setAttribute('method','post');

    $this->add(array(
        'name' => 'userName',
        'attributes' => array(
            'type' => 'text',
            'class'=> 'small'
        ),
        'options' => array(
            'label' => 'Username:'
        )
    ));

    //... and so on...

UserFilterクラスを次のように設定しました。

public function getInputFilter() {
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name'      => 'userName',
            'required'  => false,
            'filters'   => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'  => 'StringLength',
                    'options'  => array(
                        'encoding'  => 'UTF-8',
                    )
                ),
            )
        )));

    // ...

フォームが検証されたときに、コントローラーから呼び出された$ update-> getInputFilter()-> get('userName')-> setRequired(true)が尊重されないように見える理由を誰かが説明できますか?

4

1 に答える 1

8

しばらく休んだ後、問題を見つけました。明らかに、-> setRequired(true)は、動的に割り当てられた場合、相互に排他的です。\FilterInputから'required'=> trueを設定するのと同じ動作を探している場合は、さらに-> setAllowEmpty(false)を追加する必要があります。

したがって、私の改訂されたコードは次のようになります。

$update->getInputFilter()->get('userName')->setRequired(true);
$update->getInputFilter()->get('userName')->setAllowEmpty(false);

デリック

于 2013-02-14T23:37:37.237 に答える