tôi có ba đơn vị: Quốc gia, Nhà nước và thành phố với các mối quan hệ sau:symfony2 xích selectors
Image http://i39.tinypic.com/15gc85u.png
Khi tạo một thành phố, tôi muốn hai selectors, một cho quốc gia và một cho Nhà nước nơi thành phố thuộc về. Hai bộ chọn này cần phải được xích để thay đổi Quốc gia sẽ "lọc" các quốc gia được hiển thị trong bộ chọn khác.
Tôi đã tìm thấy một số tutorial cho biết cách thực hiện việc này bằng cách sử dụng Sự kiện biểu mẫu nhưng ví dụ của chúng không phải là trường hợp của tôi. Thành phố của tôi không liên quan trực tiếp đến thực thể Quốc gia (họ liên quan gián tiếp qua Tiểu bang), khi thiết lập trường quốc gia ở dạng Thành phố (bên trong lớp CityType), tôi buộc phải khai báo trường đó là 'property_path'=>false
như bạn có thể xem trong mã bên dưới:
class CityType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('country', 'entity', array(
'class'=>'TestBundle:Country',
'property'=>'name',
'property_path'=>false //Country is not directly related to City
));
$builder->add('name');
$factory = $builder->getFormFactory();
$refreshStates = function ($form, $country) use ($factory)
{
$form->add($factory->createNamed('entity', 'state', null, array(
'class' => 'Test\TestBundle\Entity\State',
'property' => 'name',
'query_builder' => function (EntityRepository $repository) use ($country)
{
$qb = $repository->createQueryBuilder('state')
->innerJoin('state.country', 'country');
if($country instanceof Country) {
$qb->where('state.country = :country')
->setParameter('country', $country);
} elseif(is_numeric($country)) {
$qb->where('country.id = :country')
->setParameter('country', $country);
} else {
$qb->where('country.name = :country')
->setParameter('country', "Venezuela");;
}
return $qb;
}
)));
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates)
{
$form = $event->getForm();
$data = $event->getData();
if($data == null)
return;
if($data instanceof City){
if($data->getId()) { //An existing City
$refreshStates($form, $data->getState()->getCountry());
}else{ //A new City
$refreshStates($form, null);
}
}
});
$builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($refreshStates)
{
$form = $event->getForm();
$data = $event->getData();
if(array_key_exists('country', $data)) {
$refreshStates($form, $data['country']);
}
});
}
public function getName()
{
return 'city';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Test\TestBundle\Entity\City');
}
}
Vấn đề là khi tôi cố gắng sửa thành phố hiện tại, quốc gia liên quan không được chọn theo mặc định trong biểu mẫu. Nếu tôi loại bỏ các dòng 'property_path'=>false
tôi nhận được (không đáng ngạc nhiên) được thông báo lỗi:
Cả tài sản "Đất nước" hay phương pháp "getCountry()" hay phương pháp "isCountry()" tồn tại trong lớp "Test \ TestBundle \ Entity \ Thành phố "
Mọi ý tưởng?
nơi 'Routing.generate ('state_list'),' đến từ đâu? Bộ điều khiển xử lý tuyến đường 'state_list' ở đâu? – gondo
Xin chào David, câu trả lời tuyệt vời ở đó, chỉ cần tự hỏi - bạn có biết cách sử dụng thành phố được tạo này khi bạn chọn, ví dụ, địa chỉ cho một người không? Vì vậy, chọn một quốc gia, làm mới trạng thái, chọn một tiểu bang, làm mới các thành phố? Tôi biết nó có liên quan gì đến Form Events, nhưng có vẻ như với tôi bạn cần phải lồng ghép chúng bằng cách nào đó? Tôi đã đăng câu hỏi về vấn đề này [ở đây] (http://stackoverflow.com/questions/20544442/add-event-listener-to-form-element-added-by-event-listener). Bất kỳ ý tưởng? – iLikeBreakfast
cách thực hiện việc này trong phiên bản 'Symfony 2.3' –