modelUser) { $this->modelUser = \Yii::$app->user->identityClass; } $this->userTableName = call_user_func(Array($this->modelUser, 'tableName')); } public function sendMessage($whom_id, $message, $sendEmail = false) { $result = null; if(!is_numeric($whom_id) && is_string($whom_id)){ $ids = $this->getUsersByRoles($whom_id); return $this->sendMessage($ids, $message, $send_email); } if(is_array($whom_id)) { $result = $this->_sendMessages($whom_id, $message, $sendEmail); } else { $result = $this->_sendMessage($whom_id, $message, $sendEmail); } return $result; } public function systemSend ($whom_id, $message, $sendEmail = false) { $this->isSystem = true; $this->sendMessage($whom_id, $message, $sendEmail); $this->isSystem = false; } /** * Method to getMyMessages. * * @throws EceptionMessages * @return array */ public function getMyMessages() { $id = $this->getIdCurrentUser(); return $this->getMessages($id); } public function checkMessage(){ $result = $this->getAllUsers(); return array_filter($result, function($arr) { return $arr['cnt_mess'] > 0 ;}); } /** * Method to getAllMessages. * * @param $whom_id * @param $from_id * * @throws EceptionMessages * @return array */ public function getAllMessages($whom_id, $from_id) { return $this->getMessages($whom_id, $from_id); } public function getNewMessages($whom_id, $from_id) { return $this->getMessages($whom_id, $from_id, 1); } /** * Method to sendMessage. * * @param $whom_id * @param $message * * @return array */ protected function _sendMessage($whom_id, $message, $send_email = false) { $model = new Messages(); $model->from_id = $this->getIdCurrentUser(); $model->whom_id = $whom_id; $model->message = $message; if($this->enableEmail && $send_email) { $this->_sendEmail($whom_id, $message); } return $this->saveData($model, self::EVENT_SEND); } /** * Method to _sendEmail. * * @param $whom_id * @param $message * * @throws EceptionMessages * * @return boolean, array */ protected function _sendEmail($whom_id, $message) { if(!is_callable($this->getEmail)) { throw new EceptionMessages('Email not send. Set in config "getEmail" to callable func.'); } if(!isset($this->templateEmail['html'], $this->templateEmail['text'])) { throw new EceptionMessages('Email not send. Set in config "templateEmail".'); } $user = $this->getUser($whom_id); if($user) { $email = call_user_func($this->getEmail, $user); } if(!empty($email)) { return \Yii::$app->mailer ->compose(['html' => $this->templateEmail['html'], 'text' => $this->templateEmail['text']], ['message' => $message]) ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' private Message']) ->setTo($email) ->setSubject($this->subject) ->send(); } return false; } /* public $getEmail = null; public $templateEmail = []; */ /** * Method to many messages. * * @param $whom_ids * @param $message * * @return array */ protected function _sendMessages(Array $whom_ids, $message, $sendEmail = false) { $result = Array(); foreach($whom_ids as $id) { $result[] = $this->_sendMessage($id, $message, $sendEmail); } return $result; } /** * Method to getNewMessages. * * @param $whom_id * @param $from_id * * @throws EceptionMessages * @return array */ protected function _getNewMessages($whom_id, $from_id) { return $this->getMessages($whom_id, $from_id, Messages::STATUS_NEW); } /** * Method to changeStatusMessage. * * @param $id * @param $status * * @throws EceptionMessages * @return array */ protected function changeStatusMessage($id, $status, $is_delete = false) { $model = Messages::findOne($id); $status_name = 'status'; $current_user_id = $this->getIdCurrentUser(); if(!$model) { throw new EceptionMessages('Message not found.'); } if($model->from_id != $current_user_id && $model->whom_id != $current_user_id) { throw new EceptionMessages('Message not found for this user.'); } if($is_delete) { switch ($current_user_id) { case $model->from_id: $status_name = 'is_delete_from'; break; case $model->whom_id: $status_name = 'is_delete_whom'; break; } } $model->$status_name = $status; return $this->saveData($model, self::EVENT_STATUS); } /** * Method to deleteMessage. * * @param $id * * @throws EceptionMessages * @return Messages */ public function deleteMessage($id) { return $this->changeStatusMessage($id, 1, 1); } /** * Method to getUser. * * @throws EceptionMessages * @return array */ public function getUser($id) { $model = new $this->modelUser(); $user = $model::findOne($id); return $user; } /** * Method to getAllUsers. * * @throws EceptionMessages * @return array */ public function getAllUsers() { $table_name = Messages::tableName(); $sql = "select usr.id, usr.$this->attributeNameUser as username, msg.cnt as cnt_mess "; $sql .= "from $this->userTableName as usr "; $sql .= "left join "; $sql .= "(select from_id, count(id) as cnt from $table_name where status = 1 and whom_id = :user_id GROUP by from_id) as msg ON usr.id = msg.from_id "; $sql .= " where usr.id != :user_id "; $connection = \Yii::$app->db; $model = $connection->createCommand($sql); $model->bindValue(':user_id', $this->getIdCurrentUser()); $users = $model->queryAll(); return $users; } /** * Method to saveData. * * @param $model * @param $name_event * * @throws EceptionMessages * @return array */ protected function saveData($model, $name_event = null) { if(!$model->save()) { $mess = $model->hasErrors() ? implode(', ', $model->getFirstErrors()) : 'Not saved. ' . $name_event; throw new EceptionMessages($mess); } else { if($name_event) { $event = new MessageEvent; $event->message = $model; $this->trigger(self::EVENT_SEND, $event); } } return $model->toArray(); } /** * Method to getMessages. * * @param $whom_id * @param $from_id * @param $type * * @throws EceptionMessages * @return array */ protected function getMessages($whom_id, $from_id = null, $type = null, $last_id = null) { $table_name = Messages::tableName(); $my_id = $this->getIdCurrentUser(); $query = new \yii\db\Query(); $query ->select(['FROM_UNIXTIME(msg.created_at, "%d-%m-%Y %H:%i:%S") as created_at', 'msg.id', 'msg.status', 'msg.message', "usr1.id as from_id", "usr1.$this->attributeNameUser as from_name", "usr2.id as whom_id", "usr2.$this->attributeNameUser as whom_name"]) ->from("$table_name as msg") ->leftJoin("$this->userTableName as usr1", 'usr1.id = msg.from_id') ->leftJoin("$this->userTableName as usr2", 'usr2.id = msg.whom_id'); if($from_id) { $query ->where(['msg.whom_id' => $whom_id, 'msg.from_id' => $from_id]) ->orWhere(['msg.from_id' => $whom_id, 'msg.whom_id' => $from_id]); } else { $query->where(['msg.whom_id' => $whom_id]); } //if not set type //send all message where no delete if($type) { $query->andWhere(['=', 'msg.status', $type]); } else { $query->andWhere('((msg.is_delete_from != 1 AND from_id = :my_id) OR (msg.is_delete_whom != 1 AND whom_id = :my_id) ) ', [ ':my_id' => $my_id, ]); } if($last_id){ $query->andWhere(['>', 'msg.id', $last_id]); } $return = $query->orderBy('msg.id')->all(); $ids = Array(); foreach($return as $m) { if($m['whom_id'] == $my_id) { $ids[] = $m['id']; } } //change status to is_read if(count($ids) > 0) { Messages::updateAll(['status' => Messages::STATUS_READ], ['in', 'id', $ids]); } $user_id = $this->getIdCurrentUser(); return array_map(function ($r) use ($user_id) { $r['i_am_sender'] = $r['from_id'] == $user_id; return $r;}, $return); } protected function getUsersByRoles($role) { $users = new \yii\db\Query(); $result = $users ->select([ 'usr.id' ]) ->from("$this->userTableName as usr") ->leftJoin('auth_assignment as ath', 'usr.id = ath.user_id') ->where(['ath.item_name' => $role]) ->all(); return array_map(function($r) {return $r['id'];}, $result); } protected function getIdCurrentUser() { return \Yii::$app->user->isGuest || $this->isSystem ? null : \Yii::$app->user->id; } }