public function ajax_sync_hotness() { $listId = JRequest::getVar('listId', '', 'post', 'string'); $total = JRequest::getVar('total', '', 'post', 'string'); $step = JRequest::getVar('step', '', 'post', 'string'); $done = JRequest::getVar('done', '', 'post', 'string'); $errors = JRequest::getVar('errors', '', 'post', 'string'); $errorMsg = JRequest::getVar('errorMsg', '', 'post', 'string'); $addedUsers = JRequest::getVar('addedUsers', '', 'post', 'string'); $failed = JRequest::getVar('failed', array(), 'post', 'string'); $offset = JRequest::getVar('offset', '', 'post', 'string'); if ($done == 0) { $_SESSION['abortAJAX'] = 0; unset($_SESSION['addedUsers']); unset($_SESSION['HotnessExists']); } if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finished'] = 1; $response['abortAJAX'] = 1; echo json_encode($response); return; } $db = JFactory::getDBO(); $MCerrorHandler = new MCerrorHandler(); // retrieve hotness rating require_once JPATH_COMPONENT_ADMINISTRATOR . DS . '/libraries/joomailer/hotActivityComposite.php'; $composite = new hotActivityComposite(); $hotnessRating = $composite->getAllUserHotnessValue($listId); $exclude = isset($_SESSION['addedUsers']) ? $_SESSION['addedUsers'] : array(); if (count($exclude)) { $failed = array_merge($exclude, $failed); $exclude = 'AND j.userid NOT IN ("' . implode('","', $failed) . '") '; } else { $exclude = ''; } $data = $this->getModel('send')->getMcObject()->listMembers($listId, '', '', $offset, $step); if (count($data) > 0) { // determine if the interest group Hotness already exists, if not: create it if (!isset($_SESSION['HotnessExists'])) { $query = $db->getQuery(true)->select($db->qn('value'))->from('#__joomailermailchimpintegration_misc')->where($db->qn('type') . ' = ' . $db->q('hotness'))->where($db->qn('listid') . ' = ' . $db->q($listId)); $db->setQuery($query); $hotnessId = $db->loadResult(); if ($hotnessId == NULL) { $result = $this->getModel('send')->getMcObject()->listInterestGroupingAdd($listId, JText::_('JM_HOTNESS_RATING'), 'hidden', array(1, 2, 3, 4, 5)); if (is_int($result)) { $query = $db->getQuery(true)->insert('#__joomailermailchimpintegration_misc')->set($db->qn('type') . ' = ' . $db->q('hotness'))->set($db->qn('listid') . ' = ' . $db->q($listId))->set($db->qn('value') . ' = ' . $db->q($result)); $db->setQuery($query); $db->execute(); $_SESSION['HotnessExists'] = $result; } } else { $_SESSION['HotnessExists'] = $hotnessId; } } $successCount = 0; for ($x = 0; $x < count($data); $x += $step) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } $k = 0; $batch = array(); for ($y = $x; $y < $x + $step; $y++) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } $dat = isset($data[$y]) ? $data[$y] : false; if ($dat) { $addedUsers[] = $dat['email']; $batch[$k]['EMAIL'] = $dat['email']; if (!isset($hotnessRating[$dat['email']])) { $hotnessRating[$dat['email']] = 2; } $batch[$k]['GROUPINGS'][] = array('id' => $_SESSION['HotnessExists'], 'groups' => $hotnessRating[$dat['email']]); $k++; } else { break; } } if ($batch) { $optin = false; //yes, send optin emails $up_exist = true; // yes, update currently subscribed users $replace_int = true; // false = add interest, don't replace $result = $this->getModel('send')->getMcObject()->listBatchSubscribe($listId, $batch, $optin, $up_exist, $replace_int); $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'] . '", '; } } } } $addedUsers = array_unique($addedUsers); if (!count($data)) { $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 style="background:#FFFFFF none repeat scroll 0 0;border:10px solid #000000;height:100px;left:37%;position:relative;text-align:center;top:37%;width:300px; ">' . '<div style="margin: 35px auto 3px; width: 300px; text-align: center;">' . JText::_('adding users') . ' (' . $done . '/' . $total . ' ' . JText::_('done') . ')</div>' . '<div style="margin: auto; background: transparent url(' . JURI::root() . 'media/com_joomailermailchimpintegration/backend/images/progress_bar_grey.gif) repeat scroll 0% 0%; width: 190px; height: 14px; display: block;">' . '<div style="width: ' . $percent . '%; overflow: hidden;">' . '<img src="' . JURI::root() . 'media/com_joomailermailchimpintegration/backend/images/progress_bar.gif" style="margin: 0 5px 0 0;"/>' . '</div>' . '<div style="width: 190px; text-align: center; position: relative;top:-13px; font-weight:bold;">' . round($percent, 0) . ' %</div>' . '</div>' . '<a id="sbox-btn-close" style="text-indent:-5000px;right:-20px;top:-18px;outline:none;" href="javascript:void(0);joomlamailerJS.sync.abortAJAX(true);">abort</a>' . '</div>'; $response['done'] = $done; $response['errors'] = count($failed); $response['errorMsg'] = $errorMsg; $response['addedUsers'] = array_values(array_unique($addedUsers)); if ($done + count($failed) + $errors >= $total) { $response['finished'] = 1; $msg = $done . ' ' . JText::_('JM_USERS_SYNCHRONIZED') . '.'; if ($errorMsg) { $errorMsg = substr($errorMsg, 0, -2); $msg .= ' (' . count($failed) . ' ' . JText::_('Errors') . ': ' . $errorMsg . ')'; } $response['finalMessage'] = $msg; } else { $response['finished'] = 0; $response['finalMessage'] = ''; } $response['abortAJAX'] = $_SESSION['abortAJAX']; } else { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finalMessage'] = JText::_('JM_NO_USERS_FOUND'); $response['finished'] = 1; $response['abortAJAX'] = $_SESSION['abortAJAX']; } echo json_encode($response); }
public function display($tpl = null) { $document = JFactory::getDocument(); $document->addStyleSheet(JURI::root(true) . '/media/com_joomailermailchimpintegration/backend/css/subscriber.css'); JToolBarHelper::title(JText::_('JM_NEWSLETTER_SUBSCRIBERS'), $this->getPageTitleClass()); $mainframe = JFactory::getApplication(); $option = JRequest::getCmd('option'); $limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int'); $limitstart = $mainframe->getUserStateFromRequest($option . '.limitstart', 'limitstart', 0, 'int'); $params = JComponentHelper::getParams('com_joomailermailchimpintegration'); $MCapi = $params->get('params.MCapi'); $JoomlamailerMC = new JoomlamailerMC(); $AIM = true; $clientDetails = $this->getModel()->getClientDetails(); if ($MCapi && $JoomlamailerMC->pingMC()) { JToolBarHelper::custom('goToLists', 'lists', 'lists', 'Lists', false, false); JToolBarHelper::spacer(); if (JRequest::getVar('type') == 's') { JToolBarHelper::custom('unsubscribe', 'unsubscribe', 'unsubscribe', 'Unsubscribe', true, false); JToolBarHelper::spacer(); JToolBarHelper::custom('delete', 'unsubscribe', 'unsubscribe', 'Delete', true, false); JToolBarHelper::spacer(); } else { if (JRequest::getVar('type') == 'u') { //JToolBarHelper::custom('resubscribe', 'resubscribe', 'resubscribe', 'Resubscribe', false, false); } } } $userid = JRequest::getVar('uid', 0, 'get', 'string'); $email = JRequest::getVar('email', 0, '', 'string', JREQUEST_ALLOWRAW); $memberInfo = $this->getModel()->getListsForEmail(); foreach ($memberInfo['lists'] as $key => $list) { $member_rating = $memberInfo['lists'][$key]['member_rating']; break; } if ($userid) { $user = JFactory::getUser($userid); } //TODO convert $start to GMT using JConfig and tzoffset $start = $user->registerDate; //$listid = JRequest::getVar('listid', 0, 'get', 'string'); //$campaigns = $this->getModel()->MC_object()->campaigns(array('sendtime_start'=>$start, 'list_id'=>$listid)); $campaigns = $this->getModel()->getCampaignsSince($start); //$lists = $this->getModel()->MC_object()->listsForEmail($email); $stats = array(); foreach ($campaigns as $campaign) { $listmemberinfo = $this->getModel()->getListMemberInfo($campaign['list_id'], $email); //Check if this email was ever subscribed to this list if ($listmemberinfo) { //if (in_array($campaign['list_id'], $lists)) { $clicks = 0; if ($AIM) { $clickStats = $this->getModel()->campaignEmailStatsAIM($campaign['id'], $user->email); if (isset($clickStats[0])) { foreach ($clickStats as $cs) { if ($cs['action'] == 'click') { $clicks++; } } } } $stats[$campaign['id']]['clicks'] = $clicks; $opens = $this->getModel()->campaignOpenedAIM($campaign['id']); if ($opens) { foreach ($opens as $o) { if ($o['email'] == $email) { $stats[$campaign['id']]['opens'] = $o['open_count']; $stats[$campaign['id']]['received'] = true; } else { $stats[$campaign['id']]['opens'] = 0; $softbounces = $this->getModel()->getSoftBounces($campaign['id']); $hardbounces = $this->getModel()->getHardBounces($campaign['id']); $bounces = array_merge($softbounces, $hardbounces); $stats[$campaign['id']]['received'] = in_array($email, $bounces) ? 0 : 1; } } } $stats[$campaign['id']]['title'] = $campaign['title']; $stats[$campaign['id']]['date'] = $campaign['send_time']; $stats[$campaign['id']]['segment_text'] = $campaign['segment_text']; $stats[$campaign['id']]['list_sub'] = $listmemberinfo['timestamp']; } } $cbpath = JPATH_ADMINISTRATOR . '/components/com_comprofiler/admin.comprofiler.php'; $jspath = JPATH_ADMINISTRATOR . '/components/com_community/admin.community.php'; $db = JFactory::getDBO(); $avatar = JURI::root() . 'media/com_joomailermailchimpintegration/backend/images/mailchimp_avatar.jpg'; $gravatar_default = $avatar; if (JFile::exists($cbpath)) { //community builder is being used $query = 'SELECT avatar FROM #__comprofiler WHERE id=' . $userid; $db->setQuery($query); $avatarPath = $db->loadResult(); if ($avatarPath) { $avatar = JURI::root() . 'images/comprofiler/' . $avatarPath; } } else { if (JFile::exists($jspath)) { //jomsocial is being used $query = 'SELECT avatar FROM #__community_users WHERE userid=' . $userid; $db->setQuery($query); $avatarPath = $db->loadResult(); if ($avatarPath) { $avatar = JURI::root() . $avatarPath; } } } if ($gravatar_default == $avatar) { $avatar = $this->getModel()->getGravatar($gravatar_default); } $twitterName = $this->getModel()->getTwitterName(); $kloutScore = $this->getModel()->getKloutScore(); $this->assignRef('kloutScore', $kloutScore); $this->assignRef('twitterName', $twitterName); $facebookName = $this->getModel()->getFacebookName(); $this->assignRef('facebookName', $facebookName); $composite = new hotActivityComposite(); $hotActivity = $composite->getActivity(); $hotnessRating = $composite->getHotnessValue(); $this->assignRef('hotnessRating', $hotnessRating); $this->assignRef('hotActivity', $hotActivity); $jomSocialGroups = $this->getModel()->getJomSocialGroups(); $totalDiscussionsOfUser = $this->getModel()->getTotalJomSocialDiscussionsOfUser(); $jomSocialDiscussions = $this->getModel()->getRecentJomSocialDiscussions(); jimport('joomla.html.pagination'); $pagination = new JPagination(count($stats), $limitstart, $limit); $this->assignRef('memberRating', $member_rating); $this->assignRef('jomSocialGroups', $jomSocialGroups); $this->assignRef('jomSocialDiscussions', $jomSocialDiscussions); $this->assignRef('totalDiscussionsOfUser', $totalDiscussionsOfUser); $this->assignRef('pagination', $pagination); $this->assignRef('email', $email); $this->assignRef('stats', $stats); $this->assignRef('limitstart', $limitstart); $this->assignRef('subscribed', $subscribed); $this->assignRef('user', $user); $this->assignRef('avatar', $avatar); parent::display($tpl); require_once JPATH_COMPONENT . '/helpers/jmFooter.php'; }
function ajax_sync_hotness() { $elements = JRequest::getVar('elements', '', 'request', 'string'); $elements = json_decode($elements); if ($elements->done == 0) { $_SESSION['abortAJAX'] = 0; unset($_SESSION['addedUsers']); unset($_SESSION['HotnessExists']); } if ($_SESSION['abortAJAX'] != 1) { $db =& JFactory::getDBO(); $model =& $this->getModel('sync'); $params =& JComponentHelper::getParams('com_joomailermailchimpintegration'); $paramsPrefix = version_compare(JVERSION, '1.6.0', 'ge') ? 'params.' : ''; $MCapi = $params->get($paramsPrefix . 'MCapi'); $MC = new joomlamailerMCAPI($MCapi); $MCerrorHandler = new MCerrorHandler(); $list_id = $elements->listid; $step = $elements->step; $offset = $elements->offset; // retrieve hotness rating require_once JPATH_COMPONENT_ADMINISTRATOR . DS . '/libraries/joomailer/hotActivityComposite.php'; $composite = new hotActivityComposite(); $hotnessRating = $composite->getAllUserHotnessValue($list_id); if (isset($_SESSION['addedUsers'])) { $exclude = $_SESSION['addedUsers']; } else { $exclude = array(); } if (!$elements->failed) { $elements->failed = array(); } $exclude = array_merge($exclude, $elements->failed); $exclude = implode('","', $exclude); $exclude = '"' . $exclude . '"'; if (isset($exclude[0])) { $exclude = 'AND j.userid NOT IN (' . $exclude . ') '; } else { $exclude = ''; } // $data = array(); // $run = true; // $page = 0; // while($run){ // $result = $MC->listMembers( $list_id, '', '', $page, '15000'); // $page++; // if($result){ // $run = true; // $data = array_merge($data, $result); // } else { // $run = false; // } // } $data = $MC->listMembers($list_id, '', '', $offset, $step); if (count($data) > 0) { // determine if the interest group Hotness already exists, if not: create it if (!isset($_SESSION['HotnessExists'])) { $query = "SELECT value FROM #__joomailermailchimpintegration_misc WHERE type = 'hotness' AND listid = '" . $list_id . "' "; $db->setQuery($query); $hotnessId = $db->loadResult(); if ($hotnessId == NULL) { $result = $MC->listInterestGroupingAdd($list_id, JText::_('JM_HOTNESS_RATING'), 'hidden', array(1, 2, 3, 4, 5)); if (is_int($result)) { $query = "INSERT INTO #__joomailermailchimpintegration_misc (type, listid, value) VALUES ('hotness', '" . $list_id . "', '" . $result . "') "; $db->setQuery($query); $db->query(); $_SESSION['HotnessExists'] = $result; } } else { $_SESSION['HotnessExists'] = $hotnessId; } } /* $userIds = array(); foreach($data as $dat){ $userIds[$dat->email] = $dat->id; } */ $addedUsers = $elements->addedUsers; $m = 0; $successCount = 0; $errorcount = $msgErrorsCount = 0; $msg = $msgErrors = false; $counter = 0; $ids = ''; $errorMsg = $elements->errorMsg; for ($x = 0; $x < count($data); $x += $step) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } $k = 0; $batch = array(); $errorcount = $msgErrorsCount = 0; for ($y = $x; $y < $x + $step; $y++) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } if (isset($data[$y])) { $dat = $data[$y]; } else { $dat = false; } if ($dat) { $addedUsers[] = $dat['email']; $batch[$k]['EMAIL'] = $dat['email']; if (!isset($hotnessRating[$dat['email']])) { $hotnessRating[$dat['email']] = 2; } $batch[$k]['GROUPINGS'][] = array('id' => $_SESSION['HotnessExists'], 'groups' => $hotnessRating[$dat['email']]); $k++; } else { break; } } if ($batch) { $optin = false; //yes, send optin emails $up_exist = true; // yes, update currently subscribed users $replace_int = true; // false = add interest, don't replace $result = $MC->listBatchSubscribe($list_id, $batch, $optin, $up_exist, $replace_int); $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'] . '", '; // $addedUsers = array_diff($addedUsers, array($userIds[$e['row']['EMAIL']])); // $elements->failed[] = $userIds[$e['row']['EMAIL']]; $errorcount++; } $msgErrorsCount += $result['error_count']; } } } $addedUsers = array_unique($addedUsers); if (!count($data)) { $done = $elements->total; unset($_SESSION['addedUsers']); $percent = 100; } else { $done = count($addedUsers); $_SESSION['addedUsers'] = $addedUsers; $percent = $done / $elements->total * 100; } $response['msg'] = '<div id="bg"></div>' . '<div style="background:#FFFFFF none repeat scroll 0 0;border:10px solid #000000;height:100px;left:37%;position:relative;text-align:center;top:37%;width:300px; ">' . '<div style="margin: 35px auto 3px; width: 300px; text-align: center;">' . JText::_('adding users') . ' ( ' . $done . '/' . $elements->total . ' ' . JText::_('done') . ' )</div>' . '<div style="margin: auto; background: transparent url(' . JURI::root() . 'administrator/components/com_joomailermailchimpintegration/assets/images/progress_bar_grey.gif) repeat scroll 0% 0%; width: 190px; height: 14px; display: block;">' . '<div style="width: ' . $percent . '%; overflow: hidden;">' . '<img src="' . JURI::root() . 'administrator/components/com_joomailermailchimpintegration/assets/images/progress_bar.gif" style="margin: 0 5px 0 0;"/>' . '</div>' . '<div style="width: 190px; text-align: center; position: relative;top:-13px; font-weight:bold;">' . round($percent, 0) . ' %</div>' . '</div>' . '<a id="sbox-btn-close" style="text-indent:-5000px;right:-20px;top:-18px;outline:none;" href="javascript:abortAJAXnoRefresh();">abort</a>' . '</div>'; $response['done'] = $done; $response['errors'] = count($elements->failed); $response['errorMsg'] = $errorMsg; $response['addedUsers'] = array_values(array_unique($addedUsers)); // $response['failed'] = $elements->failed; if ($done + count($elements->failed) + $elements->errors >= $elements->total) { $response['finished'] = 1; if ($errorMsg) { $errorMsg = substr($errorMsg, 0, -2); $msgErrors = ' ( ' . count($elements->failed) . ' ' . JText::_('Errors') . ': ' . $errorMsg . ' )'; } if (!$msg) { $msg = $done . ' ' . JText::_('JM_USERS_SYNCHRONIZED') . '.'; } if ($msgErrors) { $msg .= $msgErrors; } $response['finalMessage'] = $msg; } else { $response['finished'] = 0; $response['finalMessage'] = ''; } $response['abortAJAX'] = $_SESSION['abortAJAX']; } else { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finalMessage'] = JText::_('JM_NO_USERS_FOUND'); $response['finished'] = 1; $response['abortAJAX'] = $_SESSION['abortAJAX']; } echo json_encode($response); } else { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finished'] = 1; $response['abortAJAX'] = $_SESSION['abortAJAX']; echo json_encode($response); } }