Symfony 3 - 表单 - 持久实体 - 选择为NULL

时间:2016-11-15 12:52:46

标签: forms orm entity symfony persist

我是Symfony的新手,无法轻易找到Symfony 3回答我的问题。

问题: 我有一个基本的表单设置,用基本的id +名称实体值(国家,公司,合作伙伴等)填充选择框

从DB正确填充所有选择框。 但是,当我尝试保存填充的表单时,所有"选项"返回为null。

问题: 我缺少什么来确保选择框中的选定值被发送到INSERT语句?

注意:我查看了Form documentation,但似乎并没有涵盖这种情况。

表格: Populated form

结果提交: Submit result

控制器摘录:

/**
 * @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())
    );
}

从OpportunityType构建表单:

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>

{%endblock%}

2 个答案:

答案 0 :(得分:0)

是的,因为在你的formType中,你的每个字段都是一个EntityType类,我认为Symfony正在等待一个实体。 因此,您必须在实体机会及其“子字段”之间创建一个实现。

如果您不想在您的实体中创建关系,可以尝试Symfony2 Form Builder - creating an array of choices from a DB query

之类的内容

修改 - 添加示例

您可以在此处显示一个有效的示例: https://gitlab.com/gaea44/test-form

答案 1 :(得分:0)

已经解决,可能不是最佳解决方案,但可能对其他人有所帮助。

我最后只是在db持久化之前提交表单之后在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');
}