【问题标题】:How to get choice options from another entity in Symfony如何从 Symfony 中的另一个实体获取选择选项
【发布时间】:2016-08-01 15:09:15
【问题描述】:

我想加载两个选择列表,第二个仅加载基于第一个选择的一些值。但是我的问题首先出现...如何从与当前类(表单类型类)不直接相关的类中加载第一个列表中的 EntityType 值。

->add(
    'cliente',
    EntityType::class,
    array(
        'class' => 'AppBundle:Cliente',
        'choice_label' => 'nombre',
    )
)

但是这个实体中没有一个'cliente'字段,所以它会抛出你知道的消息......

既不是“cliente”属性也不是“getCliente()”方法之一, “cliente()”、“isCliente()”、“hasCliente()”、“__get()” 存在并且有 “AppBundle\Entity\Envio”类中的公共访问。

请问您知道如何解决这个问题吗?欢迎任何帮助!

【问题讨论】:

  • 'mapped' => 'false' 呢??
  • 有效!你知道如何添加事件监听器吗?我正在尝试访问此映射字段,但它没有出现在数据或表单中(event->getData 或 event->getForm)。我正在尝试这个: $builder->get('cliente')->addEventListener( FormEvents::POST_SET_DATA, function (FormEvent $event) { $form = $event->getForm(); $data = $event->getData (); 转储($form); ....
  • 我发布了错误的答案。检查获取非映射字段的方式并尝试。

标签: forms symfony


【解决方案1】:

根据您的错误,您的表单适用于实体 Envio。如果你想创建一个基于 Cliente 实体的 EntityType 选择列表,你需要在你的 Envio 类中建立一个学说关系:

class Envio
{
     /*
      * @ORM\ManyToOne(targetEntity="Cliente")
      */
     protected $cliente;

该错误与您关于拥有 2 个选择列表并根据第一个选择更改第二个列表的选择的问题无关。您可能最好使用 javascript,并且您将有很多选择,从 AJAX 到根据 .

【讨论】:

  • 对不起,我没有提供完整的信息。该关系在 Envio - Tarifa - Cliente 之间,因此 Envio 和 Tarifa 实体相关但不直接相关。我想要做的是选择 Cliente,然后只加载他们(选择的 Cliente)Tarifa 选项。
  • 但是,如果我理解正确,您仍然希望 Envio 实体最终拥有选定的客户?这似乎是你在表格中所做的。要使用 Symfony/Doctrine 做到这一点,您至少需要我在回答中描述的关系。在表单中使用这个 ManyToOne 和 ->add('cliente'),您将至少获得完整的客户列表。然后您可以使用 javascript 根据之前选择的 'tarifa' 更改完整列表
  • 不,Envio 实体没有客户,它有一个 tarifa(票价)并且该 tarifa 属于一个客户。因此客户端与 Envio 实体没有直接关系。我找到了这个stackoverflow.com/questions/10186185/symfony2-chained-selectors,我现在正在尝试...希望它有效...
  • 我现在的问题是如何获取在第一次选择中选择了哪些数据(哪个选项),因为这是一个未映射的字段。当我放置 PRE_SET_DATA 时,$form 变量没有选择任何东西......你能帮帮我吗?
【解决方案2】:

对于该错误,您需要将该字段设置为 'mapped' => false,因此:

->add(
    'cliente',
    EntityType::class,
    array(
        'class' => 'AppBundle:Cliente',
        'choice_label' => 'nombre',
        'mapped' => false
    )
)

那么为了在控制器中获取属性,你必须这样做:

$cliente = $form->get('cliente')->getData();

希望对您有所帮助。

【讨论】:

  • 我需要在 EnvioType 类中获取客户端。当“cliente”字段发生变化时,它必须触发一个事件以加载表单的下一个输入选项...您知道如何从 addEventListener 函数中的 EnvioType 类访问该字段吗?谢谢!
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2018-06-29
  • 1970-01-01
  • 2018-02-11
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多