2016-03-26 89 views
0

我怎样才能预选择使用entity场型时的值?Symfony2 - 如何设置实体字段类型的默认选项?

我想预先选择从数据库中提取的国家之一,因为我们的大部分用户都住在同一个国家。

我可以通过在过去添加data选项来预先选择checkbox字段中的值。

这个LocationType表单包含在UserType表单中,因为表单是由多个实体构建而成的。

的locationType形式:

namespace Cmp\MyBundle\Form\Type; 

use Cmp\MyBundle\Entity\Account; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\EntityRepository; 

    class LocationType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 

      $builder->add('company') 
       ->add('street') 
       ->add('streetno') 
       ->add('streetsuffix') 
       ->add('zipcode') 
       ->add('city') 
       ->add('province') 
       ->add('country', 'entity', array(
        'class' => 'CmpMyBundle:Country', 
        'query_builder' => function (EntityRepository $er) { 
         return $er->createQueryBuilder('c') 
          ->orderBy('c.nameEn', 'ASC'); 
        }, 
        'choice_label' => 'nameEn', 
       )) 
       ->add('tel') 
       ->add('fax') 
       ->add('url') 
       ->add('account', new AccountType()); 
     } 

     public function configureOptions(OptionsResolver $resolver) 
     { 
      $resolver->setDefaults(array(
       'data_class' => 'Cmp\MyBundle\Entity\Location', 
      )); 
     } 

     public function getName() 
     { 
      return 'location'; 
     } 
    } 

赫比产生到coutry列表dorpdown的树枝。

 <div class="form-group {% if not form.location.country.vars.valid %}has-error{% endif %}"> 
      {{ form_label(form.location.country, 'country'|trans, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} 
      <div class="col-sm-9"> 
       {{ form_errors(form.location.country) }} 
       {{ form_widget(form.location.country, {'attr': {'class': 'form-control', 'placeholder': 'country'|trans}}) }} 
      </div> 
     </div> 

控制器生成该形式:

​​

用户类型格式包括以上所示的位置形式类型。

回答

0

当你创建你的表格,您可以赋值到该字段

例如:

$data = new Foo(); 
$data->setCountryCode($country); 
$form = $this->createForm(new myFormType(), $data); 
+0

在我的情况下这是行不通的,因为我的表单是两个实体的组合。这些实体与ManyToOne链接相关联。所以新表格从用户开始,然后包括其帐户。因此,我想要设置的默认值位于另一个实体(帐户)中,作为新表单开始的那个实体。 – Tom

0

试试这个:

namespace Cmp\MyBundle\Form\Type; 

use Cmp\MyBundle\Entity\Account; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\EntityRepository; 

class LocationType extends AbstractType 
{ 
    protected $er; 

    public function __construct(EntityRepository $er) 
    { 
     $this->er = $er; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('company') 
      ->add('street') 
      ->add('streetno') 
      ->add('streetsuffix') 
      ->add('zipcode') 
      ->add('city') 
      ->add('province') 
      ->add('country', 'entity', array(
       'class' => 'CmpMyBundle:Country', 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('c') 
         ->orderBy('c.nameEn', 'ASC'); 
       }, 
       'data' => $this->er->FindOneBy(['country_code' => 'nl']) 
       'choice_label' => 'nameEn', 
      )) 
      ->add('tel') 
      ->add('fax') 
      ->add('url') 
      ->add('account', new AccountType()); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Cmp\MyBundle\Entity\Location', 
     )); 
    } 

    public function getName() 
    { 
     return 'location'; 
    } 
} 

你需要注入在该国回购服务定义:

services: 
    app.country_repository: 
     class: Doctrine\ORM\EntityRepository 
     factory_service: doctrine.orm.default_entity_manager 
     factory_method: getRepository 
     arguments: 
      - YOUR\COUNTRY\NAMESPACE\Country 
    app.form.type.location: 
     class: Cmp\MyBundle\Form\Type\LocationType 
     arguments: 
      - "@app.country_repository" 
     tags: 
      - { name: form.type } 
+0

这听起来合乎逻辑,只有我该怎么做?我已经尝试了'数据'字段后面的代码,但得到PHP错误:$ this-> getDoctrine() - > getRepository('MyBundle:Country') - > findOneBy(array('CountryCode'=>“NL”)) – Tom

+0

您的表单是作为服务定义的吗?或者你在控制器中构建它?你能在你建立表格的地方发布完整的课程吗? – gvf

+0

它被定义为一个formtype,我已经添加了这个fromtype的完整代码? – Tom