2014-10-08 39 views
7

我有以下buildForm方法:如何僅在表單是新的時候才需要填寫字段?

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder       
     ->add('firstname','text',array('label'=>'First Name')) 
     ->add('lastname','text',array('label'=>'Last Name')) 
     ->add('dob','date',array('widget'=>'single_text','label'=>'DOB')) 
     ->add('username','text',array('label'=>'Username')) 
     ->add('password','password',array('label'=>'Password')) 
     ->add('filesPassword','password',array('label'=>'My Files Password','required'=>false)) 
     ->add('email','email',array('label'=>'Email')) 
     ->add('language','entity',array('class'=>'GWD\AdminBundle\Entity\Languages','label'=>'Language')) 
     ->add('theme','entity',array('class'=>'GWD\AdminBundle\Entity\Themes','label'=>'Theme')) 
     ->add('roles','entity',array('class'=>'GWD\AdminBundle\Entity\Role','label'=>'Role')) 
    ; 
} 

如何動態設置密碼字段只在創建一個新的記錄被要求,並設置非更新記錄時,需要?

+0

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html – Cheery 2014-10-08 02:13:52

回答

0

下面的代碼對我的作品只有一個警告,密碼字段被在表格末尾添加,而不是在爲了我想要它,即使我認爲通過添加事件,我希望該字段出現在內,它會做到這一點,但事實並非如此。

<?php 

namespace GWD\AdminBundle\Form; 

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

class AdministratorsType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder       
      ->add('firstname','text',array('label'=>'First Name')) 
      ->add('lastname','text',array('label'=>'Last Name')) 
      ->add('dob','date',array('widget'=>'single_text','label'=>'DOB')) 
      ->add('username','text',array('label'=>'Username')); 

     $builder->addEventListener(FormEvents::PRE_SET_DATA, 
      function(FormEvent $event) use ($builder) { 
       $administrator = $event->getData(); 
       if (!$administrator || null === $administrator->getId()) { 
        $event->getForm()->add('password','password',array('label'=>'Password','required'=>true)); 
       } else { 
        $event->getForm()->add('password','password',array('label'=>'Password','required'=>false)); 

       } 
      } 
     ); 

     $builder 
      ->add('filesPassword','password',array('label'=>'My Files Password','required'=>false)) 
      ->add('email','email',array('label'=>'Email')) 
      ->add('language','entity',array('class'=>'GWD\AdminBundle\Entity\Languages','label'=>'Language')) 
      ->add('theme','entity',array('class'=>'GWD\AdminBundle\Entity\Themes','label'=>'Theme')) 
      ->add('roles','entity',array('class'=>'GWD\AdminBundle\Entity\Role','label'=>'Role')) 
     ; 

    } 


    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'GWD\AdminBundle\Entity\Administrators' 
     )); 
    } 


    public function getName() 
    { 
     return 'gwd_adminbundle_administrators'; 
    } 
} 
+1

例如,您可以使用此捆綁包重新排列訂單。https://github.com/egeloen/IvoryOrderedFormBundle – Cheery 2014-10-08 03:01:15

+0

太棒了!它看起來完全像我需要的,我想知道爲什麼這不是一個內置的功能... – MikeGA 2014-10-08 03:04:30

+0

除了它看起來損壞 - 我沒有看到存儲庫中的所有文件。你想在很多地方重複使用這個表格嗎?或者它只是一次性表格?而且,BTW,Sonata Admin是一個很好的管理界面軟件包。 – Cheery 2014-10-08 03:11:41

-2

您可以添加另一個變種到您的陣列中,可以定義標籤:

->add('firstname','text',array('label'=>'First Name', 'required' => false)) 
+1

我想你是誤會我的問題,我知道我可以做你的建議,但我希望只有在插入新數據時才需要它,並且在數據更新時不需要它。 – MikeGA 2014-10-08 02:11:30

8

你可以試試下面的代碼:

$builder 
    ->add('password','password', 
     array(
       'label' => 'Password', 
       'required' => is_null($builder->getData()->getId()) 
      ) 
     ) 
+0

這是最簡單和最短的方法來完成我想要的!非常感謝! – MikeGA 2014-10-08 22:12:48

+0

這個解決方案對我來說不起作用,因爲'$ builder-> getData()'永遠不會返回相應的實體數據。我必須使用與此解決方案代碼混合的[Symfony2 Cookbook中描述的事件監聽器](http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html)。 – dubrox 2015-06-24 14:13:17

+0

如果您沒有將對象添加到表單中,可能會發生這種情況。 – kapa89 2015-06-30 07:21:34

相關問題