วิธีการส่งตัวแปรจากไฟล์. php ไปยังไฟล์. js


37

ฉันหวังว่าจะมีคนสามารถช่วยฉันได้ ปัญหาคือหนึ่งต่อไปนี้: 1) ฉันมีโมดูลที่กำหนดตัวแปรเพื่อส่งไปยังไฟล์แม่แบบ php.tpl

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

ตัวแปรนี้สามารถแสดงในไฟล์ php.tpl เช่น

<?php print $testvar?>

2) ฉันได้แยกไฟล์. js แล้วฉันจะเข้าถึงไฟล์ที่มีค่านี้ได้อย่างไรภายในไฟล์. js

ฉันรู้ว่ามันจะเป็นอย่างไรถ้าไฟล์. js อยู่ภายใน. php.tpl:

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

ปัญหาคือวิธีการทำเช่นเดียวกันหากทั้งสองไฟล์. js และ. php.tpl ถูกแยกออกจากกัน?


2
อย่าสุ่มสี่สุ่มห้าออกเสียงตัวแปรใน Javascript หากมี metacharacters Javascript ใด ๆ (ราคาเดียวโดยเฉพาะ) คุณจะแนะนำข้อผิดพลาดทางไวยากรณ์ ทำvar myVar = <?php echo json_encode($testvar) ?>;ซึ่งจะดูแลปัญหาดังกล่าวให้คุณโดยไม่คำนึงถึงชนิดข้อมูล / เนื้อหาของ PHP var

รายการเคล็ดลับและเทคนิคของ Drupal 7 js Browse-tutorials.com/tutorial/javascript-drupal-7
ram4nd

คำตอบ:


65

คุณควรใช้drupal_add_js()ในโมดูลของคุณไม่จำเป็นต้องเอาท์พุทของตัวแปรใน.tpl.php:

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

และใน JavaScript ของคุณคุณสามารถเข้าถึงค่าในDrupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

การใช้งานโดยตรงของตัวแปรทั่วโลก (ตามข้อเสนอแนะในตัวอย่างของรหัสของคุณ) คือการปฏิบัติที่ท้อแท้ใน JavaScript เป็นมันถ่วง namespace นอกจากนี้หากรหัสของคุณถูกเรียกใช้ในการโหลดหน้าให้ตรวจสอบส่วน "พฤติกรรม" ในการจัดการ JavaScript ในเอกสารDrupal 7 (ทั้งหน้ามีค่าการอ่าน)


17

ในไฟล์ MODULENAME.module ของคุณให้ใช้รหัสต่อไปนี้

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

และใน MODULENAME.js ใช้สิ่งต่อไปนี้

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

})(jQuery);

ด้วยวิธีนี้คุณสามารถส่งตัวแปร PHP ของคุณไปยัง JavaScript และใช้งานได้


ฟังก์ชั่นทำอะไรและเมื่อไรที่มันถูกกระตุ้น? ทำไมไม่ใช้ Drupal.settings.YOURMODULE.testvar โดยตรง
เหลือเชื่อ

5

สำหรับDrupal 8 , drupal_add_js()ถูกลบออก (มันถูกคัดค้านใน Drupal 7 แล้ว) => ดูนี้สำหรับข้อมูลเพิ่มเติม

วิธีการส่งข้อมูล PHP ไปยัง Javascript นั้นมีการอธิบายอย่างสมบูรณ์แบบโดยคำตอบของ @ 4k4สำหรับคำถามที่คล้ายกัน

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,  // <== 
      ],
    ],
  ],
];

ใน JavaScript สามารถใช้ดังนี้:

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

คุ้มค่าที่จะพูดถึงว่าในนอกจากนี้ยังควรจะพึ่งพาการกำหนดให้*.libraries.yml - core/drupalSettings
leymannx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.