como enviar variável do arquivo .php para o arquivo .js?

37

Espero que alguém seja capaz de me ajudar. O problema é o seguinte: 1) Eu tenho um módulo no qual atribui a variável para enviar ao arquivo de modelo php.tpl

<?php
...
$testvar="Hello from alex!";
$variables['testvar'] = $testvar; 
...
?>

Essa variável pode ser mostrada no arquivo php.tpl como

<?php print $testvar?>

2) Separei o arquivo .js Como posso obter acesso a esse arquivo .js variável dentro?

Eu sei como será se o arquivo .js estiver dentro de .php.tpl:

<?php
$testvar="Hello from alex!";
?>
<script type="text/javascript">
var myVar = '<?php print $testvar?>';
</script>

O problema é como fazer o mesmo se esses dois arquivos .js e .php.tpl estiverem separados?

Alexey
fonte
2
não faça eco cegamente de uma variável para Javascript. Se houver algum metacaractere Javascript (aspas simples, especialmente), você introduzirá erros de sintaxe. Faça o var myVar = <?php echo json_encode($testvar) ?>;que resolverá esses problemas para você, independentemente do tipo de dados / conteúdo do PHP var.
Lista de Drupal 7 js dicas e truques browse-tutorials.com/tutorial/javascript-drupal-7
ram4nd

Respostas:

65

Você deve usar drupal_add_js()em seu módulo, não há necessidade de gerar a variável em seu .tpl.php:

drupal_add_js(array('YOURMODULE' => array('testvar' => $testvar)), array('type' => 'setting'));

E no seu JavaScript, você pode acessar o valor em Drupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

O uso direto de variáveis ​​globais (conforme sugerido no seu exemplo de código) é uma prática desencorajada em JavaScript, pois desorganiza o espaço de nomes global . Além disso, se o seu código for acionado no carregamento da página, verifique a seção "Comportamentos" na documentação do JavaScript no Drupal 7 (vale a pena ler a página inteira).

Pierre Buyle
fonte
17

No seu arquivo MODULENAME.module, use o seguinte código.

$testVariable = 'himanshu';
drupal_add_js(array('MODULENAME' => array('testvar' => $testVariable)), array('type' => 'setting'));
drupal_add_js(drupal_get_path('module', 'MODULENAME') . '/MODULENAME.js');

E no MODULENAME.js, use o seguinte.

(function($) {
  Drupal.behaviors.MODULENAME = {
    attach: function (context, settings) {
      alert(settings.MODULENAME.testvar);
    }
  };

})(jQuery);

Dessa forma, você pode passar sua variável PHP para JavaScript e usá-la.

Himanshu Pathak
fonte
O que a função faz e quando é acionada? Por que não usar diretamente o Drupal.settings.YOURMODULE.testvar?
Incrível
5

Para o Drupal 8 , drupal_add_js()foi removido (já foi reprovado no Drupal 7) => veja isso para obter mais informações .

A maneira de enviar informações PHP para Javascript é perfeitamente descrita pela resposta de @ 4k4 a uma pergunta semelhante.

return [
  '#theme' => 'item_list',
  '#list_type' => 'ul',
  '#items' => $my_items,
  '#attributes' => ['class' => 'some_class'],
  '#attached' => [
    'library' => ['my_module/my_library'],
    'drupalSettings' => [
      'my_library' => [
        'some_variable1' => $value,        // <== Variables passed
        'another_variable' => $take_this,  // <== 
      ],
    ],
  ],
];

Em JavaScript, eles podem ser usados ​​da seguinte maneira:

(function ($, Drupal, drupalSettings) {
  Drupal.behaviors.my_library = {
    attach: function (context, settings) {

      alert(drupalSettings.my_library.some_variable); //alerts the value of PHP's $value

    }
  };
})(jQuery, Drupal, drupalSettings);
Florian Müller
fonte
Vale ressaltar que no *.libraries.ymltambém deve haver uma dependência definida - core/drupalSettings.
Leymannx # 23/18