Esempio n. 1
0
File: sync.php Progetto: rodhoff/MNW
 public function ajaxSyncAll()
 {
     $done = JRequest::getVar('done', '', 'POST', 'int');
     if ($done == 0) {
         $_SESSION['abortAJAX'] = 0;
         unset($_SESSION['addedUsers']);
     }
     if ($_SESSION['abortAJAX'] != 1) {
         $db = JFactory::getDBO();
         $params = JComponentHelper::getParams('com_joomailermailchimpintegration');
         $MCapi = $params->get('params.MCapi');
         $MC = new joomlamailerMCAPI($MCapi);
         $MCerrorHandler = new MCerrorHandler();
         $listId = JRequest::getVar('listId', '', 'POST', 'string');
         $total = JRequest::getVar('total', 0, 'POST', 'int');
         $errors = JRequest::getVar('errors', 0, 'POST', 'int');
         $step = JRequest::getVar('step', 100, 'POST', 'int');
         $failed = JRequest::getVar('failed', array(), 'POST');
         $addedUsers = JRequest::getVar('addedUsers', array(), 'POST');
         $errorMsg = JRequest::getVar('errorMsg', '', 'POST', 'string');
         if (!$addedUsers) {
             $addedUsers = array();
         }
         // create hidden signup date merge var if it doesn't exist
         $createSignupdateMerge = true;
         $mergeVars = $MC->listMergeVars($listId);
         foreach ($mergeVars as $mv) {
             if ($mv['tag'] == 'SIGNUPAPI') {
                 $createSignupdateMerge = false;
                 break;
             }
         }
         if ($createSignupdateMerge) {
             $MC->listMergeVarAdd($listId, 'SIGNUPAPI', 'date added (API)', array('date', false, false, true));
         }
         if (isset($_SESSION['addedUsers'])) {
             $exclude = $_SESSION['addedUsers'];
         } else {
             $exclude = array();
         }
         if (!$failed) {
             $failed = array();
         }
         if (count($failed)) {
             $exclude = array_merge($exclude, $failed);
         }
         $query = $db->getQuery(true)->select($db->qn(array('id', 'email')))->from($db->qn('#__users'))->where($db->qn('block') . ' = ' . $db->q(0))->where($db->qn('id') . ' NOT IN ("' . implode('","', $exclude) . '")');
         $db->setQuery($query, 0, $step);
         $users = $db->loadObjectList();
         $userIds = array();
         foreach ($users as $user) {
             $userIds[$user->email] = $user->id;
         }
         // gather custom fields data
         $query = $db->getQuery(true)->select('*')->from($db->qn('#__joomailermailchimpintegration_custom_fields'))->where($db->qn('listid') . ' = ' . $db->q($listId));
         $db->setQuery($query);
         $customFields = $db->loadObjectList();
         $m = $successCount = $errorcount = $msgErrorsCount = $counter = 0;
         $msg = $msgErrors = false;
         $ids = '';
         for ($x = 0; $x < count($users); $x += $step) {
             if ($_SESSION['abortAJAX'] == 1) {
                 unset($_SESSION['addedUsers']);
                 break;
             }
             $k = $errorcount = $msgErrorsCount = 0;
             $batch = array();
             for ($y = $x; $y < $x + $step; $y++) {
                 if ($_SESSION['abortAJAX'] == 1) {
                     unset($_SESSION['addedUsers']);
                     break;
                 }
                 $dat = isset($users[$y]) ? $users[$y] : false;
                 if ($dat) {
                     $user = $this->getModel('sync')->getUser($dat->id);
                     $addedUsers[] = $user[0]->id;
                     $batch[$k]['EMAIL'] = $user[0]->email;
                     // name
                     $names = explode(' ', $user[0]->name);
                     if (isset($names[0]) && isset($names[1])) {
                         $batch[$k]['FNAME'] = $names[0];
                         $batch[$k]['LNAME'] = '';
                         for ($i = 1; $i < count($names); $i++) {
                             $batch[$k]['LNAME'] .= $names[$i] . ' ';
                         }
                     } else {
                         $batch[$k]['FNAME'] = $user[0]->name;
                     }
                     if (count($customFields)) {
                         foreach ($customFields as $field) {
                             $query = $db->getQuery(true);
                             if ($field->framework == 'CB') {
                                 $query->select($db->qn($field->dbfield))->from($db->qn('#__comprofiler'))->where($db->qn('user_id') . ' = ' . $db->q($user[0]->id));
                             } else {
                                 $query->select($db->qn('value'))->from($db->qn('#__community_fields_values'))->where($db->qn('field_id') . ' = ' . $db->q($field->dbfield))->where($db->qn('user_id') . ' = ' . $db->q($user[0]->id));
                             }
                             $db->setQuery($query);
                             $fieldValue = $db->loadResult();
                             if ($field->framework == 'CB') {
                                 $fieldValue = str_replace('|*|', ',', $fieldValue);
                             }
                             if ($field->framework == 'JS') {
                                 if ($fieldValue == NULL) {
                                     $fieldValue = '';
                                 } else {
                                     $fieldValue = substr($fieldValue, strlen($fieldValue) - 1) == ',' ? $fieldValue = substr($fieldValue, 0, -1) : $fieldValue;
                                 }
                             }
                             if ($field->type == 'group') {
                                 $batch[$k]['GROUPINGS'][] = array('id' => $field->grouping_id, 'groups' => $fieldValue);
                             } else {
                                 $batch[$k][$field->grouping_id] = $fieldValue;
                             }
                         }
                     }
                     // add signup date
                     $batch[$k]['SIGNUPAPI'] = date('Y-m-d');
                     $query = $db->getQuery(true);
                     try {
                         $query->insert($db->qn('#__joomailermailchimpintegration'))->set($db->qn('userid') . ' = ' . $db->q($user[0]->id))->set($db->qn('email') . ' = ' . $db->q($user[0]->email))->set($db->qn('listid') . ' = ' . $db->q($listId));
                         $db->setQuery($query);
                         $db->execute();
                     } catch (Exception $e) {
                     }
                     $k++;
                 } else {
                     break;
                 }
             }
             if ($batch) {
                 $optin = false;
                 // do not send optin emails
                 $updateExisting = true;
                 // yes, update currently subscribed users
                 $replaceInterests = true;
                 // false = add interest, don't replace
                 $result = $MC->listBatchSubscribe($listId, $batch, $optin, $updateExisting, $replaceInterests);
                 $successCount = $successCount + $result['success_count'];
                 if ($result['error_count']) {
                     foreach ($result['errors'] as $e) {
                         $tmp = new stdClass();
                         $tmp->errorCode = $e['code'];
                         $tmp->errorMessage = $e['message'];
                         $errorMsg .= '"' . $MCerrorHandler->getErrorMsg($tmp) . ' => ' . $e['row']['EMAIL'] . '", ';
                         $query->getQuery(true);
                         $query->delete($db->qn('#__joomailermailchimpintegration'))->where($db->qn('listid') . ' = ' . $db->q($listId))->where($db->qn('email') . ' = ' . $db->q($e['row']['EMAIL']));
                         $db->setQuery($query, 0, 1);
                         $db->execute();
                         $addedUsers = array_diff($addedUsers, array($userIds[$e['row']['EMAIL']]));
                         $failed[] = $userIds[$e['row']['EMAIL']];
                         $errorcount++;
                     }
                     $msgErrorsCount += $result['error_count'];
                 }
             }
         }
         if (!count($users)) {
             $done = $total;
             unset($_SESSION['addedUsers']);
             $percent = 100;
         } else {
             $done = count($addedUsers);
             $_SESSION['addedUsers'] = $addedUsers;
             $percent = $done / $total * 100;
         }
         $response['msg'] = '<div id="bg"></div>' . '<div id="progressBarContainer">' . '<div id="progressBarTitle">' . JText::_('JM_ADDING_USERS') . ' (' . $done . '/' . $total . ' ' . JText::_('JM_DONE') . ')</div>' . '<div id="progressBarBg">' . '<div id="progressBarCompleted" style="width: ' . round($percent) . '%;"></div>' . '<div id="progressBarNumber">' . round($percent) . ' %</div>' . '</div>' . '<a id="sbox-btn-close" href="javascript:joomlamailerJS.sync.abortAJAX();">abort</a>' . '</div>';
         $response['done'] = $done;
         //	$msg = $successCount.' '.JText::_('JM_RECIPIENTS_SAVED').$msgErrors;
         $response['errors'] = count($failed);
         $response['errorMsg'] = $errorMsg;
         $response['addedUsers'] = array_values($addedUsers);
         $response['failed'] = $failed;
         if ($done + count($failed) + $errors >= $total) {
             $response['finished'] = 1;
             if ($errorMsg) {
                 $errorMsg = substr($errorMsg, 0, -2);
                 $msgErrors = ' (' . count($failed) . ' ' . JText::_('JM_ERRORS') . ': ' . $errorMsg . ')';
             }
             if (!$msg) {
                 $msg = $done . ' ' . JText::_('JM_RECIPIENTS_SAVED');
             }
             if ($msgErrors) {
                 $msg .= $msgErrors;
             }
             $response['finalMessage'] = $msg;
         } else {
             $response['finished'] = 0;
             $response['finalMessage'] = '';
         }
         $response['abortAJAX'] = $_SESSION['abortAJAX'];
         echo json_encode($response);
     } else {
         unset($_SESSION['addedUsers']);
         $response['finished'] = 1;
         $response['addedUsers'] = '';
         $response['abortAJAX'] = $_SESSION['abortAJAX'];
         echo json_encode($response);
     }
 }