Symfony 3 - 表单 - 持久化实体 - 选择为空
Symfony 3 - Forms - Persist Entity - Choices are NULL
我是 Symfony 的新手,无法轻易找到 Symfony 3 对我的问题的回答。
问题:
我有一个基本的表单设置,它使用基本的 id+name 实体值(国家、公司、合作伙伴等)
填充 select 个框
所有 select 框均已从数据库中正确填充。
但是,当我尝试保存填充的表单时,所有 "choices" 都返回为 null。
问题:
我缺少什么来确保 select 框中的 selected 值被发送到 INSERT 语句?
注:我看过Form documentation,但似乎没有涵盖这种情况。
表格:
提交结果:
控制器摘录:
/**
* @Route("/opportunity/add", name="add_opportunity")
*/
public function addAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$opportunity = new Opportunity();
$form = $this->createForm(OpportunityType::class, $opportunity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($opportunity);
$em->flush();
return $this->redirectToRoute('/opportunity/add');
}
return $this->render(
'opportunity/add-opportunity.html.twig',
array('form' => $form->createView())
);
}
根据机会类型构建表单:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('countries', EntityType::class, array(
'class' => 'AppBundle:Country',
'choice_label' => 'name'
))
->add('partners', EntityType::class, array(
'class' => 'AppBundle:Partner',
'choice_label' => 'name'
))
->add('companies', EntityType::class, array(
'class' => 'AppBundle:Company',
'choice_label' => 'name'
))
->add('users', EntityType::class, array(
'class' => 'AppBundle:User',
'choice_label' => 'name'
))
->add('stages', EntityType::class, array(
'class' => 'AppBundle:Stage',
'choice_label' => 'name'
))
->add('stage_changed_date', DateType::class)
->add('target_close_date', DateType::class)
->add('contract_value', TextType::class)
;
}
形成树枝:
{% block body %}
<div style="max-width: 600px; margin-top:100px; padding:15px; margin-left:auto; margin-right:auto;" class="card">
{{ form_start(form) }}
<div class="form-header purple darken-4">
<h3><i class="fa"></i>Add Opportunity</h3>
</div>
{{ form_row(form.name) }}
{{ form_row(form.countries) }}
{{ form_row(form.partners) }}
{{ form_row(form.companies) }}
{{ form_row(form.users) }}
{{ form_row(form.stages) }}
{{ form_row(form.stage_changed_date) }}
{{ form_row(form.target_close_date) }}
{{ form_row(form.contract_value) }}
<button class="btn btn-raised btn-primary" type="submit">ADD</button>
{{ form_end(form) }}
</div>
{% 端块 %}
是的,因为在您的 formType 中,您的每个字段都是一个 EntityType class,我认为 Symfony 正在等待一个实体。
所以你必须在实体 Oppotunity 和它的 "sub fields".
之间创建一个关系
如果您不想在您的实体中创建关系,可以尝试 Symfony2 Form Builder - creating an array of choices from a DB query
编辑 - 添加示例
您可以在此处展示一个工作示例:
https://gitlab.com/gaea44/test-form
已解决,可能不是最好的解决方案,但可能对其他人有帮助。
我最终只是在数据库持久化之前提交表单之后根据需要在 Opportunity 对象上分配值:
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Get selected values for dropdowns
$opportunity->setPartnerId($opportunity->getPartners()->getId());
$opportunity->setCountryId($opportunity->getCountries()->getId());
$opportunity->setCompanyId($opportunity->getCompanies()->getId());
$opportunity->setUserId($opportunity->getUsers()->getId());
$opportunity->setStageId($opportunity->getStages()->getId());
$em->persist($opportunity);
$em->flush();
return $this->redirectToRoute('add_opportunity');
}
我是 Symfony 的新手,无法轻易找到 Symfony 3 对我的问题的回答。
问题: 我有一个基本的表单设置,它使用基本的 id+name 实体值(国家、公司、合作伙伴等)
填充 select 个框所有 select 框均已从数据库中正确填充。 但是,当我尝试保存填充的表单时,所有 "choices" 都返回为 null。
问题: 我缺少什么来确保 select 框中的 selected 值被发送到 INSERT 语句?
注:我看过Form documentation,但似乎没有涵盖这种情况。
表格:
提交结果:
控制器摘录:
/**
* @Route("/opportunity/add", name="add_opportunity")
*/
public function addAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$opportunity = new Opportunity();
$form = $this->createForm(OpportunityType::class, $opportunity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($opportunity);
$em->flush();
return $this->redirectToRoute('/opportunity/add');
}
return $this->render(
'opportunity/add-opportunity.html.twig',
array('form' => $form->createView())
);
}
根据机会类型构建表单:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('countries', EntityType::class, array(
'class' => 'AppBundle:Country',
'choice_label' => 'name'
))
->add('partners', EntityType::class, array(
'class' => 'AppBundle:Partner',
'choice_label' => 'name'
))
->add('companies', EntityType::class, array(
'class' => 'AppBundle:Company',
'choice_label' => 'name'
))
->add('users', EntityType::class, array(
'class' => 'AppBundle:User',
'choice_label' => 'name'
))
->add('stages', EntityType::class, array(
'class' => 'AppBundle:Stage',
'choice_label' => 'name'
))
->add('stage_changed_date', DateType::class)
->add('target_close_date', DateType::class)
->add('contract_value', TextType::class)
;
}
形成树枝:
{% block body %}
<div style="max-width: 600px; margin-top:100px; padding:15px; margin-left:auto; margin-right:auto;" class="card">
{{ form_start(form) }}
<div class="form-header purple darken-4">
<h3><i class="fa"></i>Add Opportunity</h3>
</div>
{{ form_row(form.name) }}
{{ form_row(form.countries) }}
{{ form_row(form.partners) }}
{{ form_row(form.companies) }}
{{ form_row(form.users) }}
{{ form_row(form.stages) }}
{{ form_row(form.stage_changed_date) }}
{{ form_row(form.target_close_date) }}
{{ form_row(form.contract_value) }}
<button class="btn btn-raised btn-primary" type="submit">ADD</button>
{{ form_end(form) }}
</div>
{% 端块 %}
是的,因为在您的 formType 中,您的每个字段都是一个 EntityType class,我认为 Symfony 正在等待一个实体。 所以你必须在实体 Oppotunity 和它的 "sub fields".
之间创建一个关系如果您不想在您的实体中创建关系,可以尝试 Symfony2 Form Builder - creating an array of choices from a DB query
编辑 - 添加示例
您可以在此处展示一个工作示例: https://gitlab.com/gaea44/test-form
已解决,可能不是最好的解决方案,但可能对其他人有帮助。
我最终只是在数据库持久化之前提交表单之后根据需要在 Opportunity 对象上分配值:
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Get selected values for dropdowns
$opportunity->setPartnerId($opportunity->getPartners()->getId());
$opportunity->setCountryId($opportunity->getCountries()->getId());
$opportunity->setCompanyId($opportunity->getCompanies()->getId());
$opportunity->setUserId($opportunity->getUsers()->getId());
$opportunity->setStageId($opportunity->getStages()->getId());
$em->persist($opportunity);
$em->flush();
return $this->redirectToRoute('add_opportunity');
}