具有相关数据的symfony实体表单类型

时间:2015-06-20 07:44:55

标签: php symfony entity

我已经在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表单字段会加载此实体中存在的所有地址) 什么是快速的方式?

1 个答案:

答案 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)),
    ));