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) Поздравляю!