Skip to content

Commit

Permalink
refs #39637, gh-111, add sms provider for flydove to save config
Browse files Browse the repository at this point in the history
  • Loading branch information
jimyhuang committed Jan 10, 2024
1 parent 89c100e commit 7c656bc
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 21 deletions.
68 changes: 57 additions & 11 deletions CRM/SMS/Form/Provider.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ public function buildQuickForm() {
$providerNames = CRM_Core_OptionGroup::values('sms_provider_name', FALSE, FALSE, FALSE, NULL, 'label');
$apiTypes = CRM_Core_OptionGroup::values('sms_api_type', FALSE, FALSE, FALSE, NULL, 'label');

$this->add('select', 'name', ts('Name'), array('' => ts('-- Select --')) + $providerNames, TRUE);
$eleProviders = $this->addSelect('name', ts('Name'), array('' => ts('-- Select --')) + $providerNames, TRUE);
if ($this->_action & CRM_Core_Action::UPDATE) {
$eleProviders->freeze();
}

$this->add('text', 'title', ts('Title'),
$attributes['title'], TRUE
Expand All @@ -97,25 +100,51 @@ public function buildQuickForm() {
$this->_id,
));

$this->add('text', 'username', ts('Username'),
$attributes['username'], TRUE
);
$this->add('text', 'username', ts('Username'), $attributes['username']);

$this->add('password', 'password', ts('Password'),
$attributes['password'], TRUE
);
$this->add('password', 'password', ts('Password'), $attributes['password']);

$this->add('select', 'api_type', ts('API Type'), $apiTypes, TRUE);

$this->add('text', 'api_url', ts('API URL'), $attributes['api_url'], TRUE);

$this->add('textarea', 'api_params', ts('API Parameters'),
"cols=50 rows=6"
);
$this->add('textarea', 'api_params', ts('API Parameters'), "cols=50 rows=6");

$this->add('checkbox', 'is_active', ts('Is this provider active?'));

$this->add('checkbox', 'is_default', ts('Is this a default provider?'));

$this->addFormRule(array('CRM_SMS_Form_Provider', 'formRule'));
}

/**
* Form rule
*
* @param array $fields
* @return array
*/
public static function formRule($fields) {
$errors = array();
if ($fields['name'] == 'CRM_SMS_Provider_Mitake') {
// check requirement of these fields
$checkFields = array(
'username' => ts('Username'),
'password' => ts('Password'),
);
foreach(array_keys($checkFields) as $field) {
if (empty($fields[$field])) {
$errors[$field] = ts('%1 is a required field.', array(1 => $checkFields[$field]));
}
}
}
if ($fields['name'] === 'CRM_SMS_Provider_Flydove' && !empty($fields['flydove_api_token'])) {
foreach($fields['flydove_api_token'] as $token) {
if (!preg_match('/^[0-9a-zA-Z]*$/', $token)) {
$errors['qfKey'] = ts('Invalid value for field(s)');
}
}
}
return $errors;
}

/**
Expand All @@ -134,7 +163,11 @@ public function setDefaultValues() {
}

if (!$this->_id) {
$defaults['is_active'] = $defaults['is_default'] = 1;
$defaults['is_active'] = 1;
$providers = CRM_SMS_BAO_Provider::getProviders();
if (empty($providers)) {
$defaults['is_default'] = 1;
}
return $defaults;
}

Expand All @@ -151,6 +184,13 @@ public function setDefaultValues() {

CRM_Core_DAO::storeValues($dao, $defaults);

if ($defaults['name'] == 'CRM_SMS_Provider_Flydove' && !empty($defaults['api_params'])) {
$apiParams = json_decode($defaults['api_params'], TRUE);
if (!empty($apiParams) && is_array($apiParams['tokens'])) {
$this->assign('flydove_api_token', $apiParams['tokens']);
}
}

return $defaults;
}

Expand All @@ -168,6 +208,12 @@ public function postProcess() {
}

$recData = $values = $this->controller->exportValues($this->_name);
if ($recData['name'] === 'CRM_SMS_Provider_Flydove' && !empty($this->_submitValues['flydove_api_token'])) {
$apiParams = array(
'tokens' => $this->_submitValues['flydove_api_token'],
);
$recData['api_params'] = json_encode($apiParams);
}
$recData['is_active'] = CRM_Utils_Array::value('is_active', $recData, 0);
$recData['is_default'] = CRM_Utils_Array::value('is_default', $recData, 0);
$domainID = CRM_Core_Config::domainID();
Expand Down
18 changes: 18 additions & 0 deletions CRM/SMS/Page/Provider.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,24 @@ public function browse($action = NULL) {

$apiTypes = CRM_Core_OptionGroup::values('sms_api_type', FALSE, FALSE, FALSE, NULL, 'label');
$provider['api_type'] = $apiTypes[$provider['api_type']];
if ($provider['name'] == 'CRM_SMS_Provider_Flydove') {
$apiParams = json_decode($provider['api_params'], TRUE);
if (is_array($apiParams)) {
$provider['api_params'] = array();
foreach($apiParams as $key => $val) {
if (is_array($val)) {
$provider['api_params'][] = '<strong>'.$key.'</strong>';
foreach($val as $k => $v) {
$provider['api_params'][] = $k.":" . CRM_Utils_String::mask($v);
}
}
else {
$provider['api_params'][] = $key.":" . CRM_Utils_String::mask($val);
}
}
$provider['api_params'] = implode('<br>', $provider['api_params']);
}
}

$provider['action'] = CRM_Core_Action::formLink(self::links(), $action,
array('id' => $provider['id']),
Expand Down
53 changes: 53 additions & 0 deletions CRM/SMS/Provider/Flydove.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

class CRM_SMS_Provider_Flydove extends CRM_SMS_Provider {

/**
* We only need one instance of this object. So we use the singleton
* pattern and cache the instance in this variable
*
* @var object
* @static
*/
static private $_singleton = NULL;

