1

興味深い問題があります。スタックオーバーフローとグーグルでも解決策が見つかりませんでした。エンティティがUserありUser、いくつかのメタがあります。だから私はUserMetaエンティティを作成し、 UserMetaValue. ユーザーフォームにはたくさんのタブがあります。そして、これらのメタをタブで使用しました。それらのいくつかは最初のタブにあり、いくつかは他のタブにあります。また、すべてのタブには独自のフォームがあります。アクティブなタブでフォームをバインドすると、アクティブなタブのメタが更新され、その他が NULL に変更されます。

StudentPersonalType.php

namespace ATL\UserBundle\Form\Type;

use ATL\CommonBundle\Utils\Shortcut;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormBuilderInterface;

class StudentPersonalType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add("first_name", null, array(
                "label" => "İsim",
                "required" => true,
                "attr" => array(
                    "class" => "span10"
                )
            ))->add("last_name", null, array(
                "label" => "Soyisim",
                "required" => true,
                "attr" => array(
                    "class" => "span10"
                )
            ))->add("username", null, array(
                "label" => "Öğrenci Numarası",
                "required" => true,
                "attr" => array(
                    "class" => "span10"
                )
            ))->add("email", null, array(
                "label" => "Email",
                "required" => true,
                "attr" => array(
                    "class" => "span10"
                )
            ))->add('metas', 'collection', array(
                'label' => "Metas",
                'type' => new UserMetaType()
            ));
    }

    public function getName(){
        return "personal";
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver){
        $resolver->setDefaults(array(
            "data_class" => "ATL\UserBundle\Entity\User"
        ));
    }
}

StudentEducationType.php

namespace ATL\UserBundle\Form\Type;

use ATL\CommonBundle\Utils\Shortcut;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormBuilderInterface;

class StudentEducationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('metas', 'collection', array(
                'label' => "Metas",
                'type' => new UserMetaType(),
                'by_reference' => false
            ));
    }

    public function getName(){
        return "education";
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver){
        $resolver->setDefaults(array(
            "data_class" => "ATL\UserBundle\Entity\User"
        ));
    }
}

そして小枝

    <div id="personal-info" class="tab-pane row-fluid active">
       <form style="margin:20px 0 0 0;" class="ajaxForm form-horizontal form-row-seperated" action="{{ formAction }}">
            {{ form_row(form.first_name) }}
            {{ form_row(form.last_name) }}
            {{ form_row(form.email) }}
            {{ form_row(form.username) }}
            {% for meta in form.metas %}
                {% if meta.value.vars.label in formValues.personal %}
                    {{ form_widget(meta) }}
                {% endif %}
            {% endfor %}
            {{ form_row(form._token) }}
            <div class="form-actions" style="margin-bottom:0;">
                <button class="btn blue" type="submit"><i class="icon-ok"></i> Kaydet</button>
            </div>
        </form>
    </div>
    <div id="education-info" class="tab-pane row-fluid">
        <form style="margin:20px 0 0 0;" class="ajaxForm form-horizontal form-row-seperated" action="{{ formAction }}">
            {% for meta in educationForm.metas %}
                {% if meta.value.vars.label in formValues.education %}
                    {{ form_widget(meta) }}
                {% endif %}
            {% endfor %}
            {{ form_row(educationForm._token) }}
            <div class="form-actions" style="margin-bottom:0;">
                <button class="btn blue" type="submit"><i class="icon-ok"></i> Kaydet</button>
            </div>
        </form>
    </div>

IFステートメントを使用してtwigファイルでチェックすることにより、コレクションフィールドをフィルタリングします。

もう一度質問します。他のページに影響を与えずに、同じページで異なる形式のメタを使用するにはどうすればよいですか?

4

1 に答える 1

1

レンダリングのために無関係なフィールドを除外する作業の半分が完了しました。ただし、フォーム バインドに関係のないフィールドを除外する必要もあります。

リクエストをフォームにバインドすると、コレクション内にすべてのエンティティのフィールドがあるため、すべて のエンティティの値が期待されます。送信した値のいずれにも対応しないすべてのフォームを削除する必要があります。これはおそらくリスナーと一緒に行うのが最善です。UserMetaUserMetaTypeUserMetaTypeFormEvents::PRE_BIND

これのより簡単な例は、フォーム: 送信されていないフィールドに null を設定しないでくださいUserMetaTypeフォームのコレクションを繰り返し処理し、バインドしたくないものを削除する必要があるため、少し複雑になります。

于 2013-04-23T07:59:26.710 に答える