通过编程跳过默认的CCK表单验证


Programmatically skip default CCK form validation

背景:在Drupal 6中,我有一个非常长的CCK表单,其中包含许多必填字段。我还有一个模块,可以授予某些用户特殊权限。一个权限应该允许用户跳过必需的字段,并且仍然能够提交表单。我想警告用户,在允许他们确认提交之前,他们跳过了一些(对于非特权用户)必需的字段。

问题:如何跳过CCK表单的默认验证?(特别是必填字段)

以前的研究:我已经彻底搜索了这个问题的答案。我知道我应该使用hook_form_alter(),也可能使用after_build()。我已经尝试使用

重置验证
$form['#validate'] = array();

然而,验证的方式没有改变(例如,必填字段的错误仍然存在,没有发生提交)。

设置$form['#validate'] = array();应该在一定程度上起作用(任何显式的验证处理程序将不再运行),但是也有#element_validate键可以添加到大多数元素中,#required标志将设置默认的表单验证。

我能想到的消除这些约束的最简单方法是递归地遍历表单并取消非法值的设置。像这样:

function mymodule_unrequire_element(&$element) {
  if (isset($element['#required'])) {
    unset($element['#required']);
  }
  if (isset($element['#element_validate'])) {
    unset($element['#element_validate']);
  }
  foreach (element_children($element) as $child_element) {
    mymodule_unrequire_element($element[$child_element]);
  }
}
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'the_form_id') {
    mymodule_unrequire_element($form);
  }
}

这是完全未经测试的,但我想它会成功的:)

模块http://drupal.org/project/skip_validation提供跳过验证功能。看一下可能会有帮助。