Điểm:1

Bằng cách nào đó đăng ký/phản ứng với addMessage

lá cờ cn

Tôi đang cố gắng tìm một sự kiện mà tôi có thể đăng ký cho phương thức addMessage.

Tôi cần kích hoạt một số mã mỗi khi thêm thông báo trạng thái. Khi phản ứng với sự kiện này, tôi cần gửi một biến từ php sang JS. Tôi không thể tìm thấy một sự kiện để đăng ký nên thay vào đó tôi đã sử dụng một quy trình tiền xử lý bên dưới.

<?php
function mymodule_pre process_status_messages(&$variables) {
  $variables['#attached']['drupalSettings']['send_me_to_js']['_variable'] = 'Chuyển tới js...';
}

Quá trình tiền xử lý này chạy mỗi khi addMessage được sử dụng và một thông báo trạng thái được hiển thị, nhưng biến mà tôi cần gửi tới JS, không phải lúc nào cũng được gửi.

Ví dụ: điều này hoạt động đối với các thông báo được tạo từ lõi và tôi nhận được biến trong JS. Nhưng khi Drupal Commerce sử dụng addMessage (ví dụ: khi thêm sản phẩm vào giỏ hàng trong thiết lập ajax), quy trình tiền xử lý sẽ chạy, thông báo trạng thái hiển thị nhưng biến không có sẵn trong JS.

Đây là javascript:

(hàm ($, Drupal, drupalSettings) {

  Drupal.behaviors.alwave_alerts = {
    đính kèm: chức năng (bối cảnh, cài đặt) {
      
      $('.my-class', context).once('unique-string').each(function () { 
        
        // Chạy sau mỗi lệnh gọi ajax
        $(tài liệu).ajaxComplete(hàm () {
          
          // Điều này đôi khi không được xác định mặc dù tiền xử lý ở trên chạy
          // và có một thông báo trạng thái trên màn hình
          // (ví dụ: khi thương mại tạo thông báo trạng thái)
          console.log(settings.send_me_to_js);

        });
          
      });
  
    }
  };
  
}(jQuery, Drupal, drupalSettings));

Phải có một cách dễ dàng?

Cập nhật:

Tôi phát hiện ra rằng tiền xử lý không chỉ gửi biến tới javascript theo yêu cầu ajax. Khi tải trang đầu tiên, nó được gửi, nhưng các yêu cầu ajax tiếp theo không gửi biến này tới JS. Có vẻ là trình tự thứ tự trong đó mọi thứ được thực thi trong các yêu cầu ajax.

Vì vậy, câu hỏi là, Làm cách nào để tôi gửi một biến tới JS từ tiền xử lý này trên các cuộc gọi ajax?

Jaypan avatar
lá cờ de
Bạn đã không thực sự cho chúng tôi biết bạn đang cố gắng làm gì, chỉ cho chúng tôi biết bạn đang cố gắng làm điều đó như thế nào. Mục tiêu tổng thể của bạn ở đây là gì?
hga77 avatar
lá cờ cn
Biến không có sẵn trong JS trên các cuộc gọi ajax. Làm cách nào tôi có thể tạo một biến từ tiền xử lý này có sẵn trong JS trong các cuộc gọi ajax? Nói cách khác, khi một thông báo trạng thái được tạo trong một cuộc gọi ajax, hàm "mymodule_pre process_status_messages" này sẽ chạy và bên trong nó là một biến mà tôi cần có sẵn trong JS, $variables['message_list'].Làm cách nào để tôi cung cấp biến này trong JS từ yêu cầu ajax (không phải htmlrequest hoặc tải trang ban đầu)? Biến được truyền trong htmlrequest chứ không phải các cuộc gọi ajax tiếp theo. Nó không được xác định trong các yêu cầu ajax trong JS.
Jaypan avatar
lá cờ de
Trường hợp sử dụng là gì?
hga77 avatar
lá cờ cn
@Jaypan, tôi cần biến $variables['message_list'] trong JS để tôi có thể thay thế các chuỗi trạng thái và tạo chúng dưới dạng cửa sổ bật lên nổi, sử dụng thư viện javascript của bên thứ ba. Không cần mẫu status_masseges vì ​​đánh dấu đến từ thư viện. Thư viện này cần lấy dữ liệu tin nhắn để tạo tin nhắn, do đó tôi cần cung cấp cho nó biến này.
Jaypan avatar
lá cờ de
Trước đây, tôi đã thiết lập thông báo trạng thái nổi bằng cách thay đổi mẫu để khớp với đầu ra, sau đó tạo tệp JS gọi JS để biến thông báo thành cửa sổ bật lên bằng cách sử dụng Drupal.behaviors. Nhưng có vẻ như bạn đang cố gắng thực hiện theo cách bạn đang cố gắng, rất tiếc là tôi không có câu trả lời cho phương pháp bạn đang cố gắng thực hiện, tôi chỉ biết mình đã làm như thế nào.
hga77 avatar
lá cờ cn
@Jaypen, Cảm ơn bạn đã trả lời. Tôi đã giải quyết vấn đề này và sẽ sớm thêm câu trả lời. Tôi đang trong quá trình đóng góp mô-đun, Đây là trang dự án https://www.drupal.org/project/shoelace_messages
Điểm:0
lá cờ cn

Tôi quản lý để giải quyết vấn đề này. Về cơ bản, vấn đề là tôi không thể chuyển một biến từ hàm tiền xử lý sang JavaScript trong các yêu cầu AJAX (như đã đề cập nhiều lần trong vấn đề này). Vì vậy, những gì tôi đã làm:

  1. Trong quá trình tiền xử lý, tôi đặt một biến lưu trữ tạm thời riêng tư để sử dụng sau này trong các yêu cầu AJAX.
  2. Lệnh gọi lại AJAX tùy chỉnh đã được tạo để chấp nhận biến và gọi hàm JavaScript, hàm này sẽ nhận biến đó.
  3. Sau đó, tôi đăng ký một sự kiện phản hồi chạy theo mọi yêu cầu. Sự kiện này là KernelEvents::RESPONSE.
  4. Bên trong trình xử lý cho sự kiện này, tôi kiểm tra xem chúng ta có đang ở trong một yêu cầu AJAX không, sau đó truy xuất biến từ kho tạm thời đã được đặt trước đó.
  5. Tôi sử dụng Lệnh AJAX tùy chỉnh, cung cấp cho nó biến tạm thời, biến này sẽ gửi nó tới JavaScript. Xong!

Bạn có thể tìm thấy mã hoàn chỉnh trong mô-đun này: https://www.drupal.org/project/shoelace_messages

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.