2015-10-06 69 views
0

嗨,我无法理解如何添加/删除表单域依赖于我的形式选择的值。Symfony2表格动态添加删除元素

我有一个名为ContestType formType:

我想要做的是显示/隐藏其他依赖于contestStyle的价值形式输入。

ContestStyle是一个实体,它有两个值:

  • 0 - >头对头
  • 1 - >联赛

如果选择(0)对塞我想有一个隐藏的表单域,playerCount的值设置为2

如果选择了Leauge(1),我想删除隐藏的字段并改为显示带有选项的选择。

它实际上比这更复杂,但让我的头部轮到这应该让我去。

class ContestType extends AbstractType 
{ 
    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(
      array('data_class' => 'GameBundle\Entity\Contest') 
     ); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('scheduleGroup', 'entity', array(
       'class' => 'GameBundle:ScheduleGroup', 
       'property' => 'name', 
       'label' => 'Date', 
       'placeholder' => 'Select Date', 
      )) 

      ->add('contestStyle', 'entity', array(
       'class' => 'GameBundle:ContestStyle', 
       'property' => 'name', 
       'label' => 'Contest Style', 
       'placeholder' => 'Select Contest Style', 
      )) 
      ->add('playerCount', 'hidden', array(
       'data' => '2', 
      )) 
      ->getForm(); 

     $builder->addEventListener(
      FormEvents::POST_SET_DATA, 
      function (FormEvent $event) { 
       $form = $event->getForm(); 

       $data = $event->getData(); 
       $contestStyle = $data->getContestStyle(); 
       $playerCountOptions = array(
        3  => '3 Players', 
        4  => '4 Players', 
        5  => '5 Players', 
        6  => '6 Players', 
        7  => '7 Players', 
        8  => '8 Players', 
        9  => '9 Players', 
        10  => '10 Players', 
        11  => '11 Players', 
        12  => '12 Players', 
        13  => '13 Players', 
        14  => '14 Players', 
        15  => '15 Players', 
        16  => '16 Players', 
        17  => '17 Players', 
        18  => '18 Players', 
        19  => '19 Players', 
        20  => '20 Players', 
       ); 
       $list = null === $contestStyle ? array() : $playerCountOptions; 
       //var_dump($data);die(); 
       if($contestStyle >1){ 
        $form->remove('playerCount'); 
        $form->add('playerCount', 'choice', array(
         'choices' => $list 
        )); 
       } 
      } 
     ); 
    } 

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

我收到一条错误注意:类学说\ COMMON \收藏\ ArrayCollection中的对象无法转换成int

我如何得到contestStyle字段的值?

这里是相关实体:

class Contest 
{ 
    public function __construct() 
    { 
     $this->scheduleGroup = new ArrayCollection(); 
     $this->contestStyle = new ArrayCollection(); 
     $this->entryFee = new ArrayCollection(); 
     $this->payoutStructure = new ArrayCollection(); 
    } 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="contestID", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $contestID; 

    /** 
    * @ORM\OneToOne(targetEntity="FantasyPro\GameBundle\Entity\ScheduleGroup") 
    * @Assert\Valid() 
    */ 
    private $scheduleGroup; 

