1

公式ドキュメントを使用して複数のバリデータを作成しましたが、それらはすべて正常に動作しますが、個別に使用した場合のみです。バンドルでこれを定義しました:

# Resources/config/validation.ynl
SF\SomeBundle\Entity\SomeEntity:
    properties:
        name:
            - NotBlank: ~
            - SF\UtilsBundle\Validator\Constraints\ContainsAlphanumeric: ~
            - SF\UtilsBundle\Validator\Constraints\MinLength: ~

ContainstAlphanumeric クラスバリデータ:

if (!preg_match('/^[a-z\d_]$/i', $value, $matches)) {
    $this->context->addViolation($constraint->message, array('%string%' => $value));
}

MinLength クラスバリデーター

$min = 5;
if( strlen($value) < $min )
{
    $this->context->addViolation($constraint->message, array('%string%' => $value, '%min_length%' => $min));
}

そのため、フォームを送信して入力の値が「q」の場合、バリデーター MinLength は長さエラーを返しますが、同じ入力の値が「qwerty」の場合、バリデーター ContainsAlphanumeric は無効な文字メッセージを返します。

何か案は?

編集:

Resources/config/validation.yml ファイルを変更して、ネイティブのSF2 Contraintsの長さバリデーターを使用しました。

properties:
    name:
        - NotBlank: ~
        - Length: { min: 5, minMessage: "El nombre debe tener almenos {{ limit }} caracteres." }
        - SF\UtilsBundle\Validator\Constraints\ContainsAlphanumeric: ~

そして、私は新しい振る舞いを発見しました:いくつかのエラーは小枝テンプレートに表示されます

{{ form_errors(form) }}

およびその他のエラー

{{ form_errors(form.some_field) }}

これは奇妙です!

4

2 に答える 2

0

私が発見しなかった問題については、バリデーターはフォームのすべてのフィールドに対してエラーを返しませんでした。私が尋ねたときに言ったように、いくつかのエラーはエラーで表示されform_errors(form.widget)、他のエラーはform_errors(form) 問題を解決しました (ただし、これが最善かどうかはわかりません)方法)検証サービスを使用し、エラーを twig に返します。

アクションで:

$form = $this->createCreateForm($entity);
$form->handleRequest($request);

if ($form->isValid())
{
    # Magic code :D
}

return array(
    'entity' => $entity,
    'form'   => $form->createView(),
    'errors' => $this->get('validator')->validate($form) # Here's the magic :D
);

小枝のテンプレートでは:

{% if errors is defined %}
    <ul>
        {% for error in errors %}
            <li>
                {{ error.message }}
            </li>
        {% endfor %}
    </ul>
{% endif %}

助けてくれてありがとう:D

PD: 各フォーム フィールドを変更しないために、error_bubbling を使用しないことにしました。

于 2013-11-07T13:50:14.533 に答える