2014-10-08 11 views
7

Mam następujący sposób buildForm:Jak zrobić pole wymagane, tylko jeśli formularz jest nowy?

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

Jak mogę dynamicznie ustawić hasło do pola wymagane tylko przy tworzeniu nowego rekordu i ustawić go non wymagane podczas aktualizacji rekordu?

+0

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html – Cheery

Odpowiedz

0

Poniższy kod działa dla mnie tylko jedno zastrzeżenie, pole hasło zostanie dodany na końcu formularza, a nie w Porządek chciałem, chociaż myślałem, że dodanie wydarzenia, w którym chciałbym, aby pole pojawiło się w grze, zdziałałoby sprawę, ale tak się nie stało.

<?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

Możesz użyć, na przykład, tego pakietu do zmiany kolejności https://github.com/egeloen/IvoryOrderedFormBundle – Cheery

+0

Świetnie! Wygląda dokładnie tak, jak potrzebuję, zastanawiam się, dlaczego nie jest to wbudowana funkcja ... – MikeGA

+0

Poza tym wygląda na uszkodzony - nie widzę wszystkich plików w repozytorium. Czy chcesz ponownie użyć formularza w wielu miejscach, czy jest to tylko jednorazowa forma? A, BTW, Sonata Admin to fajny pakiet do interfejsu administratora. – Cheery

-2

Można dodać kolejny var na swojej tablicy, gdzie można zdefiniować etykiety:

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

Chyba zrozumiał moje pytanie, wiem, że mogę rób to, co sugerujesz, ale chcę, aby było to wymagane, tylko jeśli nowe dane są wstawiane i sprawiają, że nie jest wymagane, jeśli dane są aktualizowane. – MikeGA

8

można spróbować poniższy kod:

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

To był najłatwiejszy i najkrótszy sposób na osiągnięcie tego, co chciałem! Dzięki wielkie! – MikeGA

+0

To rozwiązanie nie działa dla mnie tak, jak "$ builder-> getData()" nigdy nie zwróciło odpowiednich danych encji. Musiałem użyć [słuchacza zdarzeń opisanego w Symfony2 Cookbook] (http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html) zmieszanego z tym kodem rozwiązania. – dubrox

+0

Może się zdarzyć, jeśli nie dodałeś obiektu do formularza. – kapa89

Powiązane problemy