Merge remote-tracking branch 'gitlab/dev' into main

This commit is contained in:
Marc Michalsky 2021-08-25 16:09:56 +02:00
commit 01265fbbb0
13 changed files with 289 additions and 95 deletions

View file

@ -6,7 +6,7 @@ class CRM_TwingleCampaign_BAO_Configuration {
private static $settingsKeys = [ private static $settingsKeys = [
'twingle_api_key', 'twingle_api_key',
'twinglecampaign_xcm_profile', 'twinglecampaign_xcm_profile',
'twinglecampaign_start_case', 'twinglecampaign_default_case',
'twinglecampaign_soft_credits' 'twinglecampaign_soft_credits'
]; ];

View file

@ -56,12 +56,12 @@ class CRM_TwingleCampaign_BAO_CustomField {
} }
} }
/** /**
* Creates a CustomField by calling CiviCRM API v.3 * Creates a CustomField by calling CiviCRM API v.3
* *
* @param bool $upgrade * @param bool $upgrade
* If true: Does not show UF message if custom field already exists * If true: Does not show UF message if custom field already exists
*
* @returns array Result of custom field creation api call * @returns array Result of custom field creation api call
* @throws \CiviCRM_API3_Exception * @throws \CiviCRM_API3_Exception
*/ */
@ -79,16 +79,19 @@ class CRM_TwingleCampaign_BAO_CustomField {
// If the field does not exist, create it // If the field does not exist, create it
if ($field['count'] == 0) { if ($field['count'] == 0) {
try {
$this->result = civicrm_api3( $this->result = civicrm_api3(
'CustomField', 'CustomField',
'create', 'create',
$this->getSetAttributes()); $this->getSetAttributes());
if ($this->result['is_error'] == 0) {
// Set field id // Set field id
$this->id = $this->result['id']; $this->id = $this->result['id'];
// Log field creation // Log field creation
if ($this->result['is_error'] == 0) {
Civi::log()->info("$this->extensionName has created a new custom field. Civi::log()->info("$this->extensionName has created a new custom field.
label: $this->label label: $this->label
name: $this->name name: $this->name
@ -97,20 +100,23 @@ class CRM_TwingleCampaign_BAO_CustomField {
); );
return $this->result; return $this->result;
} }
// If the field could not get created: log error
else { else {
throw new CiviCRM_API3_Exception($this->result['error_message']);
}
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
// If the field could not get created: log error
if ($this->name && $this->custom_group_id) { if ($this->name && $this->custom_group_id) {
Civi::log() Civi::log()
->error("$this->extensionName could not create new custom field ->error("$this->extensionName could not create new custom field \"$this->name\" for group \"$this->custom_group_id\": $errorMessage");
\"$this->name\" for group \"$this->custom_group_id\": CRM_Utils_System::setUFMessage(E::ts('%1: Creation of custom field \'%2\' failed. Find more information in the logs.',
$this->result['error_message']"); [1 => $this->extensionName, 2 => $this->name]
CRM_Utils_System::setUFMessage(E::ts('Creation of custom field \'%1\' failed. Find more information in the logs.', [1 => $this->name])); ));
} }
// If there is not enough information: log simple error message // If there is not enough information: log simple error message
else { else {
Civi::log() Civi::log()
->error("$this->extensionName could not create new custom field: ->error("$this->extensionName could not create new custom field: $errorMessage");
$this->result['error_message']");
CRM_Utils_System::setUFMessage(E::ts("Creation of custom field failed. Find more information in the logs.")); CRM_Utils_System::setUFMessage(E::ts("Creation of custom field failed. Find more information in the logs."));
} }
return $this->result; return $this->result;
@ -127,6 +133,101 @@ class CRM_TwingleCampaign_BAO_CustomField {
} }
} }
/**
* Update an existing custom field
*
* @returns array Result of custom field creation api call
*/
public function update(): array {
try {
$this->result = civicrm_api3(
'CustomField',
'create',
$this->getSetAttributes());
// Log field creation
if ($this->result['is_error'] == 0) {
Civi::log()->info("$this->extensionName has updated a custom field.
label: $this->label
name: $this->name
id: $this->id
group: $this->custom_group_id"
);
return $this->result;
}
else {
throw new CiviCRM_API3_Exception($this->result['error_message']);
}
} catch (CiviCRM_API3_Exception $e) {
// If the field could not get created: log error
$errorMessage = $e->getMessage();
if ($this->name && $this->custom_group_id) {
Civi::log()
->error("$this->extensionName could not create new custom field \"$this->name\" for group \"$this->custom_group_id\": $errorMessage");
CRM_Utils_System::setUFMessage(E::ts('Creation of custom field \'%1\' failed. Find more information in the logs.', [1 => $this->name]));
}
// If there is not enough information: log simple error message
else {
Civi::log()
->error("$this->extensionName could not create new custom field: $errorMessage");
CRM_Utils_System::setUFMessage(E::ts("Creation of custom field failed. Find more information in the logs."));
}
return $this->result;
}
}
/**
* Add additional options to custom field
*
* @param array $options
*
* @return array
*/
public function addOptions(array $options): array {
$result = [];
try {
$option_group_id = civicrm_api3(
'CustomField',
'getsingle',
['id' => $this->id]
)['option_group_id'];
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
Civi::log()
->error("$this->extensionName could not get get option group id for custom field \"$this->name\": $errorMessage");
CRM_Utils_System::setUFMessage(
E::ts('%1 could not get option group id for custom field \'%2\'. Find more information in the logs.',
[1 => $this->extensionName, 2 => $this->name])
);
}
try {
foreach ($options as $key => $value) {
$result[] = civicrm_api3(
'OptionValue',
'create',
[
'option_group_id' => $option_group_id,
'value' => $key,
'label' => $value,
]
);
}
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
Civi::log()
->error("$this->extensionName could not create additional option values for custom field \"$this->name\": $errorMessage");
CRM_Utils_System::setUFMessage(
E::ts('%1 could not create additional option values for custom field \'%2\'. Find more information in the logs.',
[1 => $this->extensionName, 2 => $this->name])
);
}
return $result;
}
/** /**
* Gets all the set attributes of the object and returns them as an array. * Gets all the set attributes of the object and returns them as an array.
* *
@ -143,7 +244,6 @@ class CRM_TwingleCampaign_BAO_CustomField {
return $setAttributes; return $setAttributes;
} }
/** /**
* Get an instance of a CustomField by its name or get an array with all * Get an instance of a CustomField by its name or get an array with all
* custom fields by leaving parameters empty. * custom fields by leaving parameters empty.
@ -362,6 +462,13 @@ class CRM_TwingleCampaign_BAO_CustomField {
*/ */
public function getId() { public function getId() {
return $this->id; return $this->id;
}# }
/**
* @param mixed $option_values
*/
public function setOptionValues($option_values): void {
$this->option_values = $option_values;
}
} }

