嗨大家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变量。这似乎很好。
答案 0 :(得分:1)
有多种选择可以做你想做的事情:
1)提交会话中存储的数据
您可以通过两种方式向表单提交数据:
因此,为了保持表单字段在会话下,您应该检查表单是否已提交,如果没有,请提交先前存储在会话中的数据(从请求克隆),这可以通过表单类完成,也许在您的控制器。 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的第二个参数)
最广泛使用的方法是第三种,但是会话中对象的反序列化存在问题(在您的情况下,相关实体将脱离学说),因此我建议您尝试第一个或第二选择仍然有效。