Forms Symfony2-如何设置实体字段类型的默认选项?

Forms Symfony2-如何设置实体字段类型的默认选项?,forms,symfony,Forms,Symfony,使用实体时,如何预先选择一个值 我想预先选择一个从数据库中获取的国家,因为我们的大多数用户居住在同一个国家 过去,通过添加数据选项,我能够在复选框字段中预先选择一个值 此LocationType表单包含在UserType表单中,因为该表单是从多个实体构建的 位置类型表单: namespace Cmp\MyBundle\Form\Type; use Cmp\MyBundle\Entity\Account; use Symfony\Component\Form\AbstractType; use

使用
实体时,如何预先选择一个值

我想预先选择一个从数据库中获取的国家,因为我们的大多数用户居住在同一个国家

过去,通过添加
数据
选项,我能够在
复选框
字段中预先选择一个值

此LocationType表单包含在UserType表单中,因为该表单是从多个实体构建的

位置类型表单:

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';
        }
    }
    $user = new User();
    $form = $this->createForm(new UserRegType(), $user);
赫比是一根树枝,它会把多普敦排成一列

       <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>

用户类型表单包括上面显示的位置表单类型。

创建表单时,可以为该字段赋值

例如:

$data = new Foo();
$data->setCountryCode($country);
$form = $this->createForm(new myFormType(), $data);
试试这个:

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 }

在我的例子中,这不起作用,因为我的表单是两个实体的组合。这些实体通过多通链接链接。因此,新表单从用户开始,然后包括其帐户。因此,我要设置的默认值是在新表单开始时的另一个实体(帐户)中。这听起来合乎逻辑,只有我如何才能做到?我在“data”字段后面尝试了以下代码,但出现了PHP错误:$this->getdoctor()->getRepository('MyBundle:Country')->findOneBy(array('countryCode'=>“NL”))您的表单定义为服务吗?还是在控制器中构建它?你能把完整的类发布到你构建表单的地方吗?它被定义为一个formtype,我已经添加了这个fromtype的完整代码?我已经更新了我的回复。您需要在服务定义中插入实体存储库,您知道怎么做吗?感谢您的更新,很抱歉,您不知道如何插入实体?