nineinchnick/yii-nfy

用于结束通知并使用Web通知和Ajax轮询显示通知的Yii框架模块。

v0.10.0 2016-07-06 07:11 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:15:33 UTC


README

这是一个为Yii框架提供的模块,它提供了

  • 一个通用的队列组件
  • 发布/订阅消息传递模式
  • 一个SQL数据库队列实现
  • 一种可配置的方式来发送各种通知、消息和任务到队列
  • 一个基本的控件,用于从队列读取项目并将其作为系统通知显示给用户
  • 一个基本的控件,可以放入导航栏中,显示弹出通知和/或消息
  • 一个基本的CRUD来管理、调试队列或用作简单的消息传递工具

消息可以直接作为字符串传递,也可以从某些对象(如Active Records)创建。这可以用于记录模型的所有更改,就像audittrail2扩展一样。

当收件人订阅了一个频道时,消息传递可以依赖于类别过滤,这与框架提供的日志系统类似。

如果没有MQ服务器或不需要MQ服务器,提供了一个简单的SQL队列实现。

安装

下载并解压缩。

在配置中启用模块。在主配置和命令行配置中都要做,因为一些设置在迁移中使用。有关如何指定用户表名及其主键类型的配置部分,请参阅。

将迁移复制到您的迁移文件夹,并调整文件和类名称中的日期。然后应用迁移

./yiic migrate

定义一些队列作为应用程序组件,并可选地启用模块,请参阅下一节。

配置

队列组件

将每个队列定义为应用程序组件。

'components' => array(
	'queue' => array(
		'class' => 'nfy.components.NfyDbQueue',
		'name' => 'Notifications',
		'timeout' => 30,
	),
	// ...
),

然后您可以通过此组件发送和接收消息

// send one message 'test'
Yii::app()->queue->send('test');
// receive all available messages without using subscriptions and immediately delete them from the queue
$messages = $queue->receive();

或者您可以将一些用户订阅到它

Yii::app()->queue->subscribe(Yii:app()->user->getId());
// send one message 'test'
Yii::app()->queue->send('test');
// receive all available messages for current user and immediately delete them from the queue
$messages = $queue->receive(Yii:app()->user->getId());
// if there are any other users subscribed, they will receive the message independently

模块参数

通过在userClass属性中指定用户模型类名,将使用正确的表名和主键列名在迁移中使用。

使用示例

广播

要向每个用户发送消息,创建一个队列并将每个用户订阅到它。

过滤

在将用户订阅到队列时,可以指定一个类别列表。只有与匹配的类别相关的消息才会发送到这个订阅。这个系统模仿了框架中的记录器。

通知模型更改

监视一个模型的更改并通知一些用户。

通过扩展NfyDbQueue或NfyQueue类,可以处理非字符串消息,并从这些数据创建字符串消息体。

// this could be your CActiveRecord model
class Test extends CActiveRecord {
	... // CActiveRecord requires some methods, this is skipped for keeping this short
	public static function match($data) {
		return $data['new']->attribute == 'value';
	}
	public function afterFind($event){
		$this->_old($this->getOwner()->getAttributes());
		return parent::afterFind($event);
	}
	public function afterSave($event) {
		$old = clone $this;
		$old->setAttributes($this->_old);
		Yii::app()->queue->send(array('old'=>$old,'new'=>$this), 'logs.audit');
		return parent::afterSave($event);
	}
}

// trigger logging
$test = Test::model()->find();
$test->attribute = 'value';
$test->save();

显示通知

可以在布局、视图或控制器中的任何位置放置。

$this->widget('nfy.extensions.webNotifications.WebNotifications', array('url'=>$this->createUrl('/nfy/default/poll', array('id'=>'queueComponentId'))));

与Pusher一起使用

而不是使用NfyQueue,可以使用pusher扩展将消息直接发布到Pusher.com服务。

	$pusher = Yii::createComponent(array(
		'class' => 'Pusher',
		'key' => 'XXX',
		'secret' => 'YYY',
		'appId' => 'ZZZ',
	));
	$pusher->trigger('test_channel','newMessage',array('title'=>'nfy title', 'body'=>'test message'));

配置WebNotifications小部件以通过WebSocket接收消息

<?php $this->widget('nfy.extensions.webNotifications.WebNotifications', array(
	'url'=>'ws://ws.pusherapp.com:80/app/XXXclient=javascript&protocol=6',
	'method'=>WebNotifications::METHOD_PUSH,
	'websocket'=>array(
		'onopen'=>'js:function(socket){return function(e) {
			socket.send(JSON.stringify({
				"event": "pusher:subscribe",
				"data": {"channel": "test_channel"}
			}));
		};}',
		'onmessage'=>'js:function(_socket){return function(e) {
			var message = JSON.parse(e.data);
			var data = JSON.parse(message.data);
			if (typeof data.title != "undefined" && typeof data.body != "undefined") {
				notificationsPoller.addMessage(data);
				notificationsPoller.display();
			}
		};}',
	),
)); ?>

缺点是当页面刷新时,它暂时与Pusher断开连接。因此,如果您在处理仅打开的页面实例的请求时发送任何消息,则不会收到任何消息。

示例主要说明了如何使用WebSocket和不同于Nfy::log()的不同的交付方法。

接收消息

通过配置WebNotifications小部件,可以通过以下方式读取消息

  • 使用ajax轮询(在固定时间间隔重复请求)一个操作,该操作检查队列并返回新项目
  • 连接到WebSocket并等待新项目

变更日志

0.9 - 2013-12-28

警告! 本版本破坏了向下兼容性。必须删除所有数据库表并重新运行迁移。

  • 对提供通用队列组件的接口进行了重大重构,提高了接口质量。
  • 重写了消息过滤和订阅投递。
  • 支持超时保留消息。
  • 基本的CRUD操作,用于管理/调试队列或作为简单的消息接口。

0.6.5 - 2013-08-20

  • 修复了默认控制器中的一个拼写错误。
  • 在WebNotifications小部件中添加了对WebSocket的支持。
  • 更多示例和更新文档。

0.6 - 2013-08-15

  • 启用了长轮询。
  • 对SQLite的迁移进行了修复。

0.5.5 - 2013-08-12

  • 在NfyChannels::subscribe()方法中指定传输。
  • 保存NfySubscriptions模型时填充registered_on的值。

0.5 - 2013-07-16

破坏向后兼容性

  • 添加了路由和默认的NfyDbRoute实现,这需要重构数据库模式,因此记住在升级时应用迁移。已删除'criteria_callback'列,并由NfyDbRoute类的'canSend()'方法替换。

其他更改

  • 保存发送用户ID,以便用于过滤接收者和定制消息正文。
  • 将userClass参数添加到模块中,以提取用户表名及其主键列名和类型。
  • 更新了文档。

0.3 - 2013-07-13

  • 首次发布