Drupal obsługa formularza w module

Fragmenty kodu będą dotyczyły konkretnego przykładu (nie należy zwracać uwagi na pola formularza itp.) Najpierw należy stworzyć sam formularz w funkcji (nazwa funkcji: nazwamodułu_nazwafun):

function mysettings_points() {
  $form = array();
	global $user;
  $mode = arg(3);
  $timestamp = format_date(time(), 'custom', 'Y-m-d H:i O');
  $uid = (int)arg(4);
    $txn_user = user_load(array('uid' => $uid));
	$form['nr_karty'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Nr karty'),
    '#size'          => 30,
    '#maxlength'     => 60,
  );
  /*$form['txn_user'] = array(
    '#type'          => 'textfield',
    '#title'         => t('User Name'),
    '#size'          => 30,
    '#maxlength'     => 60,
    '#default_value' => !empty($txn_user->name) ? $txn_user->name : '',
    '#autocomplete_path' => 'user/autocomplete',
    '#description'   => t('User Name for the user you want the !points to affect', userpoints_translation()),
  );*/

  $form['points'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Points'),
    '#size'          => 10,
    '#maxlength'     => 10,
    '#default_value' => isset($txn->points) ? $txn->points : 0,
    '#description'   => t('Number of !points to add/subtract from the user. For example, 25 (to add !points) or -25 (to subtract !points).', userpoints_translation()),
  );

  $form['time_stamp'] = array(
    '#type'          => 'hidden',
    '#title'         => t('Date/Time'),
    '#default_value' => $timestamp,
    '#size'          => 30,
    '#maxlength'     => 30,
    '#description'   => t('Date and time of this transaction, in the form YYYY-MM-DD HH:MM +ZZZZ'),
  );
  if (module_exists('taxonomy')) {
    $form['tid'] = array(
      '#type' => 'select',
      '#title' => t('Category'),
      '#options' =>  userpoints_get_categories(),
      '#description' => t('Category to apply these !points to', userpoints_translation()),
    );
  }
  $form['approver_uid'] = array(
        '#type'  => 'hidden',
        '#value' => $user->uid,
      );

      $form['operation'] = array(
        '#type'  => 'hidden',
        '#value' => $user->name,
      );

      $form['status'] = array(
        '#type'  => 'hidden',
        '#value' => USERPOINTS_TXN_STATUS_PENDING,
      );

      $form['mode'] = array(
        '#type'  => 'hidden',
        '#value' => $mode,
      );
	  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
}
Teraz funkcja odpowiedzialna za obsługę odebrania żądania z formularza (_submit w nazwie funkcji).
function mysettings_points_submit($form, &$form_state) {
	global $user;
	if($form_state['values']['form_id'] != 'mysettings_points') 
	{
		return;
	}
	if($form_state['values']['nr_karty']=='') 
	{
		drupal_set_message('Podaj nr karty');
		$form_state['redirect'] = 'site';
		return;
	}
	$sql = 'SELECT uid FROM profile_values WHERE fid=1 AND value='.$form_state['values']['nr_karty'];
	$results = db_query($sql);
	$ident = intval(db_result($results));
	$txn_user = user_load($ident);
	if($txn_user->uid==0) 
	{
		drupal_set_message('Nieprawidłowy nr karty');
		$form_state['redirect'] = 'site';
		return;
	}
	$params = array(
	  'points' => $form_state['values']['points'],
	  'uid' => $txn_user->uid,
	  'operation' => $user->name,
	  'tid' => $form_state['values']['tid'],
	  'time_stamp' => strtotime($form_state['values']['time_stamp']),
	);
    userpoints_userpointsapi($params);
	drupal_set_message('Punkty przypisane');
	$form_state['redirect'] = 'site';
}
Wyświetlenie formularza w templacie:
echo drupal_get_form('mysettings_points');