diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda..0000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b9d6bd9..0000000 --- a/.gitignore +++ /dev/null @@ -1,215 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap -.DS_Store - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg diff --git a/MessageModule.php b/MessageModule.php index 40dde9e..a0b00f7 100644 --- a/MessageModule.php +++ b/MessageModule.php @@ -15,6 +15,7 @@ class MessageModule extends WebModule { + public $messagePerPage = 20; // название модуля public function getName() { @@ -27,7 +28,7 @@ public function getDescription() return Yii::t('MessageModule.client', 'Модуль для организации приватных сообщений между пользователями'); } - // автор модуля (Ваше Имя, название студии и т.п.) + // автор модуля public function getAuthor() { return Yii::t('MessageModule.client', 'Дмитрий Брусенский (BrusSENS)'); @@ -62,7 +63,7 @@ public function getIsNoDisable() public function getVersion() { - return Yii::t('MessageModule.user', '0.1-alpha'); + return Yii::t('MessageModule.user', '0.1beta-1'); } public function getIcon() @@ -84,22 +85,20 @@ public function init() $this->setImport(array( 'message.models.*', 'message.components.*', + 'message.forms.*', )); } public function getAdminPageLink() { - return '/message/messageBackend/index'; + return '/message/messageBackend/spam'; } public function getNavigation() { return array( - array('label' => Yii::t('MessageModule.user', 'Users')), - array('icon' => 'list-alt', 'label' => Yii::t('MessageModule.user', 'Manage users'), 'url' => array('/user/userBackend/index')), - array('icon' => 'plus-sign', 'label' => Yii::t('MessageModule.user', 'Create user'), 'url' => array('/user/userBackend/create')), - array('label' => Yii::t('MessageModule.user', 'Tokens')), - array('icon' => 'list-alt', 'label' => Yii::t('MessageModule.user', 'Token list'), 'url' => array('/user/tokensBackend/index')), + array('label' => Yii::t('MessageModule.message', 'Spam')), + array('icon' => 'list-alt', 'label' => Yii::t('MessageModule.message', 'Spam list'), 'url' => array('/message/messageBackend/spam')), ); } diff --git a/components/BaseController.php b/components/BaseController.php new file mode 100644 index 0000000..dc21d98 --- /dev/null +++ b/components/BaseController.php @@ -0,0 +1,34 @@ +user->isAuthenticated()) { + $this->redirect(array('/user/account/login')); + } + Yii::app()->clientScript->registerCssFile( + Yii::app()->assetManager->publish( + Yii::getPathOfAlias('application.modules.message.views.assets.css').'/messageModule.css' + ) + ); + return parent::init(); + } + /** + * Обрезка строк + */ + public function toCut($str,$len=100,$div=" ") { + //Обрезка Строки до заданной максимальной длинны, с округлением до посленего символа - разделителя (в меньшую сторону) + //например toCut('Мама мыла раму',14," ") вернет "Мама мыла" + if (strlen($str)<=$len){ + return $str; + } + else{ + $str=substr($str,0,$len); + $pos=strrpos($str,$div); + $str=substr($str,0,$pos); + return $str.' ...'; + } + } +} \ No newline at end of file diff --git a/controllers/InboxController.php b/controllers/InboxController.php new file mode 100644 index 0000000..97a2e1f --- /dev/null +++ b/controllers/InboxController.php @@ -0,0 +1,102 @@ +inbox; + $this->render('index', array('dataProvider'=>$dataProvider)); + } + /** + * Экшн просмотра входящего сообщения + */ + public function actionView() { + $model = Message::model()->messageView($_GET['message_id']); + if (!$model) { + throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); + } + + $reply=$this->reply($model); + + + $this->render('view',array('model'=>$model, 'reply'=>$reply)); + } + /** + * Экшн удаления входящего сообщения + */ + public function actionRemove() { + if(!$_GET['message_id']) { + throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); + } + else { + $result=Message::model()->removeInbox($_GET['message_id']); + if($result) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Message has been successfully removed') + ); + } + else { + Yii::app()->user->setFlash( + YFlashMessages::ERROR_MESSAGE, + Yii::t('MessageModule.message', 'When you remove the error occurred. Perhaps you have no right to commit this action') + ); + } + $this->redirect($this->createUrl('inbox/inbox')); + } + } + /** + * Экшн для пометки сообщения получателем, как "спам". + */ + public function actionMakeSpam() { + if(!$_GET['message_id']) { + throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); + } + else { + $result=Message::model()->makeSpam($_GET['message_id']); + if($result) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Message marked as "Spam"') + ); + } + else { + Yii::app()->user->setFlash( + YFlashMessages::ERROR_MESSAGE, + Yii::t('MessageModule.message', 'When you mark "This is spam" An error has occurred. You might not have permission to perform this action') + ); + } + $this->redirect($this->createUrl('inbox/inbox')); + } + } + /** + * Метод для создания ответа + */ + public function reply($model) { + $reply=new ReplyForm; + + if(isset($_POST['ajax']) && $_POST['ajax']==='message-reply-form') { + echo CActiveForm::validate($reply); + Yii::app()->end(); + } + if(isset($_POST['ReplyForm'])) { + $reply->attributes=$_POST['ReplyForm']; + $reply->subject=$model->subject; + $reply->reply_to=$model->id; + $reply->recipient_id=$model->sender_id; + if($reply->validate()) + { + if($reply->save()) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Message sent successfully!') + ); + $this->refresh(); + } + } + } + return $reply; + } +} \ No newline at end of file diff --git a/controllers/MessageBackendController.php b/controllers/MessageBackendController.php index 20acc61..c49bda1 100644 --- a/controllers/MessageBackendController.php +++ b/controllers/MessageBackendController.php @@ -4,15 +4,56 @@ * Пользователь: BrusSENS * Дата: 26.01.14 * Время: 4:49 - * Описание: + * Описание: Контроллер Администраторского раздела модуля Message; */ class MessageBackendController extends yupe\components\controllers\BackController { - public function actionIndex() { - $this->render('index'); + public $defaultAction = 'Spam'; + + public function init() { + Yii::app()->clientScript->registerCssFile( + Yii::app()->assetManager->publish( + Yii::getPathOfAlias('application.modules.message.views.assets.css').'/messageModule.css' + ) + ); + return parent::init(); + } + + /** + * Экшен списка сообщений, помеченных, как спам. + */ + public function actionSpam() { + $dataProvider= Message::model()->spamAdm; + $this->render('spam', array('dataProvider'=>$dataProvider)); } - public function spam() { - $this->render('spam'); + + /** + * Экшен блокировки спамера. + */ + public function actionBlock() { + if(isset($_GET['user_id'])) { + $user=User::model()->findByPk($_GET['user_id']); + $user->status=$user::STATUS_BLOCK; + if($user->update()) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Пользователь успешно заблокирован.') + ); + } + else { + Yii::app()->user->setFlash( + YFlashMessages::ERROR_MESSAGE, + Yii::t('MessageModule.message', 'Произошла ошибка.') + ); + } + } + else { + Yii::app()->user->setFlash( + YFlashMessages::ERROR_MESSAGE, + Yii::t('MessageModule.message', 'Некого блокировать :(.') + ); + } + $this->redirect($_SERVER['HTTP_REFERER']); } } \ No newline at end of file diff --git a/controllers/MessageController.php b/controllers/MessageController.php index 4c08a20..148e398 100644 --- a/controllers/MessageController.php +++ b/controllers/MessageController.php @@ -1,38 +1,18 @@ clientScript->registerCssFile( - Yii::app()->assetManager->publish( - Yii::getPathOfAlias('application.modules.message.views.assets.css').'/messageModule.css' - ) - ); - return parent::init(); - } - public function actionInbox() - { - $dataProvider= Message::model()->inbox; - $this->render('index', array('dataProvider'=>$dataProvider)); - } - public function actionOutbox() - { - $dataProvider= Message::model()->outbox; - $this->render('index', array('dataProvider'=>$dataProvider)); - } - public function actionView() { - $stat= Message::model()->countMessages(); - $model = Message::model()->messageView($_GET['message_id']); - if (!$model) { - throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); - } - $this->render('show',array('model'=>$model, 'stat'=>$stat)); - } - public function actionCreate() - { - $model=new Message; $user=new User; - // uncomment the following code to enable ajax-based validation if(isset($_POST['ajax']) && $_POST['ajax']==='message-CreateMessage-form') { @@ -40,9 +20,9 @@ public function actionCreate() Yii::app()->end(); } - if(isset($_POST['Message'])) + if(isset($_POST['MessageForm'])) { - $model->attributes=$_POST['Message']; + $model->attributes=$_POST['MessageForm']; if($model->validate()) { if($model->save()) { @@ -50,22 +30,10 @@ public function actionCreate() YFlashMessages::SUCCESS_MESSAGE, Yii::t('MessageModule.message', 'Message sent successfully!') ); + $this->redirect($this->createUrl('inbox/inbox'));//TODO: Сделать правильный редирект } } } $this->render('create',array('model'=>$model, 'user'=>$user->findAll())); } - public function toCut($str,$len=30,$div=" "){ - //Обрезка Строки до заданной максимальной длинны, с округлением до посленего символа - разделителя (в меньшую сторону) - //например toCut('Мама мыла раму',14," ") вернет "Мама мыла" - if (strlen($str)<=$len){ - return $str; - } - else{ - $str=substr($str,0,$len); - $pos=strrpos($str,$div); - $str=substr($str,0,$pos); - return $str.' ...'; - } - } } \ No newline at end of file diff --git a/controllers/OutboxController.php b/controllers/OutboxController.php new file mode 100644 index 0000000..344b522 --- /dev/null +++ b/controllers/OutboxController.php @@ -0,0 +1,77 @@ +outbox; + $this->render('index', array('dataProvider'=>$dataProvider)); + } + /** + * Экшн просмотра отправленного сообщения + */ + public function actionView() { + $model = Message::model()->messageView($_GET['message_id']); + if (!$model) { + throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); + } + $reply=$this->reply($model); + $this->render('view',array('model'=>$model, 'reply'=>$reply)); + } + /** + * Экшн удаления отправленного сообщения + */ + public function actionRemove() { + if(!$_GET['message_id']) { + throw new CHttpException(404, Yii::t('MessageModule.message', 'This message does not exist')); + } + else { + $result=Message::model()->removeOutbox($_GET['message_id']); + if($result) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Message has been successfully removed') + ); + } + else { + Yii::app()->user->setFlash( + YFlashMessages::ERROR_MESSAGE, + Yii::t('MessageModule.message', 'When you remove the error occurred. Perhaps you have no right to commit this action') + ); + } + $this->redirect($this->createUrl('outbox/outbox')); + } + } + /** + * Метод для создания ответа + */ + public function reply($model) { + $reply=new ReplyForm; + if(isset($_POST['ajax']) && $_POST['ajax']==='message-reply-form') { + echo CActiveForm::validate($reply); + Yii::app()->end(); + } + if(isset($_POST['ReplyForm'])) { + $reply->attributes=$_POST['ReplyForm']; + $reply->subject=$model->subject; + $reply->reply_to=$model->id; + $reply->recipient_id=$model->recipient_id; + if($reply->validate()) + { + if($reply->save()) { + Yii::app()->user->setFlash( + YFlashMessages::SUCCESS_MESSAGE, + Yii::t('MessageModule.message', 'Message sent successfully!') + ); + $this->refresh(); + } + } + } + return $reply; + } +} \ No newline at end of file diff --git a/forms/MessageForm.php b/forms/MessageForm.php new file mode 100644 index 0000000..a0b854c --- /dev/null +++ b/forms/MessageForm.php @@ -0,0 +1,55 @@ +subject)) + $this->subject=Yii::t('MessageModule.message', 'No subject'); + return parent::beforeSave(); + } + + public function attributeLabels() { + $labels=parent::attributeLabels(); + return CMap::mergeArray($labels,array( + 'nick_name' => Yii::t('MessageModule.message', 'Recipient nickname'), + )); + } + + /** + * Метод валидации пользователя по введённому nick_name. + */ + public function recipientValidate() { + //Вытаскиваем данные пользователя + $user=User::model()->findByAttributes(array('nick_name'=>$this->nick_name)); + if($user) {//если такой пользователь существует + if(Yii::app()->user->id==$user->id) {//проверяем, не отправляет ли он сообщение самому себе + $this->addError('nick_name', Yii::t('MessageModule.message', 'You can not send messages to yourself'));//если отправляет себе, то выдаём ошибку валидации + } + else {//если отправляет другому пользователю + $this->recipient_id=$user->id;//записываем id получателя в соответствующее свойство + } + } + else {//если пользователя с введёным nick_name не существует + $this->addError('nick_name', Yii::t('MessageModule.message', 'This user does not exist'));//выдаём ошибку валидации + } + } + +} \ No newline at end of file diff --git a/forms/ReplyForm.php b/forms/ReplyForm.php new file mode 100644 index 0000000..27d580b --- /dev/null +++ b/forms/ReplyForm.php @@ -0,0 +1,26 @@ + array( 'application.modules.message.models.*', + 'application.modules.message.components.*', ), 'component' => array(), 'rules' => array( - '/messages'=> 'message/message/inbox', - '/messages/outbox'=> 'message/message/outbox', - '/message/create'=> 'message/message/create', - '/message/view/'=> 'message/message/view', + '/messages/inbox'=> 'message/inbox/inbox', + '/messages/outbox'=> 'message/outbox/outbox', + '/message/create'=> 'message/message/create', + '/message/inbox/message'=> 'message/inbox/view', + '/message/outbox/message'=> 'message/outbox/view', + '/message/outbox/remove/message'=> 'message/outbox/remove', + '/message/inbox/remove/message'=> 'message/inbox/remove', + '/message/itspam/message'=> 'message/inbox/makeSpam', ), ); \ No newline at end of file diff --git a/install/migrations/m140201_133405_message_message.php b/install/migrations/m140201_133405_message_message.php index 9cfb959..0e95bf7 100644 --- a/install/migrations/m140201_133405_message_message.php +++ b/install/migrations/m140201_133405_message_message.php @@ -12,7 +12,7 @@ class m140201_133405_message_message extends yupe\components\DbMigration { /** - * Функция настройки и создания таблицы: + * Метод настройки и создания таблицы: * * @return null **/ @@ -31,6 +31,7 @@ public function safeUp() 'is_read' => "BIT(1) NOT NULL DEFAULT b'0'", 'sender_del' => "BIT(1) NOT NULL DEFAULT b'0'", 'recipient_del' => "BIT(1) NOT NULL DEFAULT b'0'", + 'reply_to' => "INT(11) NULL DEFAULT NULL", ), $this->getOptions() ); @@ -42,7 +43,7 @@ public function safeUp() '{{user_user}}', 'id', 'CASCADE', 'CASCADE'); } /** - * Функция удаления таблицы: + * Метод удаления таблицы: * * @return null **/ diff --git a/messages/ru/message.php b/messages/ru/message.php index 0a910f3..f8fc5a5 100644 --- a/messages/ru/message.php +++ b/messages/ru/message.php @@ -22,6 +22,8 @@ 'Submitted' => 'Отправленные', 'Inbox' => 'Входящие', 'Write' => 'Написать', + 'Create message' => 'Новое сообщение', + 'Messages' => 'Сообщения', 'Cancel' => 'Отмена', 'Send' => 'Отправить', 'This is spam!' => 'Это спам!', @@ -31,6 +33,7 @@ 'Subject' => 'Тема', 'Content' => 'Содержание', 'Dispatch date' => 'Дата отправки', + 'Actions' => 'Дейстия', 'Sender ID' => 'ID отправителя', 'Recipient nickname' => 'Никнейм получателя', 'Recipient ID' => 'ID получателя', @@ -43,4 +46,12 @@ 'Fields with * are required' => 'Поля, помеченные * обязательны для заполнения', 'Yesterday at' => 'Вчера в', 'Today at' => 'Сегодня в', + 'Are you sure?' => 'Вы уверены?', + 'No subject' => 'Без темы', + 'Message has been successfully removed' => 'Сообщение успешно удалено', + 'Message marked as "Spam"' => 'Сообщение помечено, как "Спам"', + 'Block spammer' => 'Заблокировать спамера', + 'This is not spam' => 'Это не спам', + 'When you mark "This is spam" An error has occurred. You might not have permission to perform this action' => 'При пометке "Это спам" произошла ошибка. Возможно у вас нет прав на выполнение данного действия', + 'When you remove the error occurred. Perhaps you have no right to commit this action' => 'При удалении произошла ошибка. Возможно у вас отсутствуют права на совершение данного действия', ); diff --git a/models/Message.php b/models/Message.php index 16b3d42..5a5b29f 100644 --- a/models/Message.php +++ b/models/Message.php @@ -1,7 +1,7 @@ true), + array('body', 'required'), + array('sender_id, recipient_id, is_spam, is_read, sender_del, recipient_del, reply_to', 'numerical', 'integerOnly'=>true), array('subject', 'length', 'max'=>150), array('send_date','default', 'value'=>new CDbExpression('NOW()')), array('sender_id','default', 'value'=>Yii::app()->user->id), - array('nick_name', 'recipientValidate'), - //array('recipient_id','default', 'value'=>2), array('body','filter', 'filter'=>array($obj=new CHtmlPurifier(),'purify')), - // The following rule is used by search(). - // @todo Please remove those attributes that should not be searched. - array('nick_name', 'safe'), array('id, subject, body, send_date, sender_id, recipient_id, is_spam, is_read, sender_del, recipient_del', 'safe', 'on'=>'search'), ); } @@ -85,12 +102,12 @@ public function attributeLabels() 'body' => Yii::t('MessageModule.message', 'Content'), 'send_date' => Yii::t('MessageModule.message', 'Dispatch date'), 'sender_id' => Yii::t('MessageModule.message', 'Sender ID'), - 'nick_name' => Yii::t('MessageModule.message', 'Recipient nickname'), 'recipient_id' => Yii::t('MessageModule.message', 'Recipient ID'), 'is_spam' => Yii::t('MessageModule.message', 'Marked by the recipient as "Spam"'), 'is_read' => Yii::t('MessageModule.message', 'Read by the recipient'), 'sender_del' => Yii::t('MessageModule.message', 'Deleted sender'), 'recipient_del' => Yii::t('MessageModule.message', 'Deleted recipient'), + 'reply_to' => Yii::t('MessageModule.message', 'Parent message'), ); } @@ -122,19 +139,29 @@ public function search() $criteria->compare('is_read',$this->is_read); $criteria->compare('sender_del',$this->sender_del); $criteria->compare('recipient_del',$this->recipient_del); + $criteria->compare('reply_to',$this->reply_to); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } - public function messageView($id) { - $message=$this->findByPk($id); - if($message->is_read==self::NOT_READ) { - $message->is_read=self::READ; - $message->update(array('is_read')); + /** + * @param $id + * + * @return CActiveRecord + * + * Метод для получения данных определённого сообщения. + */ + public function messageView($id) {//Получаем id просматриваемого сообщения. + $message=$this->findByPk($id);//Получаем данные просматриваемого сообщения. + if($message->recipient_id===Yii::app()->user->id) {//Если его читает получатель + if(!$this->getIsRead()) {//Если получатель ещё не читал сообщение + $message->is_read=self::READ;//Делаем его прочитанным. + $message->update(array('is_read'));//Обновляем информацию о сообщении. + } } - return $message; + return $message;// И возращаем модель для дальнейшего показа сообщения. } /** @@ -149,48 +176,12 @@ public static function model($className=__CLASS__) } /** - * Метод валидации пользователя по введённому nick_name - */ - public function recipientValidate() { - //Вытаскиваем данные пользователя - $user=User::model()->findByAttributes(array('nick_name'=>$this->nick_name)); - if($user) {//если такой пользователь существует - if(Yii::app()->user->id==$user->id) {//проверяем, не отправляет ли он сообщение самому себе - $this->addError('nick_name', Yii::t('MessageModule.message', 'You can not send messages to yourself'));//если отправляет себе, то выдаём ошибку валидации - } - else {//если отправляет другому пользователю - $this->recipient_id=$user->id;//записываем id получателя в соответствующее свойство - } - } - else {//если пользователя с введёным nick_name не существует - $this->addError('nick_name', Yii::t('MessageModule.message', 'This user does not exist'));//выдаём ошибку валидации - } - } - - /** - * @param string $type = inbox, sent, spam, drop - * По умолчанию inbox - * Метод получения количества сообщений - * inbox - входящие - * sent - отправленные - * spam - помеченные пользователем, как спам. - * drop - помеченные пользователем, как удалённые. + * @return string + * + * Метод получения количества непрочитанных входящих сообщений. + * + * Исп.: Message::model()->inboxcount; */ - public function countMessages() { - $stat=array(); - $criteriaSpam = new CDbCriteria; - $criteriaSpam->condition = 'recipient_id = ' . Yii::app()->user->id; - $criteriaSpam->addCondition("is_spam = " . self::SPAM); - $criteriaSpam->addCondition("recipient_del = " . self::NOT_DROP); - $stat['spam']=$this->count($criteriaSpam); - - $criteriaDrop = new CDbCriteria; - $criteriaDrop->condition = 'recipient_id = ' . Yii::app()->user->id; - $criteriaDrop->addCondition("recipient_del = " . self::DROP); - $stat['drop']=$this->count($criteriaDrop); - - return $stat; - } public function getInboxcount() { $criteria= new CDbCriteria; $criteria->condition = 'recipient_id = ' . Yii::app()->user->id; @@ -199,35 +190,60 @@ public function getInboxcount() { $criteria->addCondition("is_read = " . self::NOT_READ); return $this->count($criteria); } + + /** + * @return string + * + * Метод получения количества отправленных сообщений. + * + * Исп.: Message::model()->outboxcount; + */ public function getOutboxcount() { $criteria = new CDbCriteria; $criteria->condition = 'sender_id = ' . Yii::app()->user->id; $criteria->addCondition("sender_del = " . self::NOT_DROP); return $this->count($criteria); } + + /** + * @return CActiveDataProvider + * + * Метод получения входящих сообщений. + * + * Исп.: Message::model()->inbox; + */ public function getInbox() { $criteria = new CDbCriteria; $criteria->condition = 'recipient_id = ' . Yii::app()->user->id; $criteria->addCondition("is_spam = " . self::NOT_SPAM); $criteria->addCondition("recipient_del = " . self::NOT_DROP); - $criteria->with = array('sender'=>array('alias'=>'author')); + $criteria->with = array('sender'); $criteria->order='send_date DESC'; $dataProvider=new CActiveDataProvider($this, array( 'pagination'=>array( - 'pageSize'=>3, + 'pageSize'=>Yii::app()->controller->module->messagePerPage, ), 'criteria'=>$criteria, )); return $dataProvider; } + + /** + * @return CActiveDataProvider + * + * Метод получения отправленных сообщений. + * + * Исп.: Message::model()->outbox; + */ public function getOutbox() { $criteria = new CDbCriteria; $criteria->condition = 'sender_id = ' . Yii::app()->user->id; $criteria->addCondition("sender_del = " . self::NOT_DROP); + $criteria->with = array('recipient'); $criteria->order='send_date DESC'; $dataProvider=new CActiveDataProvider($this, array( 'pagination'=>array( - 'pageSize'=>3, + 'pageSize'=>Yii::app()->controller->module->messagePerPage, ), 'criteria'=>$criteria, )); @@ -235,56 +251,106 @@ public function getOutbox() { } /** - * @param string $type = inbox, sent, spam, drop - * По умолчанию inbox - * Метод получения списка сообщений. - * inbox - входящие - * sent - отправленные - * spam - помеченные пользователем, как спам. - * drop - помеченные пользователем, как удалённые. - * @param boolean $dataProvider - * По умолчанию true - * При false возвращает criteria + * @return CActiveDataProvider + * + * Метод получения спама для администратора. * + * Исп.: Message::model()->spamAdm; */ - public function giveMessages($type='inbox', $dataProvider=true) { + public function getSpamAdm() { $criteria = new CDbCriteria; - switch ($type) { - case "spam": - $criteria->condition = 'recipient_id = ' . Yii::app()->user->id; - $criteria->addCondition("is_spam = " . self::SPAM); - $criteria->addCondition("recipient_del = " . self::NOT_DROP); - break; - case "drop": - $criteria->condition = 'recipient_id = ' . Yii::app()->user->id; - $criteria->addCondition("recipient_del = " . self::DROP); - break; - } + $criteria->addCondition("is_spam = " . self::SPAM); + $criteria->with = array('recipient', 'sender'); $criteria->order='send_date DESC'; $dataProvider=new CActiveDataProvider($this, array( 'pagination'=>array( - 'pageSize'=>3, + 'pageSize'=>Yii::app()->controller->module->messagePerPage, ), 'criteria'=>$criteria, )); return $dataProvider; } - public function getRelation($actionId) { - switch($actionId) { - case "outbox": - return $this->recipient; - break; - case "inbox": - return $this->sender; - break; + + /** + * @return bool + * + * Метод проверки, прочитано сообщение или нет. + * + * Исп:. $this->isRead; + */ + public function getIsRead() { + if($this->is_read!=self::NOT_READ) { + return true; + } + else { + return false; } } - public function getIsRead() { - if($this->is_read!=0) { + + /** + * @param $id + * + * @return bool + * + * Метод удаления отправленого сообщения + * Удаления как такового не происходит. + * Сообщение только помечается, как удалённое Отправителем. + */ + public function removeOutbox($id) { + $message=$this->findByPk($id); + if($message->sender_id===Yii::app()->user->id) { + $message->sender_del=self::DROP; + $message->update(); return true; } else { return false; } } + + /** + * @param $id + * + * @return bool + * + * Метод удаления входящего сообщения. + * Удаления как такового не происходит. + * Сообщение только помечается, как удалённое получателем. + */ + public function removeInbox($id) { + $message=$this->findByPk($id); + if($message->recipient_id===Yii::app()->user->id) { + $message->recipient_del=self::DROP; + $message->update(); + return true; + } + else { + return false; + } + } + + /** + * @param $id + * + * @return bool + * + * Метод пометки сообщения, как спам. + */ + public function makeSpam($id) { + //Получаем сообщение по его ID. + $message=$this->findByPk($id); + //Проверяем, кто отмечает его, как спам. + if($message->recipient_id===Yii::app()->user->id) { + //Помечаем сообщение, как спам. + $message->is_spam=self::SPAM; + //Обновляем сообщение. + $message->update(); + //Возвращаем успешное выполнение операции. + return true; + } + else {//Если его помечает кто то другой. + //Возвращаем провал операции. + return false; + } + } } diff --git a/views/assets/css/messageModule.css b/views/assets/css/messageModule.css index 650239f..7c090fb 100644 --- a/views/assets/css/messageModule.css +++ b/views/assets/css/messageModule.css @@ -17,9 +17,20 @@ .y-mess-no-read:hover { background:#e2e7ed !important; } -.y-mess-item .y-mess-buttons { +.y-mess-item .btn-group, +.y-mess-item .button-rem { display:none; } -.y-mess-item:hover .y-mess-buttons { - display:block; +.y-mess-item:hover .btn-group, +.y-mess-item:hover .button-rem { + display:inline-block; +} +.y-mess-nickname-link { + text-transform: capitalize; +} +.list-view { + padding-top:0 !important; +} +hr.y-mess { + margin:5px 0; } \ No newline at end of file diff --git a/views/inbox/_view.php b/views/inbox/_view.php new file mode 100644 index 0000000..236ec92 --- /dev/null +++ b/views/inbox/_view.php @@ -0,0 +1,34 @@ +
+
+
+ <?php echo $data->sender->nick_name; ?> +
+
sender->nick_name, array('/user/people/userInfo', 'username'=>$data->sender->nick_name)); ?>
+
widget('application.modules.message.widgets.PeopleDate',array('date'=>$data->send_date, 'type' => 1)); ?>
+
+
+
+
+
toCut((!empty($data->reply_to)) ? 'Re:'.$data->subject : $data->subject), array('inbox/view', 'message_id'=>$data->id)); ?>
+
toCut($data->body); ?>
+
+
+
+ widget( + 'bootstrap.widgets.TbButtonGroup', + array( + 'size' => 'mini', + + 'buttons' => array( + array('url' => array('inbox/remove', 'message_id'=>$data->id), 'icon' => 'remove', 'type' => 'info', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Remove'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'))), + array('url' => array('inbox/makeSpam', 'message_id'=>$data->id), 'icon' => 'warning-sign', 'type' => 'danger', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'This is spam!'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'))), + ), + ) + ); + + + ?> +
+
+
\ No newline at end of file diff --git a/views/message/index.php b/views/inbox/index.php similarity index 96% rename from views/message/index.php rename to views/inbox/index.php index 56481d7..486555b 100644 --- a/views/message/index.php +++ b/views/inbox/index.php @@ -16,7 +16,7 @@ 'url'=>array('message/create'), ) ); ?> -
+
widget( 'application.modules.message.widgets.MessageMenu' );?> diff --git a/views/inbox/view.php b/views/inbox/view.php new file mode 100644 index 0000000..30d52c9 --- /dev/null +++ b/views/inbox/view.php @@ -0,0 +1,62 @@ +breadcrumbs=array( + Yii::t('MessageModule.message', 'Inbox')=>$this->createUrl('inbox/inbox'), + $model->subject +); +?> +
+
+ widget( + 'bootstrap.widgets.TbButton', + array( + 'label' => Yii::t('MessageModule.message', 'Write'), + 'type' => 'success', + 'block'=>true, + 'url'=>array('message/create'), + ) + ); ?> +
+ widget( + 'application.modules.message.widgets.MessageMenu' + );?> +
+
+
+
+ <?php echo $model->sender->nick_name; ?> +
+ +
+ +

