2016-03-26 2 views
0

Как я могу предварительно выбрать a значение при использовании entity полевой тип?Symfony2 - Как установить выбор по умолчанию для типа поля объекта?

Я бы хотел (а) выбрать страну, выбранную из базы данных, потому что большинство наших пользователей живет в одной стране.

Я смог предварительно выбрать значение в поле checkbox, добавив опцию data в прошлом.

Эта форма 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> 

контроллер, который генерирует форму:

$user = new User(); 
    $form = $this->createForm(new UserRegType(), $user); 

Пользователь тип формы включает в себя тип Расположение форму, показанную выше.

ответ

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

Смежные вопросы