2014-10-08 17 views
7

Tôi đã phương pháp buildForm sau:Làm thế nào để tạo trường bắt buộc chỉ khi biểu mẫu mới?

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

Làm thế nào tôi có thể tự động thiết lập các lĩnh vực mật khẩu được yêu cầu chỉ khi tạo ra một kỷ lục mới và thiết lập nó không cần thiết khi cập nhật một kỷ lục?

+0

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

Trả lời

0

Các mã sau đây làm việc cho tôi chỉ với một caveat, trường mật khẩu được thêm vào ở phần cuối của hình thức và không có trong thứ tự tôi muốn nó mặc dù tôi nghĩ rằng bằng cách thêm các sự kiện mà tôi muốn các lĩnh vực xuất hiện trong, nó sẽ làm các trick nhưng nó đã không.

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

Bạn có thể sử dụng, ví dụ, gói này để sắp xếp lại thứ tự https://github.com/egeloen/IvoryOrderedFormBundle – Cheery

+0

Tuyệt vời! Nó trông giống như những gì tôi cần, tôi tự hỏi tại sao đây không phải là một tính năng được xây dựng trong ... – MikeGA

+0

Ngoại trừ việc nó trông bị hỏng - Tôi không thấy tất cả các tệp trong kho lưu trữ. Bạn có muốn sử dụng lại biểu mẫu ở nhiều nơi hay chỉ là biểu mẫu một lần? Và, BTW, Sonata Admin là một gói tốt đẹp cho giao diện quản trị. – Cheery

-2

Bạn có thể thêm var khác để mảng của bạn, nơi bạn định nghĩa nhãn:

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

Tôi nghĩ rằng bạn hiểu lầm câu hỏi của tôi, tôi biết tôi có thể làm những gì bạn đề nghị nhưng tôi muốn làm cho nó chỉ cần thiết nếu dữ liệu mới của nó được chèn vào và làm cho nó không cần thiết nếu dữ liệu đang được cập nhật. – MikeGA

8

Bạn có thể thử mã bên dưới:

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

Đây là cách dễ nhất và ngắn nhất để hoàn thành những gì tôi muốn! Cám ơn rất nhiều! – MikeGA

+0

Giải pháp này không hiệu quả đối với tôi vì '$ builder-> getData()' không bao giờ trả về dữ liệu thực thể tương ứng. Tôi đã phải sử dụng [event listener được mô tả trong Symfony2 Cookbook] (http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html) được trộn lẫn với mã giải pháp này. – dubrox

+0

Điều này có thể xảy ra nếu bạn không thêm đối tượng vào biểu mẫu. – kapa89

Các vấn đề liên quan