use the id instead of the name to look up profiles
This commit is contained in:
parent
1d9e973e46
commit
d9e51c67f6
4 changed files with 157 additions and 77 deletions
|
@ -32,6 +32,12 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
|
||||||
*/
|
*/
|
||||||
protected $profile;
|
protected $profile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ID of this profile.
|
||||||
|
* @var int|NULL
|
||||||
|
*/
|
||||||
|
protected $profile_id = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*
|
*
|
||||||
|
@ -142,10 +148,11 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
|
||||||
$this->_op = 'create';
|
$this->_op = 'create';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that a profile with the given name exists.
|
// Verify that a profile with the given id exists.
|
||||||
$profile_name = CRM_Utils_Request::retrieve('name', 'String', $this);
|
|
||||||
if (!$this->profile = CRM_Twingle_Profile::getProfile($profile_name)) {
|
if ($this->_op != 'copy') {
|
||||||
$profile_name = NULL;
|
$this->profile_id = CRM_Utils_Request::retrieve('id', 'Int', $this);
|
||||||
|
$this->profile = CRM_Twingle_Profile::getProfile($this->profile_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set redirect destination.
|
// Set redirect destination.
|
||||||
|
@ -153,12 +160,12 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
|
||||||
|
|
||||||
switch ($this->_op) {
|
switch ($this->_op) {
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if ($profile_name) {
|
if ($this->profile_id) {
|
||||||
CRM_Utils_System::setTitle(E::ts('Delete Twingle API profile <em>%1</em>', [1 => $profile_name]));
|
CRM_Utils_System::setTitle(E::ts('Delete Twingle API profile <em>%1</em>', [1 => $this->profile->getName()]));
|
||||||
$this->addButtons([
|
$this->addButtons([
|
||||||
[
|
[
|
||||||
'type' => 'submit',
|
'type' => 'submit',
|
||||||
'name' => ($profile_name == 'default' ? E::ts('Reset') : E::ts('Delete')),
|
'name' => ($this->profile->getName() == 'default' ? E::ts('Reset') : E::ts('Delete')),
|
||||||
'isDefault' => TRUE,
|
'isDefault' => TRUE,
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
@ -166,40 +173,37 @@ class CRM_Twingle_Form_Profile extends CRM_Core_Form {
|
||||||
parent::buildQuickForm();
|
parent::buildQuickForm();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 'edit':
|
|
||||||
// When editing without a valid profile name, edit the default profile.
|
|
||||||
if (!$profile_name) {
|
|
||||||
$profile_name = 'default';
|
|
||||||
$this->profile = CRM_Twingle_Profile::getProfile($profile_name);
|
|
||||||
}
|
|
||||||
CRM_Utils_System::setTitle(E::ts('Edit Twingle API profile <em>%1</em>', [1 => $this->profile->getName()]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'copy':
|
case 'copy':
|
||||||
// Retrieve the source profile name.
|
// Retrieve the source profile name.
|
||||||
$profile_name = CRM_Utils_Request::retrieve('source_name', 'String', $this);
|
$source_id = CRM_Utils_Request::retrieve('source_id', 'Int', $this);
|
||||||
// When copying without a valid profile name, copy the default profile.
|
// When copying without a valid profile id, copy the default profile.
|
||||||
if (!$profile_name) {
|
if (!$source_id) {
|
||||||
$profile_name = 'default';
|
$this->profile = CRM_Twingle_Profile::createDefaultProfile();
|
||||||
|
} else {
|
||||||
|
$source_profile = CRM_Twingle_Profile::getProfile($source_id);
|
||||||
|
$this->profile = $source_profile->copy();
|
||||||
}
|
}
|
||||||
$this->profile = clone CRM_Twingle_Profile::getProfile($profile_name);
|
|
||||||
|
|
||||||
// Propose a new name for this profile.
|
// Propose a new name for this profile.
|
||||||
$profile_name = $profile_name . '_copy';
|
$profile_name = $this->profile->getName() . '_copy';
|
||||||
$this->profile->setName($profile_name);
|
$this->profile->setName($profile_name);
|
||||||
CRM_Utils_System::setTitle(E::ts('New Twingle API profile'));
|
CRM_Utils_System::setTitle(E::ts('New Twingle API profile'));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'edit':
|
||||||
|
CRM_Utils_System::setTitle(E::ts('Edit Twingle API profile <em>%1</em>', [1 => $this->profile->getName()]));
|
||||||
|
break;
|
||||||
|
|
||||||
case 'create':
|
case 'create':
|
||||||
// Load factory default profile values.
|
// Load factory default profile values.
|
||||||
$this->profile = CRM_Twingle_Profile::createDefaultProfile($profile_name);
|
$this->profile = CRM_Twingle_Profile::createDefaultProfile(E::ts('New Profile'));
|
||||||
CRM_Utils_System::setTitle(E::ts('New Twingle API profile'));
|
CRM_Utils_System::setTitle(E::ts('New Twingle API profile'));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign template variables.
|
// Assign template variables.
|
||||||
$this->assign('op', $this->_op);
|
$this->assign('op', $this->_op);
|
||||||
$this->assign('profile_name', $profile_name);
|
$this->assign('profile_name', $this->profile->getName());
|
||||||
|
$this->assign('is_default', $this->profile->is_default());
|
||||||
|
|
||||||
// Add form elements.
|
// Add form elements.
|
||||||
$is_default = $profile_name == 'default';
|
$is_default = $profile_name == 'default';
|
||||||
|
|
|
@ -22,10 +22,11 @@ class CRM_Twingle_Page_Profiles extends CRM_Core_Page {
|
||||||
public function run() {
|
public function run() {
|
||||||
CRM_Utils_System::setTitle(E::ts('Twingle API Profiles'));
|
CRM_Utils_System::setTitle(E::ts('Twingle API Profiles'));
|
||||||
$profiles = [];
|
$profiles = [];
|
||||||
foreach (CRM_Twingle_Profile::getProfiles() as $profile_name => $profile) {
|
foreach (CRM_Twingle_Profile::getProfiles() as $profile_id => $profile) {
|
||||||
$profiles[$profile_name]['name'] = $profile_name;
|
$profiles[$profile_id]['id'] = $profile_id;
|
||||||
|
$profiles[$profile_id]['name'] = $profile->getName();
|
||||||
foreach (CRM_Twingle_Profile::allowedAttributes() as $attribute) {
|
foreach (CRM_Twingle_Profile::allowedAttributes() as $attribute) {
|
||||||
$profiles[$profile_name][$attribute] = $profile->getAttribute($attribute);
|
$profiles[$profile_id][$attribute] = $profile->getAttribute($attribute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->assign('profiles', $profiles);
|
$this->assign('profiles', $profiles);
|
||||||
|
|
|
@ -25,7 +25,13 @@ use Civi\Twingle\Exceptions\ProfileException as ProfileException;
|
||||||
class CRM_Twingle_Profile {
|
class CRM_Twingle_Profile {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var int $id
|
||||||
|
* The id of the profile.
|
||||||
|
*/
|
||||||
|
protected $id = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string $name
|
||||||
* The name of the profile.
|
* The name of the profile.
|
||||||
*/
|
*/
|
||||||
protected $name = NULL;
|
protected $name = NULL;
|
||||||
|
@ -43,8 +49,10 @@ class CRM_Twingle_Profile {
|
||||||
* The name of the profile.
|
* The name of the profile.
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* The properties of the profile
|
* The properties of the profile
|
||||||
|
* @param int|NULL $id
|
||||||
*/
|
*/
|
||||||
public function __construct($name, $data) {
|
public function __construct($name, $data, $id = NULL) {
|
||||||
|
$this->id = $id;
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
$allowed_attributes = self::allowedAttributes();
|
$allowed_attributes = self::allowedAttributes();
|
||||||
$this->data = $data + array_combine(
|
$this->data = $data + array_combine(
|
||||||
|
@ -65,6 +73,18 @@ class CRM_Twingle_Profile {
|
||||||
WHERE name = %1', [1 => [$this->name, 'String']]);
|
WHERE name = %1', [1 => [$this->name, 'String']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy this profile by returning a clone with all unique information removed.
|
||||||
|
*
|
||||||
|
* @return CRM_Twingle_Profile
|
||||||
|
*/
|
||||||
|
public function copy() {
|
||||||
|
$copy = clone $this;
|
||||||
|
$copy->id = NULL;
|
||||||
|
$copy->data['selector'] = NULL;
|
||||||
|
return $copy;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the profile's selector matches the given project ID.
|
* Checks whether the profile's selector matches the given project ID.
|
||||||
*
|
*
|
||||||
|
@ -107,6 +127,24 @@ class CRM_Twingle_Profile {
|
||||||
return $this->data;
|
return $this->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the profile id.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getId() {
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the profile id.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*/
|
||||||
|
public function setId(int $id) {
|
||||||
|
$this->id = $id;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the profile name.
|
* Retrieves the profile name.
|
||||||
*
|
*
|
||||||
|
@ -119,9 +157,9 @@ class CRM_Twingle_Profile {
|
||||||
/**
|
/**
|
||||||
* Sets the profile name.
|
* Sets the profile name.
|
||||||
*
|
*
|
||||||
* @param $name
|
* @param string $name
|
||||||
*/
|
*/
|
||||||
public function setName($name) {
|
public function setName(string $name) {
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,37 +231,76 @@ class CRM_Twingle_Profile {
|
||||||
// make sure it's valid
|
// make sure it's valid
|
||||||
$this->verifyProfile();
|
$this->verifyProfile();
|
||||||
|
|
||||||
// check if the profile exists
|
try {
|
||||||
$profile_id = CRM_Core_DAO::singleValueQuery(
|
if ($this->id !== NULL) {
|
||||||
'SELECT id FROM civicrm_twingle_profile WHERE name = %1', [1 => [$this->name, 'String']]);
|
// existing profile -> just update the config
|
||||||
if ($profile_id) {
|
CRM_Core_DAO::executeQuery(
|
||||||
// existing profile -> just update the config
|
"UPDATE civicrm_twingle_profile SET config = %2 WHERE id = %1",
|
||||||
CRM_Core_DAO::executeQuery(
|
[
|
||||||
'UPDATE civicrm_twingle_profile SET config = %2 WHERE name = %1',
|
1 => [$this->id, 'String'],
|
||||||
[
|
2 => [json_encode($this->data), 'String'],
|
||||||
1 => [$this->name, 'String'],
|
]);
|
||||||
2 => [json_encode($this->data), 'String'],
|
}
|
||||||
]);
|
else {
|
||||||
|
// new profile -> add new entry to the DB
|
||||||
|
CRM_Core_DAO::executeQuery(
|
||||||
|
"INSERT IGNORE INTO civicrm_twingle_profile(name,config,last_access,access_counter) VALUES (%1, %2, null, 0)",
|
||||||
|
[
|
||||||
|
1 => [$this->name, 'String'],
|
||||||
|
2 => [json_encode($this->data), 'String'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
catch (Exception $e) {
|
||||||
// new profile -> add new entry to the DB
|
throw new ProfileException(
|
||||||
CRM_Core_DAO::executeQuery(
|
E::ts("Could not save/update profile: %1", [1 => $e->getMessage()]),
|
||||||
'INSERT IGNORE INTO civicrm_twingle_profile(name,config,last_access,access_counter) VALUES (%1, %2, null, 0)',
|
ProfileException::ERROR_CODE_COULD_NOT_SAVE_PROFILE
|
||||||
[
|
);
|
||||||
1 => [$this->name, 'String'],
|
|
||||||
2 => [json_encode($this->data), 'String'],
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes the profile from the database
|
* Deletes the profile from the database
|
||||||
|
*
|
||||||
|
* @throws \CRM_Twingle_Exceptions_ProfileException
|
||||||
*/
|
*/
|
||||||
public function deleteProfile() {
|
public function deleteProfile() {
|
||||||
CRM_Core_DAO::executeQuery(
|
// Do only reset default profile
|
||||||
'DELETE FROM civicrm_twingle_profile WHERE name = %1',
|
if ($this->getName() == 'default') {
|
||||||
[1 => [$this->name, 'String']]
|
try {
|
||||||
);
|
$default_profile = CRM_Twingle_Profile::createDefaultProfile();
|
||||||
|
$default_profile->setId($this->getId());
|
||||||
|
$default_profile->saveProfile();
|
||||||
|
|
||||||
|
// Reset counter
|
||||||
|
CRM_Core_DAO::executeQuery("UPDATE civicrm_twingle_profile SET access_counter = 0, last_access = NULL WHERE id = %1", [
|
||||||
|
1 => [
|
||||||
|
$this->id,
|
||||||
|
'Integer'
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new ProfileException(
|
||||||
|
E::ts("Could not reset default profile: %1", [1 => $e->getMessage()]),
|
||||||
|
ProfileException::ERROR_CODE_COULD_NOT_RESET_PROFILE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
CRM_Core_DAO::executeQuery("DELETE FROM civicrm_twingle_profile WHERE id = %1", [
|
||||||
|
1 => [
|
||||||
|
$this->id,
|
||||||
|
'Integer'
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new ProfileException(
|
||||||
|
E::ts("Could not delete profile: %1", [1 => $e->getMessage()]),
|
||||||
|
ProfileException::ERROR_CODE_COULD_NOT_RESET_PROFILE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -305,9 +382,9 @@ class CRM_Twingle_Profile {
|
||||||
*/
|
*/
|
||||||
public static function createDefaultProfile($name = 'default') {
|
public static function createDefaultProfile($name = 'default') {
|
||||||
return new CRM_Twingle_Profile($name, [
|
return new CRM_Twingle_Profile($name, [
|
||||||
'selector' => '',
|
'selector' => NULL,
|
||||||
'xcm_profile' => '',
|
'xcm_profile' => '',
|
||||||
'location_type_id' => CRM_Twingle_Submission::LOCATION_TYPE_ID_WORK,
|
'location_type_id' => CRM_Twingle_Submission::LOCATION_TYPE_ID_WORK,
|
||||||
'location_type_id_organisation' => CRM_Twingle_Submission::LOCATION_TYPE_ID_WORK,
|
'location_type_id_organisation' => CRM_Twingle_Submission::LOCATION_TYPE_ID_WORK,
|
||||||
// "Donation"
|
// "Donation"
|
||||||
'financial_type_id' => 1,
|
'financial_type_id' => 1,
|
||||||
|
@ -391,20 +468,19 @@ class CRM_Twingle_Profile {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the profile with the given name.
|
* Retrieves the profile with the given ID.
|
||||||
*
|
*
|
||||||
* @param string $name
|
* @param int|NULL $id
|
||||||
*
|
*
|
||||||
* @return CRM_Twingle_Profile | NULL
|
* @return CRM_Twingle_Profile | NULL
|
||||||
|
* @throws \Civi\Core\Exception\DBQueryException
|
||||||
*/
|
*/
|
||||||
public static function getProfile($name) {
|
public static function getProfile(int $id = NULL) {
|
||||||
if (!empty($name)) {
|
if (!empty($id)) {
|
||||||
$profile_data = CRM_Core_DAO::singleValueQuery(
|
$profile_data = CRM_Core_DAO::executeQuery("SELECT id, name, config FROM civicrm_twingle_profile WHERE id = %1",
|
||||||
'SELECT config FROM civicrm_twingle_profile WHERE name = %1',
|
[1 => [$id, 'Integer']]);
|
||||||
[1 => [$name, 'String']]
|
if ($profile_data->fetch()) {
|
||||||
);
|
return new CRM_Twingle_Profile($profile_data->name, json_decode($profile_data->config, 1), (int) $profile_data->id);
|
||||||
if ($profile_data) {
|
|
||||||
return new CRM_Twingle_Profile($name, json_decode($profile_data, 1));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -416,16 +492,14 @@ class CRM_Twingle_Profile {
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
* profile_name => CRM_Twingle_Profile
|
* profile_name => CRM_Twingle_Profile
|
||||||
|
* @throws \Civi\Core\Exception\DBQueryException
|
||||||
*/
|
*/
|
||||||
public static function getProfiles() {
|
public static function getProfiles() {
|
||||||
// todo: cache?
|
// todo: cache?
|
||||||
$profiles = [];
|
$profiles = [];
|
||||||
$profile_data = CRM_Core_DAO::executeQuery('SELECT name, config FROM civicrm_twingle_profile');
|
$profile_data = CRM_Core_DAO::executeQuery("SELECT id, name, config FROM civicrm_twingle_profile");
|
||||||
while ($profile_data->fetch()) {
|
while ($profile_data->fetch()) {
|
||||||
$profiles[$profile_data->name] = new CRM_Twingle_Profile(
|
$profiles[$profile_data->id] = new CRM_Twingle_Profile($profile_data->name, json_decode($profile_data->config, 1), (int) $profile_data->id);
|
||||||
$profile_data->name,
|
|
||||||
json_decode($profile_data->config, 1)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return $profiles;
|
return $profiles;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{foreach from=$profiles item=profile}
|
{foreach from=$profiles item=profile}
|
||||||
|
{assign var="profile_id" value=$profile.id}
|
||||||
{assign var="profile_name" value=$profile.name}
|
{assign var="profile_name" value=$profile.name}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{$profile.name}</td>
|
<td>{$profile.name}</td>
|
||||||
|
@ -42,12 +43,12 @@
|
||||||
<td>{ts domain="de.systopia.twingle"}{$profile_stats.$profile_name.access_counter_txt}{/ts}</td>
|
<td>{ts domain="de.systopia.twingle"}{$profile_stats.$profile_name.access_counter_txt}{/ts}</td>
|
||||||
<td>{ts domain="de.systopia.twingle"}{$profile_stats.$profile_name.last_access_txt}{/ts}</td>
|
<td>{ts domain="de.systopia.twingle"}{$profile_stats.$profile_name.last_access_txt}{/ts}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=edit&name=$profile_name"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Edit profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Edit{/ts}</a>
|
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=edit&id=$profile_id"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Edit profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Edit{/ts}</a>
|
||||||
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=copy&source_name=$profile_name"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Copy profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Copy{/ts}</a>
|
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=copy&source_id=$profile_id"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Copy profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Copy{/ts}</a>
|
||||||
{if $profile_name == 'default'}
|
{if $profile_name == 'default'}
|
||||||
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=delete&name=$profile_name"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Reset profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Reset{/ts}</a>
|
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=delete&id=$profile_id"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Reset profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Reset{/ts}</a>
|
||||||
{else}
|
{else}
|
||||||
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=delete&name=$profile_name"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Delete profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Delete{/ts}</a>
|
<a href="{crmURL p="civicrm/admin/settings/twingle/profile" q="op=delete&id=$profile_id"}" title="{ts domain="de.systopia.twingle" 1=$profile.name}Delete profile %1{/ts}" class="action-item crm-hover-button">{ts domain="de.systopia.twingle"}Delete{/ts}</a>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue