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

时间:2014-11-08 14:25:28

标签: forms symfony session

嗨大家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 个答案:

答案 0 :(得分:1)

有多种选择可以做你想做的事情:

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

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

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

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

2)使用事件Form :: PRE_SET_DATA

您可以定义一个eventlistener或订阅者,它可以根据会话修改表单的数据(可能是实体)。在这种情况下,您需要在表单类或eventsubscriber中注入会话(然后是请求) 与第一个相比,这个选择更加分离(并且可以与eventsubscriber一起重复使用),但更难。 here how to use eventlistener or eventsubscriber to make a form dynamic

3)将提交的表单数据类存储在会话

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

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