diff --git a/api/v3/RemoteFormContributionPage/Submit.php b/api/v3/RemoteFormContributionPage/Submit.php index 5844f52..8cfe2a1 100644 --- a/api/v3/RemoteFormContributionPage/Submit.php +++ b/api/v3/RemoteFormContributionPage/Submit.php @@ -16,6 +16,7 @@ function _civicrm_api3_remote_form_contribution_page_Submit_spec(&$params, $apir _rf_add_page_details($contribution_page_id, $params, $test_mode); _rf_add_profile_fields($contribution_page_id, $params); _rf_add_price_fields($contribution_page_id, $params, $params['control']['currency']); + _rf_add_recur_fields($contribution_page_id, $params); // How do we handle credit card fields? Some processors may want to insert their // own. $cc_fields = _rf_include_credit_card_fields($contribution_page_id); @@ -77,6 +78,10 @@ function _rf_add_page_details($id, &$params, $test_mode = FALSE) { ); $params['control'] = array( 'is_active' => $values['is_active'], + 'is_recur' => $values['is_recur'], + 'recur_frequency_unit' => $values['recur_frequency_unit'], + 'is_recur_interval' => $values['is_recur_interval'], + 'is_recur_installments' => $values['is_recur_installments'], 'start_date' => $values['start_date'], 'currency' => $values['currency'], 'min_amount' => $values['min_amount'], @@ -84,6 +89,71 @@ function _rf_add_page_details($id, &$params, $test_mode = FALSE) { ); } +function _rf_add_recur_fields($id, &$params) { + if ($params['control']['is_recur']) { + $params['is_recur'] = array ( + 'name' => 'is_recur', + 'title' => E::ts('I want to contribute this amount every'), + 'entity' => 'ContributionPage', + 'html_type' => 'checkbox', + ); + + if ($params['control']['is_recur_interval']) { + $params['frequency_interval'] = array ( + 'name' => 'frequency_interval', + 'entity' => 'ContributionPage', + 'html_type' => 'text', + ); + $pluralizeUnits = TRUE; + } + else { + $params['frequency_interval'] = array ( + 'name' => 'frequency_interval', + 'entity' => 'ContributionPage', + 'html_type' => 'hidden', + 'defaul' => '1', + ); + $pluralizeUnits = FALSE; + } + + // Build frequency units array, pluralizing as needed. + $frequencyUnitOptions = []; + foreach ((array)$params['control']['recur_frequency_unit'] as $frequencyUnit) { + $label = $frequencyUnit; + if ($pluralizeUnits) { + $label .= '(s)'; + } + $frequencyUnitOptions[$frequencyUnit] = $label; + } + if (count($frequencyUnitOptions) > 1) { + $params['frequency_unit'] = array ( + 'name' => 'frequency_unit', + 'title' => E::ts('Repeat every'), + 'entity' => 'ContributionPage', + 'html_type' => 'select', + 'options' => $frequencyUnitOptions, + 'default' => 'week', + ); + } + else { + $params['frequency_unit'] = array ( + 'name' => 'frequency_unit', + 'entity' => 'ContributionPage', + 'html_type' => 'hidden', + 'default' => array_shift($frequencyUnitOptions), + ); + } + + if ($params['control']['is_recur_installments']) { + $params['installments'] = array ( + 'name' => 'installments', + 'entity' => 'ContributionPage', + 'html_type' => 'text', + ); + } + } +} + function _rf_add_profile_fields($id, &$params) { // Now get profile fields. $result = civicrm_api3('UFJoin', 'get', array( diff --git a/remoteform.js b/remoteform.js index 47b1fd5..22c2e9b 100644 --- a/remoteform.js +++ b/remoteform.js @@ -717,13 +717,26 @@ function remoteForm(config) { function buildForm(fields) { for (var key in fields) { if (fields.hasOwnProperty(key)) { - var def = fields[key]; - if (!def.entity) { + if (key == 'is_recur') { + var html = createRecurringFieldsDiv(fields, createField, wrapField); + } + else if ( + key == 'frequency_unit' + || key == 'frequency_interval' + || key == 'installments' + ) { + // These are all processed in createRecurringFields(), so skip them here. continue; } - var field; - var type = getType(def); - var html = cfg.createFieldDivFunc(key, def, type, createField, wrapField); + else { + var def = fields[key]; + if (!def.entity) { + continue; + } + var field; + var type = getType(def); + var html = cfg.createFieldDivFunc(key, def, type, createField, wrapField); + } if (html) { form.appendChild(html); } @@ -834,6 +847,89 @@ function remoteForm(config) { return wrapFieldFunc(key, def, field); } + /** + * ### createRecurringFieldsDiv + * + * ```createRecurringFieldsDiv(key, def, type, createFieldFunc, wrapFieldFunc)``` + * + * Build the form elements related to recurring contributions, if the contribution + * page is configured for such. Unlike other fields in RemoteForm displays, + * this collection of fields appears in a running line; therefore it needs + * special formatting, which this function provides. + * + * #### Parameters: + * + * - fields Array of form fields, as passed to buildForm() + * + * #### Returns: + * + * A