簡體   English   中英

如何在 Drupal 中擴展貢獻的模塊?

[英]How do I extend a contributed module in Drupal?

如何在不修改的情況下擴展現有模塊? 實際上它是一個貢獻的模塊,所以我不想破解它。 但我想對其進行更改和添加某些功能。 我是 drupal 的新手,當我閱讀有關它的教程時,我一遍又一遍地聽到一件事 - 不要破解核心......我相信這同樣適用於模塊。

盡可能避免黑客攻擊或分叉模塊。 破解模塊會給你帶來更少的“破解核心”的痛苦,並且分叉模塊(沒有明顯優越的架構和功能集。)只會進一步混淆模塊的水 - 使網站建設者更難以做出有效的決定關於使用什么。

最好的解決方案是:

  1. 使用模塊提供的任何 API。 有時,您可以將某些函數用作 API 調用,但這些函數不一定是那樣設計的。
  2. 創建附加功能並向模塊問題隊列提交補丁,這樣其他人就可以從您的工作中受益,因此您可以毫不費力地從安全審計中受益。
  3. 並非總是如此,但通常您可以創建一個自定義模塊來實現 hook_form_alter 並添加一個提交處理程序,該處理程序返回您的模塊進行處理。

找到了一篇關於在 drupal 中擴展模塊的非常好的帖子 重要部分:

  • 如果模塊使用要更改的頁面回調代碼,請使用 hook_menu_alter() 更改頁面回調。

  • 如果模塊實現了您想要更改的主題函數,請更改與 hook_theme_registry_alter() 關聯的函數。 或者,如果改變主題函數獲取的變量就足夠了,那么您可以為該主題函數實現預處理函數(例如,為theme_rdf_metadata() 實現hook_preprocess_rdf_metadata(),並更改主題函數將獲取的變量。

  • 如果模塊使用 db_select() 執行 SQL 查詢,並為查詢分配標簽,請使用 hook_query_alter() 更改已執行的查詢。

  • 如果模塊實現了一個你不希望它被執行的鈎子,你可以實現 hook_module_implements_alter() 來避免它被執行。

  • 如果模塊實現了一個alter hook(例如hook_page_alter()),並且你想改變那個hook改變的東西,實現相同的alter hook,確保它在從那個模塊實現的那個之后執行。

如果您要更改的函數不是鈎子,則:

  • 檢查該函數是否正在使用從其他模塊實現的鈎子。 例如,node_save() 調用 hook_node_presave(); 如果我想更改節點的“已更改”屬性,我不會破解 node_save(),而是實現 hook_node_presave() 來更改它。

  • 檢查函數是否被鈎子引用/使用; 在這種情況下,你可以為那個鈎子做一些事情,就像我之前描述的那樣。

如果到目前為止我說的任何內容都不適用,那么最好創建一個自定義模塊,並使用另一個模塊的代碼來創建它。 我還會嘗試為現有模塊提出功能請求,希望該功能得到實現。 破解第三方模塊從來都不是一個好主意,特別是因為該模塊不再可能自動更新模塊(通過更新管理器或 Drush)。

它是什么模塊? 有些模塊提供 API,您可以通過編寫自己的模塊來擴展這些 API。 大量模塊通過構建視圖 API 來“擴展”視圖 如果你想擴展的模塊沒有好的 API,你可以隨時 fork 來制作一個滿足你需求的版本。 也許它也會幫助別人。

要更改模塊顯示的表單,您可以簡單地創建一個實現hook_form_alter()hook_form_FORM_ID_alter()的模塊。 大多數時候,當您想要修改模塊的行為方式時,您還需要更改它使用的設置表單(或任何其他表單)。

即使我們需要使用某些功能,我們也可以通過以下方式完成。 我們需要從模塊中復制函數,然后我們可以將該函數粘貼到您的 template.php 文件中。 您可以相應地對該功能進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM