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); } }