Ghi đè chức năng mô-đun đóng góp


7

Mỗi lần như vậy, tôi cần thực hiện một chút hack cho một mô-đun đóng góp để thêm một chút chức năng cần thiết, thường là một cái gì đó cụ thể cho dự án mà các nhà bảo trì mô-đun có thể không muốn sử dụng.

Hiện tại, tôi tạo một tệp vá cho mỗi lần hack và tôi lưu trữ tất cả các tệp vá như vậy trong các trang web / tất cả / mô-đun. Bằng cách này, bất cứ khi nào tôi cập nhật một mô-đun, tôi có thể dễ dàng áp dụng lại các bản hack của mình và giải quyết bất kỳ xung đột nào.

Tôi không thể giúp nhưng cảm thấy như tôi đang làm gì đó sai. Tôi là ai

Câu trả lời:


11

Một bản vá không nhất thiết phải áp dụng cho phiên bản mới của mô-đun: Nó đủ để chức năng vá được chuyển sang một dòng khác hoặc mã cho chức năng đó được thay đổi và bản vá không còn áp dụng nữa. Đối với chức năng được chuyển đến một dòng khác, đủ để một chức năng khác được viết lại để có nhiều dòng hơn (hoặc ít dòng hơn).

Cách tốt hơn để thay đổi hành vi của mô-đun là, đối với Drupal 7:

  • Nếu mô-đun sử dụng mã cho một cuộc gọi lại trang mà bạn muốn thay đổi, hãy thay đổi cuộc gọi lại trang bằng hook_menu_alter () .
  • Nếu mô-đun thực hiện một chức năng chủ đề mà bạn muốn thay đổi, hãy thay đổi chức năng được liên kết với hook_theme_registry_alter () . Trong thay thế, nếu nó là đủ để thay đổi các biến chức năng theme được, sau đó bạn có thể thực hiện các chức năng xử lý trước cho rằng chức năng chủ đề (ví dụ như hook_preprocess_rdf_metadata()cho theme_rdf_metadata () , và thay đổi các biến mà chức năng chủ đề sẽ nhận được.
  • Nếu mô-đun thực thi truy vấn SQL bằng db_select () và gán thẻ cho truy vấn, hãy thay đổi truy vấn đã thực hiện bằng hook_query_alter () .
  • Nếu mô-đun thực hiện một hook mà bạn không muốn nó được thực thi, bạn có thể triển khai hook_module_implements_alter () để tránh nó được thực thi.
  • Nếu mô-đun thực hiện một hook hook (ví dụ hook_page_alter () ) và bạn muốn thay đổi cái hook đó đã thay đổi, hãy thực hiện hook hook tương tự, hãy chắc chắn rằng nó được thực thi sau khi cái được thực hiện từ mô-đun đó.

Trong trường hợp chức năng bạn muốn thay đổi không phải là một cái móc, thì:

  • Kiểm tra chức năng đó có sử dụng móc được thực hiện từ mô-đun khác không. Ví dụ: node_save () gọi hook_node_presave () ; nếu tôi muốn thay đổi thuộc tính "đã thay đổi" của nút, tôi không hack node_save(), nhưng tôi thực hiện hook_node_presave()để thay đổi nó.
  • Kiểm tra chức năng đó được tham chiếu / sử dụng từ một cái móc; trong trường hợp đó, bạn có thể làm một cái gì đó cho cái móc đó, như tôi đã mô tả trước đây.

Nếu bất cứ điều gì tôi nói cho đến bây giờ không áp dụng, thì tốt hơn là tạo một mô-đun tùy chỉnh và sử dụng mã của mô-đun khác để tạo mô-đun. Tôi cũng sẽ thử hỏi một yêu cầu tính năng cho mô-đun hiện có, hy vọng tính năng này được triển khai.
Việc hack một mô-đun của bên thứ ba không bao giờ là một ý tưởng hay, đặc biệt là vì các bản cập nhật tự động của mô-đun (thông qua Trình quản lý cập nhật hoặc Drush) sẽ không thể thực hiện được nữa cho mô-đun đó.


2

Hầu hết các mô-đun đi kèm với các móc để ghi đè nhiều chức năng của mô-đun và chức năng chủ đề để vượt qua các chủ đề. Bạn nên thử và sử dụng nó trong hầu hết các trường hợp. Và tránh hack mã nó tự.

Nếu bạn hoàn toàn chắc chắn rằng những gì bạn muốn đạt được không phải là thứ có thể thực hiện được với phần ghi đè thì tùy chọn tiếp theo tôi sẽ chọn là tạo một bản sao của mô-đun và đặt cho nó một số tên khác và thậm chí loại bỏ các chức năng mà tôi thực sự không cần và tạo ra một mô-đun mới từ nó.

Nếu các thay đổi rất ít thì tôi không thấy có hại gì khi tự thay đổi mã mà phải theo dõi các thay đổi để làm cho nó hoạt động trở lại sau khi nâng cấp mà tôi cho rằng bạn đang thực hiện.


1
Cảm ơn. Tôi sử dụng móc khi có thể. Các bản hack mà tôi đang đề cập luôn luôn khá nhỏ, vì vậy việc sao chép một mô-đun có thể gây ra nhiều rắc rối hơn giá trị của nó, đặc biệt là để xử lý các bản cập nhật mô-đun.
Dave

Vì vậy, tôi đoán bạn đang đi đúng hướng :-)
Mohammed Shameem

1

Vâng, IMO bạn đang "làm sai", nhưng có thể các yêu cầu dự án của bạn chỉ thấp hơn yêu cầu dự án trung bình của tôi :) Đặt tất cả các bản vá và phiên bản mô-đun của bạn vào một tệp tạo drush để bạn luôn có thể xây dựng nền tảng của mình bằng drush nếu có chuyện xảy ra

http://drupal.org/project/drush_make

Tạo các tệp rất đơn giản để viết một khi bạn biết cú pháp.

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.