/** * @param \Claroline\MessageBundle\Entity\Message $message * @param bool setAsSent * * @return \Claroline\MessageBundle\Entity\Message */ public function send(Message $message, $setAsSent = true, $sendMail = true) { if (substr($receiversString = $message->getTo(), -1, 1) === ';') { $receiversString = substr_replace($receiversString, '', -1); } $receiversNames = explode(';', $receiversString); $usernames = array(); $groupNames = array(); $workspaceCodes = array(); $userReceivers = array(); $groupReceivers = array(); $workspaceReceivers = array(); //split the string of target into different array. foreach ($receiversNames as $receiverName) { if (substr($receiverName, 0, 1) === '{') { $groupNames[] = trim($receiverName, '{}'); } else { if (substr($receiverName, 0, 1) === '[') { $workspaceCodes[] = trim($receiverName, '[]'); } else { $usernames[] = $receiverName; } } } //get the different entities from the freshly created array. if (count($usernames) > 0) { $userReceivers = $this->userRepo->findByUsernames($usernames); } if (count($groupNames) > 0) { $groupReceivers = $this->groupRepo->findGroupsByNames($groupNames); } if (count($workspaceCodes) > 0) { $workspaceReceivers = $this->workspaceRepo->findWorkspacesByCode($workspaceCodes); } if (null !== $message->getParent()) { $message->setParent($message->getParent()); } $this->om->persist($message); if ($setAsSent && $message->getSender()) { $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage'); $userMessage->setIsSent(true); $userMessage->setUser($message->getSender()); $userMessage->setMessage($message); $this->om->persist($userMessage); } $mailNotifiedUsers = array(); //get every users which are going to be notified foreach ($groupReceivers as $groupReceiver) { $users = $this->userRepo->findByGroup($groupReceiver); foreach ($users as $user) { $userReceivers[] = $user; } } //workspaces are going to be notified foreach ($workspaceReceivers as $workspaceReceiver) { $users = $this->userRepo->findByWorkspaceWithUsersFromGroup($workspaceReceiver); foreach ($users as $user) { $userReceivers[] = $user; } } $ids = []; $filteredUsers = array_filter($userReceivers, function ($user) use(&$ids) { if (!in_array($user->getId(), $ids)) { $ids[] = $user->getId(); return true; } }); foreach ($filteredUsers as $filteredUser) { $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage'); $userMessage->setUser($filteredUser); $userMessage->setMessage($message); $this->om->persist($userMessage); if ($filteredUser->isMailNotified()) { $mailNotifiedUsers[] = $filteredUser; } } if ($sendMail) { $this->mailManager->send($message->getObject(), $message->getContent(), $mailNotifiedUsers, $message->getSender()); } $this->om->flush(); return $message; }