2014-09-23 5 views
1

Я использую компонент Silex и Symfony2 Form. Я пытаюсь получить значения по умолчанию из объекта формы при первой записи на странице, поэтому перед отправкой формы пользователем. Я пытаюсь сделать это так:Symfony2: Получить значения по умолчанию для формы до проверки

$query = $form->getData();

Но оно пусто, пока форма не будет отправлено. С другой стороны, это работает:

$form->get('searchRadius')->getData()

И это показывает значения по умолчанию. Можно ли заставить метод getData() работать без отправки формы? Или есть ли какой-либо другой метод для получения значений по умолчанию из формы, о которой я не знаю?

Заранее спасибо.

EDIT

Мой вопрос не достаточно ясно, так что я постараюсь это исправить.

У меня есть контроллер. В этом контроллере я создаю форму с некоторыми значениями по умолчанию. Теперь я пытаюсь получить эти значения, используя $form->getData(), но ничего не возвращает. С другой стороны, когда я пытаюсь получить доступ к своим дочерним элементам (т. Е. Полям формы) и запрашивать данные, такие как $form->get('searchRadius')->getData(), он возвращает значение по умолчанию. Но я хочу, чтобы не спрашивать каждого ребенка отдельно, чтобы получить значение по умолчанию. Я хочу спросить форму, как она была отправлена.

Я хотел бы сделать что-то вроде следующего в контроллере:

$form = $this->createForm(); 
$defaultValues = $form->getData(); 

Спасибо за ваше время и советы.

+0

Я в конечном итоге создать форму из субъектов. Таким образом Symfony будет автоматически заполнять данные. Я говорю, что это правильный способ создания форм в Symfony, и моя первая идея с значениями deafault не была хорошей! Спасибо за ваш вклад. – greg

ответ

0

Вы обрабатываете текущий запрос по форме? Сначала попробуйте выполнить запрос, а затем проверьте форму:

$form->handleRequest($request); 
$data = $form->getData(); 
var_dump($data['searchRadius']); 
if ($form->isValid()) { 
    // do something... 
} 
+0

Да, я обрабатываю запрос, а затем проверяю форму. Мой вопрос в том, как я могу «// сделать что-то ...» без проверки формы и/или обработки запроса. Форма имеет значения по умолчанию, и я хочу использовать их для «// делать что-то ...» – greg

+0

@greg Но прежде чем обрабатывать запрос - ваша форма должна содержать значение по умолчанию, и вы можете использовать его, не так ли? –

+0

Вот в чем проблема. Я не могу использовать эти значения из getData(), прежде чем обрабатывать запрос. – greg

0

Не знаете, что вы имеете в виду со значениями по умолчанию для формы. Но в Symfony вы можете создавать свои формы на сервере, а затем отображать их на веб-странице. См. Документы. here Если вы это сделаете, вы можете присвоить значения полям формы, как хотите.

С другой стороны, если вы создаете свои формы непосредственно в html, сервер не знает о них до тех пор, пока они не будут отправлены. В этом случае сервер видит только переменные и их значения, в зависимости от того, что было отправлено. Поэтому, если у вас есть текст ввода с некоторым значением, назначенным в html, и пользователь изменил его, вы не сможете получить его из формы (если вы не начнете создавать дополнительные скрытые поля с этими значениями по умолчанию).

+0

Я создаю форму в контроллере, и несколько строк ниже. Я пытаюсь получить доступ к своим значениям по умолчанию (которые я определил с помощью формообразователя). – greg

+0

Не могли бы вы разместить свой код? Используете ли вы один и тот же контроллер для создания и обработки формы? Если это так, ваша проблема, вероятно, в том, что вы пытаетесь получить данные из представленной формы, и в этом случае сервер знает только значение пары: значение. – kito

0

Несомненно, вам не нужно использовать $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(); не то же самое. Последний является потомком первого, поэтому он на один уровень вниз (т.е. вложенная форма).

+0

Я понимаю, что это ребенок объекта формы. Вот почему я не объясняю, почему использование $ form-> getData() не дает результатов назад (так как запрос его детей приводит к результатам). – greg

+0

Можете ли вы разместить код в своем контроллере, где вы создаете форму и детали формы, которую вы пытаетесь создать? Рассматривая изменения, которые вы добавили, '$ form = $ this-> createForm();' неверный синтаксис. Вам нужно передать хотя бы строку (представляющую службу с элементом form.tag) или объект, реализующий FormTypeInterface.Из API, вот определение функции для метода createForm: 'public Form createForm (string | FormTypeInterface $ type, mixed $ data = null, array $ options = array())'. –

0

Я предполагаю, что вы хотите сгенерировать некоторые значения по умолчанию для случая, когда пользователь инициирует запрос и впервые входит в представление представления формы.

В этом случае вы должны предоставить некоторые значения по умолчанию для формы - вот простой пример:

$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 (как в примере выше).

На самом деле это почти тот же самый пример, как в silex form documentation

+0

Thx для долгого и подробного ответа. Значения по умолчанию уже определены. Я пытаюсь получить их, используя метод $ form-> getData(). Но он ничего не возвращает, пока я не обрабатываю запрос и/или не проверяю форму. – greg

+0

Хм, это действительно странно. Можете ли вы поделиться более подробной информацией о том, как вы создаете свою форму? – maddob

Смежные вопросы