【问题标题】:Drupal form validation not working for meDrupal 表单验证对我不起作用
【发布时间】:2010-03-04 02:54:36
【问题描述】:

我正在尝试修改一些 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.'));

  }
}

【问题讨论】:

    标签: php validation drupal drupal-6 drupal-fapi


    【解决方案1】:

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

    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

    【讨论】:

    • +1 - 没有注意到您已经回答了这个问题 - 抱歉重复发布类似的答案。
    【解决方案2】:

    编辑:基本上与 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.'));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多