Thông tin về Drupal.sinstall và #attached


8

Tôi đang cố gắng sử dụng Drupal.sinstall lần đầu tiên để chuyển các biến từ PHP sang JavaScript. Các tài liệu về chủ đề này rất thưa thớt và tôi có một vài vấn đề.

Có thể sử dụng #attached để chuyển qua các cài đặt chứ không phải drupal_add_js(array('myModule' => $settings), 'setting');? Lý do tôi hỏi là tôi đã nói rằng đó #attachedlà cách "chính xác" để thêm cài đặt. (Tôi biết đó cũng là cách chính xác để thêm tệp, nhưng không chắc nó có hoạt động với các biến cài đặt không.)

Tôi đang sử dụng đoạn mã sau, nhưng tôi không thể tải nó dưới các đối tượng DOM và tôi bị kẹt.

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

Bất kỳ lời khuyên sẽ được đánh giá rất cao. Xin lưu ý rằng đây là lần đầu tiên tôi bắt đầu sử dụng Drupal.sinstall, vì vậy mọi chi tiết đều được chào đón và đánh giá cao.

Câu trả lời:


6

#attached có thể được sử dụng như sau.

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

Với drupal_add_js(), bạn có thể sử dụng mã sau đây.

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

Trong tệp JavaScript, bạn có thể nhận giá trị của các biến như sau.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };

Cảm ơn, Không phải điều đó chỉ giới hạn trong phạm vi của biểu mẫu $, đối với JS trong mỗi trang tôi không nên sử dụng hook_page_alter với; $ page ['tiêu đề'] ['# đính kèm'] ['js'], v.v.?
Sao Diêm Vương

ngoài ra tôi đã đề cập ở trên về các tệp, câu hỏi của tôi liên quan đến Drupal.sinstall, tức là chuyển các biến và mảng PHP qua.
Sao Diêm Vương

bạn có thể kiểm tra câu trả lời được cập nhật
khắc nghiệt

Cảm ơn một lần nữa, nhưng điều tôi không thể hiểu là tại sao những ví dụ này luôn sử dụng biểu mẫu $, còn mảng kết xuất và thêm js vào mỗi trang thì sao?
Sao Diêm Vương

Để mở rộng, khi tôi đã thêm các tệp js bằng cách sử dụng $ form / #, chúng chỉ được tải trong mảng $ form.
Sao Diêm Vương

2

Rất cám ơn cho các phản hồi được đăng.

Như đã đề cập trong câu hỏi ban đầu, vấn đề không phải là làm thế nào để tải các tệp CSS & JS bằng cách sử dụng #attached, mà là làm thế nào để chuyển các biến qua Drupal.sinstall bằng cách sử dụng #attached và không phải drupal_add_js (). Có các vấn đề thực tiễn tốt nhất xung quanh drupal_add_js liên quan đến bộ nhớ đệm và tính khả dụng trong DOM.

Sau một số nghiên cứu tôi có giải pháp. Ví dụ sau sử dụng #attached để tải tệp JS để truyền các biến PHP thông qua việc gắn chúng vào mảng $ page (kết xuất mảng).

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

Vì vậy, lý do tôi muốn làm điều này là vì tôi muốn chuyển các trạng thái biến từ PHP / Drupal sang tệp jQuery, chẳng hạn như booleans, v.v. Với ví dụ trên, bây giờ tôi có thể truy cập vào 'trạng thái' đó bằng cách sử dụng:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Tất cả điều này được thực hiện mà không cần chạm vào drupal_add_js ();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.