2012-10-18 20 views
17

Tôi có một kiểu trường lựa chọn có tên * sub_choice * trong biểu mẫu của tôi mà các lựa chọn của bạn sẽ được tải động qua AJAX tùy thuộc vào giá trị được chọn của trường lựa chọn cha mẹ, có tên * parent_choice *. Tải các lựa chọn hoạt động hoàn hảo nhưng tôi gặp phải một vấn đề khi xác nhận giá trị của sub_choice khi gửi. Nó cung cấp một lỗi xác thực "Giá trị này không hợp lệ" vì giá trị đã gửi không nằm trong lựa chọn của trường sub_choice khi nó được xây dựng. Vì vậy, có cách nào tôi có thể xác nhận hợp lệ giá trị đã gửi của trường sub_choice không? Dưới đây là mã để tạo biểu mẫu của tôi. Tôi đang sử dụng Symfony 2.1.Xác nhận các lựa chọn được nạp động trong Symfony 2

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('parent_choice', 'entity', array(
        'label' => 'Parent Choice', 
        'class' => 'Acme\TestBundle\Entity\ParentChoice' 
    )); 

    $builder->add('sub_choice', 'choice', array(
        'label' => 'Sub Choice', 
        'choices' => array(), 
        'virtual' => true 
    )); 
} 
+0

bạn có may mắn với điều này không? im bị mắc kẹt trên một cái gì đó tương tự. –

+0

Một liên kết câu hỏi tương tự gần đây với câu hỏi này và một trong các câu trả lời có vẻ khá tốt, liên quan đến việc sử dụng sự kiện PRE_BIND để sắp xếp danh sách tùy chọn hợp lệ: http://stackoverflow.com/questions/18207476/symfony2- dynamic-form-choices-validation-remove – frumious

+0

đây là phiên bản có bất kỳ giá trị nào chấp nhận http://stackoverflow.com/questions/28245027/symfony-2-choice-ajax-validation-fix –

Trả lời

-3

Giả sử cho các lựa chọn phụ bạn có quyền của id? Tạo và mảng trống rỗng, với một số lượng nhất định các giá trị và cung cấp cho nó như là một sự lựa chọn

$indexedArray = []; for ($i=0; $i<999; $i++){ $indexedArray[$i]= ''; }

sau đó 'choices' => $indexedArray, :)

-2

bạn không thể không xây dựng xác nhận sub_choice vì trong bạn cấu hình validator của bạn don' t biết giá trị nào hợp lệ (giá trị phụ thuộc vào giá trị của parent_choice).

Việc bạn có thể làm là giải quyết parent_choice thành đối tượng trước khi bạn tạo mới YourFormType() trong bộ điều khiển của mình. Sau đó, bạn có thể nhận được tất cả các giá trị có thể cho sub_choice và cung cấp chúng qua hàm tạo biểu mẫu - new YourFormType ($ subChoice).

Trong YourFormType bạn phải thêm __construct phương pháp như thế này một:

/** 
* @var array 
*/ 
protected $subChoice = array(); 

public function __construct(array $subChoice) 
{ 
    $this->subChoice = $subChoice; 
} 

và sử dụng các giá trị được cung cấp dưới dạng add:

$builder->add('sub_choice', 'choice', array(
       'label' => 'Sub Choice', 
       'choices' => $this->subChoice, 
       'virtual' => true 
)); 
18

Để làm các việc lừa bạn cần phải ghi đè lên các lĩnh vực sub_choice trước gửi biểu mẫu:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    ... 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
     $parentChoice = $event->getData(); 
     $subChoices = $this->getValidChoicesFor($parentChoice); 

     $event->getForm()->add('sub_choice', 'choice', [ 
      'label' => 'Sub Choice', 
      'choices' => $subChoices, 
     ]); 
    }); 
} 
+1

Tôi nghĩ câu trả lời này nhất hoàn toàn và trực tiếp đưa ra câu hỏi mong muốn: tùy chọn thiết lập phụ thuộc vào giá trị được chọn khác, mà không phải lộn xộn cung cấp tất cả các tùy chọn để vượt qua xác thực và sau đó có thể thiết lập lại tùy chọn sau. Điều này khiến tôi trở thành giải pháp "Symfony 2" phù hợp. – frumious

2

chấp nhận bất kỳ giá trị nào

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
    $data = $event->getData(); 
    if(is_array($data['tags']))$data=array_flip($data['tags']); 
    else $data = array(); 
    $event->getForm()->add('tags', 'tag', [ 
     'label' => 'Sub Choice', 
     'choices' => $data, 
     'mapped'=>false, 
     'required'=>false, 
     'multiple'=>true, 
    ]); 
}); 
Các vấn đề liên quan