ウェブアプリ通知システム/センターを作成しますか?

さて、大声で考えて、何かを達成するための最良の方法を試してみてください。私はおよそ25kユーザーのコミュニティサイトを持っています。

私は、サイトのフロントエンド内のユーザーにメッセージを送信する方法を作りたいと思います。これは、たとえば、一連の基準に基づく新しいエントリの通知、またはサイト管理者から新しい機能のアドバイスを行うすべてのユーザーへのメッセージであってもよい。

ユーザーはメッセージを読むことができなければなりません。メッセージを読むとマークし、メッセージを削除することができます。すべてのメッセージは通知ページに表示されます。

私は、これがCraft(プラグインを介して)を使用して達成することが可能か、これに適した他のサービスがあるかどうか不思議です。私はオンラインで何かを見つけることができません、すべてが私が後にしているものとは少し異なるプッシュ通知に合わせているようです。

私はこれを達成するための方法のまわりで私の頭をかなり得ることができないので、任意の思考。

ありがとう!

ベストアンサー

私はあなたのための簡単なプラグインを作成しました。すぐに使えるプラグインではないので、必要なものを変更する必要があります。これはちょうどあなたの出発点になることを意図しています。
コードを使用して、好きなように変更することはできますが、ほとんどは学習目的です。だから私はあなたのニーズとあなたの構造を知らないので、それが
“完了”であるとは思わないでください。最も重要なこと:私のCSS
/デザインのスキルはひどいので、何もスタイルを設定していません。あなたは自分でそれをやる必要があります

私があなたのために変えることができる/言いたいことを自由に言うことができます。

So here it is Usernotifications

So let’s go through it:
My idea was to create a section called
usernotifications (you don’t have to do it by
yourself, it is created onAfterInstall and can be changed later)
that has different entry types for different messages and purposes.
If you want to change the section handle make sure to change the
$criteria->section = 'usernotifications'; in my
service. This way you can create messages/notifications how you
like and make them really dynamic. Please read this for some ideas
and instructions Overview

Craftは、ユーザーがそれらを却下したり、あまりにも古い場合を除いて、すべてのエントリをレンダリングします。ロジックについて私のサービスをチェックしてください。

The Controller:
has two methods, the first is
actionRemoveNotificationto remove a
message/notification for a user. So you’ll display a
dismiss button and as soon as someone clicks it, you
create a record in your database with the userId and the entryId,
so you know which user removed a notification.

/**
 * Remove a notification for a user 
 */
public function actionRemoveNotification(){
    $this->requirePostRequest();
    $this->requireAjaxRequest();

    $response = [
        'success'   => false,
        'message'   => 'could not find entry'
    ];
    if($entryId = craft()->request->getParam('id')){
        $userId = craft()->userSession->getUser()->id;

        $record = UsernotificationsRecord::model()->find('entryId = :entryId AND userId = :userId', array(
            'entryId'   => $entryId,
            'userId'    => $userId
        ));
        if($record){
           //user already removed the message... there must be something wrong or he/ she cheated :P
           //you can actually ignore this... just wanted to show you how to search for entries^^
        }else{
            $record  = new UsernotificationsRecord();
        }

        $record->userId = $userId;
        $record->entryId = $entryId;

        if($record->save()){
            $response['success'] = true;
            $response['message'] = 'notification removed for user';
         }else{
            $response['message'] = 'could not save record';
            $response['errors'] = $record->getErrors();
        }
    }

    $this->returnJson($response);
}

The service:
The service should return all notifications for the current User or
nothing at all if the user is not logged in

/**
 * Get all notifications for the current user
 *
 * @return string
 */
public function getAllNotificationsForUser(){
   //check if user is logged in...
    if(!craft()->userSession->getUser()){
        return false;
    }

   //fetch all removed notifications of the user to not fetch them in our query
    $removedNotifications = craft()->db->createCommand()
        ->select('entryId')
        ->from('usernotifications')
        ->where(['userId' => craft()->userSession->getUser()->id])
        ->queryColumn();

    $criteria = craft()->elements->getCriteria(ElementType::Entry);
    $criteria->section = 'usernotifications';
   //user should not be overwhelmed with too many notification when they didn't log in for too long
   //so show only notifications 14 days ago, you can change this length or remove it if you want
   //but make sure to change the value in the task as well.
   //you could also create settings for the plugin where you can store how long
   //then entries should be displayed
    $someDateInThePast = date('U', strtotime("-14 days"));

    $criteria->postDate = "> " . $someDateInThePast;
   //exclude the ids of the removed notifications
    if($removedNotifications){
        $criteria->id = 'and, not ' . implode(', not ', $removedNotifications);
    }

    return $criteria->find();
}

Your Variable
In your variable you’ll get the html for those notifications, you
can find the templates in
templates/entries/entrytypes

public function getAllNotificationsForUser(){
    $html = '';
    $entries = craft()->usernotifications->getAllNotificationsForUser();
    if($entries){
       //I get a deprecated hint here, but the solution stated in craft throws
       //an exception... So I'm using this one
        $oldPath = craft()->path->getTemplatesPath();
        $newPath = craft()->path->getPluginsPath() . 'usernotifications/templates';
        craft()->path->setTemplatesPath($newPath);
        $html = craft()->templates->render('entries/index.twig', array(
            'entries' => $entries
        ));
        craft()->path->setTemplatesPath($oldPath);
    }
    return $html;
}

私はこれらが最も重要な部分だと思う、あなたは私のgit
repoで残りを確認し、あなたが好きなものを尋ねる/要求することができます。

エントリは次のようにレンダリングできます。

{% set notifications = craft.usernotifications.getAllNotificationsForUser() %}
{{ notifications|raw }}

Before I forget it: I created a task to remove too old records.
You can access it via
/admin/actions/usernotifications/removeOldRecords

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です