Я сейчас работаю над сайтом с большим количеством таблиц.
Почти все таблицы имеют фильтры, и, поскольку пользователь не хочет терять все свои фильтры при перезагрузке, я сохраняю фильтр в сеансе.
Пока все это работает, я запускаю ajax-вызов каждый раз, когда фильтр изменяется, чтобы сохранить новый фильтр в сеансе.
Моя проблема, когда я пытаюсь очистить фильтры.
Когда пользователь нажимает кнопку очистки или закрывает последнее окно фильтра, ключ сеанса очищается, и он печатает ноль, но когда я перезагружаю страницу, последние фильтры загружаются, и сеанс печатает их, как будто я никогда не удалял их.
Функция, которую я использую для заполнения / опустошения сессии:
public function addPersistenceAction(Request $request)
{
$parameters = $request->request->all();
$session = $this->get('session');
$session->start();//I tried removing/adding this line but it didn't change anything
//if the key wasn't send, nothing happends
if (!isset($parameters['storage'])){
return new JsonResponse(0);
}
//if no data was send, it removes the key.
if(!isset($parameters['data'])) {
$session->remove($parameters['storage']);
// I also tried setting an empty array but it didn't work either
//$session->set($parameters['storage'], []);
return new JsonResponse($session->all()); // this prints the correct data
}
//if the data was sent, it is set. This works perfectly
$session->set(
$parameters['storage'],
$parameters['data']
);
return new JsonResponse($session->get($parameters['storage']))
}
Функция всегда возвращает то, что я ожидаю, но каждый раз, когда я перезагружаю страницу, сеанс все еще имеет последний фильтр. Я пробовал использовать разные фильтры, и это всегда последний фильтр, поэтому его нельзя было кодировать в моем контроллере.
Забавно, я заметил, что если я вручную запускаю функцию, которая получает данные фильтра перед перезагрузкой страницы, она показывает мне правильное значение, и если я перезагружаюсь после этого, фильтр правильно очищается.
Итак, мой вопрос: есть ли причина, по которой мой сеанс, похоже, не сохраняется, и есть ли способ программно «заставить» Symfony сохранить данные сеанса?
полезный код:
Функция, которая получает данные сеанса:
/**
* @param Request $request
* @return JsonResponse
*/
public function getSessionDataAction(Request $request){
$parameters = $request->request->all();
$session = $this->get('session');
$session->start();
if (!empty($parameters['storage'])) {
$data = $session->get($parameters['storage'])?:[];
return new JsonResponse($data);
}else{
return new JsonResponse(array('status' => 'failed', 'message' => 'storage is mandatory'));
}
}
Моя функция контроллера:
/**
* @param Request $request
* @return Response
*/
public function indexAction(Request $request)
{
$this->denyAccessUnlessGranted(RoleVoterHelper::SECTION_USER_VIEW);
$session = $request->getSession();
//I checked and the session key I use is not touched in this function
$filterWidgets = $this->get('dmt.filter.manager')->getWidgetData('user_filter');
if (!$this->get('dmt.role_voter')->getExtGranted(RoleVoterHelper::SECTION_USER_VIEW)) {
$filterWidgets['company'] = $this->getDoctrine()->getRepository('BugTrackerModelBundle:Company')->findByAuthorities($this->getUser()->getAuthorities());
}
$authorities = $this->getDoctrine()->getRepository('BugTrackerModelBundle:Authority')->findAll();
return $this->render('DMTBundle:User:index.html.twig', [
'filter_widgets' => $filterWidgets,
'usersColumns' => $session->get('usersColumns'),
'usersSort' => $session->get('usersSort'),
'isSuperAdmin' => $this->isGranted(UserHelper::ROLE_SUPER_ADMIN),
'authorities' => $authorities,
]);
}
JavaScript, вызываемый при открытии страницы:
$.post(dependencies.bridgeGetUrl, {
// something like "project_page_filter", the key for the session.
storage : dependencies.storage
}).success(function(response){
dependencies.filterManager.hook(function(app){
app.scheme = response;
app.readScheme();
});
run(dependencies);
if(typeof dependencies.callback == "function"){
dependencies.callback(dependencies.params);
}
});
javascript, который отправляет любые изменения в сеанс:
App.scheme всегда текущее значение фильтров
dependencies.filterManager.setLifecycle(["add", "change-value"], function(app) {
$.post(dependencies.bridgeUrl, {
storage : dependencies.storage,
data : app.scheme
});
}).setLifecycle(["remove-all", "remove"], function(app) {
$.post(dependencies.bridgeUrl, {
storage : dependencies.storage,
data : app.scheme
});
$("#filterSubmit").click();
});