use singleton ExtensionCache for cached mappings and settings

This commit is contained in:
Marc Michalsky forumZFD 2020-10-29 21:19:01 +01:00
parent 0f98580adf
commit 24d224cc38
Signed by untrusted user who does not match committer: marc.koch
GPG key ID: 12406554CFB028B9
2 changed files with 109 additions and 69 deletions

View file

@ -3,16 +3,12 @@
namespace CRM\TwingleCampaign\BAO;
use Civi;
use CRM_TwingleCampaign_ExtensionUtil as E;
use CRM_Utils_Array;
use CRM\TwingleCampaign\Utils\ExtensionCache as Cache;
use DateTime;
use CRM\TwingleCampaign\BAO\CustomField as CustomField;
use Exception;
use CiviCRM_API3_Exception;
include_once E::path() . '/CRM/TwingleCampaign/BAO/CustomField.php';
class TwingleProject {
@ -28,14 +24,6 @@ class TwingleProject {
private static $bInitialized = FALSE;
public static $customFieldMapping;
public static $translations;
public static $campaigns;
public static $templates;
private $id;
private $values;
@ -56,9 +44,6 @@ class TwingleProject {
*/
public function __construct(array $project, string $origin) {
// Fetch custom field mapping once
self::init();
// If values come from CiviCRM Campaign API
if ($origin == self::CIVICRM) {
@ -82,54 +67,6 @@ class TwingleProject {
}
/**
* Get custom field mapping.
* This function will be fully executed only once, when the TwingleProject
* class gets instantiated for the first time.
*
* @throws Exception
*/
private static function init() {
// Initialize custom field mapping
if (self::$bInitialized) {
return;
}
self::$customFieldMapping = CustomField::getMapping();
// Initialize json files as arrays
$file_paths = [
'translations' => '/CRM/TwingleCampaign/resources/dictionary.json',
'templates' => '/CRM/TwingleCampaign/resources/twingle_api_templates.json',
'campaigns' => '/CRM/TwingleCampaign/resources/campaigns.json',
];
foreach ($file_paths as $key => $file_path) {
// Get array from json file
$file_path = E::path() . $file_path;
$json_file = file_get_contents($file_path);
$json_file_name = pathinfo($file_path)['filename'];
$array = json_decode($json_file, TRUE);
// Throw and log an error if json file can't be read
if (!$array) {
$message = ($json_file_name)
? "Could not read json file $json_file_name"
: "Could not locate json file in path: $file_path";
Civi::log()->error($message);
throw new Exception($message);
}
// Set attribute
self::$$key = $array;
}
self::$bInitialized = TRUE;
}
/**
* Create the TwingleProject as a campaign in CiviCRM if it does not exist
*
@ -249,7 +186,8 @@ class TwingleProject {
$single = FALSE;
// Get custom field name for project_id
$cf_project_id = TwingleProject::$customFieldMapping['twingle_project_id'];
$cf_project_id = Cache::getInstance()
->getCustomFieldMapping()['twingle_project_id'];
// If there is more than one campaign for a project, handle the duplicates
while (!$single) {
@ -361,7 +299,7 @@ class TwingleProject {
public static function translateKeys(array &$values, string $direction) {
// Get translations for fields
$field_translations = self::$translations['fields'];
$field_translations = Cache::getInstance()->getTranslations()['fields'];
// Set the direction of the translation
if ($direction == self::OUT) {
@ -452,7 +390,8 @@ class TwingleProject {
// Translate from Twingle field name to custom field name
if ($direction == self::IN) {
foreach (TwingleProject::$customFieldMapping as $field => $custom) {
foreach (Cache::getInstance()
->getCustomFieldMapping() as $field => $custom) {
if (array_key_exists(
str_replace(
@ -481,7 +420,8 @@ class TwingleProject {
// Translate from custom field name to Twingle field name
elseif ($direction == self::OUT) {
foreach (TwingleProject::$customFieldMapping as $field => $custom) {
foreach (Cache::getInstance()
->getCustomFieldMapping() as $field => $custom) {
if (array_key_exists(
$custom,
@ -508,7 +448,8 @@ class TwingleProject {
public function setEmbedData(array $embedData) {
// Get all embed_data keys from template
$embed_data_keys = self::$templates['project_embed_data'];
$embed_data_keys = Cache::getInstance()
->getTemplates()['project_embed_data'];
// Transfer all embed_data values
foreach ($embed_data_keys as $key) {

View file

@ -0,0 +1,99 @@
<?php
namespace CRM\TwingleCampaign\Utils;
use Civi;
use CRM\TwingleCampaign\BAO\CustomField as CustomField;
use CRM_TwingleCampaign_ExtensionUtil as E;
use Exception;
/**
* A singleton that caches mappings and settings
*
* @package CRM\TwingleCampaign\Utilities
*/
class ExtensionCache {
protected static $_instance = NULL;
private $customFieldMapping;
private $translations;
private $campaigns;
private $templates;
public static function getInstance() {
if (null === self::$_instance) {
self::$_instance = new self;
}
return self::$_instance;
}
protected function __construct() {
// Get a mapping of custom fields
$this->customFieldMapping = CustomField::getMapping();
// Initialize json files as arrays
$file_paths = [
'translations' => '/CRM/TwingleCampaign/resources/dictionary.json',
'templates' => '/CRM/TwingleCampaign/resources/twingle_api_templates.json',
'campaigns' => '/CRM/TwingleCampaign/resources/campaigns.json',
];
foreach ($file_paths as $key => $file_path) {
// Get array from json file
$file_path = E::path() . $file_path;
$json_file = file_get_contents($file_path);
$json_file_name = pathinfo($file_path)['filename'];
$array = json_decode($json_file, TRUE);
// Throw and log an error if json file can't be read
if (!$array) {
$message = ($json_file_name)
? "Could not read json file $json_file_name"
: "Could not locate json file in path: $file_path";
Civi::log()->error($message);
throw new Exception($message);
}
// Set attribute
$this->$key = $array;
}
}
protected function __clone() {}
/**
* @return array
*/
public function getCustomFieldMapping(): array {
return $this->customFieldMapping;
}
/**
* @return mixed
*/
public function getTranslations() {
return $this->translations;
}
/**
* @return mixed
*/
public function getCampaigns() {
return $this->campaigns;
}
/**
* @return mixed
*/
public function getTemplates() {
return $this->templates;
}
}