MODx Revolutionのプライベートメッセージ

私の友人と私は1つのサービスについて考え、MODx Revolutionに実装することにしました。 この決定の理由、およびプロジェクト自体は、この記事の範囲をはるかに超えています。おそらく(必ず読んでください)これについては後で説明します。 今日は、特定の問題がどのように解決されたかを伝えたいと思います。



そのため、ユーザーの個人的なメッセージの形で「ソーシャル」要素を実装する必要があります。 MODxの既製のアドオンを検索しても、このトピックに関するグーグル検索のように、賢明なことは何もありませんでした。 確かに、まだ若干のかすかな光がありました 、明らかに間違った方向にありました。 さて、私は他の目的のためにリソース(どのドキュメント)を使いたくありませんでした。 そして、「すぐに使える」と呼ばれるMODx自体に、1つの小さな「しかし」メッセージシステムがすでに実装されていることに気付きました。ユーザーをまったく入れないはずの管理パネルでのみ使用できます。 フロントエンドで使用するスニペットのヒントすらありません。 その時、私はもっと深く掘り下げることに決めました。



1.私たちの前でなにをしているのか



だから私たちが持っているもの。 MODxデータベースには、テーブルmodx_user_messagesと対応するxPDOクラスmodUserMessageが含まれています。 原則として、メッセージングシステムにそれらを使用することを妨げるものはありません。



クラスにアクセスするには、必要な処理に応じて、getObject、getCollection、newObjectなどのメソッドを使用します。



はい、メッセージの機密性に関するいくつかの言葉はありますが、それらは個人的なものであり、受信者以外には誰にも見せてはなりません。 そのため、最初に当社のWebサイトで認証を構成する必要があります(MODxリポジトリには素晴らしいログインパッケージがあり、このトピックに関する情報は簡単に見つかります)。



UPD。 このトピックは今日ハイライトされたので、記事を公開する時間がありませんでした。



2.メッセージを読むことを学ぶ



単純なものから複雑なものに移りましょう。 承認システムがあり、ユーザーがシステムに登録してログインできるとします。 それでは、特定のユーザーの受信メッセージを受信する受信ボックスページを作成しましょう。



新しいリソースを作成し、登録ユーザーにのみアクセス権割り当てます。これにより、許可されていない「通行人」がこのページを疑うことさえありません。 繰り返しになりますが、この点については説明しません。というのも、この記事はそれに関するものではないからです。



MODxでは、任意のチャンクまたはリソースで、プレースホルダー[[+ modx.user.id]]を使用できます。これは、現在のログインユーザーのIDを返します。 「通行人」の場合、「0」を返します。 これを宛先として使用します(もしhabrasocietyの誰かが現在のユーザーを決定するより信頼できる方法を知っているなら、私は喜んで彼の経験を取り入れます)。



したがって、新しいリソースにスニペットコールを配置し、次のように記述します。



[[!msg-inbox? &userId=`[[+modx.user.id]]`]]
      
      







現在のユーザーIDパラメーターをuserIdとして渡すことに注意してください。 次に、msg-inboxというスニペットを作成し、次のコードを追加します。



 <?php $output = ''; $outputSeparator = isset($outputSeparator) ? $outputSeparator : "\n"; $userId = isset($userId) ? $userId : 0; $limit = isset($limit) ? (integer) $limit : 10; $offset = isset($offset) ? (integer) $offset : 0; $tpl = isset($tpl) ? $tpl : 'inbox_tpl'; if ($userId == 0) { return; } $c = $modx->newQuery('modUserMessage'); $c->where(array( 'recipient' => $userId )); $c->sortby('date_sent','DESC'); $c->limit($offset,$limit); $messages = $modx->getCollection('modUserMessage',$c); foreach ($messages as $msg){ $msgarray = $msg->toArray(); $output .= $modx->getChunk($tpl, $msgarray) . $outputSeparator; $msg->set('read',1); $msg->save(); } return $output;
      
      







ご覧のとおり、特に目立ったものはありません。 ここでは、最初にパラメータがあればそれを受け入れるか、デフォルト値を示します。 次に、念のため、もう一度ユーザーIDをチェックします(突然、遊び心のある誰かがACLにアクセスしました)。0の場合、スニペットを停止します。 ちなみに、スニペットを呼び出すときは、常にuserIdを指定する必要があります。指定しないと、デフォルトで0になり、スニペットはこのステップで動作を停止します。



次に、データベース内のクエリ用にxPDOを準備します。 アドレスのIDがuserIdと等しいメッセージが必要です。 また、メッセージをページングするときに必要になる他のパラメーター、$ limitおよび$ offsetも渡します。 さて、日付の降順で並べ替えます。 「$ messages = $ modx-> getCollection( 'modUserMessage'、$ c);」という行は、条件$ cによってmodUserMessageから直接選択します。 次に、結果の配列を調べて、テンプレートの代わりにチャンクを使用します。 表示するときは、基本的にメッセージを読み取り、「1」に等しいステータスを読み取るように設定します。つまり、 「読む」。



