From d04c988569797fff53afece1c1b4932a7851274b Mon Sep 17 00:00:00 2001 From: eileen Date: Fri, 12 Mar 2021 09:50:22 +1300 Subject: [PATCH] [REF] Extract code to get generic membership parameters The form has 2 types of membership parameters 1) submitted parameters 2) calculated parameters that are per membership type This extracts the portion that are submitted to be fetched from a single place that will return the same result whereever it is called from (allows us to move code around without breaking the fragile parameter chain) --- CRM/Member/Form/Membership.php | 55 +++++++++++-------- .../CRM/Member/Form/MembershipTest.php | 4 +- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/CRM/Member/Form/Membership.php b/CRM/Member/Form/Membership.php index 68cc82b751..e04740b4c9 100644 --- a/CRM/Member/Form/Membership.php +++ b/CRM/Member/Form/Membership.php @@ -1067,24 +1067,7 @@ DESC limit 1"); $params['contact_id'] = $this->_contactID; - $fields = [ - 'status_id', - 'source', - 'is_override', - 'status_override_end_date', - 'campaign_id', - ]; - - foreach ($fields as $f) { - $params[$f] = $formValues[$f] ?? NULL; - } - - // fix for CRM-3724 - // when is_override false ignore is_admin statuses during membership - // status calculation. similarly we did fix for import in CRM-3570. - if (empty($params['is_override'])) { - $params['exclude_is_admin'] = TRUE; - } + $params = array_merge($params, $this->getFormMembershipParams()); $joinDate = $formValues['join_date']; $startDate = $formValues['start_date']; @@ -1119,10 +1102,6 @@ DESC limit 1"); // max related memberships - take from form or inherit from membership type $membershipTypeValues[$memType]['max_related'] = $formValues['max_related'] ?? NULL; } - $membershipTypeValues[$memType]['custom'] = CRM_Core_BAO_CustomField::postProcess($formValues, - $this->_id, - 'Membership' - ); } // Retrieve the name and email of the current user - this will be the FROM for the receipt email @@ -1894,4 +1873,36 @@ DESC limit 1"); return (int) $this->getSubmittedValue('financial_type_id') ?: $this->order->getFinancialTypeID(); } + /** + * Get values that should be passed to all membership create actions. + * + * These parameters are generic to all memberships created from the form, + * whether a single membership or multiple by price set (although + * the form will not expose all in the latter case. + * + * By referencing the submitted values directly we can call this + * from anywhere in postProcess and get the same result (protects + * against breakage if code is moved around). + * + * @return array + */ + protected function getFormMembershipParams(): array { + $submittedValues = $this->controller->exportValues($this->_name); + return [ + 'status_id' => $this->getSubmittedValue('status_id'), + 'source' => $this->getSubmittedValue('source'), + 'is_override' => $this->getSubmittedValue('is_override'), + 'status_override_end_date' => $this->getSubmittedValue('status_override_end_date'), + 'campaign_id' => $this->getSubmittedValue('campaign_id'), + 'custom' => CRM_Core_BAO_CustomField::postProcess($submittedValues, + $this->_id, + 'Membership' + ), + // fix for CRM-3724 + // when is_override false ignore is_admin statuses during membership + // status calculation. similarly we did fix for import in CRM-3570. + 'exclude_is_admin' => !$this->getSubmittedValue('is_override'), + ]; + } + } diff --git a/tests/phpunit/CRM/Member/Form/MembershipTest.php b/tests/phpunit/CRM/Member/Form/MembershipTest.php index 86bc054486..d5e964e588 100644 --- a/tests/phpunit/CRM/Member/Form/MembershipTest.php +++ b/tests/phpunit/CRM/Member/Form/MembershipTest.php @@ -1221,9 +1221,7 @@ Expires: ', if (isset($_REQUEST['cid'])) { unset($_REQUEST['cid']); } - $form = new CRM_Member_Form_Membership(); - $_SERVER['REQUEST_METHOD'] = 'GET'; - $form->controller = new CRM_Core_Controller(); + $form = $this->getFormObject('CRM_Member_Form_Membership'); $form->preProcess(); return $form; } -- 2.25.1