thyseus / yii2-message
Yii2的消息系统
Requires
- kartik-v/yii2-widget-select2: ^2.0
- rmrevin/yii2-fontawesome: ~3.0
- yiisoft/yii2: ^2.0.0
- yiisoft/yii2-bootstrap: ^2.0.0
- yiisoft/yii2-swiftmailer: ^2.0.0
Requires (Dev)
- codeception/specify: ^0.4.3
- codeception/verify: ^0.3.1
- yiisoft/yii2-codeception: ^2.0.0
This package is auto-updated.
Last update: 2024-08-28 04:52:55 UTC
README
允许用户互相发送私密消息的系统。
- 支持用户自定义忽略列表和管理员配置的白名单(管理员可以微调哪些用户可以给哪些用户发送消息)。
- 暂不支持加密。
- 使用Font Awesome(http://fontawesome.io/)显示一些图标
- 系统内发送的每条消息都可以自动通过电子邮件转发给接收者。
- 从0.4.0版本开始,您可以保存草稿并使用签名。
先决条件
您需要一个具有'id'和'username'属性的模型。这需要是一个ActiveRecord或Model实例。
建议您使用https://github.com/dektrium/yii2-user,它与该模块配合得非常好。请注意,dektrium已不再维护,对于未来的项目,您应该查看:https://github.com/2amigos/yii2-usuario
安装
$ composer require thyseus/yii2-message
$ php yii migrate/up --migrationPath=@vendor/thyseus/yii2-message/migrations
配置
将以下行添加到您的配置文件中
'modules' => [
'message' => [
'class' => 'thyseus\message\Module',
'userModelClass' => '\app\models\User', // your User model. Needs to be ActiveRecord.
],
],
发送电子邮件
如果您想通过Yii::$app->mailer自动发送电子邮件,只需在您的ActiveRecord模型中提供'电子邮件'列即可。
使用$ mailMessages模块选项来定义哪些用户会收到电子邮件。例如
'mailMessages' => function ($user) {
return $user->profile->receive_emails === true;
},
您可以通过在应用程序中提供@app/mail/目录来覆盖默认的电子邮件视图和布局。
邮件队列
从版本0.4开始,您可以使用yii2-queue(https://github.com/yiisoft/yii2-queue)通过邮件队列发送消息。一旦您在应用程序中配置了yii2-queue,您可以设置
'useMailQueue' => true,
让yii2-message将EmailJob推送到您的队列,而不是直接发送电子邮件。
如果您想使用邮件队列,如https://github.com/nterms/yii2-mailqueue,您可以在模块配置中覆盖'mailer'配置选项。由于yii2-queue是稳定的官方扩展,我更喜欢使用yii2-queue而不是第三方扩展。
忽略列表和接收者筛选器
用户可以通过message/message/ignorelist路由管理自己的忽略列表。您可以放置一个回调,定义哪些用户可以接收消息。例如,如果您不希望用户给管理员发送消息,可以这样操作
'recipientsFilterCallback' => function ($users) {
return array_filter($users, function ($user) {
return !$user->isAdmin;
});
},
接收者筛选器在忽略列表之后应用。
操作
以下操作是可能的
- 收件箱:https://your-domain/message/message/inbox
- 草稿:https://your-domain/message/message/drafts
- 签名:https://your-domain/message/message/signature
- 外出:https://your-domain/message/message/out-of-office
- 已发送消息:https://your-domain/message/message/sent
- 撰写消息:https://your-domain/message/message/compose
- 删除消息:https://your-domain/message/message/delete/hash/
- 查看消息:https://your-domain/message/message/view/hash/
- 管理您的忽略列表:https://your-domain/message/message/ignorelist
您可以将此代码片段放置在您的 layouts/main.php 中,以便用户访问消息操作
$messagelabel = '<span class="fas fa-envelope"></span>';
$unread = Message::find()->where(['to' => $user->id, 'status' => 0])->count();
if ($unread > 0)
$messagelabel .= '(' . $unread . ')';
echo Nav::widget([
'encodeLabels' => false, // important to display HTML-code (fontawesome icons)
'items' => [
// ...
[
'label' => $messagelabel,
'url' => '',
'visible' => !Yii::$app->user->isGuest, 'items' => [
['label' => '<i class="fas fa-inbox"></i> Inbox', 'url' => ['/message/message/inbox']],
['label' => '<i class="fas fa-share-square"></i> Sent', 'url' => ['/message/message/sent']],
'<hr>',
['label' => '<i class="fas fa-firstdraft"></i> Drafts', 'url' => ['/message/message/drafts']],
['label' => '<i class="fas fa-clone"></i> Signature', 'url' => ['/message/message/signature']],
['label' => '<i class="fas fa-calendar-times"></i> Out of Office', 'url' => ['/message/message/out-of-office']],
['label' => '<i class="fas fa-ban"></i> Manage your Ignorelist', 'url' => ['/message/message/ignorelist']],
'<hr>',
['label' => '<i class="fas fa-plus"></i> Compose a Message', 'url' => ['/message/message/compose']],
]
],
// ...
]);
自 0.3.0 版本起,您可以在 Modal Widget 中渲染编辑视图,如下所示
use kartik\growl\GrowlAsset;
use yii\bootstrap\Modal;
use yii\helpers\Url;
GrowlAsset::register($this);
Modal::begin(['id' => 'compose-message', 'header' => '<h2>Compose new Message</h2>']);
Modal::end();
$recipient_id = 1337; # write an message to user with id 1337
echo Html::a('<span class="fas fa-envelope"></span> Compose Message', '', [
'class' => 'btn btn-default btn-contact-user',
'data-recipient' => $recipient_id,
'data-pjax' => 0
]);
$message_url = Url::to(['//message/message/compose']);
$this->registerJs("
$('.modal-body').on('click', '.btn-send-message', function(event) {
if ($('#message-title').val()) {
$.post('".$message_url."', $('#message-form').serializeArray(), function() {
$.notify({message: 'Message has been sent successfully.'}, {type: 'success'});
$('#compose-message').modal('hide');
});
} else {
$('.modal-body').prepend('<div class=\"alert alert-warning\">Please enter a title at least.</div>');
}
event.preventDefault();
});
$('.modal-body').on('submit', '#message-form', function(event) {
$('.btn-send-message').click();
event.preventDefault();
});
$('body').on('click', '.btn-contact-user', function(event) {
$('#compose-message').modal();
recipient = $(this).data('recipient');
$.ajax('".$message_url."?to='+recipient+'&add_to_recipient_list=1', {
'success': function(result) {
$('.modal-body').html(result);
}
});
event.preventDefault();
});
");
对于一些常见的 URL 规则,您可以复制 Module::$urlRules 到 URL 管理器的 'rules' 部分中。
为此项目做出贡献
欢迎任何人和每个人为此项目做出贡献。
许可证
Yii2-message 在 GPLv3 许可证下发布。