次に、メッセージを表示するためのテンプレートを作成する必要があります。 これを行うには、「inbox_tpl」という名前の新しいチャンクを作成し、以下を追加します。



 <div class=”inbox-message [[+read:isequalto=`0`:then=`unread`]]”> <p><b>:</b> [[+sender:userinfo=`username`]] </p> <p><b>:</b> [[+date_sent]] </p> <p><b>:</b> [[+subject]] </p> <p><b>:</b> [[+message]]</p> </div>
      
      







基本的に、HTMLマークアップはあなたの好みに合わせて絶対に任意にできます。 したがって、ここではスタイルを示しません。 注目したいのは、未読メッセージの表示だけです。 このため、読み取り値が0の場合にメッセージコンテナーに割り当てられるクラスを使用しました:class =” inbox-message [[+ read:isequalto = `0`:then =` unread`]] "」。 それ以外の場合、未読クラスは単に追加されません。 したがって、未読メッセージはCSSを使用して「強調表示」できます。 必要に応じて、テキスト「未読」または対応するアイコンを表示できます。



現在、テスト中です。 新しいユーザーを登録し、フロントエンドにログインします。 受信ボックスページに移動します。もちろん、まだ誰も書いていないので、何も表示されません。 さて、テストメッセージを送信しましょう。 管理パネルのメニュー「ユーザー」->「メッセージ」に移動します。 「新規メッセージ」ボタンを押してユーザーを選択し、「件名」および「メッセージ」フィールドに入力して送信します。 受信ボックスのページに戻り、出来上がりです-管理者からの新しい未読メッセージがあります!



3.メッセージを送信する



完全な通信を行うには、メッセージを読むだけでは不十分です。何らかの方法で送信する必要があります。 さて、メッセージ送信フォームをページに追加してください。 受信ボックスリソースを開き、フォームを追加します。



 <form action="[[*id]]" method="post"> <label> </label><input type="text" name="to" value=""/> <label> </label><input type="text" name="subj" value=""/> <label> </label><textarea name="msg"></textarea> <input type="submit" name="send" value=""/> </form>
      
      







繰り返しますが、すべてが原始的なレベルにあります。 FormItスニペットを使用してフォームを処理します。 私の意見では、最も便利なフォーム処理ツールです。 データを処理するために、FormItは一連のスニペット、「フック」(フック)を呼び出すことができます。 フックは、スパムからの保護、フォームの検証など、さまざまなアクションを実行できます。 フックがフォームを拒否した場合(検証中など)、falseを返し、チェーン内の次のフックは失敗します。 さらに、エラーメッセージを送信できます。



メッセージを送信するには、フックを作成してFormItにフィードします。 最初に、受信トレイリソースにFormIt呼び出しを追加します。 ページのできるだけ高い位置に配置することをお勧めします。つまり、フォームの前に配置して、msg-inboxスニペットを呼び出します。



 [[!FormIt? &hooks=`msg-send` &submitVar=`send`]]
      
      







2番目のパラメーターsubmitVarに注意してください。 ここでは、「送信」ボタンの名前を示しているため、FormItはページ上のどのフォームとその処理方法を正確に認識します。 言うまでもなく、ページにはいくつかのフォームがあります。



次に、msg-sendという新しいスニペットを作成し、次のコードを追加します。



 <?php $userid = isset($userId) ? $userId: 0; if ($userid == 0) { return false; //    }; $to = $hook->getValue('to'); $message = $hook->getValue('msg'); $subj = $hook->getValue('subj'); $msg = $modx->newObject('modUserMessage'); $msg->fromArray(array( 'sender' => $userid, 'recipient' => $to, 'message' => $message, 'subject' => $subj, 'read' => 0, 'private' => 1, 'date_sent'=> strftime('%Y-%m-%d %T'), )); $msg->save(); return true;
      
      







ここでは、まず匿名性を確認してから、フォームからデータを取得します。 FormItはそれらを$フックオブジェクトに保存します。 これらを取得するには、$ hook-> getValue()メソッドを使用します。$ hook-> getValues()メソッドは、すべてのフォームデータを含む配列を返します。 次に、新しいmodUserMessageオブジェクトを作成し、そのプロパティにデータを入力します。 また、メッセージが送信された日付を追加し、タイプはprivate = 1です。



保存して確認してください。 この段階で、「To」フィールドに、受信者IDを書き込む必要があります。 自分にメッセージを送ってみましょう。 フロントエンドで管理者としてログインしている場合、受信者のIDは1になります。残りのフィールドに入力し、「送信」をクリックします。 すべてが正しく行われた場合、メッセージがページに表示されます。 これで、複数のユーザーを登録して、お互いにメッセージを投げることができます。



おわりに



この記事には、名前によるユーザーの定義やリストからの宛先の選択を意図的に含めませんでした-それはすべてあなたのタスクと希望に依存します。 さらに、創造性の余地を十分に残しているので、思いがけないコピーペーストが少なくなりました。 ユーザー名については、ヒントを示します。MODxのユーザーは基本的に同じオブジェクトであり、クラスのみがmodUserと呼ばれます。



この記事は、メッセージ管理や並べ替えなどがないため、完全なソリューションであるとは主張していません。 カスタムスニペットを使用してMODxの機能を拡張することは、一見するとそれほど難しくないことを示しました。



頑張って



PS何を知っているあなたに感謝!



All Articles