Информация о 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, поэтому каждая деталь приветствуется и ценится.

Плутон
источник

Ответы:

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
    }
  };
harshal
источник
Спасибо, разве это не ограничивается областью $ формы, для JS на каждой странице не следует использовать hook_page_alter с; $ page ['header'] ['# attach'] ['js'] и т. д.?
Плутон
кроме того, что я упоминал выше о файлах, мой вопрос касается Drupal.settings, то есть прохождения через PHP переменных и массивов.
Плутон
Вы можете проверить обновленный ответ
Harshal
Еще раз спасибо, но я не могу понять, почему в этих примерах всегда используется $ form, как насчет массивов рендеринга и добавления js на каждую страницу?
Плутон,
Чтобы развернуть, когда я добавил js-файлы, используя присоединенный $ form / #, они загружались только в массив $ form.
Плутон
2

Большое спасибо за ответы размещены.

Как упоминалось в первоначальном вопросе, проблема заключалась не в том, как загрузить файлы CSS и JS с помощью #attached, а в том, как передать переменные в Drupal.settings с помощью #attached, а не drupal_add_js (). Есть дружественные проблемы, связанные с drupal_add_js в отношении кэширования и доступности в DOM.

После некоторых исследований у меня есть решение. В следующем примере используется #attached для загрузки JS-файла И для передачи переменных PHP через присоединение их к массиву $ page (массив визуализации).

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 ();

Плутон
источник