Я использую Silex и Symfony2 Form. Я пытаюсь получить значения по умолчанию из объекта формы при первой записи на странице, поэтому перед отправкой формы пользователем. Я пытаюсь сделать это так:
$query = $form->getData();
Но он пуст, пока форма не отправлена. С другой стороны это работает:
$form->get('searchRadius')->getData()
И это показывает значения по умолчанию. Можно ли заставить метод getData () работать без отправки формы? Или есть какой-либо другой способ получить значения по умолчанию из формы, о которой я не знаю?
Заранее спасибо.
РЕДАКТИРОВАТЬ
Мой вопрос недостаточно ясен, поэтому я постараюсь это исправить.
У меня есть контроллер. В этом контроллере я создаю форму с некоторыми значениями по умолчанию. Теперь я пытаюсь получить эти значения, используя $form->getData()
но это ничего не возвращает. С другой стороны, когда я пытаюсь получить доступ к его дочерним элементам (то есть к полям формы) и запрашиваю такие данные, как $form->get('searchRadius')->getData()
он возвращает значение по умолчанию. Но я хочу не спрашивать каждого ребенка отдельно, чтобы получить значение по умолчанию. Я хочу спросить форму, как она была отправлена.
Я хотел бы сделать что-то вроде следующего в контроллере:
$form = $this->createForm();
$defaultValues = $form->getData();
Спасибо за ваше время и советы.
Вы обрабатываете текущий запрос по форме? Попробуйте сначала обработать запрос, а затем проверьте правильность формы:
$form->handleRequest($request);
$data = $form->getData();
var_dump($data['searchRadius']);
if ($form->isValid()) {
// do something...
}
Не уверен, что вы подразумеваете под значениями по умолчанию для формы. Но в Symfony вы можете создавать свои формы на сервере, а затем отображать их на веб-странице. Посмотреть документы Вот Если вы это сделаете, вы можете назначить значения для полей формы, как вы хотите.
С другой стороны, если вы создаете свои формы непосредственно в html, сервер не узнает о них, пока они не будут отправлены. В этом случае сервер видит только переменные и их значения, в зависимости от того, что было отправлено. Поэтому, если у вас был введенный текст с некоторым значением, назначенным в html, и пользователь изменил его, вы не сможете извлечь его из формы (если только вы не начнете создавать дополнительные скрытые поля с этими значениями «по умолчанию»).
Конечно, вам не нужно использовать $form->getData();
чтобы получить ваши объекты сущности / модели. Вы можете сначала создать их экземпляр, а затем передать их в объект формы, например, так:
$formType = new \My\Bundle\Form\Type\SomeType();
$formModel = new \My\Bundle\Form\Model\SomeModel();
$form = $this->createForm($formType, $formModel);
Вы можете получить доступ к свойствам вашей сущности / модели, используя методы получения объекта, например:
$formModel->getSomeProperty();
Не ясно, с чем вы боретесь в приведенном выше примере, но все $form
Объект делает это упрощение рендеринга и проверки форм.
Примечание. В приведенном выше примере $form->getData();
а также $form->get('searchRadius')->getData();
это не одно и то же. Последний является дочерним по отношению к первому, поэтому он находится на один уровень ниже (т.е. во вложенной форме).
Я предполагаю, что вы хотите сгенерировать некоторые значения по умолчанию для случая, когда пользователь инициирует get
запрос и вводит представление отправки формы в первый раз.
В этом случае вы должны предоставить для формы некоторые ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ — вот простой пример:
$app->get('/form', function() use ($app) {
// default data for the form !!!
$defaultData = array(
'name' => 'Your name',
'email' => 'Your email'
);
$form = $app['form.factory']->createBuilder('form', $defaultData)
->add('name')
->add('email')
->add('password')
->add('gender', 'choice', array(
'choices' => array(1 => 'male', 2 => 'female'),
'expanded' => true
))
->getForm();
$rootGetData = print_r($form->getData(), true);
$nameGetData = print_r($form->get('name')->getData(), true);
$passwordGetData = print_r($form->get('password')->getData(), true);
return new Response('root form data is:<pre>' . $rootGetData . '</pre>'
. 'name form data is:<pre>' . $nameGetData . '</pre>'
. 'password form data is:<pre>' . $passwordGetData . '</pre>');
});
Вот результат, который я получаю в браузере:
root form data is:
Array
(
[name] => Your name
[email] => Your email
)
name form data is:
Your name
password form data is:
!!! NO VALUE FOR PASSWORD !!!
Таким образом, при создании формы (некоторый объект, реализующий Symfony \ Component \ Form \ FormInterface) вы всегда должны предоставить некоторые данные по умолчанию. Обратите внимание, что ваш способ получения данных с $form->get('password')->getData()
не работает в примере. Я не получил никаких результатов. Это потому, что когда мы создавали форму, мы не передавали никакого значения для свойства пароля. Вы должны убедиться, что вы правильно передаете значения по умолчанию для использования getData()
,
Объект формы обычно создается либо FormFactory или FormBuilder. Если вы проверите методы, которые создают фактический экземпляр формы, всегда есть mixed $data = null
параметр присутствует. В случае FormBuilder данные передаются методом createBuilder
(как в примере выше).
На самом деле это почти тот же пример, что и в документация формы молчания