13

我正在尝试修改一些 Drupal 6 表单代码并合并一些本机表单验证。代码看起来像这样,但验证不起作用。我什至从未进入 thisFormName_form_validate 函数。任何 Drupalians 有一些好主意吗?

function thisFormName_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );


function thisFormName_form_validate($node, &$form) {
  if ($form_state['values']['email_address'] == '') 
  {
    form_set_error('', t('Email must be valid format if entered.'));

  }
}
4

2 回答 2

13

由于您使用的是表单更改,因此您不必自己创建表单,您应该自己添加验证处理程序:

function myModule_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  $form['#validate'][] = 'my_validation_function';
}


function my_validation_function(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}

Drupal 默认只使用定义为form_name+的验证_validate。情况并非如此,因为您使用的是hook_form_alter.

于 2010-03-04T11:41:46.957 回答
5

编辑:基本上与 googletorps 的答案相同。发我的时候没注意到他。将其留在这里作为替代解释,但他是正确的并且是第一个(+1)。


您的函数命名有些可疑:

  • 与所有钩子实现一样,您的hook_form_alter函数应该以您的自定义模块命名,而不是在表单(例如yourModule_form_alter)之后,在这种情况下,它将触发所有表单。如果(看起来)您只想挂接到特定表单,请使用hook_form_FORM_ID_alter,将 'hook' 替换为您的模块名称,并将 'FORM_ID' 替换为您要操作的表单的 id(名称)。

  • 表单的验证函数回调在$form['#validate']. 它只是您自己生成的表单的一种方便快捷方式,您不必显式添加它,而是使用以表单命名的函数,在末尾添加一个“_validate”。在您的情况下,您正在更改来自另一个模块的表单,因此您需要显式添加验证功能。

所以你的代码应该是这样的:

function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  // Add custom validation callback
  $form['#validate'][] = 'yourModuleName_theFormID_validate';


function yourModuleName_theFormID_validate(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}
于 2010-03-04T11:48:01.040 回答