Skip to main content

Drupal Hook System

Submitted by admin on Tue, 02/25/2020 - 03:52

1. Hook能幹嘛

先舉幾個簡單的例子來解釋Drupal Hook System能辦到什麼事情。

假設我們會想要變更Drupal core所提供的使用者登入頁面,除了使用者信箱以及密碼之外,還想要上面加一行「歡迎來到本站」的訊息。

或是我們希望使用者在新增/刪除文章之後,網站能夠自動發一封email通知管理員使用者進行了某種操作。

上面這些事情都可以透過撰寫一個包含hook function的模組做到。

簡而言之,Drupal的Hook System可以在特定的事件發生時呼叫一個由使用者定義的函式,而我們可以透過自行定義這個函式的內容,來客製化某些事件發生時的網站行為。

現在我們以上面的第一個例子為例,假設我們想要透過新增一個模組,在某個已存在的表單上增加一行簡單的訊息。如果要簡單描述我們的行為,就是在這個表單被送到使用者面前以前攔截它,然後變更表單裡面的內容。

稍微更深入一點用Drupal的語言來說,就是在這個表單被渲染前變更它(Perform alterations before a form is rendered.)。

 

2.簡單的文字顯示

這次我們要透過一個新建立的模組來替我們在Drupal 建立互動式表單 create Ajax interactive form文章中所建立的示範表單新增一段文字(可以點進去先看看結果)。

Hook其實很簡單,我們在這個範例中只需要建立兩個小檔案。

第一個是[ModuleRoot]/myModuleName.info.yml,已經是自製模組系列文章的老面孔了,不再贅述。

另一個是[ModuleRoot]/myModuleName.module,內容如下

<?php

function myModuleName_form_alter(&$form, &$form_state, $form_id){
	switch($form_id) {  
		case 'SimpleForm2_SimpleExample_Form': 
			$form['cutomtext'] = array(
				'#type' => 'item',
				'#markup' => getMyMsg(),
				'#weight' => -25, 
			);
			break;  
	}  
}

function getMyMsg(){
	return '<div>
				This is a demo of Ajax interactive form in Drupal. <br>
				See <a href="/blog/drupal-ajax-form">here</a> for ortiginal article.
			</div>';
}

下面getMyMsg只是為了改字串時方便所獨立出來的區塊,我們把重心放在myModuleName_form_alter上面。

這隻函式實作了myModuleName這個模組的hook_form_alter功能,我們可以在Drupal hook API一覽裡面找到所有的hook函式名稱,然後把hook字串取代成我們的模組名稱即可。當然,部分hook可能有其他字串需要被取代,例如hook_ENTITY_TYPE_update,其中ENTITY_TYPE可以改成node。

一旦myModuleName這個模組被啟用,所有表單在被送到使用者眼前之前都會經過myModuleName_form_alter這支函式,所以這個函式做的第一件事情就是利用form_id挑出我們感興趣要變更的表單。在上面的範例中我們使用了上一篇文章裡面getFormId()所回傳的值,如此一來所有其他表單都不會被這個hook影響到。

接著,我們在SimpleForm2_SimpleExample_Form的render array中新增了一個customtext的鍵,填入渲染型別、文字以及擺放權重,如此一來這裡新增的文字就可以跑到另一個模組所定義的表單內了。

順帶一提,Drupal表單的所有渲染型別可以在這裡找到。

 

enjoy~