diff --git a/CRM/TwingleCampaign/BAO/Configuration.php b/CRM/TwingleCampaign/BAO/Configuration.php index 6d2614e..4d26232 100644 --- a/CRM/TwingleCampaign/BAO/Configuration.php +++ b/CRM/TwingleCampaign/BAO/Configuration.php @@ -7,7 +7,8 @@ class CRM_TwingleCampaign_BAO_Configuration { 'twingle_api_key', 'twinglecampaign_xcm_profile', 'twinglecampaign_default_case', - 'twinglecampaign_soft_credits' + 'twinglecampaign_soft_credits', + 'twinglecampaign_matomo_integration' ]; @@ -27,6 +28,12 @@ class CRM_TwingleCampaign_BAO_Configuration { Civi::settings()->set('twinglecampaign_soft_credits', 0); } + // Set twinglecampaign_matomo_integration to '0' if checkbox is unchecked + if (!array_key_exists('twinglecampaign_matomo_integration', $settings)) { + Civi::settings()->set('twinglecampaign_matomo_integration', 0); + } + + Civi::settings()->add($settings); } @@ -63,4 +70,4 @@ class CRM_TwingleCampaign_BAO_Configuration { } } -} \ No newline at end of file +} diff --git a/CRM/TwingleCampaign/Form/Settings.php b/CRM/TwingleCampaign/Form/Settings.php index f614ce5..5b599e0 100644 --- a/CRM/TwingleCampaign/Form/Settings.php +++ b/CRM/TwingleCampaign/Form/Settings.php @@ -46,6 +46,13 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form { FALSE ); + $this->addElement( + 'checkbox', + 'twinglecampaign_matomo_integration', + E::ts('Use Matomo to track user interaction with Twingle forms'), + FALSE + ); + $this->addButtons([ [ 'type' => 'submit', diff --git a/CRM/TwingleCampaign/Utils/MatomoSnippet.php b/CRM/TwingleCampaign/Utils/MatomoSnippet.php new file mode 100644 index 0000000..79fd3ec --- /dev/null +++ b/CRM/TwingleCampaign/Utils/MatomoSnippet.php @@ -0,0 +1,75 @@ +", + "", + "", + ]); + } + + /** + * Returns JavaScript snippet to track events in Matomo. + * + * @return string + */ + public static function get_event_tracker() { + $code = "_paq.push(['trackEvent', 'twingle', 'donation', event.data.value.recurringRythm, event.data.value.amount]);"; + return self::embed_in_base_function($code); + } + + /** + * Returns JavaScript snippet to track Matomo goals. + * + * @param $goal_id + * The ID of your Matomo goal. + * + * @return string + */ + public static function get_goal_tracker($goal_id) { + $code = "_paq.push(['trackGoal', $goal_id]);"; + return self::embed_in_base_function($code); + } + + /** + * Returns JavaScript snippet to track ecommerce activity in Matomo. + * + * @return string + */ + public static function get_ecommerce_tracker() { + $code = implode("\n", [ + "_paq.push(['addEcommerceItem', event.data.value.rythm, '', event.data.value.target, event.data.value.amount]);", + "_paq.push(['trackEcommerceOrder', 'anonymizedData', event.data.value.amount]);", + ]); + return self::embed_in_base_function($code); + } + + /** + * Appends the given code to the original code. + * + * @param $original + * The original code. + * @param $appendix + * The code you want to append to the original code. + * + * @return string + * The combined code after appending the appendix. + */ + public static function append_code($original, $appendix) { + return $original . '\n' . $appendix; + } + +} diff --git a/api/v3/TwingleForm/Get.php b/api/v3/TwingleForm/Get.php index 6adaf2e..86a5475 100644 --- a/api/v3/TwingleForm/Get.php +++ b/api/v3/TwingleForm/Get.php @@ -2,6 +2,7 @@ use CRM_TwingleCampaign_ExtensionUtil as E; use CRM_TwingleCampaign_Utils_ExtensionCache as Cache; +use CRM_TwingleCampaign_Utils_MatomoSnippet as MatomoSnippet; /** * TwingleForm.Get API specification (optional) @@ -110,16 +111,49 @@ function civicrm_api3_twingle_form_Get(array $params): array { 'project_type' => $value[$custom_field_mapping['twingle_project_type']], 'counter' => $value[$custom_field_mapping['twingle_project_counter']] ]; + $matomo_integration_enabled = Civi::settings()->get('twinglecampaign_matomo_integration', False); switch ($value[$custom_field_mapping['twingle_project_type']]) { case 'event': - $returnValues[$value['id']]['embed_code'] = - $value[$custom_field_mapping['twingle_project_eventall']]; + if ($matomo_integration_enabled) { + $returnValues[$value['id']]['embed_code'] = + MatomoSnippet::append_code( + $value[$custom_field_mapping['twingle_project_eventall']], + MatomoSnippet::get_event_tracker() + ); + } + else { + $returnValues[$value['id']]['embed_code'] = + $value[$custom_field_mapping['twingle_project_eventall']]; + } + break; + case 'shop': + if ($matomo_integration_enabled) { + $returnValues[$value['id']]['embed_code'] = + MatomoSnippet::append_code( + $value[$custom_field_mapping['twingle_project_widget']], + MatomoSnippet::get_ecommerce_tracker() + ); + } + else { + $returnValues[$value['id']]['embed_code'] = + $value[$custom_field_mapping['twingle_project_widget']]; + } break; default: - $returnValues[$value['id']]['embed_code'] = - $value[$custom_field_mapping['twingle_project_widget']]; + if ($matomo_integration_enabled) { + $returnValues[$value['id']]['embed_code'] = + MatomoSnippet::append_code( + $value[$custom_field_mapping['twingle_project_widget']], + MatomoSnippet::get_event_tracker() + ); + } + else { + $returnValues[$value['id']]['embed_code'] = + $value[$custom_field_mapping['twingle_project_widget']]; + } } } + return civicrm_api3_create_success($returnValues, $query, 'TwingleForm', 'Get'); } else { diff --git a/templates/CRM/TwingleCampaign/Form/Settings.tpl b/templates/CRM/TwingleCampaign/Form/Settings.tpl index a7c7c14..288c13e 100644 --- a/templates/CRM/TwingleCampaign/Form/Settings.tpl +++ b/templates/CRM/TwingleCampaign/Form/Settings.tpl @@ -26,6 +26,11 @@