¿Cómo adjuntar variables a drupalSettings con ajax?

Oct 02 2020

Con la page attachmentsfunción, puedo adjuntar fácilmente una biblioteca o algunas variables a drupalSettings.

Sin embargo, ahora quiero reemplazar un código HTML con ajax Y adjuntar algunas variables a drupalSettings. Si bien la llamada ajax funciona para reemplazar HTML, no funciona para adjuntar o pasar las variables a la configuración de drupal.

¿Hay alguna manera de que pueda hacer ambas cosas? Aquí está mi código.

public static function AddAJAXResponseCommands(AjaxResponse $response = NULL, array $params = []) {

  $modalSettings = [ 'id' => 1, 'status' => true, ]; $sample = [
    '#type' => "html_tag",
    '#tag' => "div",
    '#attributes' => ['class' => ['context-menu']],
    '#value' => "Dashboard",
  ];

  $sample['#attached']['library'][] = 'mylibrary/dashboard-js'; $sample['#attached']['drupalSettings']['dashboard']['myVariables'] = $modalSettings; $response->addCommand(new ReplaceCommand('.context-menu', $sample)); return $response;
}

Cuando intento acceder a drupalSettings.dashboard.myVariables que he confirmado que ya funciona cuando uso la función de adjuntar página, no funciona cuando uso llamadas ajax. En su lugar, obtengo myVariables no está definida.

En la consola logré drupalSettings y, efectivamente, mis variables no se encuentran allí. ¿Cómo puedo agregarlo? ¿La página adjunta es la única forma de hacer esto?

Respuestas

4 NoSssweat Oct 02 2020 at 05:11

Utilice el comando de configuración

$settings=['ajax_forms_test' => ['foo' => 42]]; /* An array of key/value pairs of JavaScript settings. */ $merge=TRUE; /* (Optional) Booleen Whether the settings should be merged into the global drupalSettings. */
$response->addCommand(new SettingsCommand($settings,$merge));

Entonces su código se convertiría en algo como esto:

public static function AddAJAXResponseCommands(AjaxResponse $response = NULL, array $params = []) { $modalSettings = [
    'id' => 1,
    'status' => true,
  ];

  $sample = [ '#type' => "html_tag", '#tag' => "div", '#attributes' => ['class' => ['context-menu']], '#value' => "Dashboard", ]; $sample['#attached']['library'][] = 'mylibrary/dashboard-js';
  $merge = TRUE; $settings['dashboard']['myVariables'] = $modalSettings; $response = new AjaxResponse();
  $response ->addCommand(new ReplaceCommand('.context-menu', $sample))
    ->addCommand(new SettingsCommand($settings, $merge));
  return $response;
}