CRM-21134 fix enotices in payment processor code assignment.
authoreileen <emcnaughton@wikimedia.org>
Fri, 1 Sep 2017 23:49:00 +0000 (11:49 +1200)
committereileen <emcnaughton@wikimedia.org>
Mon, 18 Sep 2017 21:47:58 +0000 (09:47 +1200)
This is generally a code tidy up to push out the principles we have been implementing (ie.
the idea that the processors define their fields. The code can cause e-notices in extensions as is
because it is prescriptive about fields.

I removed the ANDing in the tpl because actually we are not looking to match numbers like 2
2 is the number we have hard-coded for direct debits (we should be using an option group but that
is another story

CRM/Contribute/Form/ContributionBase.php
CRM/Core/Payment.php
templates/CRM/Contribute/Form/Contribution/Confirm.tpl
templates/CRM/Contribute/Form/Contribution/ThankYou.tpl

index cffecc784e3684b527e326a3468eb5b1018930d1..fd2b20e11b57410274953c10df079368a30143d0 100644 (file)
@@ -580,23 +580,36 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
 
     // The concept of contributeMode is deprecated.
     // The payment processor object can provide info about the fields it shows.
-    if ($this->_contributeMode == 'direct' && $assignCCInfo) {
-      if ($this->_paymentProcessor &&
-        $this->_paymentProcessor['payment_type'] & CRM_Core_Payment::PAYMENT_TYPE_DIRECT_DEBIT
-      ) {
-        $this->assign('account_holder', $this->_params['account_holder']);
-        $this->assign('bank_identification_number', $this->_params['bank_identification_number']);
-        $this->assign('bank_name', $this->_params['bank_name']);
-        $this->assign('bank_account_number', $this->_params['bank_account_number']);
+    if ($assignCCInfo) {
+      /** @var  $paymentProcessorObject \CRM_Core_Payment */
+      $paymentProcessorObject = $this->_paymentProcessor['object'];
+      $paymentFields = $paymentProcessorObject->getPaymentFormFields();
+      foreach ($paymentFields as $index => $paymentField) {
+        if (!isset($this->_params[$paymentField])) {
+          unset($paymentFields[$index]);
+          continue;
+        }
+        if ($paymentField === 'credit_card_exp_date') {
+          $date = CRM_Utils_Date::format(CRM_Utils_Array::value('credit_card_exp_date', $this->_params));
+          $date = CRM_Utils_Date::mysqlToIso($date);
+          $this->assign('credit_card_exp_date', $date);
+        }
+        elseif ($paymentField === 'credit_card_number') {
+          $this->assign('credit_card_number',
+            CRM_Utils_System::mungeCreditCard(CRM_Utils_Array::value('credit_card_number', $this->_params))
+          );
+        }
+        else {
+          $this->assign($paymentField, $this->_params[$paymentField]);
+        }
       }
-      else {
-        $date = CRM_Utils_Date::format(CRM_Utils_Array::value('credit_card_exp_date', $this->_params));
-        $date = CRM_Utils_Date::mysqlToIso($date);
-        $this->assign('credit_card_exp_date', $date);
-        $this->assign('credit_card_number',
-          CRM_Utils_System::mungeCreditCard(CRM_Utils_Array::value('credit_card_number', $this->_params))
-        );
+      $paymentFieldsetLabel = ts('%1 Information', array($paymentProcessorObject->getPaymentTypeLabel()));
+      if (empty($paymentFields)) {
+        $paymentFieldsetLabel = '';
       }
+      $this->assign('paymentFieldsetLabel', $paymentFieldsetLabel);
+      $this->assign('paymentFields', $paymentFields);
+
     }
 
     $this->assign('email',
index 0bfe0c2d2ec4788790076f2a2687c836e0d2abfa..822b6bcc88c3ed98a0d6db60516b220b1ed279f9 100644 (file)
@@ -533,8 +533,17 @@ abstract class CRM_Core_Payment {
 
   /**
    * Get array of fields that should be displayed on the payment form.
-   * @todo make payment type an option value & use it in the function name - currently on debit & credit card work
+   *
+   * Common results are
+   *   array('credit_card_type', 'credit_card_number', 'cvv2', 'credit_card_exp_date')
+   *   or
+   *   array('account_holder', 'bank_account_number', 'bank_identification_number', 'bank_name')
+   *   or
+   *   array()
+   *
    * @return array
+   *   Array of payment fields appropriate to the payment processor.
+   *
    * @throws CiviCRM_API3_Exception
    */
   public function getPaymentFormFields() {
index 571e708849b12dce2c38e918c0d388b7c6ca596f..b0eb8c4b3e211bf0d634ea42fb058deb6cb65ab5 100644 (file)
 {crmRegion name="contribution-confirm-billing-block"}
        {if ($credit_card_number or $bank_account_number)}
         <div class="crm-group credit_card-group">
-            <div class="header-dark">
-            {if $paymentProcessor.payment_type & 2}
-                 {ts}Direct Debit Information{/ts}
-            {else}
-                {ts}Credit Card Information{/ts}
+            {if $paymentFieldsetLabel}
+              <div class="header-dark">
+                {$paymentFieldsetLabel}
+              </div>
             {/if}
-            </div>
-            {if $paymentProcessor.payment_type & 2}
+            {if $paymentProcessor.payment_type == 2}
                 <div class="display-block">
                     {ts}Account Holder{/ts}: {$account_holder}<br />
                     {ts}Bank Account Number{/ts}: {$bank_account_number}<br />
                 <div class="crm-section no-label credit_card_details-section">
                   <div class="content">{$credit_card_type}</div>
                   <div class="content">{$credit_card_number}</div>
-                  <div class="content">{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:''|crmDate}</div>
+                  <div class="content">{if $credit_card_exp_date}{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:''|crmDate}{/if}</div>
                   <div class="clear"></div>
                 </div>
             {/if}
index a79b990c3537d87409f3046abed6df50374c8fa8..844225af8503785a9036834da0e3b9e4739512e0 100644 (file)
   {if $contributeMode eq 'direct' and ! $is_pay_later and $is_monetary and ( $amount GT 0 OR $minimum_fee GT 0 )}
     {crmRegion name="contribution-thankyou-billing-block"}
       <div class="crm-group credit_card-group">
-        <div class="header-dark">
-          {if $paymentProcessor.payment_type & 2}
-            {ts}Direct Debit Information{/ts}
-          {else}
-            {ts}Credit Card Information{/ts}
-          {/if}
-        </div>
-        {if $paymentProcessor.payment_type & 2}
+        {if $paymentFieldsetLabel}
+          <div class="header-dark">
+            {$paymentFieldsetLabel}
+          </div>
+        {/if}
+        {if $paymentProcessor.payment_type == 2}
           <div class="display-block">
             {ts}Account Holder{/ts}: {$account_holder}<br />
             {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br />
           <div class="crm-section no-label credit_card_details-section">
             <div class="content">{$credit_card_type}</div>
             <div class="content">{$credit_card_number}</div>
-            <div class="content">{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:''|crmDate}</div>
+            <div class="content">{if $credit_card_exp_date}{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:''|crmDate}{/if}</div>
             <div class="clear"></div>
           </div>
         {/if}