12 钩子hook_field_presave

作者:老葛,北京亚艾元软件有限责任公司,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']。这是最主要的代码,里面又细分了多种情况,但是逻辑基本上一致。

    此时,当我们编辑这个节点,取消手动输入,提交后,再回到编辑页面,我们看到系统为我们自动转换成了拼音。如图所示:

图片1.png 

          系统自动根据标题生成了拼音