1

CraueFormFlowBundle を使用して複数ページのフォームを作成しており、いくつかのフィールドで検証を行おうとしていますが、これを行う方法がわかりません。検証が必要なオブジェクトはエンティティではないため、問題が発生しています。

フォーム タイプ クラスの getDefaultOption 関数に collectionConstraint を追加しようとしましたが、「配列タイプまたは Traversable および ArrayAccess の引数が必要です」というエラーが発生するため、これは機能しません。オブジェクト クラスでアノテーションを試してみましたが、考慮されていないようです。クラスがエンティティでない場合、注釈は考慮されますか? (enable_annotations を true に設定)

とにかく、これを行う適切な方法は何ですか?基本的に、「年齢」が整数であることを検証したいだけです...

class PoemDataCollectorFormType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        switch ($options['flowStep']) {
            case 6:
            $builder->add('msgCategory', 'hidden', array(
                ));
            $builder->add('msgFIB','text', array(
                'required' => false,
            ));
            $builder->add('age', 'integer', array(
                'required' => false,
                ));
            break;
        }
    }
    public function getDefaultOptions(array $options)
    {
        $options = parent::getDefaultOptions($options);
        $options['flowStep'] = 1;
        $options['data_class'] = 'YOP\YourOwnPoetBundle\PoemBuilder\PoemDataCollector';
        $options['intention'] = 'my_secret_key';

        return $options;
    }
}

編集: コードを追加し、注釈を使用して検証を処理します

Cyprianとして、私は注釈を使用することはうまくいくはずだと確信していましたが、そうではありません...私が試した方法は次のとおりです。

私のコントローラーで:

public function collectPoemDataAction() {
    $collector = $this->get('yop.poem.datacollector');
    $flow = $this->get('yop.form.flow.poemDataCollector');
    $flow->bind($collector);
    $form = $flow->createForm($collector);
    if ($flow->isValid($form)) {
        ....
    }
}

私のデータクラス (サービス yop.poem.datacollector) である私の PoemDataCollector クラスでは:

class PoemDataCollector
{
     /**
     * @Assert\Type(type="integer", message="Age should be a number")
     */

    private $age;
}

EDIT2:

サービスの実装は次のとおりです。データ クラス (PoemDataCollector) は、フォームではなくフロー クラスにリンクされているようです。

    <service id="yop.poem.datacollector" class="YOP\YourOwnPoetBundle\PoemBuilder\PoemDataCollector">
    </service>
    <service id="yop.form.poemDataCollector"
            class="YOP\YourOwnPoetBundle\Form\Type\PoemDataCollectorFormType">
        <tag name="form.type" alias="poemDataCollector" />
    </service>
    <service id="yop.form.flow.poemDataCollector"
            class="YOP\YourOwnPoetBundle\Form\PoemDataCollectorFlow"
            parent="craue.form.flow"
            scope="request">
        <call method="setFormType">
            <argument type="service" id="yop.form.poemDataCollector" />
        </call>
    </service>

craueFormFlowBundleガイドラインを尊重しながら検証を行うにはどうすればよいですか?

ガイドラインには次のように記載されています。

Validation groups
To validate the form data class a step-based validation group is passed to the form type. By default, if getName() of the form type returns registerUser, such a group is named flow_registerUser_step1 for the first step.

これらの検証グループを使用するには、どこに制約を記述すればよいですか?

私は試した:

YOP\YourOwnPoetBundle\PoemBuilder\Form\Type\PoemDataCollectorFormType:
    properties:
        name:
          - MinLength: { limit: 5, message: "Your name must have at least {{ limit }} characters.", groups: [flow_poemDataCollector_step1] }
        age:
          - Type:
               type: integer
               message: Please input a number
               groups: [flow_poemDataCollector_step6]

しかし、それは考慮されません。

EDIT3:

OK、はるかに良いです。名前の検証は次のように機能しているようです:

/**
 * @Assert\MinLength(limit=5, groups={"flow_poemDataCollector_step1"}, message="Your name must have at least {{ limit }} characters.")
 */
private $name;

メッセージは表示されませんが... テンプレートに {{ form_errors(form.name) }} と {{ form_errors(form) }} を入れました... なぜ表示されないのですか?

しかし:

/**
 * @Assert\Type(type="integer", groups={"flow_poemDataCollector_step6"}, message="Age should be a number")
 */

private $age;

全然効かない…

EDIT4:

よし、なんとか検証が機能するようになりました..しかし、エラーメッセージを表示する方法が見つかりません。使用時に表示されるはずではありませんか:

{{ form_errors(form.name) }}

また

{{ form_errors(form) }}

私のテンプレートで?私の場合、検証が失敗すると、フォームの同じステップに戻りますが、エラー メッセージは表示されません。さらに、$form->getErrors() は空の配列を返します! エラーを処理するには?

4

3 に答える 3

0

これはテストしていないので、機能するかどうかはわかりませんが、buildFormメソッド内で次のようなことができる場合があります。

    $builder->addValidator(new \Symfony\Component\Form\CallbackValidator(function(FormInterface $form) {
        $data = $form->getData();
        if (!is_int($data['age'])) {
            $form->addError(new \Symfony\Component\Form\FormError('Age must be an integer'));
        }
    }));
于 2012-09-18T16:23:40.233 に答える
0

フォームに関連するクラスで制約を定義する必要があります。このクラスはエンティティである必要はありません。

動作するはずの例:

// your data class:
use Symfony\Component\Validator\Constraints as Assert;

class DataClass
{
    /**
     * @Assert\Type(type="integer", message="Age should be an integer")
     */
    public $age;

    (...)
}

編集:

さらに、データ クラス オブジェクトをフォームに渡す必要があります。例えば。

$dataClassObject = new DataClass();
$form = $this->createForm(new SomeType(), $dataClassObject); // here is place where you put your data class object into form
$form->bindRequest($request);

// now validation should work
if ($form->isValid()) { 
    ...    
于 2012-09-18T16:32:22.533 に答える
0

だからここに何が起こっていたのですか:私は検証されているものと同じフォームのインスタンスをレンダリングしていませんでした...

でページをレンダリングしていましたが'form' => $flow->createForm($collector)->createView()、それを変更して'form' => $form->createView()問題を解決しました。エラー メッセージがレンダリングされるようになりました。

于 2012-10-26T01:32:43.697 に答える