Symfony2:在验证之前获取表单默认值

时间:2014-09-23 10:08:57

标签: php forms symfony silex

我使用Silex和Symfony2 Form组件。我尝试从页面上第一个条目的表单对象中获取默认值,因此在用户发送表单之前。我试着这样做:

$query = $form->getData();

但是在发送表单之前它是空的。另一方面,这有效:

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

它显示默认值。是否可以在不发送表单的情况下使getData()方法工作?或者是否有其他方法可以从我不知道的表单中获取默认值?

提前致谢。

修改

我的问题不够明确,所以我会尝试修复它。

我有一个控制器。在这个控制器中,我创建了一个带有一些默认值的表单现在我尝试使用$form->getData()获取这些值但它什么都不返回。另一方面,当我尝试访问其子项(即表单字段)并请求像$form->get('searchRadius')->getData()这样的数据时,它确实返回默认值。但我想避免让每个孩子分别获得默认值。我想询问发送时的表格。

我想在控制器中执行以下操作:

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

感谢您的时间和提示。

4 个答案:

答案 0 :(得分:0)

您是否按表格处理当前请求?尝试先处理请求,然后检查表单是否有效:

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

答案 1 :(得分:0)

不确定表单的默认值是什么意思。但是在Symfony中,您可以在服务器中创建表单,然后在网页中显示它们。查看文档here如果您这样做,可以根据需要将值分配给表单的字段。

另一方面,如果您直接在html中创建表单,服务器在提交之前不会知道它们。在这种情况下,服务器只能看到变量及其值,具体取决于发送的内容。因此,如果您的输入文本在html中分配了一些值,并且用户更改了它,您将无法从表单中检索它(除非您开始使用此“默认值”值创建额外的隐藏字段)。

答案 2 :(得分:0)

当然,您不必使用$form->getData();来获取实体/模型对象。您可以先实例化它们,然后将它们传递给表单对象,如下所示:

$formType = new \My\Bundle\Form\Type\SomeType();
$formModel = new \My\Bundle\Form\Model\SomeModel();
$form = $this->createForm($formType, $formModel);

您可以使用对象的getter访问实体/模型的属性,如下所示:

$formModel->getSomeProperty();

目前尚不清楚您在上面的示例中遇到了什么,但所有$form对象都会简化表单的呈现和验证。

注意:在上面的示例中,$form->getData();$form->get('searchRadius')->getData();不是一回事。后者是前者的孩子,所以它是一个级别(即嵌套形式)。

答案 3 :(得分:0)

我假设你想在用户启动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()获取数据的方式在示例中不起作用。我没有得到任何结果。那是因为当我们创建表单时,我们没有为password属性传递任何值。您应确保正确传递默认值以使用getData()

表单对象通常由 FormFactory FormBuilder 创建。如果查看创建实际表单实例的方法,则始终存在mixed $data = null参数。如果是 FormBuilder ,则数据将使用方法createBuilder传递(如上例所示)。

实际上这与silex form documentation

中的示例几乎相同