看到不少人在问Drupal如何制作站内通知。下面给出我正在使用的方法。*此站内信并非指private message,而是系统发送给用户某人关注了你等等的系统通知。
因为我的目的是做到完全的自定义,所以我使用的是几乎纯代码的方式。
需要使用到的module:
https://www.drupal.org/project/message
下载Message,安装后,先add一个message的type,比如我的是Symbol Update Message:
通过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即可。
最终效果:
好文