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

Forms 使用会话值设置表单数据,而不提交此symfony表单,forms,symfony,session,Forms,Symfony,Session,大家好,symfonistes 我想在网页中使用symfony的表单来获取搜索数据,当这些数据得到验证时,我会使用一个带有分页系统的表格来查看表单所在网页中的数据 我的网页运行正常,搜索引擎和分页系统表,但只有一件事没有运行。当我单击系统分页按钮(排序、页码或每页的浏览次数)时,会向控制器发送一个请求,此时我丢失了数据选择表 系统分页的结果良好,与以前的搜索相对,但数据形式消失。这样,用户可以使用我的网页,但他不会查看结果的参数 我想使用会话使用前面定义的数据重新生成表单。目前,我在表单类中使用

大家好,symfonistes

我想在网页中使用symfony的表单来获取搜索数据,当这些数据得到验证时,我会使用一个带有分页系统的表格来查看表单所在网页中的数据

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

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

我想使用会话使用前面定义的数据重新生成表单。目前,我在表单类中使用首选_选项(不运行),但如果您有其他解决方案,欢迎使用

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

非常感谢你的支持

我的班级:

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()),
        ));

我测试了$defaultCQSearch变量。这似乎是一个很好的安排。

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

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

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

  • 在本例中,使用handleRequest传递整个请求
  • 在这种情况下,使用submit直接将字段传递给表单
因此,为了将表单字段保存在会话下,您应该检查表单是否已提交,如果未提交,则提交先前存储在会话中的数据(从请求克隆),这可以通过表单类完成,可能在控制器中。

2)使用事件形式::预设置数据

您可以定义eventlistener或订阅服务器,以基于会话修改表单的数据(可能是实体)。在这种情况下,需要将会话(然后是请求)注入form类或eventsubscriber中 与第一种选择相比,这种选择更加解耦(并且可以与eventsubscriber一起重用),但更加困难。

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

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


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

问题与以前相同。首选_选项不会在会话中存储提交的表单数据类或使用事件表单::PRE_SET_数据时运行。我已将对象设置为正确的值,但首选选项不会在字段中选择我的值。您需要编辑表单的数据,而不是首选选项,但我希望在第一次使用表单时,在我的实体字段顶部选择以前选择的数据和(重要的)其他数据。同一选择HTML或实体字段表单中的首选选项和其他选项。