%PDF- %PDF-
Direktori : /home/lightco1/www/administrator/components/com_joomailermailchimpintegration/controllers/ |
Current File : /home/lightco1/www/administrator/components/com_joomailermailchimpintegration/controllers/sync.php |
<?php /** * Copyright (C) 2015 freakedout (www.freakedout.de) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. **/ // no direct access defined('_JEXEC') or die('Restricted Access'); class joomailermailchimpintegrationControllerSync extends joomailermailchimpintegrationController { public function __construct() { parent::__construct(); // Register Extra tasks $this->registerTask('add' , 'sync'); $this->registerTask('backup' , 'sync'); } public function sugar() { JRequest::setVar('view', 'sync'); JRequest::setVar('layout', 'sugar' ); JRequest::setVar('hidemainmenu', 0); parent::display(); } public function highrise() { JRequest::setVar('view', 'sync'); JRequest::setVar('layout', 'highrise' ); JRequest::setVar('hidemainmenu', 0); parent::display(); } public function sync() { $db = JFactory::getDBO(); $mainframe = JFactory::getApplication(); $listId = JRequest::getVar('listId', false, '', 'string'); if (!$listId) { $this->app->enqueueMessage(JText::_('JM_INVALID_LISTID'), 'error'); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } //total number of elements to process $elements = JRequest::getVar('boxchecked', 0, '', 'int'); if (!$elements) { $this->app->enqueueMessage(JText::_('JM_NO_USERS_SELECTED'), 'error'); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } $params = JComponentHelper::getParams('com_joomailermailchimpintegration'); $MCapi = $params->get('params.MCapi'); $MC = new joomlamailerMCAPI($MCapi); $MCerrorHandler = new MCerrorHandler(); $query = $db->getQuery(true) ->select($db->qn('userid')) ->from($db->qn('#__joomailermailchimpintegration')) ->where($db->qn('listid') . ' = ' . $db->q($listId)); $db->setQuery($query); $exclude = $db->loadColumn(); if ($exclude == null) { $exclude = array(); } // 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(); if (!isset($customFields[0])) { $customFields = false; } $data = JRequest::getVar('cid', 0, '', 'array'); if (!$data) { $data = JRequest::getVar('cid[]', 0, '', 'array'); } $batch = $failed = array(); $i = $k = $errorcount = 0; $msg = $error_msg = false; foreach ($data as $dat) { if (in_array($dat, $exclude)) { continue; } $i++; $user = $this->getModel('sync')->getUser($dat); $userIds[$user[0]->email] = $user[0]->id; $batch[$k]['EMAIL'] = $user[0]->email; // name $names = explode(' ', $user[0]->name); if ($names[0] && isset($names[1])) { $batch[$k]['FNAME'] = $names[0]; for ($i = 1; $i < count($names); $i++) { $batch[$k]['LNAME'] .= $names[$i] . ' '; } } else { $batch[$k]['FNAME'] = $user[0]->name; } $custom = array(); if ($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 if ($field->framework =='JS') { $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') { $fieldValue = (substr($fieldValue, strlen($fieldValue) - 1) == ',') ? $fieldValue = substr($fieldValue, 0, -1) : $fieldValue; if ($fieldValue==NULL) { $fieldValue = ''; } } if ($field->type == 'group') { $batch[$k]['GROUPINGS'][] = array('id' => $field->grouping_id, 'groups' => $fieldValue); } else { $batch[$k][$field->grouping_id] = $fieldValue; } } } $query = $db->getQuery(true) ->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(); $k++; } if (count($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); $msg = $result['success_count'] . ' ' . JText::_('JM_RECIPIENTS_SAVED'); //$resubscribeLink = ''; if ($result['error_count']) { // var_dump($result['errors']);die; foreach ($result['errors'] as $e) { // $errorMsg .= '"'.$e['message'].'", '; $tmp = new stdClass(); $tmp->errorCode = $e['code']; $tmp->errorMessage = $e['message']; $errorMsg .= '"' . $MCerrorHandler->getErrorMsg($tmp) . ' => ' . $e['row']['EMAIL'] . '", '; /*if ($tmp->errorCode == 212){ // => do not allow admins to resubscribe unsubscribed users to prevent spam complaints $resubscribeLink = ' <a href="index.php?option=com_joomailermailchimpintegration&view=subscribers&listid='.$listId.'&type=u">'. JText::_('JM_RESUBSCRIBE_LINK').'</a>'; }*/ $failed[] = $e['row']['EMAIL']; } $errorMsg = substr($errorMsg, 0, -2); $msg .= ' (' . $result['error_count'] . ' ' . JText::_('Errors') . ': ' . $errorMsg . ')'; //$msg .= $resubscribeLink; } // clean cache $this->getModel('main')->emptyCache('joomlamailerMisc'); } else { $msg = JText::_('JM_ALL_USERS_ALREADY_ADDED', true); } foreach ($failed as $fail) { $query = $db->getQuery(true); $query->delete($db->qn('#__joomailermailchimpintegration')) ->where($db->qn('listis') . ' = ' . $db->q($listId)) ->where($db->qn('email') . ' = ' . $db->q($fail)); $db->setQuery($query); $db->execute(); } $this->app->enqueueMessage($msg); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } function sync_all() { $mainframe = JFactory::getApplication(); $db = JFactory::getDBO(); JHTMLBehavior::keepalive(); $listId = JRequest::getVar('listid', 0, '', 'string'); ///// $query = 'SELECT userid FROM #__joomailermailchimpintegration WHERE listid = "' . $listId . '"'; $db->setQuery($query); $exclude = $db->loadResultArray(); $exclude = implode('","', $exclude); $exclude = '"' . $exclude . '"'; $query = 'SELECT id FROM #__users WHERE id NOT IN (' . $exclude . ') and block = 0'; $db->setQuery($query); $data = $db->loadObjectList(); $elements = count($data); $params = JComponentHelper::getParams('com_joomailermailchimpintegration'); $MCapi = $params->get('params.MCapi'); $MC = new MCAPI($MCapi); $MCerrorHandler = new MCerrorHandler(); // gather custom fields data $db = JFactory::getDBO(); $query = "SELECT * FROM #__joomailermailchimpintegration_custom_fields WHERE listid = '" . $listId . "' "; $db->setQuery($query); $customFields = $db->loadObjectList(); if (!isset($customFields[0])) $customFields = false; $m = 0; $successCount = $errorcount = $msgErrorsCount = 0; $msg = $msgErrors = false; $step = 100; // foreach ($data as $dat){ for ($x=0;$x<count($data);$x+=$step){ $k=0; $batch = array(); for ($y=$x;$y<($x+$step);$y++){ $dat = $data[$y]; if ($dat){ $user = $this->getModel('sync')->getUser($dat->id); $batch[$k]['EMAIL'] = $user[0]->email; // name $names = explode(' ', $user[0]->name); if ($names[0] && $names[1]) { $batch[$k]['FNAME'] = $names[0]; for($i=1;$i<count($names);$i++){ $batch[$k]['LNAME'] .= $names[$i].' '; } } else { $batch[$k]['FNAME'] = $user[0]->name; } $custom = array(); if ($customFields){ foreach($customFields as $field){ if ($field->framework == 'CB') { $query = "SELECT ".$field->dbfield." FROM #__comprofiler WHERE user_id = '".$user[0]->id."' "; } else { $query = "SELECT value FROM #__community_fields_values WHERE field_id = ".$field->dbfield." AND user_id = '".$user[0]->id."' "; } $db->setQuery($query); $fieldValue = $db->loadResult(); if ($field->framework == 'CB') $fieldValue = str_replace('|*|', ',', $fieldValue); if ($field->framework == 'JS') { $fieldValue = (substr($fieldValue, strlen($fieldValue) - 1)==',')? $fieldValue = substr($fieldValue,0,-1):$fieldValue; if ($fieldValue==NULL) $fieldValue = ''; } $batch[$k]['GROUPINGS'][] = array('id' => (int)$field->grouping_id, 'groups' => $fieldValue); } } $query = 'INSERT INTO #__joomailermailchimpintegration (userid,email,listid) VALUES ("'.$user[0]->id.'", "'.$user[0]->email.'", "'.$listId.'")'; $db->setQuery($query); $db->execute(); $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) . '", '; $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(); } $msgErrorsCount += $result['error_count']; } } } if ($errorMsg) { $msgErrors = substr($errorMsg, 0, -2); $msgErrors = ' (' . $msgErrorsCount . ' ' . JText::_('JM_ERRORS') . ': ' . $msgErrors . ')'; } $msg = $successCount . ' ' . JText::_('JM_RECIPIENTS_SAVED') . $msgErrors; $this->app->enqueueMessage($msg); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } 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); } } public function abortAJAX() { $_SESSION['abortAJAX'] = 1; echo json_encode(array( 'finalMessage' => JText::_('JM_OPERATION_CANCELLED') )); } public function getTotal() { $listId = JRequest::getVar('listId'); $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select('COUNT(' . $db->qn('id') . ')') ->from($db->qn('#__users')) ->where($db->qn('block') . ' = ' . $db->q(0)); $db->setQuery($query); echo $db->loadResult(); } public function getListSubscribers() { $listId = JRequest::getVar('listId', '', 'POST', 'string'); $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select($db->qn('userid')) ->from($db->qn('#__joomailermailchimpintegration')) ->where($db->qn('listid') . ' = ' . $db->q($listId)) ->group('userid'); $db->setQuery($query); echo json_encode($db->loadAssocList()); } public function setConfig() { $crm = JRequest::getVar('crm'); $crmFields = JRequest::getVar('crmFields'); $params = json_encode($crmFields); $db = JFactory::getDBO(); $query = "DELETE FROM #__joomailermailchimpintegration_crm WHERE crm = '$crm'"; $db->setQuery($query); $db->execute(); $query = "INSERT INTO #__joomailermailchimpintegration_crm (crm, params) VALUES ('$crm', '".$params."')"; $db->setQuery($query); $db->execute(); $msg = JText::_('JM_CONFIGURATION_SAVED'); $this->app->enqueueMessage($msg); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } function sync_highrise() { $db =& JFactory::getDBO(); $params =& JComponentHelper::getParams('com_joomailermailchimpintegration'); $highrise_url = $params->get('params.highrise_url'); $highrise_api_token = $params->get('params.highrise_api_token'); $config = $this->getModel('sync')->getConfig('highrise'); if ($config == NULL){ jimport('joomla.application.component.helper'); $cHelper = JComponentHelper::getComponent('com_comprofiler', false); $cbInstalled = $cHelper->enabled; $config = new stdClass(); $config->{'first-name'} = ($cbInstalled) ? 'CB' : 'core'; $config->email_work = 'default'; } $validator = new EmailAddressValidator; $elements = JRequest::getVar('elements', '', 'request', 'string'); $elements = json_decode($elements); if ($elements->done == 0) { $_SESSION['abortAJAX'] = 0; unset($_SESSION['addedUsers']); } $failed = $elements->errors; $errorMsg = $elements->errorMsg; $step = $elements->step; if ($_SESSION['abortAJAX'] != 1){ if (isset($_SESSION['addedUsers'])){ $exclude = $_SESSION['addedUsers']; } else { $exclude = array(); } $addedUsers = $exclude; if (isset($exclude[0])){ $exclude = implode('","', $exclude); $exclude = '"'.$exclude.'"'; $excludeCond = 'AND id NOT IN ('.$exclude.') '; } else { $excludeCond = ''; } if ($elements->range == 'all'){ $query = 'SELECT * FROM #__users ' .'WHERE block = 0 ' .$excludeCond .'ORDER BY id ' .'LIMIT '.$step; } else { $idList = implode(" OR id = ", $elements->cid); $query = 'SELECT * FROM #__users ' .'WHERE block = 0 ' .$excludeCond .'AND (id = '.$idList.') ' .'ORDER BY id '; } $db->setQuery($query); $users = $db->loadObjectList(); $queryJS = false; $queryCB = false; $JSand = array(); foreach($config as $k => $v){ if ($k != 'first-name' && $k != 'last-name'){ $vEx = explode(';', $v); if ($vEx[0] == 'js') { $queryJS = true; $JSand[] = $vEx[1]; } else if ($vEx[0] == 'CB') { $queryCB = true; } } } $JSand = implode("','", array_unique($JSand)); require_once(JPATH_ADMINISTRATOR.'/components/com_joomailermailchimpintegration/libraries/push2Highrise.php'); $highrise = new Push_Highrise($highrise_url, $highrise_api_token); $data = array(); $emails = array(); $x = 0; $new = $elements->new; $updated = $elements->updated; $userIDs = array(); foreach($users as $user){ if ($validator->check_email_address($user->email)){ $request = array(); $userCB = false; $names = explode(' ', $user->name); $firstname = $names[0]; $lastname = ''; if (isset($names[1])){ for($i=1;$i<count($names);$i++){ $lastname .= $names[$i].' '; } } $lastname = trim($lastname); if ($config->{'first-name'} != 'core') { $query = "SELECT * FROM #__comprofiler WHERE user_id = '$user->id'"; $db->setQuery($query); $userCB = $db->loadObjectList(); $firstname = ($userCB[0]->firstname) ? $userCB[0]->firstname : $firstname; $lastname = ($userCB[0]->lastname) ? $userCB[0]->lastname : $lastname; if ($userCB[0]->middlename != ''){ $lastname = $userCB[0]->middlename.' '.$lastname; } } $highriseUser = $highrise->person_in_highrise(array('first-name' => $firstname, 'last-name' => $lastname)); $request['id'] = $highriseUser->id; // var_dump($highriseUser);die; if ($queryJS){ $query = "SELECT field_id, value FROM #__community_fields_values ". "WHERE user_id = '$user->id' ". "AND field_id IN ('$JSand')"; $db->setQuery($query); $JSfields = $db->loadObjectList(); $JSfieldsArray = array(); foreach($JSfields as $jsf){ $JSfieldsArray[$jsf->field_id] = $jsf->value; } } if ($queryCB){ if (!$userCB){ $query = "SELECT * FROM #__comprofiler WHERE user_id = '$user->id'"; $db->setQuery($query); $userCB = $db->loadObjectList(); } } $xml = "<person>\n"; if ((int)$highriseUser->id > 0){ $xml .= '<id>'.$highriseUser->id."</id>\n"; } $xml .= "<first-name>".htmlspecialchars($firstname)."</first-name>\n" ."<last-name>".htmlspecialchars($lastname)."</last-name>"; if (isset($config->title) && $config->title != ''){ $conf = explode(';', $config->title); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "\n<title>".htmlspecialchars($value)."</title>"; } if (isset($config->background) && $config->background != ''){ $conf = explode(';', $config->background); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "\n<background>".htmlspecialchars($value)."</background>"; } if (isset($config->company) && $config->company != ''){ $conf = explode(';', $config->company); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "\n<company-name>".htmlspecialchars($value).'</company-name>'; } $xml .= "\n<contact-data>"; $xml .= "\n<email-addresses>"; $emailTypes = array('work', 'home', 'other'); foreach ($emailTypes as $et){ if (isset($config->{'email_'.$et}) && $config->{'email_'.$et} != ''){ if ($config->{'email_'.$et} == 'default'){ $value = $user->email; } else { $conf = explode(';', $config->{'email_'.$et}); $value = ($conf[0] == 'js') ? $JSfieldsArray[$conf[1]] : $userCB[0]->{$conf[1]}; } $fieldId = ''; if (isset($highriseUser->{'contact-data'}->{'email-addresses'}->{'email-address'})){ foreach($highriseUser->{'contact-data'}->{'email-addresses'} as $hu){ foreach($hu->{'email-address'} as $ea){ if ($ea->location == ucfirst($et)){ $fieldId = '<id type="integer">'.$ea->id[0]."</id>\n"; break; } } } } $xml .= "\n<email-address>\n" .$fieldId ."<address>".htmlspecialchars($value)."</address>\n" ."<location>".ucfirst($et)."</location>\n" ."</email-address>"; } } $xml .= "\n</email-addresses>\n"; $xml .= "\n<phone-numbers>\n"; $phoneTypes = array('work','mobile','fax','pager','home','skype','other'); foreach($phoneTypes as $pt){ if ($config->{'phone_'.$pt} != NULL && $config->{'phone_'.$pt} != ''){ $conf = explode(';', $config->{'phone_'.$pt}); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $fieldId = ''; if (isset($highriseUser->{'contact-data'}->{'phone-numbers'}->{'phone-number'})){ foreach($highriseUser->{'contact-data'}->{'phone-numbers'} as $hu){ foreach($hu->{'phone-number'} as $pn){ if ($pn->location == ucfirst($pt)){ $fieldId = '<id type="integer">'.$pn->id[0]."</id>\n"; break; } } } } $xml .= "<phone-number>\n" .$fieldId ."<number>".htmlspecialchars($value)."</number>\n" ."<location>".ucfirst($pt)."</location>\n" ."</phone-number>"; } } $xml .= "\n</phone-numbers>\n"; $xml .= "\n<instant-messengers>\n"; $imTypes = array('AIM','MSN','ICQ','Jabber','Yahoo','Skype','QQ','Sametime','Gadu-Gadu','Google Talk','Other'); foreach($imTypes as $im){ if (isset($config->{$im}) && $config->{$im} != ''){ $value = false; if ($config->{$im} == 'default'){ $value = $user->email; } else if ($config->{$im} != ''){ $conf = explode(';', $config->{$im}); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); } if ($value){ $fieldId = ''; if (isset($highriseUser->{'contact-data'}->{'instant-messengers'}->{'instant-messenger'})){ foreach($highriseUser->{'contact-data'}->{'instant-messengers'} as $imx){ foreach($imx->{'instant-messenger'} as $ia){ if ($ia->protocol == $im){ $fieldId = '<id type="integer">'.$ia->id[0]."</id>\n"; break; } } } } $xml .= "<instant-messenger>\n" .$fieldId ."<address>".htmlspecialchars($value)."</address>\n" ."<location>Work</location>\n" ."<protocol>".$im."</protocol>\n" ."</instant-messenger>"; } } } $xml .= "\n</instant-messengers>\n"; if (isset($config->website) && $config->website != ''){ $xml .= "\n<web-addresses>\n"; $conf = explode(';', $config->website); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $fieldId = ''; if (isset($highriseUser->{'contact-data'}->{'web-addresses'}->{'web-address'})){ foreach($highriseUser->{'contact-data'}->{'web-addresses'} as $ws){ foreach($ws->{'web-address'} as $wa){ if ($wa->location == 'Work'){ $fieldId = '<id type="integer">'.$wa->id[0]."</id>\n"; break; } } } } $xml .= "<web-address>\n" .$fieldId ."<url>".htmlspecialchars($value)."</url>\n" ."<location>Work</location>\n" ."</web-address>"; $xml .= "\n</web-addresses>\n"; } if (isset($config->twitter) && $config->twitter != ''){ $xml .= "\n<twitter-accounts>\n"; $conf = explode(';', $config->twitter); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $value = removeSpecialCharacters($value); $fieldId = ''; if (isset($highriseUser->{'contact-data'}->{'twitter-accounts'}->{'twitter-account'})){ foreach($highriseUser->{'contact-data'}->{'twitter-accounts'} as $tac){ foreach($tac->{'twitter-account'} as $ta){ if ($ta->location == 'Personal'){ $fieldId = '<id type="integer">'.$ta->id[0]."</id>\n"; break; } } } } $xml .= "<twitter-account>\n" .$fieldId ."<username>".htmlspecialchars(str_replace(' ','',$value))."</username>\n" ."<location>Personal</location>\n" ."</twitter-account>"; $xml .= "\n</twitter-accounts>\n"; } if ( (isset($config->street) && $config->street != '') || (isset($config->city) && $config->city != '' ) || (isset($config->zip) && $config->zip != '' ) || (isset($config->state) && $config->state != '' ) || (isset($config->country)&& $config->country != '') ){ $xml .= "\n<addresses>\n"; $xml .= "<address>\n"; $fieldId = ''; if (isset($highriseUser->{'contact-data'}->addresses->address)){ foreach($highriseUser->{'contact-data'}->addresses as $ads){ foreach($ads->address as $ad){ if ($ad->location == 'Work'){ $fieldId = '<id type="integer">'.$ad->id[0]."</id>\n"; break; } } } } $xml .= $fieldId; if (isset($config->street) && $config->street != '') { $conf = explode(';', $config->street); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "<street>".htmlspecialchars($value)."</street>\n"; } if (isset($config->city) && $config->city != '') { $conf = explode(';', $config->city); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "<city>".htmlspecialchars($value)."</city>\n"; } if (isset($config->zip) && $config->zip != '') { $conf = explode(';', $config->zip); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "<zip>".htmlspecialchars($value)."</zip>\n"; } if (isset($config->state) && $config->state != '') { $conf = explode(';', $config->state); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "<state>".htmlspecialchars($value)."</state>\n"; } if (isset($config->country) && $config->country != '') { $conf = explode(';', $config->country); $value = ($conf[0] == 'js') ? ((isset($JSfieldsArray[$conf[1]]))?$JSfieldsArray[$conf[1]]:'') : ((isset($userCB[0]->{$conf[1]}))?$userCB[0]->{$conf[1]}:''); $xml .= "<country>".htmlspecialchars($value)."</country>\n"; } $xml .= "<location>Work</location>\n"; $xml .= "</address>\n"; $xml .= "</addresses>\n"; } $xml .= "\n</contact-data>"; $xml .= "\n</person>"; $request['xml'] = $xml; $apiResult = $highrise->pushContact($request); if ($apiResult['status'] != 200 && $apiResult['status'] != 201){ // error $failed++; $errorMsg .= '"Server returned error code '.$apiResult['status'].' for user '.$user->name.' (ID '.$user->id.')", '; $apiResult['newContacts'] = 0; $apiResult['updated'] = 0; } else { // success $query = "INSERT INTO #__joomailermailchimpintegration_crm_users " ."(crm, user_id) VALUES " ."('highrise', '$user->id.')"; $db->setQuery($query); $db->execute(); $addedUsers[] = $user->id; } } else { $failed++; $errorMsg .= '"Invalid email => '.$user->email.' ('.$user->name.' - ID '.$user->id.')", '; $apiResult['newContacts'] = 0; $apiResult['updated'] = 0; } } } else { unset($_SESSION['addedUsers']); $response['finished'] = 1; $response['addedUsers'] = ''; $response['abortAJAX'] = $_SESSION['abortAJAX']; echo json_encode($response); } if (!count($users)) { $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 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; $response['newContacts']= $new + $apiResult['new']; $response['updated'] = $updated + $apiResult['updated']; $response['errors'] = $failed; $response['errorMsg'] = $errorMsg; if (($done + $failed) >= $elements->total){ unset($_SESSION['addedUsers']); $response['finished'] = 1; if ($errorMsg) { $errorMsg = substr($errorMsg,0,-2); $msgErrors = ' ; '.$failed.' '.JText::_('JM_ERRORS').': '.$errorMsg.' '; } $msg = ($done + $failed).' '.JText::_('JM_USERS_PROCESSED'); $msg .= ' ('.$response['newContacts'].' '.JText::_('JM_NEW').' ; '.$response['updated'].' '.JText::_('JM_UPDATED').' '; if (isset($msgErrors) && $msgErrors) { $msg .= $msgErrors; } $msg .= ')'; $response['finalMessage'] = $msg; } else { $response['finished'] = 0; $response['finalMessage'] = ''; } $response['abortAJAX'] = $_SESSION['abortAJAX']; echo json_encode($response); } function ajax_sync_sugar() { $db =& JFactory::getDBO(); $params =& JComponentHelper::getParams('com_joomailermailchimpintegration'); $paramsPrefix = (version_compare(JVERSION,'1.6.0','ge')) ? 'params.' : ''; $sugar_name = $params->get('params.sugar_name'); $sugar_pwd = $params->get('params.sugar_pwd'); $sugar_url = $params->get('params.sugar_url'); $config = $this->getModel('sync')->getConfig('sugar'); if ($config == NULL){ jimport('joomla.application.component.helper'); $cHelper = JComponentHelper::getComponent('com_comprofiler', true); $cbInstalled = $cHelper->enabled; $config = new stdClass(); $config->first_name = ($cbInstalled) ? 'CB' : 'core'; } $validator = new EmailAddressValidator; require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomailermailchimpintegration'.DS.'libraries'.DS.'sugar.php'); $sugar = new SugarCRMWebServices; $sugar->SugarCRM($sugar_name, $sugar_pwd, $sugar_url); $sugar->login(); $elements = JRequest::getVar('elements', '', 'request', 'string'); $elements = json_decode($elements); if ($elements->done == 0) { $_SESSION['abortAJAX'] = 0; unset($_SESSION['addedUsers']); } $failed = $elements->errors; $errorMsg = $elements->errorMsg; $step = $elements->step; if ($_SESSION['abortAJAX'] != 1){ if (isset($_SESSION['addedUsers'])){ $exclude = $_SESSION['addedUsers']; } else { $exclude = array(); } $addedUsers = $exclude; if (isset($exclude[0])){ $exclude = implode('","', $exclude); $exclude = '"'.$exclude.'"'; $excludeCond = 'AND id NOT IN ('.$exclude.') '; } else { $excludeCond = ''; } if ($elements->range == 'all'){ $query = 'SELECT * FROM #__users ' .'WHERE block = 0 ' .$excludeCond .'ORDER BY id ' .'LIMIT '.$step; } else { $idList = implode(" OR id = ", $elements->cid); $query = 'SELECT * FROM #__users ' .'WHERE block = 0 ' .$excludeCond .'AND (id = '.$idList.') ' .'ORDER BY id '; } $db->setQuery($query); $users = $db->loadObjectList(); $queryJS = false; $queryCB = false; $JSand = array(); foreach($config as $k => $v){ if ($k != 'firstname' && $k != 'lastname'){ $vEx = explode(';', $v); if ($vEx[0] == 'js') { $queryJS = true; $JSand[] = $vEx[1]; } else if ($vEx[0] == 'CB'){ $queryCB = true; } } } $JSand = implode("','", array_unique($JSand)); $data = array(); $emails = array(); $x = 0; $new = $elements->new; $updated = $elements->updated; $userIDs = array(); foreach($users as $user){ if ($validator->check_email_address($user->email)){ $userCB = false; if ($config->first_name == 'core'){ $names = explode(' ', $user->name); $first_name = $names[0]; $last_name = ''; if (isset($names[1])){ for($i=1;$i<count($names);$i++){ $last_name .= $names[$i].' '; } } $last_name = trim($last_name); } else { $query = "SELECT * FROM #__comprofiler WHERE user_id = '$user->id'"; $db->setQuery($query); $userCB = $db->loadObjectList(); $first_name = $userCB[0]->firstname; $last_name = $userCB[0]->lastname; if ($userCB[0]->middlename != ''){ $last_name = $userCB[0]->middlename.' '.$last_name; } } // var_dump($first_name, $last_name); if ($queryJS){ $query = "SELECT field_id, value FROM #__community_fields_values ". "WHERE user_id = '$user->id' ". "AND field_id IN ('$JSand')"; $db->setQuery($query); $JSfields = $db->loadObjectList(); $JSfieldsArray = array(); foreach($JSfields as $jsf){ $JSfieldsArray[$jsf->field_id] = $jsf->value; } } if ($queryCB){ if (!$userCB){ $query = "SELECT * FROM #__comprofiler WHERE user_id = '$user->id'"; $db->setQuery($query); $userCB = $db->loadObjectList(); } } $data[$x] = array('first_name' => $first_name, 'last_name' => $last_name, 'email1' => $user->email ); foreach($config as $k => $v){ if ($k != 'first_name' && $k != 'last_name'){ if ($v){ $vEx = explode(';', $v); if ($vEx[0] == 'js') { $data[$x][$k] = (isset($JSfieldsArray[$vEx[1]])) ? $JSfieldsArray[$vEx[1]] : ''; } else { $data[$x][$k] = (isset($userCB[0]->{$vEx[1]})) ? str_replace('|*|',', ',$userCB[0]->{$vEx[1]}) : ''; } } } } $emails[$x] = $user->email; $userIDs[] = $user->id; $x++; } else { $errorMsg .= '"Invalid email => '.$user->email.'", '; $failed++; } $addedUsers[] = $user->id; } if (isset($emails[0])){ $existing_users = $sugar->findUserByEmail($emails); } else { $existing_users = array(); } $sendData = array(); $x = 0; foreach($data as $d){ $sendData[$x] = $d; if (isset($existing_users[ $d['email1'] ])){ $sendData[$x]['id'] = $existing_users[ $d['email1'] ]; $updated++; } else { $new++; } $x++; } $sugarResult = $sugar->setContactMulti($sendData); if ($sugarResult !== false && isset($userIDs[0])){ $userIDsInserts = array(); foreach($userIDs as $uid){ $userIDsInserts[] = "('sugar', '$uid')"; } $userIDsInsert = implode(', ', $userIDsInserts); $query = "INSERT INTO #__joomailermailchimpintegration_crm_users " ."(crm, user_id) VALUES " .$userIDsInsert; $db->setQuery($query); $db->execute(); } } else { unset($_SESSION['addedUsers']); $response['finished'] = 1; $response['addedUsers'] = ''; $response['abortAJAX'] = $_SESSION['abortAJAX']; echo json_encode($response); } if (!count($users)) { $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 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'] = $elements->run++; $response['done'] = $done; $response['newUser'] = $new; $response['updated'] = $updated; $response['errors'] = $failed; $response['errorMsg'] = $errorMsg; if (($done + $failed) >= $elements->total){ unset($_SESSION['addedUsers']); $response['finished'] = 1; if ($errorMsg) { $errorMsg = substr($errorMsg,0,-2); $msgErrors = ' ; '.$failed.' '.JText::_('JM_ERRORS').': '.$errorMsg.' '; } $msg = $done.' '.JText::_('JM_USERS_PROCESSED'); $msg .= ' ('.$new.' '.JText::_('JM_NEW').' ; '.$updated.' '.JText::_('JM_UPDATED').' '; if (isset($msgErrors) && $msgErrors) { $msg .= $msgErrors; } $msg .= ')'; $response['finalMessage'] = $msg; } else { $response['finished'] = 0; $response['finalMessage'] = ''; } $response['abortAJAX'] = $_SESSION['abortAJAX']; echo json_encode($response); } public function cancel() { $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=sync'); } }