2013-06-25 45 views
2

数据值我想修改的形式与内容的值: 我尝试用“PRE_BIND”事件,但如果形式不发送第一次,这并不工作。 我有这样的:Symfony2的形式获得形式类型

<?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'; 
    } 
} 

有谁知道我能得到的价值?

+0

表单的预期行为是什么?用户看到表单,进入“支付”,然后提交,获得不同选择的相同表单?你在控制器中做什么? – nifr

+0

查询需要更新参数“支付”与“支付”输入值 –

+0

你是什么意思“但这不起作用,如果表单不是第一次发送。” ?当然,你必须发送一些请求/提交表格才能更新字段? – nifr

回答

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); 

从它们的形式映射到实体将具有相同的值,并在视图中呈现时,这将显示的任何属性。尽管如果我有一个表单中表示多个实体,我然后创建一个新的事物类称为处理器,将具有映射和绑定到窗体,也可以更改窗体字段值的属性。

这是我知道在渲染表单字段值之前知道的最简单的方法。