Tình huống: Tôi có biểu mẫu với 2 lựa chọn. Khi người dùng chọn một cái gì đó từ lựa chọn đầu tiên, lựa chọn thứ hai được điền bằng các giá trị mới. Phần này hoạt động tốt.Symfony2: Thay đổi lựa chọn bằng ajax và xác nhận
Nhưng biểu mẫu không được xác thực vì nó chứa một số lựa chọn không được phép ở dạng ban đầu.
Mẫu:
<?php
class MyType extends AbstractType
{
private $category;
public function __construct($category = null)
{
$this->category = $category;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
);
$builder->add('template', 'choice', array(
'choices' => $this->loadChoices()
);
}
private function loadChoices()
{
// load them from DB depending on the $this->category
}
}
Ban đầu loại là foo
. Vì vậy, các mẫu cho foo được tải và đặt làm lựa chọn. Nhưng nếu người dùng chọn bar
, các mẫu thanh sẽ được tải. Nhưng biểu mẫu vẫn có các lựa chọn foo và không xác thực.
Cách tốt nhất để giải quyết vấn đề này là gì?
Một cách tôi tìm thấy là chỉ cần bắt đầu lại mẫu tại bộ điều khiển:
<?php
$form = $this->createForm(new MyType());
if ($request->getMethod() === 'POST') {
if ($request->request->has($form->getName())
&& isset($request->request->get($form->getName())['category'])) {
$form = $this->createForm(new MyType($request->request->get($form->getName())['category']));
}
// ...
}
này hoạt động, nhưng tôi không thể kiểm tra nó bởi vì nó ném IllegalArgumentException
khi thiết lập các giá trị và chỉ thừa nhận mặc định. Có giải pháp nào tốt hơn cho việc này không? Cảm ơn trước!
Bạn đã cố gắng để thiết lập nhóm xác nhận cho mỗi bộ tùy chọn bạn cần phải xác nhận? Sau đó, bạn có thể gọi dịch vụ trình xác thực chỉ trên nhóm có liên quan đến bạn. http://symfony.com/doc/2.0/book/forms.html#validation-groups – Xocoatzin