: widget('application.modules.message.widgets.PeopleDate',array('date'=>$model->send_date, 'type' => 1)); ?>

+

: reply_to)) ? 'Re:'.$model->subject : $model->subject ?>

+
+ +
+ widget( + 'bootstrap.widgets.TbButtonGroup', + array( + 'size' => 'mini', + 'buttons' => array( + array('url' => array('inbox/remove', 'message_id'=>$model->id), 'icon' => 'remove', 'type' => 'info', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Remove'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'))), + array('url' => array('inbox/makeSpam', 'message_id'=>$model->id), 'icon' => 'warning-sign', 'type' => 'danger', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'This is spam!'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'))), + ) + ) + ); + + + ?> +
+
+
+

body; ?>

+
+ renderPartial('/message/reply',array( + 'model'=>$reply, + )); ?> +
+
+
\ No newline at end of file diff --git a/views/message/_view.php b/views/message/_view.php deleted file mode 100644 index cfecfbf..0000000 --- a/views/message/_view.php +++ /dev/null @@ -1,39 +0,0 @@ -
-
-
- <?php echo $data->getRelation(Yii::app()->controller->action->id)->nick_name; ?> -
-
getRelation(Yii::app()->controller->action->id)->nick_name, array('/user/people/userInfo', 'username'=>$data->getRelation(Yii::app()->controller->action->id)->nick_name)); ?>
-
widget('application.modules.message.widgets.PeopleDate',array('date'=>$data->send_date, 'type' => 1)); ?>
-
-
-
-
-
toCut($data->subject), array('message/view', 'message_id'=>$data->id)); ?>
-
body; ?>
-
-
-
- widget( - 'bootstrap.widgets.TbButtonGroup', - array( - 'size' => 'mini', - 'type' => 'primary', - 'buttons' => array( - array( - 'label' => '', - 'htmlOptions' => array( - 'class'=>'y-mess-buttons' - ), - 'icon' => 'cog', - 'items' => array( - array('label' => Yii::t('MessageModule.message', 'Remove'), 'url' => '#', 'icon' => 'remove',), - array('label' => Yii::t('MessageModule.message', 'This is spam!'), 'url' => '#', 'icon' => 'warning-sign',), - ) - ), - ), - ) - );?> -
-
-
\ No newline at end of file diff --git a/views/message/create.php b/views/message/create.php index d9060f0..cde2658 100644 --- a/views/message/create.php +++ b/views/message/create.php @@ -1,29 +1,8 @@ -breadcrumbs=array( +Yii::t('MessageModule.message', 'Messages')=>$this->createUrl('inbox/inbox'), +Yii::t('MessageModule.message', 'Create message') +); ?> -
widget( @@ -56,9 +35,7 @@ 'url'=>array('message/inbox'), ) ); ?> - endWidget(); ?> -
\ No newline at end of file diff --git a/views/message/reply.php b/views/message/reply.php new file mode 100644 index 0000000..c6eaf82 --- /dev/null +++ b/views/message/reply.php @@ -0,0 +1,16 @@ +
+
+ beginWidget('bootstrap.widgets.TbActiveForm', array( + 'id'=>'message-reply-form', + 'enableAjaxValidation'=>true, + )); ?> + +

