2013-06-25 67 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); 

從它們的形式映射到實體將具有相同的值,並在視圖中呈現時,這將顯示的任何屬性。儘管如果我有一個表單中表示多個實體,我然後創建一個新的事物類稱爲處理器,將具有映射和綁定到窗體,也可以更改窗體字段值的屬性。

這是我知道在渲染表單字段值之前知道的最簡單的方法。