/** * Set up a new campaign and send a message. * * @access public // */ public function campaignAction() { // Defaults $success = null; $message = null; $error = null; $recipients = array(); $sentto = array(); $description = null; $date = null; $time = null; $sendtime = null; $timezone = null; $status = null; $user_folders = 0; $shortcode = 0; // set the default message body values $this->defaultValues(); $userid = $this->user->getId(); $formObj = new Application_Model_Form(); $user = new Application_Model_User($userid); $rpt = new Application_Model_Report(); $yearmonth = date('Y-m'); // Logged in users folder ID's $user_folders = $this->user->getFolders(); $foldersid = array_keys($user_folders); $totalfolders = count($foldersid); $orgeachfolders = array(); $setarray = array(); // for($i = 0; $i < $totalfolders; $i++){ // $orgnumbers = array(); // $folder = new Application_Model_Folder($this->user, $foldersid[$i]); // $subscribers = $folder->getSubscribers(); // foreach ($subscribers as $subscriber) { // if(!in_array($subscriber['phonenumber'], $setarray)){ // $orgnumbers[] =$subscriber['phonenumber']; // } // $setarray[$subscriber['phonenumber']] = $subscriber['phonenumber']; // } // $orgeachfolders[$foldersid[$i]] = $orgnumbers; // } $this->view->cleandata = $orgeachfolders; $this->view->folders = $user_folders; // When the form is submit if ($this->request->isPost()) { // see if a folder was selected $sendto = $this->request->getParam('folders'); $description = trim($this->request->getParam('description')); $this->msg_head = $this->request->getParam('msg_head'); $this->msg_body = $this->request->getParam('msg_body'); $shortcode = $this->request->getParam('scselect'); // echo '<pre>'; print_r($sendto); exit; // Get the sendtime $scheduled = false; if ($this->request->getParam('sendtime') == 'later') { $scheduled = true; $sendtime = $this->request->getParam('date') . ' ' . $this->request->getParam('time'); } // User's timezone $this->user->setTimeZone($this->request->getParam('t_zone')); $timezone = $this->user->getTimeZone(); // Only admins can edit the footer if ($this->user->isAdmin()) { $this->msg_foot = $this->request->getParam('msg_foot'); } $msg = $this->msg_head ? "{$this->msg_head}:" : ''; $msg .= "{$this->msg_body}\n{$this->msg_foot}"; $msg = trim($msg); $sendmessage = new Application_Model_Message($this->user); // Verify the user provided a description for this message if ($description) { // Verify there was a message set if ($msg) { // make sure we got the sendto array from POST if (is_array($sendto) && !empty($sendto)) { // Create a campaign id that each message that goes out for this campaign can be grouped by $campaignid = md5($this->user->username . time()); // Get the subscribers from each selected folder $recipients = array(); foreach ($sendto as $folder) { //0001 // Clear out the recipients array for each folder $recipients = array(); // easy check to make sure this folder is owned by this user if (array_key_exists($folder, $user_folders)) { // Get the folder model $folder = new Application_Model_Folder($this->user, $folder); // Verify it if ($folder->isValid()) { // Get subscribers to this folder $subscribers = $folder->getSubscribers(); // echo '<pre>'; print_r($subscribers); // echo'<br>'."DELEMMA "; if (!empty($subscribers)) { foreach ($subscribers as $subscriber) { // Don't add this user if they have already received this message from being in another selected folder if (!in_array($subscriber['phonenumber'], $sentto)) { // key off the phone number to avoid duplicates from this folder, which should // never happen, but better safe than sorry $recipients[$subscriber['phonenumber']] = $subscriber['phonenumber']; } } /** * The message needs to be sent to each folder individually so that the folderid * can be logged in the outbound table. That allows us to see what folder to opt * a user out of when they reply with an optout. */ if (!empty($recipients)) { // Construct the message $i_default = 0; // Set the folderid this message is being sent to $sendmessage->folderid = $folder->getId(); // Set the user description $sendmessage->description = $description; // Set a unique identifier for all messages that go out on this campaign $sendmessage->campaignid = $campaignid; // Queue it up for delivery // ($body, $recipients, $sendtime = null, $timezone = null, $confirmid = 0, $depth = 0, $createuser = 0, $shortcode=87365) //queue($msg, $recipients, $sendtime, $timezone,$i_default,$source,$userid,$shortcode); dev $source = 404; $status = $sendmessage->queue($msg, $recipients, $sendtime, $timezone, $i_default, $source, $userid, $shortcode); // $status = $sendmessage->queue($msg, $recipients, $sendtime, $timezone,$i_default,$userid); if ($status) { // Put these recipients into our sentto array to avoid sending duplicates $sentto = array_merge($sentto, $recipients); } else { $error = $sendmessage->getError(); } } } else { $error = 'There are no subscribers in the chosen folder(s).'; } } else { $error = $folder->getError(); } } else { $error = 'Invalid folder selected [' . $folder . '].'; } } // end of foreach 0001 // If the sentto list never got any recipients, there was no one in the selected folders /* if (empty($sentto)) { //echo 2222; $error = 'There are no subscribers in the chosen folder(s).'; } */ if ($status == 1) { $insert = $scheduled ? 'scheduled to send' : 'sent'; $message = 'Message successfully ' . $insert . ' to ' . count($sentto) . ' subscribers!'; $success = true; // now set the message fields back to default $this->defaultValues(); } else { $error = $sendmessage->getError(); } } else { $error = 'You must select at least one folder to send the message to.'; } } else { $error = 'Message content is required'; } } else { $error = 'Message description is required'; } } $userusage = $rpt->dashboard_totalMessagesSentOut($userid, $yearmonth); // echo 'USAGE: '.$yearmonth; // Send the message values back to the view $this->view->description = $description; $this->view->sendtime = $sendtime; $this->view->timezone = $timezone; $this->view->msg_head = $this->msg_head; $this->view->msg_body = $this->msg_body; $this->view->msg_foot = $this->msg_foot; // Status back to the view $this->view->error = $error; $this->view->success = $success; $this->view->message = $message; $this->view->formobject = $formObj; $this->view->formobjects = $formObj->webformList($userid); $this->view->userid = $userid; $this->view->userObj = $user; $this->view->msglimit = $user->messagelimit; $this->view->userusage = $userusage; }
/** * Created a sendMessage method that will do everything the post controller would * because we have a user who wants to send a message via GET and our API does this * via POST. I tried using _forward('post'), but it was doubling up the JSON response * body for some reason. So now post and get just call this method to do the same thing. * * @access private */ private function sendMessage() { $valid = true; echo $recipients = $this->_requestParam('recipients'); exit; $subjecttext = $this->_requestParam('subject'); $bodytext = $this->_requestParam('message'); $sendtime = $this->_requestParam('sendtime'); $timezone = $this->_requestParam('timezone'); // Cleanup send time if ($sendtime) { $tparts = str_split($sendtime, 2); $sendtime = $tparts[0] . $tparts[1] . '-' . $tparts[2] . '-' . $tparts[3] . ' ' . $tparts[4] . ':' . $tparts[5] . ':00'; } // Not using this at the moment, so don't want anyone to access it //$folder = $this->_request->getParam('id'); //$loadby = $this->_request->getParam('field'); $folder = false; $loadby = false; // Folder is optional (at the moment...) if ($folder) { $folder = new Application_Model_Folder($this->apiuser, $folder, $loadby); if ($folder->isValid()) { // Get subscribers in this folder $subscribers = $folder->getSubscribers(); // TODO: Come up with a better way to pull phone #'s out of a folder's subscriber list foreach ($subscribers as $subscriber) { $recipients[] = $subscriber['phonenumber']; } } else { $valid = false; $this->setError($folder->getError(), 500); } } // Validate and send if ($valid) { if ($recipients) { if ($bodytext) { $message = new Application_Model_Message($this->apiuser); $bodytext = urldecode($bodytext); $subjecttext = urldecode($subjecttext); // Build the message with a subject if there is one. $msg = $subjecttext ? $subjecttext . ': ' . $bodytext : $bodytext; // Queue it up for delivery $return = $message->queue($msg, $recipients, $sendtime, $timezone); if ($return) { $this->setOutputParam('status', true); $this->setOutputParam('message', 'Message successfully sent.'); } else { $this->setError($message->getError(), 500); } } else { $this->setError('Message is required.', 500); } } else { $this->setError('At least one recipient is required.', 500); } } }