public $_bulkMode = FALSE;

public $_bulkLimit = 500;

public static function &singleton($providerParams = array(), $force = FALSE) {
$providerId = CRM_Utils_Array::value('provider_id', $providerParams);
$providerId = CRM_Utils_Type::validate($providerId, 'Integer');
if (empty($providerId)) {
CRM_Core_Error::fatal('Provider not known or not provided.');
}
if (!isset(self::$_singleton)) {
self::$_singleton = new CRM_SMS_Provider_Flydove($providerId);
}
return self::$_singleton;
}

function __construct($providerId) {
}

/**
* Main function to send SMS
*
* The result should be mapping to activity status name for better update activity
*
* @param array $messages [
* 'phone' => string,
* 'body' => string,
* 'guid' => string,
* 'activityId' => int,
* ]
* @return array response of self::doRequest
*/
public function send(&$messages){
$response = array();
return $response;
}

public function activityUpdate() {
}
}
40 changes: 30 additions & 10 deletions templates/CRM/SMS/Form/Provider.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
{ts}Are you sure you would like to execute this job?{/ts}
</div>
{else}
<table class="form-layout-compressed">
<table class="form-layout-compressed sms-provider-table">
<tr class="crm-job-form-block-name">
<td class="label">{$form.name.label}</td><td>{$form.name.html}</td>
</tr>
Expand All @@ -60,10 +60,18 @@
<tr class="crm-job-form-block-api_params">
<td class="label">{$form.api_params.label}</td><td>{$form.api_params.html}</td>
</tr>
<tr class="crm-job-form-block-flydove hide-row">
<td class="label"><label>{ts}Flydove Settings{/ts}</label></td>
<td>
<div><label>{ts}Flydove File Import API Token{/ts} <input type="text" name="flydove_api_token[import]" class="huge" value="{$flydove_api_token.import}" /></label></div>
<div><label>{ts}Flydove Subscribe API Token{/ts} <input type="text" name="flydove_api_token[subscribe]" class="huge" value="{$flydove_api_token.subscribe}"/></label></div>
<div><label>{ts}Flydove Group Management API Token{/ts} <input type="text" name="flydove_api_token[group]" class="huge" value="{$flydove_api_token.group}"/></label></div>
</td>
</tr>
<tr class="crm-job-form-block-is_active">
<td></td><td>{$form.is_active.html}&nbsp;{$form.is_active.label}</td>
</tr>
<tr class="crm-job-form-block-is_active">
<tr class="crm-job-form-block-is_default">
<td></td><td>{$form.is_default.html}&nbsp;{$form.is_default.label}</td>
</tr>
</table>
Expand All @@ -73,16 +81,28 @@
</fieldset>
</div>

{if $action eq 1 or $action eq 2}
<script type="text/javascript" >
{literal}
CRM.$(function($) {
var $form = $("form.{/literal}{$form.formClass}{literal}");
$('select[name=name]', $form).change(function() {
var url = {/literal}"{$refreshURL}"{literal} + "&key=" + this.value;
$(this).closest('.crm-ajax-container, #crm-main-content-wrapper').crmSnippet({url: url}).crmSnippet('refresh');
});
cj(document).ready(function($){
var showHideProviderFields = function(providerName) {
if (providerName == 'Flydove') {
$('.crm-job-form-block-username, .crm-job-form-block-password, .crm-job-form-block-api_params, .crm-job-form-block-is_default').hide();
$('.crm-job-form-block-flydove').removeClass('hide-row');
}
else if(providerName == 'Mitake') {
$('.crm-job-form-block-username, .crm-job-form-block-password, .crm-job-form-block-api_params, .crm-job-form-block-is_default').show();
$('.crm-job-form-block-flydove').addClass('hide-row');
}
}
$('#name').change(function(){
let className = $(this).val();
let providerName = className.replace('CRM_SMS_Provider_', '');
showHideProviderFields(providerName);
});
let className = $('#name').val();
let providerName = className.replace('CRM_SMS_Provider_', '');
showHideProviderFields(providerName);
});
{/literal}
</script>
{/if}

0 comments on commit 7c656bc

Please sign in to comment.