diff --git a/twinglecampaign.php b/twinglecampaign.php index 0a17f8d..4ec4e54 100644 --- a/twinglecampaign.php +++ b/twinglecampaign.php @@ -1,94 +1,164 @@ campaign_type_id; - $hook_campaign_id = $dao->id; - // Get campaign type id for TwingleProject - $twingle_project_campaign_type_id = - ExtensionCache::getInstance() - ->getCampaigns()['campaign_types']['twingle_project']['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); - } + // 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', + [$dao->id, $dao->campaign_type_id] + ); } + // If the transaction is already finished, call the function directly + else { + twinglecampaign_postSave_callback($dao->id, $dao->campaign_type_id); + } + } // Remove no hook flag unset($_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook']); } /** - * This callback function synchronizes a recently updated TwingleProject - * campaign + * ## postSave callback + * This callback function synchronizes a recently updated TwingleProject or + * creates a TwingleCampaign * - * @param $campaign_id + * @param int $campaign_id + * @param int $campaign_type_id * + * @throws \CiviCRM_API3_Exception */ -function twinglecampaign_postSave_callback($campaign_id) { - if ($_POST['action'] == 'clone') { - unset($_POST['action']); - $result = civicrm_api3('TwingleProject', 'getsingle', - ['id' => $campaign_id] - )['values'][$campaign_id]; - $project = new CRM_TwingleCampaign_BAO_TwingleProject($result); - try { - $project->clone(); - } catch (Exception $e) { - Civi::log()->error( - E::LONG_NAME . - " could not clone TwingleProject campaign: " . - $e->getMessage() - ); - CRM_Utils_System::setUFMessage('TwingleProject could not get cloned.'); +function twinglecampaign_postSave_callback ( + int $campaign_id, + int $campaign_type_id +) { + + // Get campaign type id for TwingleProject + $twingle_project_campaign_type_id = + ExtensionCache::getInstance() + ->getCampaigns()['campaign_types']['twingle_project']['id']; + + // Get campaign type id for TwingleCampaign + $twingle_campaign_campaign_type_id = + ExtensionCache::getInstance() + ->getCampaigns()['campaign_types']['twingle_campaign']['id']; + + + // If $campaign_type_id is a TwingleProject or TwingleCampaign campaign, + // synchronize it + if ( + $campaign_type_id == $twingle_project_campaign_type_id || + $campaign_type_id == $twingle_campaign_campaign_type_id + ) { + + // Set $entity for $campaign_type_id + if ($campaign_type_id == $twingle_project_campaign_type_id) { + $entity = 'TwingleProject'; } - } - else { - try { - civicrm_api3('TwingleProject', 'sync', ['id' => $campaign_id]); - CRM_Utils_System::setUFMessage('TwingleProject was cloned.'); - } catch (CiviCRM_API3_Exception $e) { - Civi::log()->error( - 'twinglecampaign_postSave_callback ' . $e->getMessage() - ); + else { + $entity = 'TwingleCampaign'; + } + + if ($_POST['action'] == 'clone') { + unset($_POST['action']); + $result = civicrm_api3($entity, 'getsingle', + ['id' => $campaign_id] + )['values'][$campaign_id]; + $project = new $entity($result); + try { + $project->clone(); + } catch (Exception $e) { + Civi::log()->error( + E::LONG_NAME . + ' could not clone ' . $entity . ': ' . $e->getMessage() + ); + CRM_Utils_System::setUFMessage($entity. ' could not get cloned.'); + } + } + elseif ($entity == 'TwingleProject') { + try { + civicrm_api3('TwingleProject', 'sync', ['id' => $campaign_id]); + CRM_Utils_System::setUFMessage('TwingleProject was saved.'); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + 'twinglecampaign_postSave_callback ' . $e->getMessage() + ); + } + } else { + try { + civicrm_api3('TwingleCampaign', 'create', ['id' => $campaign_id]); + CRM_Utils_System::setUFMessage('TwingleCampaign was saved.'); + } catch (CiviCRM_API3_Exception $e) { + Civi::log()->error( + 'twinglecampaign_postSave_callback ' . $e->getMessage() + ); + } } } } + +///** +// * ## Implements hook_civicrm_post(). +// * +// * @throws CiviCRM_API3_Exception +// */ +//function twinglecampaign_civicrm_post($op, $objectName, $objectId, &$objectRef) { +// if ($op == 'delete') { +// +// if (CRM_Core_Transaction::isActive()) { +// CRM_Core_Transaction::addCallback( +// CRM_Core_Transaction::PHASE_POST_COMMIT, +// 'twinglecampaign_post_callback', +// [$hook_campaign_id] +// ); +// } +// // If the transaction is already finished, call the function directly +// else { +// twinglecampaign_post_callback($hook_campaign_id); +// } +// } +//} + +///** +// * ## post callback +// * This callback function deletes a TwingleProject on Twingle's side +// * +// * @param $campaign_id +// */ +//function twinglecampaign_post_callback($campaign_id) { +// $result = civicrm_api('TwingleProject', 'delete', [$campaign_id]); +// if ($result['is_error'] != 0) { +// CRM_Utils_System::setUFMessage($result['error_message']); +// } +//} + + /** * Implements hook_civicrm_config(). *