作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
接下来,我们需要检查用户的输入是否正确,我们主要检查用户手动输入的情况,看用户输入的字符是否是ASCII字符,因为经transliteration模块转换后的字符串只包含ASCII字符。我们来看看这个字段的验证函数:
/**
* Implements hook_field_validate().
*
* Possible error codes:
* - 'transliteration_title_invalid': The transliteration title is not valid
*/
function transliteration_title_field_validate($obj_type, $object, $field, $instance, $langcode, $items, &$errors) {
foreach ($items as $delta => $item) {
//drupal_set_message($item['value']);
//[\x20-\x7e] [A-Za-z0-9]
if (!empty($item['manual']) && !preg_match('/^[\x20-\x7e]+$/', $item['value'])) {
$message = t('"%value" is not a valid transliteration titles', array('%value' => $item['value']));
/*
//这段代码不能正常工作
$errors[$field['field_name']][$langcode][$delta][] = array(
'error' => "transliteration_title_invalid_".$field['field_name'],
'message' => t('It is not a valid transliteration titles'),
);
*/
form_set_error($field['field_name'] .']['.$langcode.']['. $delta .'][value', $message);
}
}
}
这段代码的含义是,如果当前为手动输入,而用户输入的字符包含非ASCII字符时,设置一个错误信息。这里使用了正则表达式,来检查ASCII字符,我费了很大的功夫才找到了这个还能工作的表达式。另外,$errors[$field['field_name']][$langcode][$delta][]这种方式,工作起来总有问题,所以采用了更为原始一点的form_set_error,这在表单API里面讲过。注意$field['field_name'] .']['.$langcode.']['. $delta .'][value',在这个字符串的末位,没有“]”符号,对于这种数组形式的表单元素,就是这种用法。
此时,如果在手动方式下,输入一个包含中文字符的字符串,系统就会报错,表单不能提交。如图所示:
当含有中文字符时,系统提示输入错误