Làm thế nào để tạo cửa sổ phương thức (cửa sổ bật lên)?


10

Tôi đang cố gắng sử dụng chức năng cốt lõi của Drupal 8 để mở một trang trong cửa sổ phương thức. Thật không may, rất khó để tìm thấy một số tài liệu chính thức về nó, và hầu hết các blog về chủ đề này dường như đã lỗi thời. Nhưng theo như tôi biết, có thể tạo một hộp thoại theo chế độ bằng cách thêm các thuộc tính sau vào một phần tử:

class="use-ajax” data-dialog-type="modal"

Vì vậy, một ví dụ đầy đủ sẽ trông như:

<a href="/impressum/lizenzen/43" class="use-ajax" data-dialog-type="modal">
   <span class="glyphicon glyphicon-copyright-mark" aria-hidden="true"></span>
</a>

Trường hợp trong trường hợp của tôi /impressum/lizenzen/43là một đường dẫn đến một trang xem.

Điều này có vẻ hiệu quả, nhưng chỉ khi tôi đăng nhập với tư cách quản trị viên. Vì đây dường như không phải là vấn đề về quyền, tôi cho rằng nó có liên quan đến chủ đề quản trị viên ( Seven ), có thể bao gồm một số thư viện cốt lõi mà Bootstrap (mà tôi sử dụng cho trang web của mình) có thể không. Nhưng thật kỳ lạ, trong thanh tiêu đề của phương thức xuất hiện, thay vì tiêu đề trang, chuỗi ArArArray, điều khiến tôi cho rằng, một chuỗi bất ngờ cho cuộc trò chuyện chuỗi đã diễn ra: nhập mô tả hình ảnh ở đây

Ai đó có thể

  • dẫn tôi đến tài liệu chính thức về API phương thức lõi,
  • giải thích cho tôi, những gì có thể là lý do mà nó chỉ hoạt động như quản trị viên.
  • Và cuối cùng cho tôi biết, tại sao trên trái đất, một cuộc trò chuyện mảng với chuỗi diễn ra gọi một phương thức?

Câu trả lời:


6

Đây là tài liệu chính thức cho thay đổi API bạn đã đề cập:

Phương thức / hộp thoại / ajax đang sử dụng tham số truy vấn thay vì chấp nhận tiêu đề

Chi tiết quan trọng nhất là đính kèm thư viện này:

$build['#attached']['library'][] = 'core/drupal.dialog.ajax';

Bạn hỏi về lý do tại sao điều này hoạt động trên các trang quản trị mà không có điều này. Lý do là, các trang quản trị đã có sự phụ thuộc vào hầu hết các thư viện Drupal jQuery, trong khi các trang không phải quản trị viên được tải mà không có bất kỳ jQuery nào ra khỏi hộp (đây là một cải tiến hiệu suất tuyệt vời trong D8).

Chủ đề Bootstrap

Nếu được bật trong cài đặt chủ đề của chủ đề Bootstrap, "Phương thức jQuery" được thay thế bằng "Phương thức Bootstrap", hãy xem đoạn mã này:

LibraryInfo :: notify ()

elseif ($extension === 'core') {
  // Replace core dialog/jQuery UI implementations with Bootstrap Modals.
  if ($this->theme->getSetting('modal_enabled')) {
    $libraries['drupal.dialog']['override'] = 'bootstrap/drupal.dialog';
    $libraries['drupal.dialog.ajax']['override'] = 'bootstrap/drupal.dialog.ajax';
  }

Để làm việc này, bạn đính kèm cùng thư viện lõi như trên, để chủ đề Bootstrap có thể tìm thấy các thư viện lõi này để ghi đè lên chúng.


bạn có gặp vấn đề với cửa sổ bật lên khi trang vẫn đang tải và người dùng nhấp vào nút. Trang sẽ chuyển hướng đến url popup trang.
Jonh

Tôi đang cố gắng để làm điều này để làm việc trên hình thức nút nhưng cho đến nay không thể. chỉ cần thêm một liên kết đến hình thức nút với các thuộc tính thích hợp kích hoạt một phương thức để tải? Tôi đang thêm điều này dưới dạng thay đổi ... <a href="https://drupal.stackexchange.com/node/43" class="use-ajax" data-dialog-type="modal"> test </a>
awm

Vâng, điều này sẽ làm việc. Kiểm tra trong trình duyệt xem thư viện js đã đề cập có được tải và chạy không có lỗi hay không (vô hiệu hóa tập hợp tệp js trong cài đặt hiệu năng hệ thống để xem tất cả các tệp js).
4k4

5

Đối với bất kỳ ai đang cố gắng thêm chủ đề này vào một chủ đề, bạn chỉ cần thêm drupal.dialog.ajax vào tệp library.yml của mình trong phần phụ thuộc của JS:

- core/drupal.dialog.ajax

Thêm về phụ thuộc chủ đề ở đây .


2
Điều này không giải quyết vấn đề cho tôi. Trong chủ đề bootstrap, thư viện này đã được bao gồm theo mặc định.
dùng5950

4

Tôi vật lộn với Tài liệu là tốt. Tuy nhiên, tôi đã có thể khiến Modal của mình hoạt động bằng cách sử dụng Dialog API D8 Core cung cấp.

confirmationDialog = Drupal.dialog(CONTENT_OF_MODAL, {
  dialogClass: 'ADD_ANY_CLASSES',
  resizable: false,
  closeOnEscape: false,
  create: function () {
    $(this).parent().find('.ui-dialog-titlebar-close').remove();
  },
  beforeClose: false,
  close: function (event) {
    $(event.target).remove();
  }
});

Hiển thị một phương thức

confirmationDialog.showModal();

Đóng một phương thức

confirmationDialog.close();

Điều này có vẻ đúng dựa trên drupal.org/node/1852224
Smartsheet eng

1

Chủ đề của bạn cần khai báo sự phụ thuộc vào core / drupal.ajax vì ajax không được tải tự động cho người dùng ẩn danh.

dependencies:
    - core/jquery
    - core/drupal.ajax
    - core/drupal
    - core/drupalSettings
    - core/jquery.once
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.