create(TRUE); } // Create custom groups foreach ($campaign_info['custom_groups'] as $custom_group) { foreach (CampaignType::getCampaignTypes() as $campaign_type) { if ($campaign_type->getName() == $custom_group['campaign_type']) { $custom_group['extends_entity_column_value'] = $campaign_type->getValue(); } } $cg = new CustomGroup($custom_group); $cg->create(TRUE); } // If new fields get created during the update, set a flag to set all // last_update values of the affected campaigns to "0" and trigger a // synchronization. This ensures that settings on Twingle's side will not // get overwritten with empty values. $updatedCampaignTypes = []; // Create custom fields foreach ($campaign_info['custom_fields'] as $custom_field) { $cf = new CustomField($custom_field); $result = $cf->create(TRUE); if (!empty($result)) { preg_match( '/^Twingle_[a-yA-Z]*/', $cf->getCustomGroupId(), $updatedCampaignTypes[] ); } } // Filter changed campaign types foreach ($updatedCampaignTypes as $key => $value) { $updatedCampaignTypes[str_replace('_', '', $value[0])] = TRUE; unset($updatedCampaignTypes[$key]); } // Pull changed campaigns to fill new created fields with data try { foreach ($updatedCampaignTypes as $key => $value) { if ($value === TRUE) { civicrm_api3( $key, 'sync', ['pull' => TRUE] ); } } } catch (Exception $e) { Civi::log()->error( E::LONG_NAME . ' could not pull campaigns from Twingle to fill the campaign fields that were created on update.' . $e->getMessage() ); CRM_Core_Session::setStatus( E::ts( 'Could not pull campaigns from Twingle to fill the campaign fields that were created within this update: %1', [1 => $e->getMessage()] ), E::ts('Scheduled Job'), 'error' ); } // Create option values foreach ($option_values as $option_value) { $ov = new OptionValue($option_value); $ov->create(); } return TRUE; } /** * @throws \Exception */ public function install() { // Create campaign types, custom fields and custom groups by the contents // of the campaigns.php file $campaign_info = require E::path() . '/CRM/TwingleCampaign/resources/campaigns.php'; $option_values = require E::path() . '/CRM/TwingleCampaign/resources/option_values.php'; // Create campaign types foreach ($campaign_info['campaign_types'] as $campaign_type) { new CampaignType($campaign_type); } foreach (CampaignType::getCampaignTypes() as $campaign_type) { $campaign_type->create(); } // Create custom groups foreach ($campaign_info['custom_groups'] as $custom_group) { foreach (CampaignType::getCampaignTypes() as $campaign_type) { if ($campaign_type->getName() == $custom_group['campaign_type']) { $custom_group['extends_entity_column_value'] = $campaign_type->getValue(); } } $cg = new CustomGroup($custom_group); $cg->create(); } // Create custom fields foreach ($campaign_info['custom_fields'] as $custom_field) { $cf = new CustomField($custom_field); $cf->create(); } // Create option values foreach ($option_values as $option_value) { $ov = new OptionValue($option_value); $ov->create(); } // setup cron job to trigger synchronization try { civicrm_api3('Job', 'create', [ 'run_frequency' => "Hourly", 'name' => "TwingleSync", 'api_entity' => "TwingleSync", 'api_action' => "sync", 'description' => E::ts("Syncronizes all TwingleProjects an TwingleEvents between CiviCRM and Twingle"), 'is_active' => 1, ]); } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . ' could not create scheduled job on extension installation: ' . $e->getMessage() ); CRM_Core_Session::setStatus( E::ts('Could not create scheduled job "TwingleSync".'), E::ts('Scheduled Job'), error ); } } /** * @throws \CiviCRM_API3_Exception * @throws \Exception */ public function uninstall() { $campaign_info = require E::path() . '/CRM/TwingleCampaign/resources/campaigns.php'; $option_values = Cache::getInstance()->getOptionValues(); // Delete campaign types foreach ($campaign_info['campaign_types'] as $campaign_type) { $result = CampaignType::fetch($campaign_type['name']); if ($result) { $result->delete(); } } // Delete custom groups foreach ($campaign_info['custom_groups'] as $custom_group) { $result = CustomGroup::fetch($custom_group['name']); if ($result) { $result->delete(); } } // Delete option values foreach ($option_values as $option_value) { $result = OptionValue::fetch($option_value['name']); if ($result) { $result->delete(); } } // Delete all settings for this extension Configuration::deleteAll(); // Delete cron job try { $jobId = civicrm_api3('Job', 'getsingle', [ 'name' => "TwingleSync", ])['id']; civicrm_api3('Job', 'delete', [ 'id' => $jobId, ]); } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . ' could not delete scheduled job on extension uninstallation: ' . $e->getMessage() ); CRM_Core_Session::setStatus( E::ts('Could not delete scheduled job "TwingleSync".'), E::ts('Scheduled Job'), error ); } } /** * @throws \Exception */ public function enable() { // Enable cron job try { $jobId = civicrm_api3('Job', 'getsingle', [ 'name' => "TwingleSync", ])['id']; civicrm_api3('Job', 'create', [ 'id' => $jobId, 'is_active' => 1, ]); } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . ' could not activate scheduled job on extension activation: ' . $e->getMessage() ); CRM_Core_Session::setStatus( E::ts('Could not activate scheduled job "TwingleSync". Your Campaigns will not get synchronized to Twingle.'), E::ts('Scheduled Job'), error ); } } /** * @throws \Exception */ public function disable() { // Disable cron job try { $jobId = civicrm_api3('Job', 'getsingle', [ 'name' => 'TwingleSync', ])['id']; civicrm_api3('Job', 'create', [ 'id' => $jobId, 'is_active' => 0, ]); } catch (CiviCRM_API3_Exception $e) { Civi::log()->error( E::LONG_NAME . ' could not disable scheduled job on extension deactivation: ' . $e->getMessage() ); CRM_Core_Session::setStatus( E::ts('Could not disable scheduled job "TwingleSync".'), E::ts('Scheduled Job'), error ); } // Remove Twingle api key from settings Civi::settings()->revert('twingle_api_key'); } }