diff --git a/CRM/TwingleCampaign/BAO/TwingleProject.php b/CRM/TwingleCampaign/BAO/TwingleProject.php index dd0b2f2..7ec5289 100644 --- a/CRM/TwingleCampaign/BAO/TwingleProject.php +++ b/CRM/TwingleCampaign/BAO/TwingleProject.php @@ -2,8 +2,10 @@ use CRM_TwingleCampaign_Utils_ExtensionCache as Cache; use CRM_TwingleCampaign_BAO_Campaign as Campaign; +use CRM_TwingleCampaign_ExtensionUtil as E; use CRM_TwingleCampaign_BAO_TwingleApiCall as TwingleApiCall; + class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { /** @@ -15,9 +17,8 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { * * @param int|null $id * - * @throws \Exception */ - function __construct(array $project, int $id = NULL) { + public function __construct(array $project, int $id = NULL) { parent::__construct($project); $this->id = $id; @@ -27,7 +28,7 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { ->getCustomFieldMapping()['twingle_project_id']; } - + /** * Export values. Ensures that only those values will be exported which the @@ -60,8 +61,8 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { /** * Create the Campaign as a campaign in CiviCRM if it does not exist * - * @param bool $is_test - * If true: don't do any changes + * @param bool $no_hook + * Do not trigger postSave hook to prevent recursion * * @return bool * Returns a boolean @@ -69,10 +70,7 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { * @throws \CiviCRM_API3_Exception * @throws \Exception */ - public function create(bool $is_test = FALSE): array { - - // Create campaign only if this is not a test - if (!$is_test) { + public function create(bool $no_hook = FALSE): bool { // Prepare project values for import into database $values_prepared_for_import = $this->values; @@ -92,8 +90,13 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { // Set id $values_prepared_for_import['id'] = $this->id; - // Create campaign - $result = civicrm_api3('Campaign', 'create', $values_prepared_for_import); + // Set a flag to not trigger the hook + if ($no_hook) { + $_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook'] = TRUE; + } + + // Create campaign + $result = civicrm_api3('Campaign', 'create', $values_prepared_for_import); // Update id $this->id = $result['id']; @@ -152,8 +155,8 @@ class CRM_TwingleCampaign_BAO_TwingleProject extends Campaign { // Set default for 'allow_more' $values['allow_more'] = empty($values['allow_more']) - ? False - : True; + ? FALSE + : TRUE; } else { diff --git a/twinglecampaign.php b/twinglecampaign.php index ed55b61..76471c0 100644 --- a/twinglecampaign.php +++ b/twinglecampaign.php @@ -2,45 +2,56 @@ use CRM_TwingleCampaign_BAO_CampaignType as CampaignType; use CRM_TwingleCampaign_Utils_ExtensionCache as ExtensionCache; +use CRM_TwingleCampaign_ExtensionUtil as E; require_once 'twinglecampaign.civix.php'; -use CRM_TwingleCampaign_ExtensionUtil as E; -// -//Civi::dispatcher()->addListener('hook_civicrm_postSave_civicrm_campaign', -// "twinglecampaign_postSave_civicrm_campaign", -1000); /** * Implements hook_civicrm_postSave_Campaigns(). + * This function synchronizes TwingleProject campaigns between CiviCRM and + * Twingle when they get created, edited or cloned. To prevent recursion a no + * hook flag is getting used. * * @param $dao * * @throws CiviCRM_API3_Exception */ function twinglecampaign_civicrm_postSave_civicrm_campaign($dao) { - $twingle_campaign_types = ExtensionCache::getInstance() - ->getCampaigns()['campaign_types']; - $twingle_campaign_type_ids = []; - $hook_campaign_type_id = $dao->campaign_type_id; - $hook_campaign_id = $dao->id; - foreach ($twingle_campaign_types as $twingle_campaign_type) { - $id = civicrm_api3('OptionValue', 'get', - ['sequential' => 1, 'name' => $twingle_campaign_type['name']] + + if (empty($_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook']) || + $_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook'] != TRUE) { + + // extract variables from $dao object + $hook_campaign_type_id = $dao->campaign_type_id; + $hook_campaign_id = $dao->id; + + // Get campaign type id for TwingleProject + $twingle_project_campaign_type_id = civicrm_api3( + 'OptionValue', + 'get', + ['sequential' => 1, 'name' => 'twingle_project'] )['values'][0]['value']; - array_push($twingle_campaign_type_ids, $id); - } - if (in_array($hook_campaign_type_id, $twingle_campaign_type_ids)) { - if (CRM_Core_Transaction::isActive()) { - CRM_Core_Transaction::addCallback( - CRM_Core_Transaction::PHASE_POST_COMMIT, - 'twinglecampaign_postSave_callback', - [$hook_campaign_id] - ); - } - else { - twinglecampaign_postSave_callback($hook_campaign_id); + + // If $dao is a TwingleProject campaign, synchronize it + if ($hook_campaign_type_id == $twingle_project_campaign_type_id) { + // If the db transaction is still running, add a function to it that will + // be called afterwards + if (CRM_Core_Transaction::isActive()) { + CRM_Core_Transaction::addCallback( + CRM_Core_Transaction::PHASE_POST_COMMIT, + 'twinglecampaign_postSave_callback', + [$hook_campaign_id] + ); + } + // If the transaction is already finished, call the function directly + else { + twinglecampaign_postSave_callback($hook_campaign_id); + } } } + // Remove no hook flag + unset($_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook']); } /**