I'm having a hard time figuring out how to do this.
Essentially I have a table displaying users on a page. The table is paginated with the PagerExtender and sortable with the TableSortExtender.
Each user row has links with "use-ajax" classes; these links perform actions on the user, and then rebuild the current table after performing those actions -- this happens all in AJAX.
The problem I am having is, when I rebuild the table in AJAX, the current request is the request for the AJAX action, and not the request which built this page. This means when the table is rebuilt via AJAX, the pager and sort settings are lost and you are reset to the first page, without any sorts.
I have found code somewhere to pull the previous request, and get the URL and parameters, but I don't know how reliable this is or how to implement it:
$current_request = \Drupal::request(); $previous_url = $current_request->server->get('HTTP_REFERER'); $previous_request = Request::create($previous_url); // $url_object is a Url with the previous page paramters and URL $url_object = \Drupal::service('path.validator')->getUrlIfValid($previous_request->getRequestUri());
The problem with the above is:
- I don't know how reliable the HTTP_REFERER will be
- I don't know how to add the previous page request parameters to the current request, so the table is rebuilt properly
- If the previous request is NOT the request that built the table/page, I'm stuck again
Is the solution always passing the previous request URL and Params with every AJAX request I make? I feel like someone has solved this somewhere or somehow but I am just lost in this area in Drupal 8, and have been beating my head constantly trying to figure out how to refresh parts of a page in an AJAX request.
EDIT: I am not certain the best place to put the "completed" code, but thanks to 4k4 I've put the following together:
// create url object from route to render link $my_url = Url::fromRoute('my_module.my_route', array('param' => $value)); // get the current query parameters for our page $query_options = \Drupal::request()->query->all(); // add them to our Url $my_url->setOption('query', $query_options);