Ejemplo n.º 1
0
 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);
 }