【问题标题】:Symfony2: Get form default values before validationSymfony2:在验证之前获取表单默认值
【发布时间】:2014-09-23 10:08:57
【问题描述】:

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

$query = $form->getData();

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

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

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

提前致谢。

编辑

我的问题不够清楚,所以我会尝试解决它。​​

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

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

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

感谢您的宝贵时间和建议。

【问题讨论】:

  • 我最终从实体创建了表单。这样 Symfony 将自动预填充数据。我说这是在 Symfony 中创建表单的正确方法,而我第一个使用默认值的想法并不好!感谢您的意见。

标签: php forms symfony silex


【解决方案1】:

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

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

【讨论】:

  • 是的,我正在处理请求,然后验证表单。我的问题是如何在不验证表单和/或处理请求的情况下“// 做某事......”。表单有默认值,我想用它们来“//做某事......”
  • @greg 但是在你处理请求之前 - 你的表单必须包含默认值并且你可以使用它,不是吗?
  • 这就是问题所在。在处理请求之前,我无法使用 getData() 中的这些值。
  • @greg 您是否尝试转储使用getData() 返回的数据或转储整个表单以找到存储默认数据的位置?
  • 是的。对象太大而无法转储,getData() 什么也不返回。我猜我将不得不挖掘 Form 对象的代码。
【解决方案2】:

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

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

【讨论】:

  • 我正在控制器中创建一个表单,在下面几行我尝试访问它的默认值(我使用 formbuilder 定义的)。
  • 你能发布你的代码吗?您是否使用相同的控制器来创建和处理表单?如果是这种情况,您的问题可能是您试图从提交的表单中获取数据,在这种情况下,服务器只知道对变量:值。
【解决方案3】:

当然,您不必使用$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(); 不是同一个东西。后者是前者的子代,所以它是下一层(即嵌套形式)。

【讨论】:

  • 我知道它是表单对象的子对象。这就是为什么我不明白为什么使用 $form->getData() 不会返回任何结果(因为询问它的孩子确实会带来结果)。
  • 您能否将代码发布到您创建表单的控制器中以及您尝试实例化的表单的详细信息?查看您添加的编辑,$form = $this->createForm(); 的语法不正确。您至少需要传递一个字符串(用 form.tag 元素表示一个服务)或一个实现 FormTypeInterface 的对象。在 API 中,createForm 方法的函数定义如下:public Form createForm(string|FormTypeInterface $type, mixed $data = null, array $options = array())
【解决方案4】:

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

Form 对象通常由 FormFactoryFormBuilder 创建。如果您检查创建实际表单实例的方法,总会有一个mixed $data = null 参数存在。在 FormBuilder 的情况下,数据通过 createBuilder 方法传递(如上例所示)。

实际上这与silex form documentation中的示例几乎相同

【讨论】:

  • 感谢详细的回答。默认值已经定义。我试图实现的是使用 $form->getData() 方法来获取它们。但在我处理请求和/或验证表单之前它什么都不返回。
  • 嗯,这真的很奇怪。您能否分享一些有关如何创建表单的更多详细信息?
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 2013-12-27
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多