hook_validate

2011-02-07 為 form 增加新的 validation 規則

hook_form_alter() 本來是為了修改 form 的各種屬性
例如增加欄位, 修改欄位的預設值等等
但其實還可以增加 validation 規則和增加提交後的處理

增加 validation 規則:

<?php
function mymodule_form_alter(&$form,$form_state, $form_id) {
  if(
$form_id=='user_register') { //只是一個例子, 你可以填入需要的 form id
    //為 #validate 陣列增加一個元素, 元素的值就是新的 validate 函數名
   
$form['#validate'][] = 'mymodule_new_user_register_validation';
  }
}

//然後定義新的 validate 函數, 帶入兩個參數
function mymodule_new_user_register_validation($form, &$form_state) {
 
//$form_state['values'] 儲存用戶提交的數據
 
if(strpos('admin',$form_state['values']['username'])===false) {
   
//用戶名字不可以有 admin 的字眼
   
form_set_error('username', '用戶名字不可以有 admin 的字眼');
  }
}
?>

增加提交後的處理:

<?php
function mymodule_form_alter(&$form,$form_state, $form_id) {
  if(
$form_id=='user_register') {
   
//為 #submit 陣列增加一個元素, 元素的值就是新的提交後處理函數
   
$form['#submit'][] = 'mymodule_new_user_register_submit';
  }
}

//然後定義新的 validate 函數, 帶入兩個參數
function mymodule_new_user_register_submit($form, &$form_state) {
 
//$form_state['values'] 儲存用戶提交的數據
 
drupal_set_message('Welcome, '.$form_state['values']['username']);
}
?>

相關:
Drupal form API
hook_submit, hook_form_alter, hook_validate in Drupal 6.x

hook_submit, hook_form_alter, hook_validate in Drupal 6.x

EDIT: 2011-02-07 更詳細的 hook_form_alter 例子

hook_submit() 是每一張form 提交的時候會經過的 hook
可以用作發電郵之類的自定義動作

類似的, hook_validate() 是驗證每一張 form 的時候會經過的hook
可以自定義更多驗證的 logic

而從Drupal 5.x 之中, hook_submit() 的 function callback 可以在form API 使用如下 syntax:

<?php
$form
['submit']['#submit'] = array('function1','function2');
?>

那 function1 和 function2 都會在 hook_submit() 之中callback 了

而 Drupal 6.x 之中, #submit 在不再在 submit button 之中定義:

<?php
$form
['#submit'][] = 'my_module_submit_handler'
?>

雖然 D5 的方法都可以, 但便不可以用 hook_form_alter() 從一個 module 修改另一個module 的 form 了

例如, contact form 需要一個contact number,
submit 時將 contact number 加到 body 之內:

<?php
function my_module_form_alter($form,&$form_statues) {
 
$form['#submit'][] = 'my_module_submit_handler';
}
function
my_module_submit_handler($form,&$form_statues){
 
//processing
}
?>

EDIT: 2011-02-07 更詳細的 hook_form_alter 例子