Ejemplo n.º 1
0
 /**
  * Sends message.
  * @return boolean
  */
 public function send()
 {
     $transaction = static::getDb()->beginTransaction();
     try {
         $this->sender_id = User::loggedId();
         $this->sender_status = self::STATUS_READ;
         if ($this->save()) {
             $count = count($this->receiversId);
             foreach ($this->receiversId as $receiver) {
                 if (!(new Query())->select('id')->from(User::tableName())->where(['id' => $receiver, 'status' => User::STATUS_ACTIVE])->exists()) {
                     if ($count == 1) {
                         throw new Exception('No active receivers to send message to!');
                     } else {
                         continue;
                     }
                 }
                 $message = new MessageReceiver();
                 $message->message_id = $this->id;
                 $message->receiver_id = $receiver;
                 $message->receiver_status = self::STATUS_NEW;
                 if ($message->save()) {
                     Cache::getInstance()->deleteElement('user.newmessages', $receiver);
                 } else {
                     throw new Exception('MessageReceiver saving error!');
                 }
             }
             $transaction->commit();
             $sessionKey = 'messages.' . $this->sender_id;
             if (Yii::$app->session->has($sessionKey)) {
                 $sentAlready = explode('|', Yii::$app->session->get($sessionKey));
                 $sentAlready[] = time();
                 Yii::$app->session->set($sessionKey, implode('|', $sentAlready));
             } else {
                 Yii::$app->session->set($sessionKey, time());
             }
             return true;
         } else {
             throw new Exception('Message saving error!');
         }
     } catch (Exception $e) {
         $transaction->rollBack();
         Log::error($e->getMessage(), $this->id, __METHOD__);
     }
     return false;
 }