Drupal.settingsと#attachedに関する情報


8

PHPからJavaScriptに変数を渡すために、初めてDrupal.settingsを使用しようとしています。このトピックに関するドキュメントはまばらで、いくつか問題があります。

代わりに#attachedを使用して設定を通過させることは可能drupal_add_js(array('myModule' => $settings), 'setting');ですか?私が尋ねる理由#attachedは、それが設定を追加する「正しい」方法であると言われたからです。(私はそれがファイルを追加する正しい方法でもあることを知っていますが、それが設定変数で機能するかどうかはわかりません。)

次のコードを使用していますが、DOMオブジェクトの下にロードできず、行き詰まっています。

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

何かアドバイスをいただければ幸いです。Drupal.settingsを使用するのは今回が初めてなので、細部まで歓迎し、感謝しています。

回答:


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
    }
  };

おかげで、それは$フォームのスコープに限定されていません。すべてのページのJSで、私はhook_page_alterを使用しないでください。$ page ['header'] ['#attached'] ['js']など?
冥王星

上記でファイルについて述べた以外に、私の質問はDrupal.settings、つまりPHP変数と配列を渡すことに関するものです。
冥王星

あなたは更新された答えをチェックすることができます
harshal

改めて感謝しますが、これらの例では常に$ formを使用している理由を理解できません。レンダー配列とすべてのページにjsを追加するのはどうですか
冥王星

展開すると、$ form /#attachedを使用してjsファイルを追加したとき、それらは$ form配列内にのみロードされています。
冥王星

2

投稿された回答に感謝します。

元の質問で述べたように、問題は#attachedを使用してCSSおよびJSファイルをロードする方法ではなく、drupal_add_js()ではなく#attachedを使用して変数をDrupal.settingsに渡す方法でした。DOMでのキャッシングと可用性に関して、drupal_add_jsに関するベストプラクティスの問題があります。

いくつかの研究の後、私は解決策を持っています。次の例の用途には、JSファイルをロードするために#attached $のページ配列(配列をレンダリング)にそれらを取り付けることによって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();に触れることなく行われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.