Après avoir validé avec javascript que je pourrai utiliser l'emplacement client:
if (navigator.geolocation) {
...
J'ai besoin de charger le contenu d'un bloc de vue avec des arguments (basés sur les coordonnées de position). Je sais comment obtenir le code HTML que je veux mettre à l'intérieur du div, donc au moins j'ai cette partie.
J'ai essayé de suivre Simple Drupal AJAX chargement avec jQuery et rappel de livraison article (c'est-à-dire pour Drupal 7 très différent de Drupal 8) mais je viens d'arriver pour charger une page dans un div (avec en-têtes et pied de page très loin de mon véritable objectif).
jQuery('#my-div').load('/admin/help');
Des idées sur la façon de charger du contenu dans un div avec ajax?
J'ai trouvé une solution de travail. Ce n'est peut-être pas la meilleure approche, mais cela fonctionne.
Vous devez créer votre fichier de routage:
mon_module.routing.yml
diocese_core.path_with_data:
path: 'path-with-data'
defaults:
_controller: '\Drupal\my_module\Controller\MyController::Render'
requirements:
_access: 'TRUE'
Création du contrôleur pour votre page
src/Controller/MyController.php
<?php
namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use \Symfony\Component\HttpFoundation\Response;
/**
* An example controller.
*/
class MyController extends ControllerBase {
/**
* {@inheritdoc}
*/
public function Render() {
$build = array(
'#type' => 'markup',
'#markup' => t('Hello World!'),
);
// This is the important part, because will render only the TWIG template.
return new Response(render($build));
}
}
Et il vous suffit d'appeler javascript
jQuery('#my-div').load('path-with-data');
Ce sera la sortie une fois le code exécuté:
<div id="my-div">Hello World!</div>
Références:
C'est exactement ce dont vous avez besoin.
var endpoint = Drupal.url('modal/get-content');
Drupal.ajax({ url: endpoint }).execute();
où point final est l'URL de votre itinéraire. Vous avez donc un contrôleur pour votre itinéraire et ce contrôleur a AjaxResponse
public function getContent($modal_id) {
$response = new AjaxResponse();
$selector = '.modal.in .modal-body';
// You can use markup, rendreable array, getForm via form_builder service.
$content = [
'#markup' => '....',
];
$response->addCommand(new InvokeCommand($selector, 'removeClass', ['spinner-loading']));
$response->addCommand(new HtmlCommand($selector, $content));
return $response;
}
Ajoutez ce dont vous avez besoin à votre tableau de génération et pour effectuer le rendu sans le modèle de page, vous pouvez passer à un nouvel objet Response:
$build['view'] = [
'#type' => 'view',
'#name' => 'my_view',
'#display_id' => 'block_1',
'#arguments' => $view_arguments,
];
$rendered = \Drupal::service('renderer')->renderRoot($build);
$response = new Response();
$response->setContent($rendered);
return $response;
J'ai cherché la même solution et j'ai été très surpris que d'une manière drupal nous ayons besoin d'une seule ligne de code:
Drupal.ajax({ url: endpoint }).execute();