带有相关数据的 symfony 实体表单类型
symfony entity form type with related data
我已经在 symfony2 表单类型中创建了我的表单,我使用了一个实体类型供用户从中选择 his/her 地址,如下所示:
$builder->add('sladdress', 'entity', array(
'class' => 'myClass\UserBundle\Entity\UserAddresses',
'property' => 'address',
'label' => 'label.your_addresses_list',
'translation_domain' => 'labels',
'mapped' => false
));
我有一个 UserAddresses 实体,它与用户实体有 ManyToOne 关系并保存用户的地址。
问题仍然是我应该怎么做才能让 sladdress 类型只加载用户拥有的地址?(默认情况下,sladdress 表单字段加载该实体中存在的所有地址)
什么是快速方法?
我找到了解决方案,我们应该像这样使用 symfony 表单类型的 'query_builder' 参数:
$builder->add('sladdress', 'entity', array('class' => 'myClass\UserBundle\Entity\UserAddresses', 'property' => 'address', 'label' => 'label.your_addresses_list', 'translation_domain' => 'labels', 'mapped' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.user = ?1')
->setParameter(1, $this->context->getToken()->getUser());
},));
但是我们应该注意的是我们不能在 symfony formTypes 中使用 $this->context 所以我们应该在这个 formType 中创建一个名为 $context 的私有变量,如下所示:
private $context;
然后在此 formType 中创建一个构造函数方法,该方法从调用此表单类型的 $form->createFromBuilder() 的控制器中提供安全上下文:
public function __construct($context)
{
$this->context = $context;
}
最后,当我们在控制器中调用 FormType 并将 SecurityContext 作为参数传递给它时,如下所示:
$form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' => $vendor_id)),
));
我已经在 symfony2 表单类型中创建了我的表单,我使用了一个实体类型供用户从中选择 his/her 地址,如下所示:
$builder->add('sladdress', 'entity', array(
'class' => 'myClass\UserBundle\Entity\UserAddresses',
'property' => 'address',
'label' => 'label.your_addresses_list',
'translation_domain' => 'labels',
'mapped' => false
));
我有一个 UserAddresses 实体,它与用户实体有 ManyToOne 关系并保存用户的地址。 问题仍然是我应该怎么做才能让 sladdress 类型只加载用户拥有的地址?(默认情况下,sladdress 表单字段加载该实体中存在的所有地址) 什么是快速方法?
我找到了解决方案,我们应该像这样使用 symfony 表单类型的 'query_builder' 参数:
$builder->add('sladdress', 'entity', array('class' => 'myClass\UserBundle\Entity\UserAddresses', 'property' => 'address', 'label' => 'label.your_addresses_list', 'translation_domain' => 'labels', 'mapped' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.user = ?1')
->setParameter(1, $this->context->getToken()->getUser());
},));
但是我们应该注意的是我们不能在 symfony formTypes 中使用 $this->context 所以我们应该在这个 formType 中创建一个名为 $context 的私有变量,如下所示:
private $context;
然后在此 formType 中创建一个构造函数方法,该方法从调用此表单类型的 $form->createFromBuilder() 的控制器中提供安全上下文:
public function __construct($context)
{
$this->context = $context;
}
最后,当我们在控制器中调用 FormType 并将 SecurityContext 作为参数传递给它时,如下所示:
$form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' => $vendor_id)),
));