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的完整代码?我已经更新了我的回复。您需要在服务定义中插入实体存储库,您知道怎么做吗?感谢您的更新,很抱歉,您不知道如何插入实体?