不幸的是,它需要一些样板文件。
首先,您需要在表单中添加两个事件FormEvents::PRE_SET_DATA 和FormEvents::PRE_SUBMIT,以便在提交表单或设置实体时使用相关选项填充相关下拉列表。
在下面的示例中,出发日期取决于所选的行程。
class ExampleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('tripsFk', 'entity', array(
'class' => 'ExampleBundle:Trips',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('t')
->orderBy('t.id', 'DESC');
},
'label' => 'Trip',
'attr' => array(
'class' => 'booking_trip'
)
));
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
$builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit'));
}
function onPreSubmit(FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
$trip = $data['tripsFk'];
$this->populateChoices($form, $trip);
}
function onPreSetData(FormEvent $event)
{
$entity = $event->getData();
$form = $event->getForm();
$tripId = $entity->getTripsFk() ? $entity->getTripsFk() : null;
$this->populateChoices($form, $tripId);
}
public function populateChoices($form, $tripId)
{
$form->add('departIdFk', 'entity', array(
'label' => 'Departure Code',
'class' => 'ExampleBundle:Departures',
'query_builder' => function(EntityRepository $er) use ($tripId) {
return $er->createQueryBuilder('t')
->andWhere('t.trip_id', ':trip_id')
->setParameter('trip_id', $tripId);
},
'attr' => array(
'class' => 'booking_date'
)
));
}
}
接下来你要做的是编写一个 javascript 来改变 .booking_date 淹没旅行变化的选项。在下面.booking_trip change 事件的 js sn-p 中,我们删除现有的离开选项,并加载新的选项:
var bookingTripChange = (function () {
var $trip = $('.booking_trip');
var $dates = $('.booking_date');
init = function () {
$trip.on('change', function () {
$dates.attr('disabled', 'disabled');
$.ajax({
url: Routing.generate('load_departures', {tripId: $trip.val()}),
type: 'GET',
dataType: 'json',
success: function (response) {
$dates.find('option').remove();
$("<option/>", {value: '', text: 'Specify Departure Code'}).appendTo($dates);
$.each(response.tripdates, function (index, entity) {
$("<option/>", {value: entity.id, text: entity.label}).appendTo($dates);
});
$dates.removeAttr('disabled');
}
});
});
};
return {
init: init
};
})();
bookingTripChange.init();
最后要做的是为load_departures 路由写一个动作。它可以是一个简单的选择,给定$tripId 并水合到array。
public function loadChoicesAction(Request $request, $tripId)
{
$tripdates = $this->getDoctrine()
->getRepository('ExampleBundle:Departures')
->getTripsDatesOptions($tripId);
$content = json_encode(array(
'tripdates' => $tripdates
));
$reponse = new Response($content, 200);
return $reponse;
}
附:
- 要让js路由工作你需要安装:FOSJsRoutingBundle