0

UserBundle (SonataUserBundle から拡張) に ProfileType フォームがあり、ProfileType フォームにサブフォームタイプ (AddressType()) を追加しました。

プロファイル タイプ

   /**
    * {@inheritdoc}
    */
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
    $builder
        ->add('gender')
        ->add('firstname')
        ->add('lastname')
        ->add('middlename')
        ->add('dateOfBirth', 'birthday', array('required' => false))
        ->add('phone')
        ->add('address', new AddressType(), array('required' => false));
    ;
   }

  /**
   * {@inheritdoc}
   */
   public function setDefaultOptions(OptionsResolverInterface $resolver)
   {
       $resolver->setDefaults(array(
           'data_class' => $this->class,
           'validation_groups' => array('Profile', 'Address'),
           'cascade_validation' => true,
       ));
   }

住所タイプ

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('postalcode')
        ->add('houseNumber')
        ->add('houseNumberAddition')
        ->add('street')
        ->add('city')
        ->add('country')
    ;
}

edit_profile_html.twigで、特に AddressTypeにエラーがあるかどうかを知りたいです。しかし、form.address.vars.errors は AddressType の無効な要素の数を返しません。AddressType の要素のエラーを明確にチェックすると、正しいカウントが返されます

したがって、form.address.vars.errors.length は 0 ですが、form.address.postalcode.var.errors.length は機能します。しかし、すべての要素を1つずつチェックしたくありません。

        <fieldset {% if form.address.vars.errors|length>0 %} class="warning" {% endif %} >
            <legend>{% trans %}vg.userbundle.form.address.legend{% endtrans %}</legend>
            {{ form_rest(form.address) }}
        </fieldset>

edit_profile_html.twig

{% block subtitle %}{{ "title_user_account" | trans({}, 'SonataUserBundle') }} - {{      "title_user_edit_profile" | trans({}, 'SonataUserBundle') }}{% endblock %}
{% block content %}
  {% block fos_user_content %}
    <form novalidate action="{{ path('sonata_user_profile_edit') }}" method="POST">
        <fieldset {% if form.vars.errors|length>0 %} class="warning" {% endif %} >
            <legend>{% trans %}vg.userbundle.form.profile.legend{% endtrans %}</legend>
            {{ form_row(form.gender) }}
            {{ form_row(form.firstname) }}
            {{ form_row(form.lastname) }}
            {{ form_row(form.middlename) }}
            {{ form_row(form.dateOfBirth) }}
            {{ form_row(form.phone) }}
        </fieldset>

        <fieldset {% if form.address.vars.errors|length>0 %} class="warning" {% endif %} >
            <legend>{% trans %}vg.userbundle.form.address.legend{% endtrans %}</legend>
            {{ form_rest(form.address) }}
        </fieldset>
        <fieldset class="submit">
            <ul>
                <li><input type="submit" name="submit"
                           value="{{ 'sonata_user_submit'|trans({}, 'SonataUserBundle') }}"/></li>
            </ul>
        </fieldset>
    </form>

  {% endblock %}
{% endblock content %}

では、「埋め込まれた」FormType の無効な要素の数を取得する正しい方法は何ですか?

4

2 に答える 2

5

「有効な」変数を使用して、フォームとそのすべての要素が有効である(=エラーがない)かどうかを確認できます(これはあなたがやりたいことだと思います):

<fieldset {% if not form.address.vars.valid %} class="warning" {% endif %} >
于 2012-12-03T21:47:57.770 に答える
0

オブジェクトアドレスを反復処理して子アイテムのエラーをカウントする方法はないと思います。

{% for child in address %}
        {{ ...count errors... }}
{% endfor %}

すべてのフォームアイテムはオブジェクトであることに注意してください。つまり、「アドレス」のすべての子もオブジェクトです。

于 2012-12-03T21:38:32.380 に答える