作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
axel.rutz还发现了一个bug(http://drupal.org/node/1149684),就是如果向多个字段添加验证规则的话,只有最后一个起作用,我最终是这样解决这个问题的,将field_validation_field_attach_validate里面的代码:
$errors[$rule['field_name']][$langcode] = module_invoke_all("field_validation_validate", $rule['validator'], $items, $rule);
替换为:
//module_invoke_all does not work here, so i call it directly.
foreach (module_implements("field_validation_validate") as $module) {
$function = $module . '_' . "field_validation_validate";
if (function_exists($function)) {
$function($rule['validator'], $rule, $langcode, $items, $errors);
}
}
从module_invoke_all到module_implements的转换,是一个进步,使我认识到module_invoke_all是无法传递引用的。field_validation_field_validation_validate也做了相应的调整,这是调整后的样子:
/**
* Implements hook_field_validation_validate().
*/
function field_validation_field_validation_validate($validator_name, $rule, $langcode, $items, &$errors) {
if (!empty($items)) {
switch ($validator_name) {
case "regex":
mb_regex_encoding('UTF-8');
$regex = $rule['data'];
foreach ($items as $delta => $item) {
if ($item['value'] != '' && (!mb_ereg("$regex", $item['value']))) {
$errors[$rule['field_name']][$langcode][$delta][] = array(
'error' => 'regex_'.$rule['ruleid'],
'message' => t($rule['error_message']),
);
}
}
break;
}
}
}
这里可以传递引用参数&$errors了,这里还有另外一个改进,就是为错误消息使用了t函数。