niciz / yii2-message

为Yii2的消息系统

安装: 83

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

v0.5.4 2024-04-22 15:41 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

此外,您还需要安装和设置一个邮件组件,例如https://github.com/yiisoft/yii2-symfonymailer/

安装

$ composer require niciz/yii2-message
$ php yii migrate/up --migrationPath=@vendor/niciz/yii2-message/migrations

配置

将以下行添加到您的配置文件中

'modules' => [
    'message' => [
        'class' => 'niciz\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将电子邮件作业推送到您的队列,而不是直接发送电子邮件。

如果您想使用类似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;
            });
        },

接收者过滤器是在忽略列表之后应用的。

动作

以下动作是可能的

你可以将此代码片段放入你的 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版本开始,你可以在模态小部件内渲染编写视图,如下所示

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许可证下发布。