【发布时间】:2021-03-17 08:16:25
【问题描述】:
我是 Symfony 的新手,我的表单有问题。 我正在尝试用拳头的选定项目填充下拉列表。
到目前为止,我能够用数据填充第一个,并为第二个设置了 EventListener。
我一直坚持从所做的选择中展示和填充它。 我遵循了 Symfony 教程中的 indications。
这是我的表单类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Getting the Site(s) linked tu the User
$sites = $this->controller->getSitesByUser();
$builder
->add('site', EntityType::class,[
'class' => Site::class,
'data' => $sites,
'label' => 'Site : ',
'placeholder' => 'Choisissez un Site',
'choice_label' => function($sites){
return sprintf('%s',$sites->getNom());
}
])
->add('appel', EntityType::class,[
'class' => Appel::class
])
->add('startDate', DateType::class, [
'label' => 'Date début :',
'widget' => 'single_text',
'attr' => ['class' => 'js-datepicker'],
'label' => 'Date début :'
])
->add('endDate', DateType::class, [
'label' => 'Date fin :',
'widget' => 'single_text',
'attr' => ['class' => 'js-datepicker'],
'label' => 'Date fin :'
])
->add('generate', SubmitType::class, [
'label' => 'Generer'
])
->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'))
->getForm();
}
function onPreSetData(FormEvent $event) {
// GetData return a Fact Object
$form = $event->getForm();
// Get selected field from 'site'
$entityObject = $form->get('site')->getData();
// Get the id of the selected object
if($entityObject != null){
$selectedSite = $entityObject->getId();
}else $selectedSite = null;
//dd($selectedSite);
//$appels = $this->controller->getPostesBySite($selectedSite);
$this->addElements($form, $selectedSite);
}
private function addElements(FormInterface $form, $selectedSite){
if (null === $selectedSite) {
$form->remove('appel');
return;
}
// Only if the user has selected a Site Entity
if($selectedSite){
$form->add('appel', EntityType::class,[
'class' => Appel::class,
'placeholder' => 'Sélectionnez un Poste',
'label' => 'Poste : ',
'multiple' => true,
'required' => false,
'query_builder' => function (AppelRepository $ar) use ($selectedSite) { // Variable to use in use (sic)
return $ar->createQueryBuilder('u')
->select('u')
->where('u.site = :idSite')
->orderBy('u.from_dispname', 'ASC')
->setParameter('idSite', $selectedSite);
},
]);
}
}
public function configureOptions(OptionsResolver $resolver): void{
$resolver->setDefaults([
'data_class' => Fact::class,
]);
}
和我的控制器:
public function createfact(Request $request, $id, UserInterface $user = null) : Response {
$fact = new Fact();
$fact->setName('Facture n° '.$fact->getId(). 'par '.$fact->getUser());
$fact->setDate(new \DateTime());
$form = $this->createForm(FactFormType::class, $fact);
$form->handleRequest($request);
return $this->render('main/fact.html.twig', [
'formFact' => $form->createView()
]);
}
在我的树枝上:
{% block body %}
{{ form_start(formFact) }}
{#{{ form_widget(formFact) }}#}
{{ form_row(formFact.site)}}
{% if formFact.appel is defined %}
{{ form_row(formFact.appel) }}
{% endif %}
{{ form_row(formFact.startDate)}}
{{ form_row(formFact.endDate)}}
{{ form_row(formFact.generate)}}
{{ form_end(formFact) }}
{% 端块 %}
在块体中使用此脚本:
<script>
var $site = $('#fact_form_site');
// When sport gets selected ...
$site.change(function() {
// ... retrieve the corresponding form.
var $form = $(this).closest('form');
// Simulate form data, but only include the selected site value.
var data = {};
data[$site.attr('site')] = $site.val();
// Submit data via AJAX to the form's action path.
$.ajax({
url : $form.attr('action'),
type: $form.attr('method'),
data : data,
success: function(html) {
// Replace current position field ...
$('#fact_form_appel').replaceWith(
// ... with the returned one from the AJAX response.
$(html).find('#fact_form_appel')
);
// Position field now displays the appropriate positions.
}
});
});
我错过了什么?
提前致谢。
【问题讨论】:
-
if($entityObject != null){ $selectedSite = $entityObject->getId(); return;}这里的return;背后的原因是什么? -
没有理由在这里。已删除,谢谢@zizoujab
-
表单提交了吗?响应状态码是200? (您可以在 web profiler 中检查请求内容、状态和表单状态)
-
是的,在分析器中加载状态为 200
-
可能跑题了,但你不应该在 buildForm 方法结束时使用 getForm。