如何从子窗体中获取父Symfony3窗体的值?

hkmswyz6  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个带有嵌入窗体的父窗体。在嵌入式(子)表单中,我希望创建一个下拉字段,其中包含从数据库查询的另一个实体的选项。作为查询的一部分,我需要引用父实体,但不确定如何从子窗体类访问父对象。
例如,父实体是$subscriber实体。在我的例子中,父表单实际上并不显示任何与订阅者相关的属性,只是允许您添加或删除子实体表单。每个子窗体必须具有如上所述的字段,但需要将选择限制为订阅者已经与之有关系的值。
但这就是我的问题所在。如何从子窗体中使用的代码访问下面的$subscriber变量?:

$builder->add('otherEntity', EntityType::class, array(
    'class' => "AppBundle:YetAnotherEntity",
    'label' => "Other Entity",
    'query_builder' => $this->manager->getRepository("AppBundle:OtherEntity")->getOtherEntityBySubscriber($subscriber)
 ));

它又在我的仓库中调用这个函数:

public function getOtherEntityBySubscriber($subscriber)
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT o FROM AppBundle:OtherEntity o JOIN n.subscriberOtherEntity so WHERE o.subscriber = :subscriber'
        )
        ->setParameter("subscriber", $subscriber)
        ->getResult();
}

在Jbafford的推荐之后:我试过你的第一个选项,但我的问题是我的父窗体调用类型CollectionType::class而不是我的自定义类型...因为我计划制作一个可以添加多个子项的表单。我无法将任何自定义选项传递给CollectionType。我是否需要扩展CollectionType来创建我自己的Type,以便能够接受额外选项?
我的父窗体看起来像这样:

$builder->add('child', CollectionType::class, array(
  "entry_type" => ChildType::class,
  "allow_add" => true,
  "by_reference" => false,
  "allow_delete" => true)
);

如果我在上面添加订阅者作为一个选项,我会得到一个错误,基本上说它不是一个有效的选项。我尝试让我的ChildType扩展CollectionType,但我不认为这是我需要做的,并得到一个错误:
表单的视图数据应该是类AppBundle\Entity\Child的示例,但它是类Doctrine\ORM\PersistentCollection的示例。您可以通过将“data_class”选项设置为null或通过添加视图转换器来将类Doctrine\ORM\PersistentCollection的示例转换为AppBundle\Entity\Child的示例来避免此错误。
我想我需要另一个类来扩展CollectionType,只是为了放入上面的add方法,但我仍然希望我的条目类型是ChildType::class

mqkwyuun

mqkwyuun1#

由于$subscriber是父窗体的主题,因此可以做到这一点的一种方法是将$subscriber作为窗体选项传递给子窗体。
你可以在子节点中这样定义它:

class ChildForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $subscriber = $options['subscriber'];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setRequired(['subscriber']);
    }
}

然后从父母那里传递。
如果你的父表单是根表单,你可以从$options['data']中得到$subscriber

$builder->add('otherEntity', ChildForm::class, [
            'subscriber' => $options['data'],
        ],

如果没有,您可能需要使用事件侦听器来获取表单数据:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $subscriber = $event->getData();
        $form = $event->getForm();

        $form->add('otherEntity', ChildForm::class, [
            'subscriber' => $subscriber,
        ]);
    });

相关问题