Symfony2 — Как настроить метки параметров выбора для типа поля сущности при использовании query_builder?

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

Это фрагмент моего поля сущности:

->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');
    }

На самом деле я могу указать отображаемое значение через свойство, и оно автоматически принимает идентификатор, относящийся к таблице БД. Хорошо. Что я могу сделать вместо этого, хочу ли я изменить значение параметра?

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

person Roberto Rizzi    schedule 18.09.2013    source источник


Ответы (4)


Если вы создаете поле «сущность», вы создаете форму отношения между двумя сущностями, поэтому значением поля по умолчанию является аннотированное поле идентификатора вашей сущности. Вы можете изменить это поведение с помощью View Transformer. Ознакомьтесь с этим документом: http://symfony.com/doc/current/cookbook/form/data_transformers.html#model-and-view-transformers

person Paul Andrieux    schedule 18.09.2013
comment
Привет, Пол, ты уверен, что это можно сделать с помощью преобразователя данных? Знаете ли вы какие-либо примеры того, как изменить поведение этой сущности? - person Roberto Rizzi; 17.06.2015

также искал такое же решение и нашел его здесь: другое свойство для типа поля сущности в форме

просто установите свойство в параметрах типа поля и создайте метод получения для свойства, которое форматирует строку так, чтобы выводить метку.

person Heyflynn    schedule 26.02.2014

Я решил это следующим образом:

код в 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));

В файле ветки я создаю элемент <select> с идентификатором "myproject_mybundle_myformtype_preferred_language":

<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();
person Villapalos    schedule 11.01.2016

В вашем контроллере внесите это изменение,

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