From 45155a8f14bdb2684ce17ea65179e4df23db6ee3 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Mon, 23 Oct 2023 23:17:16 +1300 Subject: [PATCH] Unshare form function --- CRM/Contribute/Form/Contribution.php | 89 ++++++++++++++++++++++- CRM/Contribute/Form/Contribution/Main.php | 26 +++---- 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/CRM/Contribute/Form/Contribution.php b/CRM/Contribute/Form/Contribution.php index 7fce7b21a9..eeabdeb110 100644 --- a/CRM/Contribute/Form/Contribution.php +++ b/CRM/Contribute/Form/Contribution.php @@ -682,7 +682,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP } } if ($buildRecurBlock) { - CRM_Contribute_Form_Contribution_Main::buildRecur($this); + $this->buildRecur(); $this->setDefaults(['is_recur' => 0]); $this->assign('buildRecurBlock', TRUE); } @@ -2383,4 +2383,91 @@ WHERE contribution_id = {$id} return $this->_ppID ? (int) $this->_ppID : NULL; } + /** + * Build elements to collect information for recurring contributions. + * + * Previously shared function. + */ + private function buildRecur(): void { + $form = $this; + $attributes = CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionRecur'); + $className = 'CRM_Contribute_Form_Contribution'; + + $form->assign('is_recur_interval', $form->_values['is_recur_interval'] ?? NULL); + $form->assign('is_recur_installments', $form->_values['is_recur_installments'] ?? NULL); + $paymentObject = $form->getVar('_paymentObject'); + if ($paymentObject) { + $form->assign('recurringHelpText', $paymentObject->getText('contributionPageRecurringHelp', [ + 'is_recur_installments' => !empty($form->_values['is_recur_installments']), + 'is_email_receipt' => !empty($form->_values['is_email_receipt']), + ])); + } + + $frUnits = $form->_values['recur_frequency_unit'] ?? NULL; + $frequencyUnits = CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE); + if (empty($frUnits) && + $className == 'CRM_Contribute_Form_Contribution' + ) { + $frUnits = implode(CRM_Core_DAO::VALUE_SEPARATOR, + CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, FALSE, NULL, 'value') + ); + } + + $unitVals = explode(CRM_Core_DAO::VALUE_SEPARATOR, $frUnits); + + // FIXME: Ideally we should freeze select box if there is only + // one option but looks there is some problem /w QF freeze. + //if ( count( $units ) == 1 ) { + //$frequencyUnit->freeze( ); + //} + + $form->add('text', 'installments', ts('installments'), + $attributes['installments'] + ['class' => 'two'] + ); + $form->addRule('installments', ts('Number of installments must be a whole number.'), 'integer'); + + $is_recur_label = ts('I want to contribute this amount every'); + + // CRM 10860, display text instead of a dropdown if there's only 1 frequency unit + if (count($unitVals) == 1) { + $form->assign('one_frequency_unit', TRUE); + $form->add('hidden', 'frequency_unit', $unitVals[0]); + if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + $unit = CRM_Contribute_BAO_Contribution::getUnitLabelWithPlural($unitVals[0]); + $form->assign('frequency_unit', $unit); + } + else { + $is_recur_label = ts('I want to contribute this amount every %1', + [1 => $frequencyUnits[$unitVals[0]]] + ); + $form->assign('all_text_recur', TRUE); + } + } + else { + $form->assign('one_frequency_unit', FALSE); + $units = []; + foreach ($unitVals as $key => $val) { + if (array_key_exists($val, $frequencyUnits)) { + $units[$val] = $frequencyUnits[$val]; + if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + $units[$val] = CRM_Contribute_BAO_Contribution::getUnitLabelWithPlural($val); + $unit = ts('Every'); + } + } + } + $frequencyUnit = &$form->add('select', 'frequency_unit', NULL, $units, FALSE, ['aria-label' => ts('Frequency Unit'), 'class' => 'crm-select2 eight']); + } + + if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + $form->add('text', 'frequency_interval', $unit, $attributes['frequency_interval'] + ['aria-label' => ts('Every'), 'class' => 'two']); + $form->addRule('frequency_interval', ts('Frequency must be a whole number (EXAMPLE: Every 3 months).'), 'integer'); + } + else { + // make sure frequency_interval is submitted as 1 if given no choice to user. + $form->add('hidden', 'frequency_interval', 1); + } + + $form->add('checkbox', 'is_recur', $is_recur_label, NULL); + } + } diff --git a/CRM/Contribute/Form/Contribution/Main.php b/CRM/Contribute/Form/Contribution/Main.php index e29b12bf9c..5bafb92897 100644 --- a/CRM/Contribute/Form/Contribution/Main.php +++ b/CRM/Contribute/Form/Contribution/Main.php @@ -355,7 +355,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu if ($this->_values['is_monetary'] && $this->_values['is_recur'] && empty($this->_values['pledge_id']) ) { - self::buildRecur($this); + $this->buildRecur(); } } @@ -767,15 +767,14 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu /** * Build elements to collect information for recurring contributions. * - * - * @param CRM_Core_Form $form + * Previously shared function. */ - public static function buildRecur(&$form) { + private function buildRecur(): void { + $form = $this; $attributes = CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionRecur'); - $className = get_class($form); - $form->assign('is_recur_interval', CRM_Utils_Array::value('is_recur_interval', $form->_values)); - $form->assign('is_recur_installments', CRM_Utils_Array::value('is_recur_installments', $form->_values)); + $form->assign('is_recur_interval', $this->getContributionPageValue('is_recur_interval')); + $form->assign('is_recur_installments', $this->getContributionPageValue('is_recur_installments')); $paymentObject = $form->getVar('_paymentObject'); if ($paymentObject) { $form->assign('recurringHelpText', $paymentObject->getText('contributionPageRecurringHelp', [ @@ -786,13 +785,6 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu $frUnits = $form->_values['recur_frequency_unit'] ?? NULL; $frequencyUnits = CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE); - if (empty($frUnits) && - $className == 'CRM_Contribute_Form_Contribution' - ) { - $frUnits = implode(CRM_Core_DAO::VALUE_SEPARATOR, - CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, FALSE, NULL, 'value') - ); - } $unitVals = explode(CRM_Core_DAO::VALUE_SEPARATOR, $frUnits); @@ -813,7 +805,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu if (count($unitVals) == 1) { $form->assign('one_frequency_unit', TRUE); $form->add('hidden', 'frequency_unit', $unitVals[0]); - if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + if (!empty($form->_values['is_recur_interval'])) { $unit = CRM_Contribute_BAO_Contribution::getUnitLabelWithPlural($unitVals[0]); $form->assign('frequency_unit', $unit); } @@ -830,7 +822,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu foreach ($unitVals as $key => $val) { if (array_key_exists($val, $frequencyUnits)) { $units[$val] = $frequencyUnits[$val]; - if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + if (!empty($form->_values['is_recur_interval'])) { $units[$val] = CRM_Contribute_BAO_Contribution::getUnitLabelWithPlural($val); $unit = ts('Every'); } @@ -839,7 +831,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu $frequencyUnit = &$form->add('select', 'frequency_unit', NULL, $units, FALSE, ['aria-label' => ts('Frequency Unit'), 'class' => 'crm-select2 eight']); } - if (!empty($form->_values['is_recur_interval']) || $className == 'CRM_Contribute_Form_Contribution') { + if (!empty($form->_values['is_recur_interval'])) { $form->add('text', 'frequency_interval', $unit, $attributes['frequency_interval'] + ['aria-label' => ts('Every'), 'class' => 'two']); $form->addRule('frequency_interval', ts('Frequency must be a whole number (EXAMPLE: Every 3 months).'), 'integer'); } -- 2.25.1