static function getMailchimpGroupIdFromName($listID, $groupName) { CRM_Mailchimp_Utils::checkDebug('Start-CRM_Mailchimp_Utils getMailchimpGroupIdFromName $listID', $listID); CRM_Mailchimp_Utils::checkDebug('Start-CRM_Mailchimp_Utils getMailchimpGroupIdFromName $groupName', $groupName); if (empty($listID) || empty($groupName)) { return NULL; } $mcLists = new Mailchimp_Lists(CRM_Mailchimp_Utils::mailchimp()); try { $results = $mcLists->interestGroupings($listID); } catch (Exception $e) { return NULL; } foreach ($results as $grouping) { foreach ($grouping['groups'] as $group) { if ($group['name'] == $groupName) { return $group['id']; } } } CRM_Mailchimp_Utils::checkDebug('End-CRM_Mailchimp_Utils getMailchimpGroupIdFromName $listID', $listID); CRM_Mailchimp_Utils::checkDebug('End-CRM_Mailchimp_Utils getMailchimpGroupIdFromName $groupName', $groupName); }
/** * Mailchimp in their wisdom changed all the Ids for interests. * * So we have to map on names and then update our stored Ids. * * Also change cronjobs. */ public function upgrade_20() { $this->ctx->log->info('Applying update to v2.0 Updating Mailchimp Interest Ids to fit their new API'); // New $api = CRM_Mailchimp_Utils::getMailchimpApi(); // Old $mcLists = new Mailchimp_Lists(CRM_Mailchimp_Utils::mailchimp()); // Use new API to get lists. Allow for 10,000 lists so we don't bother // batching. $lists = []; foreach ($api->get("/lists", ['fields' => 'lists.id,lists.name', 'count' => 10000])->data->lists as $list) { $lists[$list->id] = ['name' => $list->name]; } $queries = []; // Loop lists. foreach (array_keys($lists) as $list_id) { // Fetch Interest categories. $categories = $api->get("/lists/{$list_id}/interest-categories", ['count' => 10000, 'fields' => 'categories.id,categories.title'])->data->categories; if (!$categories) { continue; } // Old: fetch all categories (groupings) and interests (groups) in one go: $old = $mcLists->interestGroupings($list_id); // New: fetch interests for each category. foreach ($categories as $category) { // $lists[$list_id]['categories'][$category->id] = ['name' => $category->title]; // Match this category by name with the old 'groupings' $matched_old_grouping = FALSE; foreach ($old as $old_grouping) { if ($old_grouping['name'] == $category->title) { $matched_old_grouping = $old_grouping; break; } } if ($matched_old_grouping) { // Found a match. $cat_queries[] = ['list_id' => $list_id, 'old' => $matched_old_grouping['id'], 'new' => $category->id]; // Now do interests (old: groups) $interests = $api->get("/lists/{$list_id}/interest-categories/{$category->id}/interests", ['fields' => 'interests.id,interests.name', 'count' => 10000])->data->interests; foreach ($interests as $interest) { // Can we find this interest by name? $matched_old_group = FALSE; foreach ($matched_old_grouping['groups'] as $old_group) { if ($old_group['name'] == $interest->name) { $int_queries[] = ['list_id' => $list_id, 'old' => $old_group['id'], 'new' => $interest->id]; break; } } } } } } foreach ($cat_queries as $params) { CRM_Core_DAO::executeQuery('UPDATE civicrm_value_mailchimp_settings ' . 'SET mc_grouping_id = %1 ' . 'WHERE mc_list_id = %2 AND mc_grouping_id = %3;', [1 => [$params['new'], 'String'], 2 => [$params['list_id'], 'String'], 3 => [$params['old'], 'String']]); } foreach ($int_queries as $params) { CRM_Core_DAO::executeQuery('UPDATE civicrm_value_mailchimp_settings ' . 'SET mc_group_id = %1 ' . 'WHERE mc_list_id = %2 AND mc_group_id = %3;', [1 => [$params['new'], 'String'], 2 => [$params['list_id'], 'String'], 3 => [$params['old'], 'String']]); } // Now cron jobs. Delete all mailchimp ones. $result = civicrm_api3('Job', 'get', array('sequential' => 1, 'api_entity' => "mailchimp")); if ($result['count']) { // Should only be one, but just in case... foreach ($result['values'] as $old) { // Double check id exists! if (!empty($old['id'])) { civicrm_api3('Job', 'delete', ['id' => $old['id']]); } } } // Create Push Sync job. $params = array('sequential' => 1, 'name' => 'Mailchimp Push Sync', 'description' => 'Sync contacts between CiviCRM and MailChimp, assuming CiviCRM to be correct. Please understand the implications before using this.', 'run_frequency' => 'Daily', 'api_entity' => 'Mailchimp', 'api_action' => 'pushsync', 'is_active' => 0); $result = civicrm_api3('job', 'create', $params); // Create Pull Sync job. $params = array('sequential' => 1, 'name' => 'Mailchimp Pull Sync', 'description' => 'Sync contacts between CiviCRM and MailChimp, assuming Mailchimp to be correct. Please understand the implications before using this.', 'run_frequency' => 'Daily', 'api_entity' => 'Mailchimp', 'api_action' => 'pullsync', 'is_active' => 0); $result = civicrm_api3('job', 'create', $params); return TRUE; }
/** * Mailchimp Get Mailchimp Groupids API * * @param array $params * @return array API result descriptor * @see civicrm_api3_create_success * @see civicrm_api3_create_error * @throws API_Exception */ function civicrm_api3_mailchimp_getgroupid($params) { $mcLists = new Mailchimp_Lists(CRM_Mailchimp_Utils::mailchimp()); try { $results = $mcLists->interestGroupings($params['id']); } catch (Exception $e) { return array(); } $groups = array(); foreach ($results as $result) { foreach ($result['groups'] as $group) { $groups[] = array('groupingid' => $result['id'], 'groupingname' => $result['name'], 'groupname' => $group['name'], 'groupid' => $group['id']); } } return civicrm_api3_create_success($groups); }