Comment envoyer une variable d'un fichier .php à un fichier .js?

37

J'espère que quelqu'un pourra m'aider. Le problème est le suivant: 1) J'ai un module dans lequel un attribuer la variable afin d'envoyer au fichier de modèle php.tpl

<?php
...
$testvar="Hello from alex!";
$variables['testvar'] = $testvar; 
...
?>

Cette variable peut être affichée dans le fichier php.tpl comme

<?php print $testvar?>

2) J'ai un fichier .js séparé. Comment puis-je accéder à ce fichier variable dans le fichier .js?

Je sais comment ça se passera si le fichier .js est à l'intérieur du fichier .php.tpl:

<?php
$testvar="Hello from alex!";
?>
<script type="text/javascript">
var myVar = '<?php print $testvar?>';
</script>

Le problème est comment faire la même chose si ces deux fichiers .js et .php.tpl sont séparés?

Alexey
la source
2
n'échangez pas aveuglément une variable en Javascript. S'il existe des métacaractères Javascript (guillemets simples, en particulier), vous introduirez des erreurs de syntaxe. Faites var myVar = <?php echo json_encode($testvar) ?>;ce qui s’occupe de ces problèmes pour vous, quel que soit le type de données / le contenu de la variable PHP.
Liste des Drupal 7 conseils js et astuces browse-tutorials.com/tutorial/javascript-drupal-7
ram4nd

Réponses:

65

Vous devriez utiliser drupal_add_js()dans votre module, il n'est pas nécessaire de sortir la variable dans votre .tpl.php:

drupal_add_js(array('YOURMODULE' => array('testvar' => $testvar)), array('type' => 'setting'));

Et dans votre JavaScript, vous pouvez accéder à la valeur en Drupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

L'utilisation directe de variables globales (comme suggéré dans votre exemple de code) est une pratique déconseillée en JavaScript car elle encombre l'espace de noms global . De plus, si votre code est déclenché au chargement de la page, consultez la section "Comportements" de la rubrique Gestion de JavaScript dans la documentation de Drupal 7 (la page entière mérite d'être lue).

Pierre Buyle
la source
17

Dans votre fichier MODULENAME.module, utilisez le code suivant.

$testVariable = 'himanshu';
drupal_add_js(array('MODULENAME' => array('testvar' => $testVariable)), array('type' => 'setting'));
drupal_add_js(drupal_get_path('module', 'MODULENAME') . '/MODULENAME.js');

Et dans MODULENAME.js, utilisez le suivant.

(function($) {
  Drupal.behaviors.MODULENAME = {
    attach: function (context, settings) {
      alert(settings.MODULENAME.testvar);
    }
  };

})(jQuery);

De cette façon, vous pouvez passer votre variable PHP à JavaScript et l'utiliser.

Himanshu Pathak
la source
Que fait la fonction et quand est-elle déclenchée? Pourquoi ne pas utiliser directement Drupal.settings.YOURMODULE.testvar?
Incroyable
5

Pour Drupal 8 , a drupal_add_js()été supprimé (il était déjà obsolète dans Drupal 7) => voir ceci pour plus d’informations .

Le moyen d'envoyer des informations PHP sur Javascript est parfaitement décrit par la réponse de @ 4k4 à une question similaire.

return [
  '#theme' => 'item_list',
  '#list_type' => 'ul',
  '#items' => $my_items,
  '#attributes' => ['class' => 'some_class'],
  '#attached' => [
    'library' => ['my_module/my_library'],
    'drupalSettings' => [
      'my_library' => [
        'some_variable1' => $value,        // <== Variables passed
        'another_variable' => $take_this,  // <== 
      ],
    ],
  ],
];

En JavaScript, ils peuvent être utilisés comme suit:

(function ($, Drupal, drupalSettings) {
  Drupal.behaviors.my_library = {
    attach: function (context, settings) {

      alert(drupalSettings.my_library.some_variable); //alerts the value of PHP's $value

    }
  };
})(jQuery, Drupal, drupalSettings);
Florian Müller
la source
*.libraries.ymlIl convient de mentionner que dans le, il devrait également y avoir une dépendance définie pour - core/drupalSettings.
leymannx