我已经在symfony2表单类型中创建了我的表单,我使用了一个实体类型供用户从中选择他/她的地址,如下所示:
$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表单字段会加载此实体中存在的所有地址) 什么是快速的方式?
答案 0 :(得分:1)
我找到了解决方案,我们应该使用' query_builder' symfony表单类型的参数如下:
$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->上下文,因此我们应该在此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)),
));