Массив флажков дает неожиданные значения при отправке события - PullRequest
3 голосов
/ 08 октября 2019

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

Пример требуемых данных

['0','0','1','1','1','1','1','1','1'] #Array[]|length = 9
['1','0','0','0','0','0','0','0','0']
['0','1','0','0','0','0','0','0','0']
['1','1','0','0','0','0','0','0','0']
['2','0','0','0','0','0','0','0','0']
['0','2','0','0','0','0','0','0','0']
['0','0','2','0','0','0','0','0','0']
['0','0','2','1','0','0','0','0','0']
['1','0','2','0','0','0','0','0','0']

Вот что я получил для этих соответствующих примеров

['0','0']
['1','0']
['0','1']
['1','1']
['2','0']
['0','0']
['0','2']
['0','0','2'] #something i cant understand
['1','0','2']

Я использую базовый ChoiceType

$builder
        ->add('recipe', ChoiceType::class, [
          'choices' => [],
          'multiple' => true,
          'expanded' => true,
          'label' => 'Craft',
        ])
;

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $craft = $event->getData();
        $recipe = $craft['recipe'];

        dump($recipe); # good at this point
});

$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
        $craft = $event->getData();
        $recipe = $craft['recipe'];

        dump($recipe); # bad array...
});

Согласно документации Symfony, между этими двумя событиями данные нормализуются. ( reference )

Я бы хотел настроить шаг нормализации, соответствующий моему FormType, и единственное, что я обнаружил через несколько часов, - это файл, расположенный в symfony / form / ChoiceList / ArrayChoiceList.php, который можетбыть моей проблемой( ArrayChoiceList на github )

1 Ответ

3 голосов
/ 08 октября 2019

ChoiceType, imho, неправильный тип формы для этого (и это распространенная ошибка), поскольку он используется для выбора записей из большего набора записей. Там, где обычно порядок не важен, а невыбранные записи пропускаются.

В зависимости от того, что на самом деле выбрано , выбрано , один из следующих (не обязательно полных) списков может вам помочь:

A. записи единообразны

Обычный вариант использования для CollectionType. Если оставить значение по умолчанию для параметров CollectionType allow_add и allow_delete на false, элементы не будут добавлены или удалены. Тем не менее, рендеринг может быть более сложным. CollectionType entry_type, вероятно, будет ChoiceTypemultiple, установленным на false!) с вероятным выбором, аналогичным описанному ранее ... или CheckboxType, однако здесь может быть сложно установить значения.

B. записи различаются

Возможно, было бы лучше вручную добавить 9 элементов формы вручную и установить для property_path каждого значение recipe[N], где N - это число от 0 до 8, определяющее, где получить игде установить конкретное значение.

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