跳转到主要内容
yoyo198624 提交于 5 January 2015

看到不少人在问Drupal如何制作站内通知。下面给出我正在使用的方法。*此站内信并非指private message,而是系统发送给用户某人关注了你等等的系统通知。

因为我的目的是做到完全的自定义,所以我使用的是几乎纯代码的方式。

需要使用到的module:

   https://www.drupal.org/project/message

下载Message,安装后,先add一个message的type,比如我的是Symbol Update Message:

ping_mu_kuai_zhao_2015-01-05_xia_wu_12.25.36.png

通过message 模块能做到的事:

1. 可以通过hook等方式,调用save message的方法,去保存一个message。

2. message可以使用token和多语言。

3. 通过load message的方法,把message的内容加载出来。

4. 给任意一个message的type添加一个read的field,可以在load message的时候做到针对每一个message是否read

 

在下方的replacement tokens中填入你需要的占位符,我这里是@symbol。here是个link,

<a href="/en/technical?symbol=@symbol" style="line-height: 20px;" target="_blank">here</a>

为什么这里用a连接不用token加上l函数?因为替换的实际内容在你message产生的时候就已经写入了数据库。这时,如果当前产生的语言是英语,那么l函数产生的替换内容也是英语。如果收信放用中文看网站,就会出现信息是英文的问题。点击field language,可以给不同的language添加message版本,缺失会使用default的language。

新建完这个message之后,给他添加一个read字段。默认为否或者0。

新建一个自定义module,添加一个自定义的hook函数

/**
 * Implements hook_symbol_update_message
 */
function foo_symbol_update_message($symbol, $account = NULL){
  if($account){
    $arg = array(
      '@symbol' => $symbol,
    );
    $message = message_create('symbol_update_message', array('arguments' => $arg,'language'=>'en'), $account);
    $wrapper = entity_metadata_wrapper('message', $message);
    $wrapper->save();
  }
}

之后在需要给用户发送message的地方插入hook的调用。比如我的是在一个form的submit的时候调用

module_invoke_all('symbol_update_message', $symbol, user_load($uid));

在刚才的自定义module里,新加一个menu,比如notification/lists,写入你的显示方法。其中可能会用到以下方法:

message_load_multiple($ids)  //load message方法

$message->getText($language->language);  //拿到一个message后通过getText 方法可以拿到message的的text,传入不同的language,会显示你刚才在不同language下定义的language。

在load的时候,可以添加一个foo_set_read($message)的方法,在load需要显示的message后,把新message改成read即可。

最终效果:

ping_mu_kuai_zhao_2015-01-05_xia_wu_1.09.09.png

 

Drupal 版本