Поле сущности Symfony2, отображающее все записи, когда варианты выбора пусты - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть поле формы типа объекта в моем проекте Symfony2.

$builder = $this->createFormBuilder();
$projects = $this->getProjects();

$builder->add('project', 'entity',
        array(
            'class' => 'MyBundle:Project',
            'required' => false,
            'choices' => $projects,
        ));

Проблема, с которой я столкнулся, заключается в том, что когда метод getProjects() вернет пустой набор результатов, в раскрывающемся списке будут все проекты в таблице Project.

Есть ли способ отключить это поведение?

1 Ответ

5 голосов
/ 29 февраля 2012

Я полагаю, что неожиданное поведение происходит, потому что вы путаете использование типов полей формы Выбор и Сущность.

Вы указываете поле Entity (второй параметр в $ builder-> add ()), а затем пытаетесь заполнить его значениями, используя опцию 'choices'.Однако опция 'выборы' не может напрямую применяться к типу поля Entity , хотя, как говорят, она наследуется от Choice.Скорее, поле Entity предназначено для автоматической загрузки вариантов из базы данных для вас.Если вы устанавливаете только Entity 'class', поле заполняется всеми сущностями из таблицы в порядке возрастания первичного ключа.Чтобы загрузить подмножество сущностей и / или загрузить их в определенном порядке, вы можете установить функцию 'query_builder'.

Например, чтобы создать раскрывающийся список всех стран в порядке возрастания имен:

$builder->add('country', 
              'entity', 
              array('class' => 'My\Bundle\Entity\Country',
                    'property' => 'name', 
                    'query_builder' => function(EntityRepository $er) {
                        return $er->createQueryBuilder('country')
                                  ->orderBy('country.name', 'ASC');
                    },
                    'required' => true, 
                    'empty_value' => false));

Запрос может быть как простым, так и сложным.См. Использование Doctrine's Query Builder .

Я подозреваю, что способ создания поля проекта в вопросе приводит к тому, что базовые варианты для раскрывающегося списка устанавливаются дважды - во-первых, когда классопция 'устанавливается для всех доступных объектов проекта, во-вторых, когда установлена ​​опция' выборы ', к результату $ this-> getProjects ().Предположительно, если последний является пустым массивом, он не переопределяет первый и, следовательно, все проекты появляются в списке.

Если по какой-то причине вы не можете использовать построитель запросов, чтобы получить проекты для удалениязатем вы можете использовать тип поля Choice и вручную отобразить данные проектов в опцию 'choices'.Например, что-то вроде этого:

$builder = $this->createFormBuilder();
$projects = $this->getProjects();

$projectChoices = array();
foreach ($projects as $project) {
    $key = $project->getId();
    $value = $project->getName();
    $projectChoices[$key] = $value;
}

$builder->add('project', 
              'choice',
               array('choices' => $projectChoices,
                     'required' => false));

Обратите внимание, что в этом случае значение поля 'project' будет идентификатором Project, тогда как для поля Entity это будет фактическая сущность Project, которая является другойпричина, по которой предпочтительно использовать поле Entity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...