使用会话值设置表单数据而不提交此 symfony 表单

Posted

技术标签:

【中文标题】使用会话值设置表单数据而不提交此 symfony 表单【英文标题】:set form data with session value without submit this symfony form 【发布时间】:2014-11-08 14:25:28 【问题描述】:

大家好,symfonistes,

我想在网页中使用 symfony 的表单来搜索数据,当这些数据被验证时,我使用带有分页系统的表格在表单所在的同一网页中查看它。

我的网页在搜索引擎和分页系统表中运行正常,但只有一件事没有运行。当我单击系统分页按钮(排序、页码或每页查看次数)时,会向控制器发送一个请求,此时我丢失了我的数据选择表。

系统分页的结果很好,相对于以前的搜索,但数据形式消失了。这样用户可以使用我的网页,但他不会查看结果的哪些参数。

我想使用 session 来重建我的表单,其中包含之前定义的数据。目前我在我的表单类中使用了preferred_choices(未运行),但如果您有其他解决方案,欢迎您。

或者你能告诉我为什么我的表单 preferred_choices 没有运行吗?

非常感谢您的支持

我的表单类:

class CqsProSansMarqueType extends AbstractType

public function buildForm(FormBuilderInterface $builder, array $options)

    $defaultCQSsearch = new CqsProSansMarque();
    ladybug_dump($options['attr']);
    $defaultCQSsearch->setRayLibelle((!array_key_exists('ray_libelle',     $options['attr'])) ? null : $options['attr']['ray_libelle']);
    $defaultCQSsearch->setFamLibelle((!array_key_exists('fam_libelle', $options['attr'])) ? null : $options['attr']['fam_libelle']);
    $defaultCQSsearch->setCaeLibelle((!array_key_exists('cae_libelle', $options['attr'])) ? null : $options['attr']['cae_libelle']);

    ladybug_dump($defaultCQSsearch);

    $builder
        ->add('ray_libelle', 'entity', array(
            'class' => 'ApplicationDriveBundle:CqsProSansMarque',
            'property' => 'ray_libelle',
            'query_builder' => function(CqsProSansMarqueRepository $er)
                return $er->createQueryBuilder('a')
                ->select('a')
                ->groupBy('a.ray_libelle');
            ,
            'preferred_choices' => array($defaultCQSsearch),
            'label' => 'rayon',
            'required' => false,
        ))
        ->add('fam_libelle', 'entity', array(
            'class' => 'ApplicationDriveBundle:CqsProSansMarque',
            'property' => 'fam_libelle',
            'query_builder' => function(CqsProSansMarqueRepository $er)
                    return $er->createQueryBuilder('a')
                        ->select('a')
                        ->groupBy('a.fam_libelle');
                ,
            'label' => 'famille',
            'required' => false,
        ))

    ;


public function setDefaultOptions(OptionsResolverInterface $resolver)

    $resolver->setDefaults(array(
        'data_class' => 'Application\DriveBundle\Entity\CqsProSansMarque',
    ));


public function getName()

    return 'CqsProSansMarque';

我的控制器构造的形式:

            $searchForm2 = $this->createForm(new CqsProSansMarqueType(), $CqsProSansMarque, array(
            'action' => $this->generateUrl('QualityPage_proSansMarque_search', array('maxItemsPerPage' => $maxItemsPerPage)),
            'method' => 'POST',
            'attr'   =>  array('ray_libelle' => $CqsProSansMarque->getRayLibelle()),
        ));

我测试了我的 $defaultCQSsearch 变量。好像设置的不错。

【问题讨论】:

【参考方案1】:

有不止一种选择可以做你想做的事:

1) 提交存储在会话中的数据

您可以通过两种方式向表单提交数据:

使用handleRequest,在这种情况下你传递整个请求 使用提交,在这种情况下,您直接将字段传递给表单

所以要将表单字段保留在会话下,您应该检查表单是否已提交,如果没有,请提交先前存储在会话中的数据(从请求中克隆),这可以通过表单类完成,可能在您的控制器。 here is a link that explain how to use submit method.

2) 使用事件Form::PRE_SET_DATA

你可以定义一个事件监听器或一个订阅者来修改基于会话的表单的数据(可能是一个实体)。在这种情况下,您需要在表单类或事件订阅者中注入会话(然后是请求) 与第一个相比,这种选择更加解耦(并且可以与事件订阅者一起重用),但更加困难。 here how to use eventlistener or eventsubscriber to make a form dynamic

3) 将提交的表单数据类存储在session中

并使用它来创建新表单(作为 createForm 的第二个参数)

最广泛使用的方法是第三种方法,但存在与会话中对象的反序列化相关的问题(在您的情况下,相关实体将与学说分离),因此我建议您尝试第一种或第二个选择仍然有效。

【讨论】:

问题和之前一样。在会话中存储提交的表单数据类或使用事件 Form::PRE_SET_DATA 时,preferred_choices 不会运行。我为对象设置了正确的值,但 preferred_choices 没有在该字段中选择我的值。 您需要编辑表单的数据而不是首选 但我希望我的实体字段与先前选择的数据和(其重要的)其他数据作为第一次使用表单的开始。在同一选择 html 或实体字段表单中的首选和其他选择。

以上是关于使用会话值设置表单数据而不提交此 symfony 表单的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中对多页表单使用会话跟踪

CodeIgniter:提交无效表单后如何保留值?

提交表单时,会话变量会更改值。

如何在IE浏览器中重新加载/刷新页面而不使用JS弹出表单重新提交

Python CGI 是不是收到由 JQuery 在提交时设置的表单值?

Symfony 1.4:表单中 CSRF 的自定义错误消息