diff --git a/CRM/TwingleCampaign/BAO/Campaign.php b/CRM/TwingleCampaign/BAO/Campaign.php index 86b0bdc..b22666e 100644 --- a/CRM/TwingleCampaign/BAO/Campaign.php +++ b/CRM/TwingleCampaign/BAO/Campaign.php @@ -125,7 +125,9 @@ abstract class CRM_TwingleCampaign_BAO_Campaign { /** * ## Complement campaign values - * Complement existing campaign values with new ones + * Complement existing campaign values with new ones. + * Existing values will not get overwritten. + * * @param array $arrayToComplement */ public function complement(array $arrayToComplement) { @@ -143,6 +145,27 @@ abstract class CRM_TwingleCampaign_BAO_Campaign { } } + /** + * ## Merge campaign values + * Merge existing campaign values with new ones. + * Existing values will be overwritten! + * + * @param array $arrayToMerge + */ + public function merge(array $arrayToMerge) { + $this->complement_r($arrayToMerge, $this->values); + } + + private function merge_r($orig, &$fill) { + foreach ($orig as $key => $value) { + if (is_array($value)) { + $this->complement_r($orig[$key], $fill[$key]); + } else { + $fill[$key] = $value; + } + } + } + public static abstract function formatValues(array &$values, string $direction); /** diff --git a/CRM/TwingleCampaign/BAO/TwingleCampaign.php b/CRM/TwingleCampaign/BAO/TwingleCampaign.php index cc0d77e..ca9af4f 100644 --- a/CRM/TwingleCampaign/BAO/TwingleCampaign.php +++ b/CRM/TwingleCampaign/BAO/TwingleCampaign.php @@ -32,15 +32,14 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { $this->id = $id ?? NULL; $this->values['campaign_type_id'] = 'twingle_campaign'; - if (!isset($this->id)) { - $this->update($values); - $this->getParentProject(); + $this->update($values); + $this->getParentProject(); + if (!isset($this->values['cid'])) { $this->createCid(); - $this->createUrl(); - } - else { - $this->update($values); } + $this->createUrl(); + + } @@ -102,8 +101,8 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { // until the parent campaign type is a TwingleProject $parent_id = $this->values['parent_id']; $parent_id = $parent_id ?? civicrm_api3( - 'TwingleCampaign', - 'getsingle', + 'TwingleCampaign', + 'getsingle', ['id' => $this->id] )['parent_id']; @@ -318,7 +317,15 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { */ public function getResponse(string $status = NULL): array { - $keys = ['id', 'name', 'title', 'parent_project_id', 'parent_id', 'cid', 'url']; + $keys = [ + 'id', + 'name', + 'title', + 'parent_project_id', + 'parent_id', + 'cid', + 'url', + ]; $response = []; foreach ($keys as $key) { if (isset($this->values[$key])) { @@ -366,6 +373,7 @@ class CRM_TwingleCampaign_BAO_TwingleCampaign { /** * ## Get ID + * * @return mixed|null */ public function getId(): int { diff --git a/api/v3/TwingleProject/Create.php b/api/v3/TwingleProject/Create.php index 6d2bcd8..2c60095 100644 --- a/api/v3/TwingleProject/Create.php +++ b/api/v3/TwingleProject/Create.php @@ -86,8 +86,7 @@ function civicrm_api3_twingle_project_Create(array $params): array { unset($result['project_id']); $project = new TwingleProject($result, $params['id']); unset($params['id']); - $project->update($params); - $project->setEmbedData($params); + $project->merge($params); } // If no id is provided, try to create a new project with provided values else { diff --git a/twinglecampaign.php b/twinglecampaign.php index e210c34..50f8044 100644 --- a/twinglecampaign.php +++ b/twinglecampaign.php @@ -62,26 +62,36 @@ function twinglecampaign_civicrm_postSave_civicrm_campaign($dao) { if (empty($_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook']) || $_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook'] != TRUE) { + // If request is not an API-Call + if ($_GET['action'] != 'create') { - // If the db transaction is still running, add a function to it that will - // be called afterwards - if (CRM_Core_Transaction::isActive()) { + // If the db transaction is still running, add a function to it that will + // be called afterwards + if (CRM_Core_Transaction::isActive()) { - if (_validateAndSendInput($dao->id, $dao->campaign_type_id)) { + if (_validateAndSendInput($dao->id, $dao->campaign_type_id)) { - CRM_Core_Transaction::addCallback( - CRM_Core_Transaction::PHASE_POST_COMMIT, - 'twinglecampaign_postSave_campaign_update_callback', - [$dao->id, $dao->campaign_type_id] - ); + CRM_Core_Transaction::addCallback( + CRM_Core_Transaction::PHASE_POST_COMMIT, + 'twinglecampaign_postSave_campaign_update_callback', + [$dao->id, $dao->campaign_type_id] + ); + } } - } - // If the transaction is already finished, call the function directly + // If the transaction is already finished, call the function directly + else { + twinglecampaign_postSave_campaign_update_callback($dao->id, $dao->campaign_type_id); + } + + } else { - twinglecampaign_postSave_campaign_update_callback($dao->id, $dao->campaign_type_id); + CRM_Core_Transaction::addCallback( + CRM_Core_Transaction::PHASE_POST_COMMIT, + 'twinglecampaign_postSave_campaign_update_callback', + [$dao->id, $dao->campaign_type_id] + ); } - } // Remove no hook flag unset($_SESSION['CiviCRM']['de.forumzfd.twinglecampaign']['no_hook']);