View file

@ -53,22 +53,29 @@ class CRM_TwingleCampaign_BAO_TwingleEvent extends Campaign {
if (parent::create()) { if (parent::create()) {
// Get case type
$parentProject = civicrm_api3(
'TwingleProject',
'getsingle',
['id' => $this->values['parent_id']]
);
$caseType = $parentProject['case']
?? Configuration::get('twinglecampaign_default_case');
if ($caseType) {
// check for existence // check for existence
$result = civicrm_api3('Case', 'get', [ $result = civicrm_api3('Case', 'get', [
'contact_id' => $this->formattedValues['contact'], 'contact_id' => $this->formattedValues['contact'],
'case_type_id' => Configuration::get('twinglecampaign_start_case'), 'case_type_id' => $caseType,
'subject' => $this->formattedValues['title'] . ' | Event-ID: ' . 'subject' => $this->formattedValues['title'] . ' | Event-ID: ' .
$this->formattedValues['id'], $this->formattedValues['id'],
]); ]);
// Open a case // Open a case
if ( if ($result['count'] == 0) {
Configuration::get('twinglecampaign_start_case') &&
$result['count'] == 0
) {
$result = civicrm_api3('Case', 'create', [ $result = civicrm_api3('Case', 'create', [
'contact_id' => $this->formattedValues['contact'], 'contact_id' => $this->formattedValues['contact'],
'case_type_id' => Configuration::get('twinglecampaign_start_case'), 'case_type_id' => $caseType,
'subject' => $this->formattedValues['title'] . ' | Event-ID: ' . 'subject' => $this->formattedValues['title'] . ' | Event-ID: ' .
$this->formattedValues['id'], $this->formattedValues['id'],
'start_date' => $this->formattedValues['created_at'], 'start_date' => $this->formattedValues['created_at'],
@ -78,7 +85,7 @@ class CRM_TwingleCampaign_BAO_TwingleEvent extends Campaign {
if ($result['is_error'] != 0) { if ($result['is_error'] != 0) {
throw new Exception('Could not create case'); throw new Exception('Could not create case');
} }
}
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View file

@ -4,6 +4,7 @@ use CRM_TwingleCampaign_BAO_Configuration as Configuration;
use CRM_TwingleCampaign_ExtensionUtil as E; use CRM_TwingleCampaign_ExtensionUtil as E;
include_once E::path() . '/CRM/TwingleCampaign/BAO/Configuration.php'; include_once E::path() . '/CRM/TwingleCampaign/BAO/Configuration.php';
include_once E::path() . '/CRM/TwingleCampaign/Utils/CaseTypes.php';
/** /**
* Form controller class * Form controller class
@ -32,9 +33,9 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form {
$this->addElement( $this->addElement(
'select', 'select',
'twinglecampaign_start_case', 'twinglecampaign_default_case',
E::ts('Start a case for event initiators'), E::ts('Default case to open for event initiators'),
$this->getCaseTypes(), getCaseTypes(),
['class' => 'crm-select2 huge'] ['class' => 'crm-select2 huge']
); );
@ -92,30 +93,5 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form {
return $xcmProfiles; return $xcmProfiles;
} }
/**
* Retrieves all case types
*
* @return array
*/
private function getCaseTypes(): array {
$caseTypes = [NULL => E::ts('none')];
try {
$result = civicrm_api3('CaseType', 'get', [
'sequential' => 1,
'options' => ['limit' => 0]
]);
if (is_array($result['values'])) {
foreach ($result['values'] as $case) {
$caseTypes[$case['name']] = $case['title'];
}
}
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME . ' could not retrieve case types: ' .
$e->getMessage());
}
return $caseTypes;
}
} }

View file

@ -20,7 +20,7 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base {
* changed campaigns will get pulled from Twingle. * changed campaigns will get pulled from Twingle.
* @throws \CiviCRM_API3_Exception * @throws \CiviCRM_API3_Exception
*/ */
public function upgrade_01(): bool { public function upgrade_02(): bool {
$campaign_info = require E::path() . $campaign_info = require E::path() .
'/CRM/TwingleCampaign/resources/campaigns.php'; '/CRM/TwingleCampaign/resources/campaigns.php';

View file

@ -0,0 +1,28 @@
<?php
use CRM_TwingleCampaign_ExtensionUtil as E;
/**
* Retrieves all case types
*
* @return array
*/
function getCaseTypes(): array {
$caseTypes = [NULL => E::ts('none')];
try {
$result = civicrm_api3('CaseType', 'get', [
'sequential' => 1,
'options' => ['limit' => 0]
]);
if (is_array($result['values'])) {
foreach ($result['values'] as $case) {
$caseTypes[$case['name']] = $case['title'];
}
}
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME . ' could not retrieve case types: ' .
$e->getMessage());
}
return $caseTypes;
}

View file

@ -1,6 +1,7 @@
<?php <?php
use CRM_TwingleCampaign_ExtensionUtil as E; use CRM_TwingleCampaign_ExtensionUtil as E;
require_once E::path() . '/CRM/TwingleCampaign/Utils/CaseTypes.php';
return [ return [
"campaign_types" => [ "campaign_types" => [
@ -121,6 +122,21 @@ return [
"help_post" => E::ts("Choose the project type. Allow users to create own events or to pay a membership fee."), "help_post" => E::ts("Choose the project type. Allow users to create own events or to pay a membership fee."),
"default_value" => "default" "default_value" => "default"
], ],
"twingle_project_case" => [
"custom_group_id" => "Twingle_Project_Information",
"label" => E::ts("Case"),
"name" => "twingle_project_case",
"is_required" => FALSE,
"is_searchable" => 1,
"data_type" => "String",
"html_type" => "Select",
"option_values" => getCaseTypes(),
"text_length" => 32,
"is_active" => 1,
"is_view" => FALSE,
"weight" => 3,
"help_post" => E::ts("Which case should get opened for event creators?")
],
"twingle_project_allow_more" => [ "twingle_project_allow_more" => [
"custom_group_id" => "Twingle_Project_Information", "custom_group_id" => "Twingle_Project_Information",
"label" => E::ts("allow more"), "label" => E::ts("allow more"),

Binary file not shown.

View file

@ -7,17 +7,17 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 2.4.3\n"
"Last-Translator: \n" "Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: de_DE\n" "Language: de_DE\n"
#: CRM/TwingleCampaign/BAO/CustomField.php #: CRM/TwingleCampaign/BAO/CustomField.php
msgid "" msgid ""
"Creation of custom field '%1' failed. Find more information in the logs." "%1: Creation of custom field '%2' failed. Find more information in the logs."
msgstr "" msgstr ""
"Erstellung von Custom Field '%1' fehlgeschlagen. Mehr Informationen in den " "%1: Erstellen des benutzerdefinierten Feldes '%2' fehlgeschlagen. Mehr "
"Logs." "Informationen in den Logs."
#: CRM/TwingleCampaign/BAO/CustomField.php #: CRM/TwingleCampaign/BAO/CustomField.php
msgid "Creation of custom field failed. Find more information in the logs." msgid "Creation of custom field failed. Find more information in the logs."
@ -33,6 +33,29 @@ msgstr ""
"Erstellung der Custom Field '%1' fehlgeschlagen, weil bereits eine Custom " "Erstellung der Custom Field '%1' fehlgeschlagen, weil bereits eine Custom "
"Field mit selbem Namen existiert. Mehr Informationen in den Logs." "Field mit selbem Namen existiert. Mehr Informationen in den Logs."
#: CRM/TwingleCampaign/BAO/CustomField.php
msgid ""
"Creation of custom field '%1' failed. Find more information in the logs."
msgstr ""
"Erstellung von Custom Field '%1' fehlgeschlagen. Mehr Informationen in den "
"Logs."
#: CRM/TwingleCampaign/BAO/CustomField.php
msgid ""
"%1 could not get option group id for custom field '%2'. Find more "
"information in the logs."
msgstr ""
"%1 konnte die Option-Group-ID für das benutzerdefinierte Feld '%2' nicht "
"finden. Mehr Informationen in den Logs."
#: CRM/TwingleCampaign/BAO/CustomField.php
msgid ""
"%1 could not create additional option values for custom field '%2'. Find "
"more information in the logs."
msgstr ""
"%1 konnte dem benutzerdefinierte Feld '%2' keine zusätzlichen Optionen "
"hinzufügen. Mehr Informationen in den Logs."
#: CRM/TwingleCampaign/BAO/CustomGroup.php #: CRM/TwingleCampaign/BAO/CustomGroup.php
msgid "" msgid ""
"Creation of custom group '%1' failed. Find more information in the logs." "Creation of custom group '%1' failed. Find more information in the logs."
@ -120,8 +143,8 @@ msgid "XCM Profile to match event initiators"
msgstr "XCM-Profil zum Abgleichen von Event-Initiatoren" msgstr "XCM-Profil zum Abgleichen von Event-Initiatoren"
#: CRM/TwingleCampaign/Form/Settings.php #: CRM/TwingleCampaign/Form/Settings.php
msgid "Start a case for event initiators" msgid "Default case to open for event initiators"
msgstr "Einen Fall für Event-Initiatoren anlegen" msgstr "Standarfdall, der für Event-Initiatoren eröffnet werden soll"
#: CRM/TwingleCampaign/Form/Settings.php #: CRM/TwingleCampaign/Form/Settings.php
msgid "Create soft credits for event initiators" msgid "Create soft credits for event initiators"
@ -135,10 +158,6 @@ msgstr "Speichern"
msgid "TwingleCampaign configuration saved" msgid "TwingleCampaign configuration saved"
msgstr "TwingleCampaign Konfiguration gespeichert" msgstr "TwingleCampaign Konfiguration gespeichert"
#: CRM/TwingleCampaign/Form/Settings.php
msgid "none"
msgstr "keine"
#: CRM/TwingleCampaign/Upgrader/Base.php #: CRM/TwingleCampaign/Upgrader/Base.php
msgid "Upgrade %1 to revision %2" msgid "Upgrade %1 to revision %2"
msgstr "Upgrade %1 auf Revision %2" msgstr "Upgrade %1 auf Revision %2"
@ -182,6 +201,10 @@ msgstr ""
msgid "Could not disable scheduled job \"TwingleSync\"." msgid "Could not disable scheduled job \"TwingleSync\"."
msgstr "Geplante Aufgabe \"TwingleSync\" konnte nicht deaktiviert werden." msgstr "Geplante Aufgabe \"TwingleSync\" konnte nicht deaktiviert werden."
#: CRM/TwingleCampaign/Utils/CaseTypes.php
msgid "none"
msgstr "keine"
#: CRM/TwingleCampaign/resources/campaigns.php #: CRM/TwingleCampaign/resources/campaigns.php
msgid "Twingle Information" msgid "Twingle Information"
msgstr "Twingle Informationen" msgstr "Twingle Informationen"
@ -250,6 +273,14 @@ msgstr ""
"Wähle den Projekt-Typ: erlaube Benutzern ihre eigenen Spenden-Events " "Wähle den Projekt-Typ: erlaube Benutzern ihre eigenen Spenden-Events "
"anzulegen oder eine Mitgliedschaft zu bezahlen." "anzulegen oder eine Mitgliedschaft zu bezahlen."
#: CRM/TwingleCampaign/resources/campaigns.php
msgid "Case"
msgstr "Fall"
#: CRM/TwingleCampaign/resources/campaigns.php
msgid "Which case should get opened for event creators?"
msgstr "Welcher Fall soll für Event-Initiatoren eröffnet werden?"
#: CRM/TwingleCampaign/resources/campaigns.php #: CRM/TwingleCampaign/resources/campaigns.php
msgid "allow more" msgid "allow more"
msgstr "Mehr zulassen" msgstr "Mehr zulassen"

View file

@ -1,5 +1,5 @@
#: ./CRM/TwingleCampaign/BAO/CustomField.php #: ./CRM/TwingleCampaign/BAO/CustomField.php
msgid "Creation of custom field '%1' failed. Find more information in the logs." msgid "%1: Creation of custom field '%2' failed. Find more information in the logs."
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/BAO/CustomField.php #: ./CRM/TwingleCampaign/BAO/CustomField.php
@ -10,6 +10,18 @@ msgstr ""
msgid "Creation of custom field '%1' failed, because a custom field with that name already exists. Find more information in the logs." msgid "Creation of custom field '%1' failed, because a custom field with that name already exists. Find more information in the logs."
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/BAO/CustomField.php
msgid "Creation of custom field '%1' failed. Find more information in the logs."
msgstr ""
#: ./CRM/TwingleCampaign/BAO/CustomField.php
msgid "%1 could not get option group id for custom field '%2'. Find more information in the logs."
msgstr ""
#: ./CRM/TwingleCampaign/BAO/CustomField.php
msgid "%1 could not create additional option values for custom field '%2'. Find more information in the logs."
msgstr ""
#: ./CRM/TwingleCampaign/BAO/CustomGroup.php #: ./CRM/TwingleCampaign/BAO/CustomGroup.php
msgid "Creation of custom group '%1' failed. Find more information in the logs." msgid "Creation of custom group '%1' failed. Find more information in the logs."
msgstr "" msgstr ""
@ -75,7 +87,7 @@ msgid "XCM Profile to match event initiators"
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/Form/Settings.php #: ./CRM/TwingleCampaign/Form/Settings.php
msgid "Start a case for event initiators" msgid "Default case to open for event initiators"
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/Form/Settings.php #: ./CRM/TwingleCampaign/Form/Settings.php
@ -90,10 +102,6 @@ msgstr ""
msgid "TwingleCampaign configuration saved" msgid "TwingleCampaign configuration saved"
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/Form/Settings.php
msgid "none"
msgstr ""
#: ./CRM/TwingleCampaign/Upgrader/Base.php #: ./CRM/TwingleCampaign/Upgrader/Base.php
msgid "Upgrade %1 to revision %2" msgid "Upgrade %1 to revision %2"
msgstr "" msgstr ""
@ -126,6 +134,10 @@ msgstr ""
msgid "Could not disable scheduled job \"TwingleSync\"." msgid "Could not disable scheduled job \"TwingleSync\"."
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/Utils/CaseTypes.php
msgid "none"
msgstr ""
#: ./CRM/TwingleCampaign/resources/campaigns.php #: ./CRM/TwingleCampaign/resources/campaigns.php
msgid "Twingle Information" msgid "Twingle Information"
msgstr "" msgstr ""
@ -186,6 +198,14 @@ msgstr ""
msgid "Choose the project type. Allow users to create own events or to pay a membership fee." msgid "Choose the project type. Allow users to create own events or to pay a membership fee."
msgstr "" msgstr ""
#: ./CRM/TwingleCampaign/resources/campaigns.php
msgid "Case"
msgstr ""
#: ./CRM/TwingleCampaign/resources/campaigns.php
msgid "Which case should get opened for event creators?"
msgstr ""
#: ./CRM/TwingleCampaign/resources/campaigns.php #: ./CRM/TwingleCampaign/resources/campaigns.php
msgid "allow more" msgid "allow more"
msgstr "" msgstr ""

View file

@ -17,8 +17,8 @@
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div class="crm-section"> <div class="crm-section">
<div class="label">{$form.twinglecampaign_start_case.label}</div> <div class="label">{$form.twinglecampaign_default_case.label}</div>
<div class="content">{$form.twinglecampaign_start_case.html}</div> <div class="content">{$form.twinglecampaign_default_case.html}</div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div class="crm-section"> <div class="crm-section">

View file

@ -4,6 +4,7 @@ use CRM_TwingleCampaign_Utils_ExtensionCache as ExtensionCache;
use CRM_TwingleCampaign_BAO_TwingleProject as TwingleProject; use CRM_TwingleCampaign_BAO_TwingleProject as TwingleProject;
use CRM_TwingleCampaign_BAO_TwingleApiCall as TwingleApiCall; use CRM_TwingleCampaign_BAO_TwingleApiCall as TwingleApiCall;
use CRM_TwingleCampaign_ExtensionUtil as E; use CRM_TwingleCampaign_ExtensionUtil as E;
use CRM_TwingleCampaign_BAO_CustomField as CustomField;
require_once 'twinglecampaign.civix.php'; require_once 'twinglecampaign.civix.php';
@ -46,6 +47,14 @@ function twinglecampaign_civicrm_config(&$config) {
} }
} }
function twinglecampaign_civicrm_postSave_civicrm_case_type() {
$twingle_project_case_custom_field =
CustomField::fetch('twingle_project_case');
$newCaseType = json_decode($_POST['json'], True);
$twingle_project_case_custom_field->addOptions(
[$newCaseType['name'] => $newCaseType['title']]
);
}
/** /**
* Implements hook_civicrm_postSave_Campaign(). * Implements hook_civicrm_postSave_Campaign().