public function process() { $errors = array(); if (isset($_REQUEST['butt_del']) && $_REQUEST['butt_del'] && $_REQUEST['newsletter_id']) { $data = self::get_newsletter($_REQUEST['newsletter_id']); if (module_form::confirm_delete('newsletter_id', "Really delete newsletter: " . $data['subject'], self::link_open($_REQUEST['newsletter_id']))) { $this->delete_newsletter($_REQUEST['newsletter_id']); set_message("Newsletter deleted successfully"); redirect_browser(self::link_list(false)); } } else { if ("save_newsletter" == $_REQUEST['_process']) { $newsletter_id = isset($_REQUEST['newsletter_id']) ? (int) $_REQUEST['newsletter_id'] : false; $newsletter_id = $this->save_newsletter($newsletter_id, $_POST); if (isset($_REQUEST['butt_send'])) { redirect_browser($this->link_send($newsletter_id)); } if (isset($_REQUEST['butt_duplicate'])) { $newsletter_id = $this->duplicate_newsetter($newsletter_id); set_message('Newsletter duplicated successfully'); redirect_browser($this->link_open($newsletter_id)); } if (isset($_REQUEST['butt_preview_email'])) { if ($this->send_preview($newsletter_id, $_REQUEST['quick_email'])) { //set_message("Newsletter preview sent successfully."); redirect_browser($this->link_open($newsletter_id)); } /*else{ echo "<br><br>Failed to send preview. <br><br>"; echo '<a href="'.$this->link_open($newsletter_id).'">try again</a> '; exit; }*/ } if (isset($_REQUEST['butt_preview'])) { redirect_browser($this->link_preview($newsletter_id)); } set_message("Newsletter saved successfully"); redirect_browser($this->link_open($newsletter_id)); } else { if ("send_send" == $_REQUEST['_process']) { $newsletter_id = (int) $_REQUEST['newsletter_id']; $send_id = (int) $_REQUEST['send_id']; if ($newsletter_id && $send_id) { $sql = "UPDATE `" . _DB_PREFIX . "newsletter_send` SET `status` = " . _NEWSLETTER_STATUS_PENDING . " WHERE send_id = {$send_id} AND newsletter_id = {$newsletter_id}"; query($sql); self::update_member_data_for_send($send_id); self::remove_unsubscribed_members_from_send($send_id); //ready to send redirect_browser($this->link_queue_watch($newsletter_id, $send_id)); } } else { if ("modify_send" == $_REQUEST['_process']) { $send_id = (int) $_REQUEST['send_id']; $newsletter_id = (int) $_REQUEST['newsletter_id']; $send = get_single('newsletter_send', array('send_id', 'newsletter_id'), array($send_id, $newsletter_id)); if (isset($_POST['status']) && $_POST['status'] == 'delete') { if (module_form::confirm_delete('newsletter_id', "Really delete this send?", self::link_queue_watch($newsletter_id, $send_id))) { if ($send && $send['send_id'] == $send_id) { set_message("Newsletter send deleted successfully"); update_insert('send_id', $send_id, 'newsletter_send', array('status' => _NEWSLETTER_STATUS_DELETED)); } redirect_browser(self::link_list(false)); } unset($_POST['status']); } if (!$send['start_time']) { $_POST['start_time'] = time(); } // hack cos sometimes it doesn't save start time? i think i fixed this bug though. if ($send && $send['send_id'] == $send_id) { update_insert('send_id', $send_id, 'newsletter_send', $_POST); redirect_browser($this->link_queue_watch($newsletter_id, $send_id)); } } else { if ("enque_send" == $_REQUEST['_process']) { $newsletter_id = (int) $_REQUEST['newsletter_id']; $send_id = (int) $_REQUEST['send_id']; $newsletter_data = self::get_newsletter($newsletter_id); if ($newsletter_data['newsletter_id'] != $newsletter_id) { die('failed to enqueue send'); } // are we adding members to an existing send? or overwriting them to an existing draft / or creating a new blank send. if ($send_id > 0) { $adding_members = true; } else { $adding_members = false; } $members = array(); //todo: pass this off as a hook. // so we could have another module (eg: module_drupal or module_wordpress) that // checks which members were selected on the previous screen, and return a standard member array if (class_exists('module_group', false)) { // find the groups we are sending to. $send_groups = array(); $groups = module_group::get_groups(); foreach ($groups as $group) { if (isset($_REQUEST['group']) && isset($_REQUEST['group'][$group['group_id']]) && $_REQUEST['group'][$group['group_id']] == 'yes') { // we are sending to this group // get a list of members in this group and add them to a send table ready to go. $send_groups[$group['group_id']] = true; } } // find the members for these groups $callback = 'module_group::newsletter_callback'; $error_count = 0; foreach ($send_groups as $group_id => $tf) { $group_members = module_group::get_members($group_id); //echo '<pre>';print_r($group_members);exit; // give all these members a callback so the newsletter system can get more data from them. $group_members_with_data = array(); foreach ($group_members as $id => $group_member) { $args = array('group_id' => $group_id, 'owner_id' => $group_member['owner_id'], 'owner_table' => $group_member['owner_table']); // run this data callback to get the data from this group member. $all_callback_data = self::member_data_callback($callback, $args, false); // false, just want the email address for now. if (!$all_callback_data) { $error_count++; } if (is_array($all_callback_data)) { // check if $callback_data is a multi-array - sometimes this will return more than 1 record (eg: customer = returns all contacts under that customer) if (!isset($all_callback_data['_multi'])) { // this is a single record. make it multi $all_callback_data = array($all_callback_data); } else { unset($all_callback_data['_multi']); } foreach ($all_callback_data as $callback_data) { if (!$callback_data) { continue; } if (!isset($callback_data['data_callback']) || !$callback_data['data_callback']) { $callback_data['data_callback'] = $callback; } if (!isset($callback_data['data_args']) || !$callback_data['data_args']) { $callback_data['data_args'] = json_encode($args); } $group_members_with_data[] = $callback_data; } } /*$group_members[$id] = self::member_data_callback($callback,$args); if(!$group_members[$id]){ // todo: report this problematic group member, possibly remove group member from list. $error_count++; unset($group_members[$id]); }else{ // a callback on customers will return all contacts for that customer (if advanced option is set) if(!isset($group_members[$id]['data_callback']) || !$group_members[$id]['data_callback']){ $group_members[$id]['data_callback'] = $callback; } if(!isset($group_members[$id]['data_args']) || !$group_members[$id]['data_args']){ $group_members[$id]['data_args'] = json_encode($args); } }*/ } unset($group_members); //$members = array_merge($members,$group_members); $members = array_merge($members, $group_members_with_data); } if ($error_count > 0) { set_error('Failed to get the information on ' . $error_count . ' group members.'); } } /*if(class_exists('module_company',false) && module_company::can_i('view','Company') && module_company::is_enabled()){ // copy of the group logic above, but we're adding companies to the list. // find the groups we are sending to. $send_companys = array(); $companys = module_company::get_companys(); foreach($companys as $company){ if(isset($_REQUEST['company']) && isset($_REQUEST['company'][$company['company_id']]) && $_REQUEST['company'][$company['company_id']] == 'yes'){ // we are sending to this company // get a list of members in this company and add them to a send table ready to go. $send_companys[$company['company_id']] = true; } } // find the members for these companys $callback = 'module_company::newsletter_callback'; $error_count = 0; foreach($send_companys as $company_id => $tf){ $company_members = module_company::get_members($company_id); //echo '<pre>';print_r($company_members);exit; // give all these members a callback so the newsletter system can get more data from them. $company_members_with_data = array(); foreach($company_members as $id => $company_member){ $args = array( 'company_id'=>$company_id, 'owner_id'=>$company_member['owner_id'], 'owner_table'=>$company_member['owner_table'], ); // run this data callback to get the data from this company member. $all_callback_data = self::member_data_callback($callback,$args); if(!$all_callback_data){ $error_count++; } if(is_array($all_callback_data)){ // check if $callback_data is a multi-array - sometimes this will return more than 1 record (eg: customer = returns all contacts under that customer) if(!isset($all_callback_data['_multi'])){ // this is a single record. make it multi $all_callback_data = array($all_callback_data); }else{ unset($all_callback_data['_multi']); } foreach($all_callback_data as $callback_data){ if(!$callback_data)continue; if(!isset($callback_data['data_callback']) || !$callback_data['data_callback']){ $callback_data['data_callback'] = $callback; } if(!isset($callback_data['data_args']) || !$callback_data['data_args']){ $callback_data['data_args'] = json_encode($args); } $company_members_with_data[] = $callback_data; } } } unset($company_members); //$members = array_merge($members,$company_members); $members = array_merge($members,$company_members_with_data); } if($error_count>0){ set_error('Failed to get the information on '.$error_count.' company members.'); } }*/ //echo '<pre>';print_r($members);exit; // todo - load CSV formats in too. IDEA! make a new CSV module, it will work in with GROUP hook above! YESS! if (!$adding_members && !count($members)) { set_error('Please select at least 1 person to send this newsletter to'); redirect_browser(self::link_send($newsletter_id)); } if (!$adding_members && !$send_id) { // see if we can re-use a previously unsent send (ie: draft send) $drafts = get_multiple('newsletter_send', array('newsletter_id' => $newsletter_id, 'status' => _NEWSLETTER_STATUS_NEW)); if (count($drafts)) { $draft = array_shift($drafts); if ($draft['send_id']) { $send_id = (int) $draft['send_id']; $sql = "DELETE FROM `" . _DB_PREFIX . "newsletter_send_member` WHERE send_id = " . (int) $send_id; query($sql); } } } if (isset($_REQUEST['start_time'])) { $start_time = strtotime(input_date($_REQUEST['start_time'], true)); if (!$start_time) { $start_time = time(); } } else { $start_time = time(); } $allow_duplicates = isset($_REQUEST['allow_duplicates']) ? $_REQUEST['allow_duplicates'] : 0; // remove cache from send newsletter data history if (isset($newsletter_data['sends']) && is_array($newsletter_data['sends'])) { foreach ($newsletter_data['sends'] as $previous_newsletter_data_send_id => $previous_newsletter_data_send) { if (isset($previous_newsletter_data_send['cache'])) { unset($newsletter_data['sends'][$previous_newsletter_data_send_id]['cache']); } } } $send_id = self::save_send($send_id, array('newsletter_id' => $newsletter_id, 'status' => _NEWSLETTER_STATUS_NEW, 'start_time' => $start_time, 'allow_duplicates' => $allow_duplicates, 'cache' => serialize($newsletter_data), 'subject' => $newsletter_data['subject'])); $done_member = false; if ($send_id) { // add the members from this send into the listing. // this will be a snapshop of the members details at the time this send is created. // todo: figure out if this will come back and bite me in the bum :) $failed_due_to_unsubscribe = false; $error_count = 0; foreach ($members as $member) { //print_r($member); // check uniquness of this member's email in the send listing. // find this member by email. $newsletter_member_id = self::member_from_email($member); if ($newsletter_member_id > 0) { // found a member! add it to the send queue for this send. if (!$allow_duplicates) { // check if this member has received this email before. $sql = "SELECT * FROM `" . _DB_PREFIX . "newsletter_send_member` sm"; $sql .= " LEFT JOIN `" . _DB_PREFIX . "newsletter_send` s USING (send_id) "; $sql .= " WHERE sm.newsletter_member_id = " . (int) $newsletter_member_id; $sql .= " AND sm.send_id IN (SELECT send_id FROM `" . _DB_PREFIX . "newsletter_send` WHERE newsletter_id = {$newsletter_id})"; $sql .= " AND sm.send_id != " . (int) $send_id; $sql .= " AND s.status != 4 "; // so we ignore deleted sends. $check = query($sql); if (mysql_num_rows($check)) { // user has received this before. //echo 'received before'; mysql_free_result($check); continue; } mysql_free_result($check); } // check if this member is unsubscribed or marked as not receiving emails? if (self::is_member_unsubscribed($newsletter_member_id, $member)) { // unsubscribe checks blacklist so no need to inclde it here: || self::email_blacklisted($member['email']) //echo 'unsubscribed'; $failed_due_to_unsubscribe = true; continue; } $sql = "REPLACE INTO `" . _DB_PREFIX . "newsletter_send_member` SET "; $sql .= " send_id = " . (int) $send_id . " "; $sql .= ", newsletter_member_id = " . (int) $newsletter_member_id . " "; $sql .= ", `sent_time` = 0"; $sql .= ", `status` = 0"; $sql .= ", `open_time` = 0"; $sql .= ", `bounce_time` = 0"; query($sql); //echo 'done'; $done_member = true; } else { $error_count++; if (_DEBUG_MODE) { echo 'failed to create member from email'; print_r($member); echo '<hr>'; } } } if ($error_count) { set_error('Failed to add ' . $error_count . ' members to the queue. Possibly because they have no valid email address.'); if (_DEBUG_MODE) { //exit; } } // exit; if (!$done_member && !$adding_members) { if ($failed_due_to_unsubscribe) { set_error('All selected members have been unsubscribed or bounced, please select other members.'); // this member is added, redirect and show the errors .. } else { set_error('Please select at least 1 person to send this newsletter to.'); redirect_browser(self::link_send($newsletter_id)); } } redirect_browser($this->link_queue($newsletter_id, $send_id)); } } else { if ("save_newsletter_template" == $_REQUEST['_process']) { if (isset($_REQUEST['butt_del'])) { $data = self::get_newsletter_template($_REQUEST['newsletter_template_id']); if (module_form::confirm_delete('newsletter_template_id', "Really delete newsletter template: " . $data['newsletter_template_name'], self::link_open_template($_REQUEST['newsletter_template_id']))) { $this->delete_newsletter_template($_REQUEST['newsletter_template_id']); set_message("Newsletter template deleted successfully"); redirect_browser(self::link_open_template(false)); } } $newsletter_template_id = $this->save_newsletter_template($_REQUEST['newsletter_template_id'], $_POST); set_message("Newsletter template saved successfully"); redirect_browser($this->link_open_template($newsletter_template_id)); } } } } } } if (!count($errors)) { redirect_browser($_REQUEST['_redirect']); exit; } print_error($errors, true); }