1

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:

  1. I don't know how reliable the HTTP_REFERER will be
  2. I don't know how to add the previous page request parameters to the current request, so the table is rebuilt properly
  3. 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);

2 Answers 2

2

No, HTTP_REFERER is not reliable and yes, the solution is to add the query parameters of the current request to each AJAX link. Form API does the same for form elements:

RenderElement::preRenderAjaxForm:

    // Add all the current query parameters in order to ensure that we build
    // the same form on the AJAX POST requests. For example,
    // \Drupal\user\AccountForm takes query parameters into account in order
    // to hide the password field dynamically.
    $settings['options']['query'] += \Drupal::request()->query->all();
1
  • This is great! I actually applied it to the Url object I am using to create the links for these AJAX requests -- works like a charm! Now I just have to solve the sortable table headers breaking from being built within AJAX....
    – joegl
    Commented May 9, 2019 at 22:04
0

This works for me in Drupal 9.3:

#ajax request body

$.ajax({
  url: Drupal.url('ajax-load-more'),
  type: 'post',
  data: { nid : drupalSettings.webform.dialog.entity_id },
  success: function (res) {
    console.log(res);
  }
});


In the controller file:

$nid = \Drupal::request()->get('nid');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.