2012-04-17 18 views
22

Tôi có một số order và một thực thể client.Biểu mẫu Symfony2: Chọn một thực thể hoặc thêm một thực thể mới

Tôi tự hỏi nếu nó có thể với hệ thống biểu mẫu Symfony2 thực tế để tạo ra một mẫu đơn đặt hàng mà sẽ cho phép:

  1. Chọn một số khách hàng từ một danh sách thả xuống (kết hợp của collectionentity dạng type)
  2. Và để tạo khách hàng mới khi đang di chuyển (cách mặc định cho loại collection) nếu không có trong danh sách thả xuống.

Tôi đã nhìn thấy một số cách để làm điều đó bằng cách tạo nhiều biểu mẫu trong cùng một trang, nhưng đây không phải là cách tôi muốn đạt được nó.

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

0

Loại collection Loại biểu mẫu cho phép thêm và xóa khi đang bay với thuộc tính allow_addallow_delete.

Mọi thông tin bằng cách làm theo những liên kết 2:

Nếu bạn không thích để có được hình thức bổ sung trên cùng một trang, bạn có thể tích hợp chúng trong hộp thoại hộp ... Nhưng bạn chắc chắn cần một biểu mẫu để tạo các mục mới ...

+2

Cám ơn câu trả lời của bạn. Tôi biết loại 'bộ sưu tập'. Nhưng tôi có cảm giác rằng tôi có thể thêm và xóa khách hàng hiện tại, hoặc thêm và xóa khách hàng mới, nhưng không thêm khách hàng hiện tại và tạo ứng dụng khách mới (ví dụ) trong cùng một biểu mẫu. Liệu tôi có sai ? Tôi hy vọng nó rõ ràng. –

+0

Tôi đoán bạn phải diferrenciate 'Thêm một khách hàng hiện tại' từ 'Thêm khách hàng mới' vì biểu mẫu phải khác nhau. – AlterPHP

+4

Tôi tin rằng không trả lời được câu hỏi ban đầu, mà đối với tôi là: có cách nào thanh lịch để thêm các đối tượng hiện có hoặc mới vào một bộ sưu tập không? Tôi không hiểu tại sao câu trả lời này được chấp nhận. – Julien

1

Nếu tôi đã hiểu, bạn muốn tạo và sto tái khách hàng mới trong Biểu mẫu "đang bay", tại thời điểm này. Tôi nghĩ rằng bạn phải làm điều đó bằng cách sử dụng JavaScript và thiết lập một hành động bổ sung trong bộ điều khiển của bạn.

  1. JS -> Chụp sự kiện để thêm khách hàng mới cho bạn cơ sở dữ liệu (ví dụ: "Thêm mới" sự kiện nhấn nút)
  2. JS -> Bên trong sự kiện này, hãy gọi qua AJAX để điều khiển của bạn với các giá trị của khách hàng mới. (Sử dụng FOSJsRoutingBundle thật dễ dàng để làm)
  3. Symfony2 -> Bên trong hành động mới của bạn, lưu trữ ứng dụng khách mới vào cơ sở dữ liệu của bạn.
  4. JS -> Sự kiện OnSuccess, trong cuộc gọi AJAX của bạn, thêm Ứng dụng khách mới vào DropDownBox (ddb.append (tag yếu tố mới)

Chỉ cần làm điều đó bạn có khách hàng mới của bạn được lưu trữ trong cơ sở dữ liệu và thêm vào dropdownbox

+0

Ý tưởng là tạo ra một trình đơn thả xuống hiển thị các máy khách hiện có, nhưng cũng có khả năng tạo một máy khách mới (nếu không có trong danh sách) trong cùng một biểu mẫu. Và tôi quyết định sử dụng một số js để đạt được hành vi này. –

1

của bạn Về phần tôi, tôi đã cùng một loại vấn đề và tôi giải quyết nó bằng cách tạo ra 2 thuộc tính trong số formType của tôi;

Ví dụ, đối với bạn nó sẽ là:

customer->entity 
new_customer-> collection 

Trong tập tin thực thể đặt hàng, bạn sẽ có thêm 3 phương pháp (getter, setter, và loại bỏ) getter và loại bỏ không làm bất cứ điều gì nhưng setter nên gọi số setCustomer(c)

Tôi không chắc đó có phải là cách tốt nhất hay không nhưng đó là cách duy nhất tôi tìm ra!

3

Bạn có thể ánh xạ hai trường trong một biểu mẫu đến cùng một thuộc tính bằng cách sử dụng tùy chọn property_path. Sau đó, sử dụng các sự kiện biểu mẫu, sử dụng dữ liệu đã gửi để đưa ra quyết định và sửa đổi biểu mẫu để chỉ một trong các trường có tùy chọn mappedtrue.

+2

Tôi thực sự quan tâm đến giải pháp này, bạn có thể cung cấp ví dụ chi tiết không? – Wirone

+0

@antony, bạn có thể xây dựng được không? – SteeveDroz

+1

@SteeveDroz Tôi đã trả lời câu hỏi này gần 2 năm trước. Tôi nghĩ rằng thông tin bạn yêu cầu là tất cả ở đây https://knpuniversity.com/blog/property_path và http://symfony.com/doc/current/components/form/form_events.html. – antony

6

Tôi đã có một vấn đề tương tự mà có thể dẫn đến độ phân giải của bạn:

Tôi có một loại và Khoản mối quan hệ (Nhiều-to-One) và tôi muốn hoặc chọn một mục hiện có hoặc tạo một mục mới.

Trong lớp Mẫu của tôi:

$builder->add('item', 'entity', array(
     'label' => 'Item', 
     'class' => 'ExampleItemBundle:Item', 
    )); 

    $builder->add('itemNew', new EmbedItemForm(), array(
     'required' => FALSE, 
     'mapped' => FALSE, 
     'property_path' => 'item', 
    )); 

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

     if (!empty($data['itemNew']['name'])) { 
      $form->remove('item'); 

      $form->add('itemNew', new EmbedItemForm(), array(
       'required' => TRUE, 
       'mapped' => TRUE, 
       'property_path' => 'item', 
      )); 
     } 
    }); 
+2

Cần sử dụng EmbedItemForm :: class as type là string | null trong phương thức add từ symfony 3 (có thể là 2.?). –

+0

Điều này phù hợp với tôi. Tôi chỉ sửa đổi nó vì vậy tôi không phải sử dụng hai phím biểu mẫu khác nhau. Trước khi người nghe tôi sử dụng kiểu biểu mẫu tùy chỉnh của mình. Trong trình lắng nghe, tôi chỉ kiểm tra xem (is_numeric ($ data ['item']) sau đó tôi xóa biểu mẫu và thêm một mẫu EntityType – mameluc

+0

@patrick Tôi đang sử dụng chính xác ví dụ tương tự nhưng vì một lý do nào đó tôi nhận được lỗi "biểu mẫu này không được chứa các trường thừa". Tôi chắc chắn eventListener đã được gọi để xóa/thêm các trường chính xác. – Simon

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