Điểm:0

Thêm Javascript trong hook hook_entity_type_presave()

lá cờ es

Tôi đang cố gắng thêm Javascript vào hook hook_entity_type_presave(), nhưng nó không kích hoạt.

Có thể thêm vào trong hook này không?

Tôi đã cố gắng nhưng không thành công -- mã của tôi ở bên dưới -- và ví dụ này trên Drupal.org: https://www.drupal.org/docs/drupal-apis/javascript-api/add-javascript-to-your-theme-or-module ...mô tả quy trình thêm javascript trong ngữ cảnh của hai mô-đun tùy chỉnh khác, sử dụng hook_element_info_alter() và hook_page_attachments().

mô-đun của tôi:

my_module
  my_module.libraries
  my_module.module
  my_module.info.yml
  js
    url-tham số.js

my_module.libraries:

tham số url:
  phiên bản: 1.x  
  js:
    js/url-parameter.js: {}
  phụ thuộc:
    - lõi/jquery

my_module.module


function my_module_node_presave(Drupal\node\NodeInterface $entity) {

  // mã khác liên quan đến presave hook, hoạt động tốt

  // Tôi cố tải JS ở đây, nhưng nó không kích hoạt:

  $attachments['#attached']['library'][] = 'js/url-parameter.js';
  
}

js\url-tham số.js:

(hàm (jQuery) {
  jQuery(tài liệu).ready(function() {
    cảnh báo ("xin chào");
    console.log('Đã tải');
  });
})(jQuery);

lá cờ cn
Nếu bạn có thể cập nhật câu hỏi và mô tả chi tiết hơn một chút mục tiêu cuối cùng của bạn là gì thì tôi nghĩ nó sẽ hữu ích - bạn không thể đính kèm JS vào một hook lưu trước (bạn có thể buộc phải làm như vậy), nhưng nó không thực sự làm dù sao cũng nên nghĩ đến việc đính kèm nó ở đó - JS tùy chỉnh của bạn chắc chắn sẽ chỉ áp dụng được cho một số trang/ngữ cảnh nhất định và không có gì đảm bảo rằng trang/ngữ cảnh đó sẽ nằm trong phạm vi mỗi khi thực thể được lưu. Vì vậy, thật tốt khi biết chính xác những gì bạn muốn xảy ra
scaffolding avatar
lá cờ es
Cảm ơn @Clive. Mục đích của presave hook là thêm một hình ảnh anh hùng nhất quán và văn bản vào một số loại nút nhất định (tức là một loại trang sự kiện cụ thể). Xin lỗi, tôi đã xóa logic đó khi cố gắng đơn giản hóa mã cho câu hỏi này. Suy nghĩ của tôi là: trong khi tôi đang thêm hình ảnh và văn bản chính, tôi cũng muốn thêm một tập lệnh vào cùng loại nút đó. Thêm JS trong cùng một móc sẽ hoạt động nhưng nếu bạn có đề xuất về cách tiếp cận tốt hơn, vui lòng gửi từ.
lá cờ cn
Bạn có thể muốn suy nghĩ về việc tách logic đó ra - thiết lập dữ liệu nút chắc chắn là một công việc cho presave hook, nhưng có thể cho rằng JS thuộc về trang nút, không phải thao tác lưu, do đó, có thể được gắn vào chế độ xem nút một cách có điều kiện hơn . Có một ví dụ ở đây: https://drupal.stackexchange.com/questions/231160/attach-javascript-library-and-settings-to-a-node-page, có lẽ bạn cần thêm một số logic bổ sung để kiểm tra xem các trường anh hùng được điền, sau đó đính kèm thư viện
Điểm:3
lá cờ us

hook_entity_presave()hook_ENTITY_TYPE_presave() không nên cho rằng thực thể đã được chỉnh sửa bằng biểu mẫu hoặc một trang đã được hiển thị cho người dùng. Các hook đó cũng được gọi khi một thực thể được tạo theo chương trình, ví dụ như với đoạn mã sau, mã này cũng có thể được sử dụng trong một hook_cron() thực hiện.

giá trị $ = [
  'loại' => 'bài báo',
  'title' => 'Tiêu đề bài viết',
  'uid' => 1,
  'trạng thái' => ĐÚNG,
];
$node = \Drupal::entityManager()->getStorage('node')->create($values);
$node->save();

Móc được gọi trước khi một thực thể được hiển thị là hook_entity_view() (hoặc hook_ENTITY_TYPE_view()). Sử dụng một trong những hook đó, một mô-đun có thể thêm một mảng kết xuất bổ sung vào xây dựng $, ví dụ với $build['#attached']['library'][] = 'js/url-parameter.js';.

Như mã ví dụ, $display->getComponent() nên được sử dụng để xác minh trường thực thể đã được đặt để hiển thị, vì người dùng quản trị viên có thể ẩn các trường khỏi /admin/struct/types/manage/article/display (đối với Mạo từ loại nội dung). Ví dụ: với các cài đặt sau, tôi sẽ ẩn trường thực thể tùy chỉnh và thẻ lĩnh vực cho Mạo từ loại nội dung.

ảnh chụp màn hình

Tôi cũng sẽ kiểm tra giá trị của $view_mode được chuyển đến các hook đó vì giá trị đó cho biết lý do tại sao nút được hiển thị. Ví dụ: khi mô-đun Tìm kiếm lập chỉ mục các nút, $view_mode bằng 'search_index'; khi một nút được thêm vào nguồn cấp dữ liệu RSS, $view_mode bằng 'rss'. Trong những trường hợp đó, có thể bạn không muốn thêm thư viện.

scaffolding avatar
lá cờ es
Cảm ơn bạn @apaderno, sẽ thử phương pháp này, tôi nghĩ rằng điều này sẽ giải quyết được vấn đề.
scaffolding avatar
lá cờ es
Chỉ cần xác nhận, điều này đã giúp tôi giải quyết vấn đề này. Cảm ơn bạn @apaderno

Đă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.