Informações sobre Drupal.settings e #attached

8

Estou tentando usar o Drupal.settings pela primeira vez para passar variáveis ​​do PHP para JavaScript. A documentação sobre o tópico é escassa e tenho alguns problemas.

É possível usar #attached para passar pelas configurações e não drupal_add_js(array('myModule' => $settings), 'setting');? A razão pela qual estou perguntando é que me disseram que essa #attachedé a maneira "correta" de adicionar configurações. (Eu sei que também é a maneira correta de adicionar arquivos, mas não tenho certeza se funciona com variáveis ​​de configuração.)

Estou usando o código a seguir, mas não consigo carregá-lo sob os objetos DOM e estou travado.

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

Qualquer conselho seria muito apreciado. Lembre-se de que é a primeira vez que decidi usar o Drupal.settings, para que todos os detalhes sejam bem-vindos e apreciados.

Plutão
fonte

Respostas:

6

#attached pode ser usado da seguinte maneira.

$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',
);

Com drupal_add_js(), você pode usar o seguinte código.

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

Em um arquivo JavaScript, você pode obter o valor das variáveis ​​da seguinte maneira.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };
harshal
fonte
Obrigado, não está confinado ao escopo de um formulário $, para JS em todas as páginas não devo usar hook_page_alter; $ page ['cabeçalho'] ['# anexado'] ['js'] etc.?
Plutão
além de ter mencionado acima sobre arquivos, minha pergunta está relacionada ao Drupal.settings, ou seja, passando variáveis ​​e matrizes do PHP.
Plutão
você pode verificar a resposta atualizada
harshal
Mais uma vez obrigado, mas o que não consigo entender é por que esses exemplos sempre usam $ form, e sobre matrizes de renderização e adição de js em todas as páginas?
Plutão
Para expandir, quando adicionei arquivos js usando $ form / # em anexo, eles foram carregados apenas dentro da matriz $ form.
Plutão
2

Muito obrigado pelas respostas postadas.

Como mencionado na pergunta original, o problema não era como carregar arquivos CSS e JS usando #attached, mas como passar variáveis ​​para Drupal.settings usando #attached e não drupal_add_js (). Existem problemas de práticas recomendadas em torno do drupal_add_js com relação ao cache e disponibilidade no DOM.

Depois de algumas pesquisas, tenho a solução. O exemplo a seguir usa #attached para carregar um arquivo JS AND para passar variáveis ​​PHP anexando-as à matriz $ page (matriz de renderização).

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',
   ),
);
}

Portanto, a razão pela qual desejo fazer isso é que desejo passar estados variáveis ​​do PHP / Drupal para um arquivo jQuery, como booleanos etc. Com o exemplo acima, agora posso acessar esse 'estado' usando:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Tudo isso é feito sem tocar em drupal_add_js ();

Plutão
fonte