* are required');?>

+ + errorSummary($model); ?> + textAreaRow($model, 'body', array('class'=>'span12', 'rows'=>9)); ?> + + widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit', 'type'=>'success', 'label'=>Yii::t('MessageModule.message','Send'))); ?> + endWidget(); ?> +
\ No newline at end of file diff --git a/views/message/show.php b/views/message/show.php deleted file mode 100644 index 740ed34..0000000 --- a/views/message/show.php +++ /dev/null @@ -1,53 +0,0 @@ - -
-
- widget( - 'bootstrap.widgets.TbButton', - array( - 'label' => Yii::t('MessageModule.message', 'Write'), - 'type' => 'success', - 'block'=>true, - 'url'=>array('message/create'), - ) - ); ?> -
- widget( - 'application.modules.message.widgets.MessageMenu' - );?> -
-
- - - - - - - - - - - - -
<?php echo $model->sender->nick_name; ?>send_date; ?>
sender->nick_name; ?>subject; ?>
body; ?>
-
-
\ No newline at end of file diff --git a/views/messageBackend/_spamView.php b/views/messageBackend/_spamView.php new file mode 100644 index 0000000..ad78d2f --- /dev/null +++ b/views/messageBackend/_spamView.php @@ -0,0 +1,34 @@ +
+
+
+ <?php echo $data->sender->nick_name; ?> +
+
sender->nick_name, $this->createUrl('/backend/user/user/view', array('id'=>$data->sender_id))); ?>
+
widget('application.modules.message.widgets.PeopleDate',array('date'=>$data->send_date, 'type' => 1)); ?>
+
+
+
+
+
subject; ?>
+
body; ?>
+
+
+
+ widget( + 'bootstrap.widgets.TbButtonGroup', + array( + 'size' => 'small', + 'buttons' => array( + array('url' => array('inbox/remove', 'message_id'=>$model->id), 'icon' => 'remove', 'type' => 'info', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Remove'))), + array('url' => array('/message/messageBackend/block', 'user_id'=>$data->sender_id), 'icon' => 'legal', 'type' => 'danger', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Block spammer'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'))), + array('url' => array('inbox/makeSpam', 'message_id'=>$model->id), 'icon' => 'shield', 'type' => 'success', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'This is not spam'))), + ) + ) + ); + + + ?> +
+
+
\ No newline at end of file diff --git a/views/messageBackend/index.php b/views/messageBackend/index.php deleted file mode 100644 index 0af8135..0000000 --- a/views/messageBackend/index.php +++ /dev/null @@ -1,14 +0,0 @@ -breadcrumbs = array( - Yii::t('MessageModule.message', 'Приватные сообщения') => array('/message/messageBackend/index'), - Yii::t('MessageModule.message', 'Управление'), - ); - - $this->pageTitle = Yii::t('MessageModule.message', 'Приватные сообщения - Управление'); - - $this->menu = array( - array('label' => Yii::t('MessageModule.message', 'Спам'), 'items' => array( - array('icon' => 'list-alt', 'label' => Yii::t('MessageModule.message', 'Список спама'), 'url' => array('/message/spamBackend/index')), - )), - ); -?> \ No newline at end of file diff --git a/views/messageBackend/spam.php b/views/messageBackend/spam.php index b5da638..185535c 100644 --- a/views/messageBackend/spam.php +++ b/views/messageBackend/spam.php @@ -1,9 +1,23 @@ breadcrumbs = array( + Yii::t('MessageModule.message', 'Private messages') => array('/message/messageBackend/spam'), + Yii::t('MessageModule.message', 'Spam management'), + ); + + $this->pageTitle = Yii::t('MessageModule.message', 'Private messages') . ' - ' . Yii::t('MessageModule.message', 'Spam management'); + + $this->menu = array( + array('label' => Yii::t('MessageModule.message', 'Спам'), 'items' => array( + array('icon' => 'list-alt', 'label' => Yii::t('MessageModule.message', 'Список спама'), 'url' => array('/message/messageBackend/spam')), + )), + ); +?> + + widget( + 'bootstrap.widgets.TbThumbnails', + array( + 'dataProvider' => $dataProvider, + 'template' => "{items} {pager}", + 'itemView' => '_spamView', + ) + );?> diff --git a/views/outbox/_view.php b/views/outbox/_view.php new file mode 100644 index 0000000..2a4e8e6 --- /dev/null +++ b/views/outbox/_view.php @@ -0,0 +1,23 @@ +
+
+
+ <?php echo $data->sender->nick_name; ?> +
+
recipient->nick_name, array('/user/people/userInfo', 'username'=>$data->recipient->nick_name)); ?>
+
widget('application.modules.message.widgets.PeopleDate',array('date'=>$data->send_date, 'type' => 1)); ?>
+
+
+
+
+
toCut((!empty($data->reply_to)) ? 'Re:'.$data->subject : $data->subject), array('outbox/view', 'message_id'=>$data->id)); ?>
+
toCut($data->body); ?>
+
+
+
+ widget( + 'bootstrap.widgets.TbButton', + array('url' => array('outbox/remove', 'message_id'=>$data->id), 'size' => 'mini', 'icon' => 'remove', 'type' => 'info', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Remove'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'), 'class'=>'button-rem')) + );?> +
+
+
\ No newline at end of file diff --git a/views/outbox/index.php b/views/outbox/index.php new file mode 100644 index 0000000..bf9ae9f --- /dev/null +++ b/views/outbox/index.php @@ -0,0 +1,34 @@ +breadcrumbs=array( + Yii::t('MessageModule.message', 'Submitted'), +); +?> +
+
+ widget( + 'bootstrap.widgets.TbButton', + array( + 'label' => Yii::t('MessageModule.message', 'Write'), + 'type' => 'success', + 'block'=>true, + 'url'=>array('message/create'), + ) + ); ?> +
+ widget( + 'application.modules.message.widgets.MessageMenu' + );?> +
+
+ widget( + 'bootstrap.widgets.TbThumbnails', + array( + 'dataProvider' => $dataProvider, + 'template' => "{items} {pager}", + 'itemView' => '_view', + ) + );?> +
+
\ No newline at end of file diff --git a/views/outbox/view.php b/views/outbox/view.php new file mode 100644 index 0000000..a4ec926 --- /dev/null +++ b/views/outbox/view.php @@ -0,0 +1,52 @@ +breadcrumbs=array( + Yii::t('MessageModule.message', 'Submitted')=>$this->createUrl('outbox/outbox'), + $model->subject +); +?> +
+
+ widget( + 'bootstrap.widgets.TbButton', + array( + 'label' => Yii::t('MessageModule.message', 'Write'), + 'type' => 'success', + 'block'=>true, + 'url'=>array('message/create'), + ) + ); ?> +
+ widget( + 'application.modules.message.widgets.MessageMenu' + );?> +
+
+
+
+ <?php echo $model->recipient->nick_name; ?> +
+ +
+ +

