【问题标题】:Symfony2 - How to customize the select option labels for the entity field type when using the query_builder?Symfony2 - 使用 query_builder 时如何自定义实体字段类型的选择选项标签?
【发布时间】:2013-09-18 09:30:47
【问题描述】:

当我在 Symfony2 中创建实体字段时,如何指定生成的选择选项字段的值?

这是我的实体字段的sn-p:

->add('preferred_language', 'entity', array(
    'mapped' => false,
    'property' => 'name',
    'class' => 'Common\MainBundle\Entity\Language',
    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->orderBy('u.id', 'DESC');
    }

实际上我可以通过 property 指定显示的值,它会自动获取引用到 db 表的 id。好的。相反,我可以做什么,是否要更改选项值?

<option value="my_value">my_property</option>

【问题讨论】:

    标签: forms symfony symfony-forms symfony-2.3


    【解决方案1】:

    如果您创建一个“实体”字段,您将在两个实体之间创建一个关系表单,因此默认字段值是您的实体上的 id 注释字段。 您可以使用 View Transformer 更改此行为。查看此文档: http://symfony.com/doc/current/cookbook/form/data_transformers.html#model-and-view-transformers

    【讨论】:

    • 嗨,保罗,你确定可以通过数据转换器来做到这一点吗?你知道如何改变实体行为的例子吗?
    【解决方案2】:

    也在寻找相同的解决方案并在这里找到它:different property for entity field type in form

    只需在字段类型选项中设置属性,并为该属性创建一个 getter,将字符串格式化为输出标签的方式。

    【讨论】:

      【解决方案3】:

      我通过以下方式解决了:

      FormType 中的代码必须相同:

      ->add('preferred_language', 'entity', array(
      'mapped' => false,
      'property' => 'name',
      'class' => 'Common\MainBundle\Entity\Language',
      'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
          return $er->createQueryBuilder('u')
              ->orderBy('u.id', 'DESC');
      }
      

      在控制器中,我使用 DQL 获取数据:

      $em = $this->getDoctrine()->getManager();
      $query = $em->createQuery('SELECT u FROM MyBundle:Language ORDER BY u.id DESC');
      $data = $query->getResult();
      

      我通过渲染方法传递数据:

      return $this->render('MyBundle:Default:page.html.twig',
              array('formulario' => $formulario->createView(),
                  'data' => $data));
      

      在 twig 文件中,我创建了一个 ID 为“myproject_mybundle_myformtype_preferred_language”的&lt;select&gt; 项目:

      <select id="myproject_mybundle_myformtype_preferred_language" name="aeneagrama_adminbundle_itemcontenidotype[preferred_language]" class="form-control">
          <option value="0">-- Choose an option --</option>
          {% for item in data %}
              <option value="{{ item.your_column }}">{{ item.name }}</option>
          {% endfor %}</select>
      

      最后,当你从表单中获取输入数据时,你可以在控制器中获取它:

      $form->get('preferred_language')->getData();
      

      【讨论】:

        【解决方案4】:

        在您的控制器中进行此更改,

        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery('SELECT u FROM MyBundle:Language u ORDER BY u.id DESC');
        $data = $query->getResult();
        

        【讨论】:

          猜你喜欢
          • 2012-07-09
          • 2013-10-10
          • 2012-12-27
          • 2013-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多