SYMFONY FORM ChoiceType, множественный =>true. Как обойти необходимость внедрения Data Transformers

В ФОРМЕ SYMFONY (ORM не используется (вместо запроса БД используется PDO)).

У меня есть класс MyEntityType, в котором функция buildForm имеет:

$builder->add('my_attribute',ChoiceType::class,array(
  'choices'=>$listForMyAttribute,
  'multiple'=>'true',
  'attr'=>array('data-native-menu'=>'false'),
  'label'=>'Multiple Select on my attribute'
));

Мой атрибут - это массив объектов с именем MyEntity, который имеет:

/**
* @Assert\NotBlank()
*/
private $myAttribute;

С получателем и установщиком для этой переменной $ myAttribute.

Когда я отправляю форму в контроллере, она не проходит проверку и регистрирует эту ошибку:

Невозможно отменить значение для пути свойства "myAttribute": не удалось найти все подходящие варианты для заданных значений.

Когда я начинаю искать решение вокруг этого сообщения об ошибке, оно приводит к чему-то под названием "Как использовать преобразователи данных" в SYMFONY Cookbook; И кажется, что решение будет включать в себя создание нового класса и написание большого количества кода для чего-то, что можно уметь обходить совершенно прямым путем.

У кого-нибудь есть идея?

1 ответ

Решение

Моя проблема заключалась в том, что мой массив $listForMyAttribute был определен в функции buildForm(), и его определение основывалось на некоторых условных выражениях.

Условие создания массива было выполнено, когда этот элемент отображался впервые.

После нажатия кнопки подтверждения buildForm был восстановлен в контроллере, во второй раз условие не было выполнено для создания массива $listForMyAttribute, как это было на первом дисплее. Следовательно, программа выдает "ошибка не найдена", поскольку значение, указанное для этого поля, не может быть найдено.

Сегодня я столкнулся с точно такой же проблемой. Решение простое, как 1-2-3.

1) Создайте вспомогательный фиктивный класс DoNotTransformChoices

<?php
namespace AppBundle\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

class DoNotTransformChoices implements ChoiceListInterface 
{
    public function getChoices() { return []; }
    public function getValues() { return []; }
    public function getPreferredViews() { return []; }
    public function getRemainingViews() { return []; }
    public function getChoicesForValues(array $values) { return $values; }
    public function getValuesForChoices(array $choices) { return $choices; }
    public function getIndicesForChoices(array $choices) { return $choices; }
    public function getIndicesForValues(array $values) { return $values; }
}

2) Добавьте в свое поле следующую дополнительную опцию:

   ...
   'choice_list' => new DoNotTransformChoices,
   ...

3) Поздравляю!

Другие вопросы по тегам