我是Symfony的新手。我有一个包含5个过滤器的表,我想保持它们的状态(保存最后一个查询)当用户再次返回到该表所在的页面时,因为重置了过滤器。
我正在阅读如何做到这一点,因为我不知道。我读了关于html网络存储,关于会话变量,但我找不到任何如何做的例子,可以请有人解释我哪个是最好的方法来做和如何申请。
这是我的控制器上的filterAction:
/**
* @Route("/filterFichas/", name="filterFichas")
*/
public function filterFichasAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$txtColectivo = $request->request->get('colectivo');
$txtRol = $request->request->get('rol');
$txtEstadosObjetivos = $request->request->get('EstadosObjetivos');
$txtEstadosFichas = $request->request->get('EstadosFichas');
$idPeriodo = $request->request->get('periodo');
$periodo = $em->getRepository('GOCModelBundle:Periodo')->findOneBy(array('id' => $idPeriodo));
$respuesta = array();
foreach ($periodo->getFicha() as $ficha){
$flag = true;
if($txtColectivo != "todas"){
$colectivo= $em->getRepository('GOCModelBundle:Colectivo')->findOneBy(array('nombre' => $txtColectivo ));
if($ficha->getUser()->getColectivo() != $colectivo){
$flag = false;
}
}
if($txtRol != "todas"){
$rol = $em->getRepository('GOCModelBundle:Rol')->findOneBy(array('rol' => $txtRol ));
if($ficha->getUser()->getRol() != $rol){
$flag = false;
}
}
if($txtEstadosFichas != "todas"){
if(count($ficha->getFichacontenidoestado()) > 0){
$estadoContenido = $em->getRepository('GOCModelBundle:Estadocontenido')->findOneBy(array('descripcion' => $txtEstadosFichas ));
if($ficha->getFichacontenidoestado()[count($ficha->getFichacontenidoestado()) - 1]->getEstadocontenido() != $estadoContenido){
$flag = false;
}
}else{
$flag = false;
}
}
if($txtEstadosObjetivos != "todas"){
if(count($ficha->getFichaobjetivosestado()) > 0){
$estadoObjetivos = $em->getRepository('GOCModelBundle:Estadobjetivo')->findOneBy(array('descripcion' => $txtEstadosObjetivos ));
if($ficha->getFichaobjetivosestado()[count($ficha->getFichaobjetivosestado()) - 1]->getEstadobjetivo() != $estadoObjetivos){
$flag = false;
}
}else{
$flag = false;
}
}
if($flag){
$respTemp = array(
'user' => $ficha->getUser(),
'ficha' => $ficha,
);
array_push($respuesta, $respTemp);
}
}
return $this->render('GOCFichasBundle:Default:fichasFilter.html.twig', array(
'usr' => $respuesta,
));
}
这是我对过滤器的js动作:
function filterFichas() {
$.blockUI({ message: '<h4><img src="{{ asset('assets/global/plugins/cubeportfolio/cubeportfolio/img/cbp-loading.gif') }}" /> Cargando datos, por favor espere...</h4>' });
var idPeriodo = $('#selectPeriodoActual').val();
$( "#tabla" ).load( "{{ path('filterFichas')}}",
{
colectivo:$( "#selectColectivo" ).val(),
rol: $( "#selectRol" ).val(),
EstadosObjetivos: $( "#selectEstadoObjetivos" ).val(),
EstadosFichas: $( "#selectEstadoFichas" ).val(),
periodo: idPeriodo
},
function() {
$.unblockUI();
});
}
当用户返回时,如何保存用户执行的最后一次过滤操作,以及最后一个过滤后的表。
答案 0 :(得分:1)
您可以使用Cookie来保存过滤器值。
$.cookie($( "#selectEstadoFichas" ).val(), 1, { expires : 10 });
答案 1 :(得分:0)
最简单的方法是使用session component,如果它继承BaseController,可以在控制器内轻松访问。
您可以使用$this->get('session')
检索控制器内的会话服务。之后,您可以用来与之交互的界面与您正在使用的Request
对象的参数包几乎相同(get
和set
方法具有相同的签名)。
因此,为了处理参数,您必须首先检查它是否已经在$request->query
参数包中。如果没有,请查看会话内部的值,如果它仍然不存在,则回退到默认值(在您的情况下可能是null
)。
您可以利用get method的第二个可选参数来定义默认值,以防在一行中找不到任何内容。之后,您可以将检索到的值保存在会话中,以便在用户稍后返回时检索它。
$session = $this->get('session');
...
$myParam = $request->request->get('myParam', $session->get('myParam'));
if($myParam !== null)
{
$session->set('myParam', $myParam);
}
通过这样做,如果请求和会话中都未定义$myParam
,则null
将为myParam
。无论哪种方式,如果检索到的值不为空,则将其存储到会话中以供进一步使用。
但请注意,由于我们在此处讨论会话,因此这些保存的参数将仅持续用户会话的持续时间。如果您的用户关闭了Web浏览器并返回,则先前保存的参数将丢失。