有关Drupal.settings和#attached的信息


8

我试图第一次使用Drupal.settings将变量从PHP传递到JavaScript。关于该主题的文档很少,我遇到了一些问题。

是否可以使用#attached通过设置而不是通过设置drupal_add_js(array('myModule' => $settings), 'setting');?我问的原因是,有人告诉我这#attached是添加设置的“正确”方法。(我知道这也是添加文件的正确方法,但不确定是否可以与设置变量一起使用。)

我正在使用下面的代码,但是无法将其加载到DOM对象下,并且被卡住了。

(function ($) {
   Drupal.behaviors.myModule = {
     attach: function(context, settings) {}
   };
});(jQuery);

任何建议将不胜感激。请记住,这是我第一次开始使用Drupal.settings,因此欢迎并赞赏每个细节。

Answers:


6

#attached可以如下使用。

$form['#attached']['js'][] = array(
  'data' => array(
    'xx_system' => array(
        'xx_code' => variable_get('xx_code', 'xx'),
        'xx_key' => variable_get('xx_key', 'xx'),
      ),
    ),
  'type' => 'setting',
);

使用drupal_add_js(),您可以使用以下代码。

 drupal_add_js(array('orgs' => $orgs), array('type' => 'setting'));
 drupal_add_js(drupal_get_path('module', 'module_name') . '/module_name.js');

在JavaScript文件中,您可以按以下方式获取变量的值。

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };

谢谢,不是仅限于$ form的范围,因为在每个页面中的JS我都不应将hook_page_alter与 $ page ['header'] ['#attached'] ['js']等?
2013年

除了我上面提到的关于文件的内容外,我的问题还涉及Drupal.settings,即传递PHP变量和数组。
2013年

您可以检查更新的答案
严厉的

再次感谢,但是我不明白的是为什么这些示例总是使用$ form,渲染数组并将js添加到每个页面呢?
2013年

为了扩展,当我使用$ form /#attached添加js文件时,它们仅加载在$ form数组中。
2013年

2

非常感谢您的回复。

正如原始问题中提到的那样,问题不在于如何使用#attached加载CSS和JS文件,而是如何使用#attached而不是drupal_add_js()将变量传递到Drupal.settings。关于drupal_add_js,在DOM下的缓存和可用性方面存在最佳实践问题。

经过研究后,我找到了解决方案。#attached下面的示例使用加载JS文件通过将其附加到$页面阵列(渲染阵列)来传递PHP变量。

hook_page_alter() {

  $my_PHP_variable  // or array of variables

  $page['header']['#attached']['js'] = array(
    drupal_get_path('module', 'mymodule') . '/js/mymodule.js' => array(),
    array(
      // Pass PHP variables to Drupal.settings.
      'data' => array('myModuleVarSet' => $my_PHP_variable),
      'type' => 'setting',
   ),
);
}

因此,我要这样做的原因是我想将变量状态从PHP / Drupal传递到jQuery文件(例如布尔值等)。通过上面的示例,我现在可以使用以下方式访问该“状态”:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

无需触摸drupal_add_js()即可完成所有操作;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.