    /** 
     * 
     * @ORM\OneToOne(targetEntity="FantasyPro\GameBundle\Entity\ContestStyle") 
     * @Assert\Valid() 
     */ 
    private $contestStyle; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="playerCount", type="integer", nullable=false) 
    * @Assert\NotBlank() 
    */ 
    private $playerCount; 

    /** 
    * @ORM\OneToOne(targetEntity="FantasyPro\GameBundle\Entity\EntryFee") 
    * @Assert\Valid() 
    */ 
    private $entryFee; 

    /** 
    * @var string 
    * 
    * @ORM\OneToOne(targetEntity="FantasyPro\GameBundle\Entity\PayoutStructure") 
    */ 
    private $payoutStructure; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255, nullable=true) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="opponent", type="string", length=255, nullable=false) 
    * 
    */ 
    private $playerScope; 

    /** 
    * Get contestID 
    * 
    * @return integer 
    */ 
    public function getContestID() 
    { 
     return $this->contestID; 
    } 

    public function getScheduleGroup() 
    { 
     return $this->scheduleGroup; 
    } 

    /** 
    * @param ScheduleGroup $scheduleGroup 
    */ 
    public function setScheduleGroup(ScheduleGroup $scheduleGroup = null){ 
     $this->scheduleGroup = $scheduleGroup; 
    } 

    public function getContestStyle() 
    { 
     return $this->contestStyle; 
    } 

    /** 
    * @param ContestStyle $contestStyle 
    */ 
    public function setContestStyle(ContestStyle $contestStyle = null) 
    { 
     $this->contestStyle = $contestStyle; 
    } 

    /** 
    * @return int 
    */ 
    public function getPlayerCount() 
    { 
     return $this->playerCount; 
    } 

    /** 
    * @param int $playerCount 
    */ 
    public function setPlayerCount($playerCount) 
    { 
     $this->playerCount = $playerCount; 
    } 

    public function getEntryFee() 
    { 
     return $this->entryFee; 
    } 

    public function setEntryFee(EntryFee $entryFee = null) 
    { 
     $this->entryFee = $entryFee; 
    } 

    /** 
    * @return string 
    */ 
    public function getPayoutStructure() 
    { 
     return $this->payoutStructure; 
    } 

    /** 
    * @param string $payoutStructure 
    */ 
    public function setPayoutStructure($payoutStructure) 
    { 
     $this->payoutStructure = $payoutStructure; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @param string $name 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    /** 
    * @return string 
    */ 
    public function getPlayerScope() 
    { 
     return $this->playerScope; 
    } 

    /** 
    * @param string $playerScope 
    */ 
    public function setPlayerScope($playerScope) 
    { 
     $this->playerScope = $playerScope; 
    } 
} 

ContestStyle:

class ContestStyle 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=100) 
    */ 
    private $name; 


    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return ContestStyle 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 
} 

回答

1

的处理程序是错误的,你需要使用SUBMIT作为事件处理程序:

class ContestType extends AbstractType 
{ 
    protected $em; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(
      array('data_class' => 'GameBundle\Entity\Contest') 
     ); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('scheduleGroup', 'entity', array(
       'class' => 'GameBundle:ScheduleGroup', 
       'property' => 'name', 
       'label' => 'Date', 
       'placeholder' => 'Select Date', 
      )) 

      ->add('contestStyle', 'entity', array(
       'class' => 'GameBundle:ContestStyle', 
       'property' => 'name', 
       'label' => 'Contest Style', 
       'placeholder' => 'Select Contest Style', 
      )) 
      ->add('playerCount', 'hidden', array(
       'data' => '2', 
      )) 
      ->getForm(); 

     $builder->addEventListener(
      FormEvents::SUBMIT, 
      function (FormEvent $event) { 
       $form = $event->getForm(); 

       $data = $event->getData(); 
       $contestStyle = $data->getContestStyle()->getID();; 
       $playerCountOptions = array(
        3  => '3 Players', 
        4  => '4 Players', 
        5  => '5 Players', 
        6  => '6 Players', 
        7  => '7 Players', 
        8  => '8 Players', 
        9  => '9 Players', 
        10  => '10 Players', 
        11  => '11 Players', 
        12  => '12 Players', 
        13  => '13 Players', 
        14  => '14 Players', 
        15  => '15 Players', 
        16  => '16 Players', 
        17  => '17 Players', 
        18  => '18 Players', 
        19  => '19 Players', 
        20  => '20 Players', 
       ); 
       $list = null === $contestStyle ? array() : $playerCountOptions; 

       if($contestStyle >1){ 
        $form->remove('playerCount'); 
        $form->add('playerCount', 'choice', array(
         'choices' => $list 
        )); 
       } 
      } 
     ); 
    } 

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