1

ここでバナナを食べます。2 つのフィールドを含む単純なフォームを作成しました。1 つはテキスト フィールド、もう 1 つはテキストエリアです。フォームは見栄えがしますが、何を試しても検証しません。

ここに私のフォームクラスがあります:

class MyForm extends Form
{

public function __construct()
{

    parent::__construct();

    $this->add(array(
        'name' => 'subject',
        'required' => true,
        'allowEmpty' => false,
        'options' => array(
            'label' => 'Betreff*',
        ),
        'type' => 'Zend\Form\Element\Text',
        'validators' => array(
            // validators for field "name"
            new \Zend\Validator\NotEmpty(),
        ),
        'filters' => array(
            // filters for field "name"
            array('name' => 'Zend\Filter\StringTrim'),
        ),
    ));

    $this->add(array(
        'name' => 'text',
        'required' => true,
        'allowEmpty' => false,
        'options' => array(
            'label' => 'Nachricht*',
        ),
        'type' => 'Zend\Form\Element\Textarea',
    ));

    $this->add(new Element\Csrf('security'));
}
}

valdiatorsとはfilters、私が試した多くのことの1つにすぎません...

ここのコントローラーでは、フォームは常に有効です。

    $form = new MyForm();

    $request = $this->getRequest();
    if ($request->isPost()) {

        $form = new MyForm();
        $form->setData($request->getPost());

        echo $form->isValid();

        if($form->isValid()) { ... }

私はいつもif.

私は疑問に思っています: を設定するときに、とにかくバリデーターが必要なのはなぜrequired=trueですか? 何もしていないのに、なぜそのような属性を実装するのでしょうか?

それでも: フォームを検証するにはどうすればよいですか? trimクリーンアップフィルターとバリデーターが欲しいだけですNotEmpty

ありがとう!

4

1 に答える 1

2

フィールドに required => true を追加するのは、表面的な目的のためだけです。

どの「もし」について話しているのですか?isValid? をエコーするだけです。

(ここで質問してすみません。ツアーの質問にはまだコメントできません。担当者が少ない...)

編集:

お約束通り、「解決」。あなたが自分で解決策を見つけたと言った後、私はこれを書き始めたので、フォームを作成し、フォームとバリデータを一緒に保つ方法を書き留めます. 明確にするためにバリデーターをフォームの横に置いておくのが好きですが、技術的にはエンティティーにバリデーターを配置することで、API などの面でより柔軟性が得られます。

十分に言いましたが、フォームで使用する(非常に基本的な)フィールドセットの例を次に示します。

(すべてが非常に自明であるため、コメントを省略しました)

class RaceUserFieldset extends Fieldset implements InputFilterProviderInterface {

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

        $this   ->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods(false))
               ->setObject(new RaceUser());

        $this->add(array(
            'name' => 'userid',
            'type' => 'hidden',
        ));
        $this->add(array(
            'name' => 'username',
            'type' => 'Text',
        ));
    }

    public function getInputFilterSpecification() {
        return array(
            'username' => array(
                'required' => true,
            ),
        );
    }
}

エンティティ、ハイドレーター、フィールド (フィルターはありませんが、それは簡単です)、およびバリデーターです。

フォームで使用するには ( simplefied ):

class RaceUserForm extends Form
{
    public function __construct()
    {
        parent::__construct('raceuser');

        $this->setAttribute('method', 'post');

        $this->add(array(
            'type' => 'YCRFront\Form\EditRaceFieldset',
            'options' => array(
                'use_as_base_fieldset' => true
            )
        ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type' => 'submit',
                'value' => 'Send'
            )
        ));
    }
}
于 2013-11-15T18:09:04.693 に答える