: widget('application.modules.message.widgets.PeopleDate',array('date'=>$model->send_date, 'type' => 1)); ?>

+

: reply_to)) ? 'Re:'.$model->subject : $model->subject ?>

+
+ +
+ widget( + 'bootstrap.widgets.TbButton', + array('url' => array('outbox/remove', 'message_id'=>$model->id), 'size' => 'mini', 'icon' => 'remove', 'type' => 'info', 'htmlOptions'=>array('title'=>Yii::t('MessageModule.message', 'Remove'), 'confirm'=>Yii::t('MessageModule.message', 'Are you sure?'), 'class'=>'button-rem')) + );?> +
+
+
+

body; ?>

+
+ renderPartial('/message/reply',array( + 'model'=>$reply, + )); ?> +
+
+
\ No newline at end of file diff --git a/widgets/MessageMenu.php b/widgets/MessageMenu.php index 54530a8..e526765 100644 --- a/widgets/MessageMenu.php +++ b/widgets/MessageMenu.php @@ -4,7 +4,7 @@ * Пользователь: BrusSENS * Дата: 31.01.14 * Время: 16:31 - * Описание: + * Описание: Виджет меню фронтэнда. */ Yii::import('bootstrap.widgets.TbMenu'); class MessageMenu extends TbMenu { @@ -16,8 +16,8 @@ public function init() { parent::init(); } public function items() { - $items[]=array('label' => Yii::t('MessageModule.message', 'Inbox') . ((Message::model()->inboxcount!=0) ? '' . Message::model()->inboxcount . '':''),'url' => array('message/inbox'),'active' => (Yii::app()->getController()->getAction()->getId() == 'inbox') ? true : null); - $items[]=array('label' => Yii::t('MessageModule.message', 'Submitted') . ((Message::model()->outboxcount!=0) ? '' . Message::model()->outboxcount . '':''),'url' => array('message/outbox'),'active' => (Yii::app()->getController()->getAction()->getId() == 'outbox') ? true : null); + $items[]=array('label' => Yii::t('MessageModule.message', 'Inbox') . ((Message::model()->inboxcount!=0) ? '' . Message::model()->inboxcount . '':''),'url' => array('inbox/inbox'),'active' => (Yii::app()->getController()->getId() == 'inbox') ? true : null); + $items[]=array('label' => Yii::t('MessageModule.message', 'Submitted') . ((Message::model()->outboxcount!=0) ? '' . Message::model()->outboxcount . '':''),'url' => array('outbox/outbox'),'active' => (Yii::app()->getController()->getId() == 'outbox') ? true : null); return $items; } } \ No newline at end of file