it-swarm.com.de

Wie übergebe ich PHP Variablen an Javascript / jQuery?

Ich habe diesen Weg gefunden, um Variablen von PHP an Javascript) zu senden.

In der template.tpl.php Datei, ich habe den folgenden Code.

<?php 
  echo '<div class="drupal-vars" style="display:none;">'.json_encode($variables).'</div>';
?>

In Javascript habe ich den folgenden Code:

(function ($) {
  $(document).ready(function() { 
      var variables = jQuery.parseJSON($('.drupal-vars').html()); 
      //Remove if youwant to clean the code.
      $('.drupal-vars').remove();
  });

}(jQuery));

Ich habe eine andere Lösung gefunden, aber sie ist komplizierter, obwohl sie möglicherweise besser strukturiert ist.

  1. Gibt es einen besseren Weg, dies zu tun?
  2. Wie hässlich ist das, was ich hier mache?

Das Tutorial sieht so aus:

Ich beginne mit der Erstellung einer Implementierung von hook_menu (), um einen Seitenrückruf einzurichten:

<?php
function helper_menu() {

  $items = array();

  $items['js-vars'] = array(
    'title' => t('Javascript Variables'),
    'description' => t('Javascript Variables'),
    'page callback' => 'helper_page_callback_js_vars',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,    
  );

  return $items;

}
?>

Als nächstes definiere ich den Seitenrückruf:

<?php
function helper_page_callback_js_vars() {

  // include module javascript file
  drupal_add_js(drupal_get_path('module','helper') . '/js/helper.js');

  // define variables you'd like to pass to the DOM
  $js_vars = array(
    'js_vars' => array(
      'message' => t('Hello @username', array('@username' => $GLOBALS['user']->name)),
      'an_array' => array(
        'color' => t('red'),
        'name' => t('Eric'),
      ),
    ),
  );

  // pass variables to javascript
  drupal_add_js($js_vars, 'setting');

  // generate some page output
  return "TEST";

}
?>

Und hier ist der Inhalt der Javascript-Include-Datei, die ich in meinem Modulverzeichnis festgehalten habe:

$(document).ready(function(){

  // debug variables directly in FireBug
  console.debug(Drupal.settings.js_vars);

  // popup mesage passed from Drupal
  alert(Drupal.settings.js_vars.message);

});
7
Xavi Colomer

Verwenden Sie besser drupal_add_js() , um Ihr Objekt im JS Drupal.settings - Objekt zu übergeben:

// In PHP:
drupal_add_js(array('myModule' => array('variables' => $variables)), 'setting');

// In JS
var variables = Drupal.settings.myModule.variables;

Drupal verarbeitet alle Konvertierungen von Objekten/Arrays intern, und dies ist nur eine viel sauberere Methode. Im Moment schließen Sie unformatiertes JSON als Teil der Seitenausgabe ein, was in Bezug auf die Semantik nicht besonders gut ist. Denken Sie auch daran, dass Suchmaschinen diesen Text aufnehmen, obwohl Sie ihn für Benutzer mit Javascript verstecken.

Ich würde auch empfehlen, diese Logik von der Vorlagendatei selbst zu trennen und sie in eine template_preprocess_ - Funktion in der template.php - Datei Ihres Themas einzufügen ... wieder ist es nur sauberer. z.B.

function MYTHEME_preprocess_html(&$vars) {
  $variables = $your_variables;
  drupal_add_js(array('myModule' => array('variables' => $variables)), 'setting');
}

Schauen Sie sich den Link zur Funktion drupal_add_js() an, es gibt ziemlich viele Optionen, und Sie werden sie wahrscheinlich sehr nützlich finden.

16
Clive

In anderen Fällen können Sie auch die Funktion drupal_to_js verwenden. Es konvertiert eine PHP Variable) in ihr Javascript-Äquivalent.

<?php
  $php_settings = array(
    'key1' => 'value1',
    'key2' => 'value2',
  );
?>
<script type="text/javascript">
  var phpSettings = <?php echo drupal_to_js($php_settings); ?>
</script>
1
Jekis

ein Beispiel zum Konvertieren von Knotendaten in ein js-Objekt:

in template.php

function mythemename_preprocess_node(&$variables){  
     drupal_add_js(array('node' => $variables['node']), 'setting');
}

in der page.tpl.php

  var node = Drupal.settings.node; 
 // console.log(node);
1
Matoeil