作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们完成了字段的验证以后,还有一项工作要做,那就是在将字段的值,保存到数据库之前,重新设置一下,在不是手动输入的情况下,将其设置为源字段经过transliteration模块转换后的值。为此,我们还需要实现一个钩子函数,在module文件中添加以下代码:
/**
* Implements hook_field_presave().
*/
function transliteration_title_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
//drupal_set_message($field['settings']['size']);
if($field['type'] == 'transliteration_title_field'){
if(isset($entity->{$instance['widget']['settings']['source_field_id']})){
$source_field = $entity->{$instance['widget']['settings']['source_field_id']};
if(is_array($source_field)){
$source_field_items = $source_field[$langcode];
foreach ($source_field_items as $delta => $item) {
if(empty($items[$delta]['manual'])){
$upper_lower_case = $instance['widget']['settings']['upper_lower_case'];
if (function_exists($upper_lower_case)) {
$items[$delta]['value'] = $upper_lower_case(transliteration_get($item['value']));
$items[$delta]['manual'] = 0;
}else{
$items[$delta]['value'] = transliteration_get($item['value']);
$items[$delta]['manual'] = 0;
}
}
}
}else{
if(empty($items[0]['manual'])){
$upper_lower_case = $instance['widget']['settings']['upper_lower_case'];
if (function_exists($upper_lower_case)) {
//drupal_set_message('123');
//drupal_set_message( $upper_lower_case);
$items[0]['value'] = $upper_lower_case(transliteration_get($entity->{$instance['widget']['settings']['source_field_id']}));
$items[0]['manual'] = 0;
}else{
//drupal_set_message('123456');
$items[0]['value'] = transliteration_get($entity->{$instance['widget']['settings']['source_field_id']});
$items[0]['manual'] = 0;
}
}
}
}
}
}
这段代码,首先对源字段作了检查,假如默认的源字段为title,那么此时实体(节点)的title属性就是一个字符串值。如果是一个普通的字段,那么这里就会是一个数组。然后对于这两种情况,进行了分别处理。前者相对简单一点,后者稍微复杂了一点。这里面的核心代码是:
$items[$delta]['value'] = $upper_lower_case(transliteration_get($item['value']));
这里我们对源字段的值进行了transliteration转换,然后根据我们的大小写情况,对字符串作了进一步处理,最后将返回值赋给了$items[$delta]['value']。这是最主要的代码,里面又细分了多种情况,但是逻辑基本上一致。
此时,当我们编辑这个节点,取消手动输入,提交后,再回到编辑页面,我们看到系统为我们自动转换成了拼音。如图所示:
系统自动根据标题生成了拼音