【问题标题】:Symfony2 - How to set the default choice for the entity field-type?Symfony2 - 如何设置实体字段类型的默认选择?
【发布时间】:2016-03-26 20:49:39
【问题描述】:

使用 entity 字段类型时如何预选一个值?

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

过去,我可以通过添加 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';
        }
    }

Herby 生成到国家列表 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);

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

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    当您创建表单时,您可以为该字段分配一个值

    例如:

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

    【讨论】:

    • 在我的情况下这不起作用,因为我的表单是两个实体的组合。这些实体通过多对一链接链接。因此,新表单从用户开始,然后包含其帐户。所以我要设置的默认值是在另一个实体(帐户)中作为新表单的开头。
    【解决方案2】:

    试试这个:

    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 }
    

    【讨论】:

    • 这听起来合乎逻辑,但我该怎么做呢?我在“数据”字段后面尝试了以下代码,但出现 PHP 错误: $this->getDoctrine()->getRepository('MyBundle:Country')->findOneBy(array('countryCode' => "NL"))
    • 您的表单是否定义为服务?还是在控制器中构建它?你能发布你构建表单的完整课程吗?
    • 定义为formtype,这个fromtype的完整代码我加了吗?
    • 我已经更新了我的回复。你需要在服务定义中注入实体仓库,你知道怎么做吗?
    • 感谢更新,抱歉不知道如何注入实体?
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多