2

コンテンツ値でフォームを変更したい: 「PRE_BIND」イベントを試してみましたが、フォームが最初に送信されない場合、これは機能しません。私はこれを持っています:

<?php

namespace YOU\CommercantBundle\Form\Type;


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class LivraisonChoixType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {


        $builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) use ($builder)
        {
            $form = $event->getForm();
            $data = $event->getData();

            if ((int)$data['pays'] > 0) {

                $form->remove('livreur');
                $pays = $data['pays'];

                $form->add('livreur','entity',array(
                        'property' =>'name',
                        'class' => 'YOUAdminBundle:Livreur',
                        'label' => 'Livreur :',
                        'query_builder' => function($er) use ($pays){
                            return $er->createQueryBuilder('c')
                                ->join('c.pays', 'p')
                                ->andWhere('p.id= :pays')
                                ->addOrderBy('c.name', 'ASC')
                                ->setParameter('pays', $pays);
                        },
                    )
            );

            }
        });

        $builder
            ->add('pays','pays',array('label'=>'Destination :'))
            ->add('livreur','entity',array(
                        'property' =>'name',
                        'class' => 'YOUAdminBundle:Livreur',
                        'label' => 'Livreur :',
                        'query_builder' => function($er) {
                        return $er->createQueryBuilder('c')
                            ->join('c.pays', 'p')
                            ->andWhere('p.id= :pays')
                            ->addOrderBy('c.name', 'ASC')
                            ->setParameter('pays', 0);
                    },
                )
            )
            ->add('prix','number',array('required'=>true,'label' => 'Frais :'))
            ->add('prix2','number',array('required'=>false,'label' => 'Frais en second article :'))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'YOU\CommercantBundle\Entity\LivraisonChoix',
        ));
    }

    public function getName()
    {
        return 'you_commercantbundle_livraisonchoixtype';
    }
}

このフォーム タイプによって呼び出されます:

<?php

namespace YOU\CommercantBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class LivraisonType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name','text',array('required'=>true,'label'=>'Nom :'))
            ->add('choix','collection',array(
                            'type'=>new LivraisonChoixType(),
                            'options'=>array('attr'=>array('class'=>'livreur-collection')),
                            'allow_add' => true,
                            'allow_delete' => true,
                            'by_reference' => false,
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'YOU\CommercantBundle\Entity\Livraison'
        ));
    }

    public function getName()
    {
        return 'you_commercantbundle_livraisontype';
    }
}

値を取得する方法を知っている人はいますか?

4

1 に答える 1

0

これは最良の答えではないかもしれませんが、フォームがレンダリングされる前にフォームに値を割り当てたいときに私が行うことです。基本的に、フォームをエンティティにバインドします。

// First create entity that will bind with form
$someEntityInstance = new myEntity();
$someEntityInstance->setPropertyOne(5);
$someEntityInstance->setPropertyTwo('another value');

// Then bind entity to form
$myForm = $this->createForm(new myFormType, $someEntityInstance);

フォームからエンティティにマップされるすべてのプロパティは同じ値を持ち、ビューでレンダリングされると、これが表示されます。ただし、フォームに複数のエンティティが表示されている場合は、プロセッサと呼ばれる新しいモノのクラスを作成します。このクラスには、フォーム フィールドの値を変更できるプロパティがマップされ、フォームにバインドされます。

これは、レンダリングする前にフォーム フィールドの値を変更するための、私が知っている最も簡単な方法です。

于 2013-09-14T22:18:18.703 に答える