Đúng cách để thêm JS và CSS vào nút / chỉnh sửa và các hình thức khác


10

Tôi đang tạo một trang web có rất nhiều JS và tôi tự hỏi tôi nên đặt mã JS ở đâu. Tối ưu tôi muốn giữ JS với mỗi mô-đun chứ không phải lớp chủ đề. Một số nội dung có thể được hiển thị dưới dạng khối, v.v.

Nhưng tôi có một số vấn đề với bộ đệm. Trong ví dụ của tôi, tôi cần thêm JS & CSS vào biểu mẫu chỉnh sửa nút. Tôi đã sử dụng hook_block_view, nhưng nó được lưu trữ. Vì vậy, nếu có lỗi trong biểu mẫu chỉnh sửa nút, các hàm drupal_add_js & drupal_add_css sẽ không được gọi. Điều tương tự cũng đúng với hook_node_prepare.

Bạn sẽ nhập lớp JS & CSS ở đâu? và có các hook được gọi ngay cả khi có lỗi trong biểu mẫu chỉnh sửa nút không?

Câu trả lời:


6

Nếu bạn muốn thêm JS và CSS vào trang chỉnh sửa nút nói riêng (hoặc bất kỳ hình thức nào nói chung), thì nơi tốt nhất và đúng để làm như vậy là hook_form_alter () và thuộc tính bạn nên sử dụng là #after_build.

Nhận xét này về DO cho bạn biết chính xác những việc cần làm - http://drupal.org/node/1253520#comment-4881588

Hi vọng điêu nay co ich :-)


Cảm ơn, chỉ những gì tôi cần. Có một hình thức đẹp bây giờ, tốt hơn nhiều so với anh ấy mặc định. Bất kỳ ý kiến ​​về kiến ​​trúc của một trang web như vậy?
Jens

Vui mừng nó đã làm việc. Khi đó là như vậy, bạn nên đánh dấu câu trả lời là 'câu trả lời được chấp nhận' để câu hỏi không xuất hiện trong danh sách các câu hỏi chưa được trả lời và người giúp bạn thoát khỏi "nghiệp chướng". Tôi thấy rằng bạn là người mới ở đây. Tôi cũng vậy, nhưng tôi có nhiều tài khoản hoạt động hơn trên các dịch vụ StackOverflow khác và tôi yêu nơi này.
Sumeet Pareek

Và oh .. chỉ cần biết rằng bạn cần có CSS ​​CSS trên một biểu mẫu và cố gắng nhận xét về kiến ​​trúc của trang web sẽ không kém gì một tội ác :-p
Sumeet Pareek

Chắc chắn, trả lời ngay bây giờ.
Jens

1
@SumeetPareek Tôi đánh giá thấp câu trả lời của bạn (nhưng không vi phạm) vì sử dụng #attachedđược khuyến nghị trong hầu hết mọi trường hợp. Hơn nữa, drupal_add_js / css sẽ không được dùng nữa trong Drupal 8.
AyeshK

6

Bạn nên sử dụng thuộc tính #attached để đảm bảo rằng JS / CSS luôn được tải đúng cách cùng với một phần tử kết xuất khác.


Tôi cảm thấy điều này thực sự có lợi từ một ví dụ về cách sử dụng #attachedvà có thể một số thông tin bổ sung về vấn đề bạn đang tránh.
Michael Greisman

@MichaelGreisman Tôi phải nói rằng tôi không thấy ngay giá trị của việc thêm mã nội tuyến ở đây. Nó sẽ được duy trì tốt hơn tại liên kết tôi cung cấp, đây là tài liệu chính thức về cách thực hiện. Câu trả lời của tôi giải thích những gì cần làm, nhưng tài liệu api mẫu là nơi thích hợp để làm thế nào .
Letharion

3

Tôi cảm thấy những câu trả lời và nhận xét rất cần mã ví dụ, đặc biệt là các mã của @AyeshK và @Letharion. Điều này là quá dài cho một bình luận, vì vậy xin vui lòng tha thứ cho câu trả lời. Nếu nó hữu ích với bạn, vui lòng bỏ phiếu cho câu trả lời của Sumeet hoặc Letharion. Ngoài ra, ví dụ sau đây rõ ràng thêm CSS, nhưng sẽ gần như giống hệt nhau để thêm javascript.

Sử dụng câu trả lời của @ Sumeet, nhưng sử dụng thuộc #attachedtính thay vì drupal_add_css, trông như thế này:

/* Implements hook_form_FORM_ID_alter() */
function MY_MODULE_form_MY_FORM_ID_alter(&$form, &$form_state, $form_id) {
  $form['#after_build'][] = 'MY_MODULE_some_function_name_after_build';
}

function MY_MODULE_some_function_name_after_build($form, &$form_state) {
  $style_path = drupal_get_path('module','MY_MODULE') . '/css/my_css.css';
  // drupal_add_css('file', $style_path);
  $form['#attached']['css'][] = $style_path;
  return $form;
}

Cuối cùng, sự phản đối drupal_add_csscó thể được tìm thấy trong bài viết này . Đó có thể là tin tức với nhiều người mà drupal_add_xxx đã hoạt động tốt, vì nó là dành cho tôi.


Một #after_buildchút là, theo sự hiểu biết tốt nhất của tôi vô nghĩa, và đơn giản nên được loại bỏ. (Có một nhận xét tương tự về câu trả lời cung cấp #after_buildgiải pháp) Tôi nghĩ rằng chính điều này giải thích tại sao câu trả lời ngắn gọn của tôi là tốt. Nếu bạn đơn giản nhìn vào liên kết tôi cung cấp, bạn sẽ tìm thấy cùng một mã, nhưng không có các bit không cần thiết.
Letharion

0

Đối với Drupal 8, tôi khuyên bạn nên xem bài viết này

library.yml

something: 
  version: VERSION
  js: 
    js/something.js: {}
  dependencies: 
    - core/jquery

.module

function MODULE_page_attachments(array &$page) {
  $page['#attached']['library'][] = MODULE/something;
}
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.