Мой проект написан с использованием компонентов Silex и Symfony (т.е. компонента Form).
Я пытаюсь создать батарею переключателей, построенных из класса, и я хочу предварительно выбрать один из этих радиостанций.
Я создаю такую форму:
$form = $app['form.factory']->createBuilder(new QueryFormType(), $query)
где QueryFormType
– мой пользовательский тип (он расширяет AbstractType), где я определяю поля формы, а $query
– сущность со значениями по умолчанию для формы.
Поля формы в QueryFormType
выглядят так (для ясности я пропустил построитель и другие поля):
->add('contractPeriod', 'filter', array( 'label' => 'Contract Period:', 'choices' => array( '-1' => 'No period', '1' => '1 month', '2' => '2 months', '3' => '3 months', '6' => '6 months', '12' => '12 months', '18' => '18 months' ), 'expanded' => TRUE, 'multiple' => FALSE ))
$query
– это экземпляр класса, который должен предварительно выбрать переключатель. В его конструкторе вы найдете:
$this->contractPeriod = '3';
У этого есть правильные геттеры и сеттеры для этого свойства тоже.
Теперь. Форма и переключатели отображаются правильно. Радиоприемник предварительно выбран на '3' => '3 months'
. Когда я проверяю радио выше в списке определений (так что 2, 1 или -1), форма принимает его как значение. Но когда я проверяю значение ниже в определенном списке (6, 12 или 18), он использует значение по умолчанию, заданное в $query
. Какого черта?
Мой вопрос в том, как правильно установить значение по умолчанию, чтобы я мог выбрать любое другое значение, которое я хочу после визуализации формы?
Я уже пробовал использовать свойство data в определении поля формы, и это та же история. Я могу выбрать только более низкие значения, но не выше. Я устал использовать «preferred_choices», но он не работает так, как я ожидал (испорченные идентификаторы входов).
Прошу вас о помощи.
РЕДАКТИРОВАТЬ
Вот как я представляю форму:
$form->submit($request->query->get($form->getName()), FALSE);
Я узнал, что если я установлю clearMissing на TRUE (второй аргумент), он работает хорошо, но я не могу выполнять частичное предварительное заполнение (или исправление формы). Кажется, это ошибка.
РЕДАКТИРОВАТЬ
Это как-то связано с этими строками внутри класса Form компонентов symfony:
if ($isSubmitted || $clearMissing) { $child->submit($isSubmitted ? $submittedData[$name] : null, $clearMissing); unset($submittedData[$name]); if (null !== $this->clickedButton) { continue; } if ($child instanceof ClickableInterface && $child->isClicked()) { $this->clickedButton = $child; continue; } if (method_exists($child, 'getClickedButton') && null !== $child->getClickedButton()) { $this->clickedButton = $child->getClickedButton(); } }
сif ($isSubmitted || $clearMissing) { $child->submit($isSubmitted ? $submittedData[$name] : null, $clearMissing); unset($submittedData[$name]); if (null !== $this->clickedButton) { continue; } if ($child instanceof ClickableInterface && $child->isClicked()) { $this->clickedButton = $child; continue; } if (method_exists($child, 'getClickedButton') && null !== $child->getClickedButton()) { $this->clickedButton = $child->getClickedButton(); } }
$ child-> submit update viewData своего родителя (форма в этом случае) для отправленного значения, только если оно меньше / равно значению по умолчанию, заданному в форме. Зачем?
РЕДАКТИРОВАТЬ
Я думаю, что компонент Form не отправит детей после значения по умолчанию, которое в этом случае isSubmited == false и clearMissing == false. Это делает доступными только значения до значения по умолчанию. Но я не знаю.