2016-03-26 216 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