2015-06-20 60 views
1

我创建了我的Symfony2的表单类型形式和我用于用户实体类型来选择他/她的地址,从这样的:symfony的实体形式的类型与相关数据

$builder->add('sladdress', 'entity', array(
    'class' => 'myClass\UserBundle\Entity\UserAddresses', 
    'property' => 'address', 
    'label' => 'label.your_addresses_list', 
    'translation_domain' => 'labels', 
    'mapped' => false 
)); 

我有一个UserAddresses实体它与Users Entity具有ManyToOne关系并保存用户的地址。 问题依然存在,我该怎么做才能让sladdress类型只加载用户拥有的地址?(默认情况下,sladdress表单字段会加载此实体中存在的所有地址) 什么是快速方式?

回答

1

我找到了解决办法,我们应该用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所以我们应该在这个formType创建一个私有变量名为$背景是这样的:

private $context; 

,然后在此创建formType构造方法,让来自调用该控制器的形式 - $> 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)), 
    )); 
+1

为什么你通过整个security.context,而你可以通过只从用户令牌? – DonCallisto

+0

另外,您的安全上下文令牌可以返回匿名。用户 – stevenll

+0

@DonCallisto是的,我可以传递用户从令牌,但我可能需要在未来的上下文中的其他东西 – Mohammad