towards CRM-16402, improve payment processor loading.
authorEileen McNaughton <eileen@fuzion.co.nz>
Wed, 24 Jun 2015 11:38:21 +0000 (23:38 +1200)
committerEileen McNaughton <eileen@fuzion.co.nz>
Wed, 24 Jun 2015 21:06:55 +0000 (09:06 +1200)
In this case we stop calling a deprecated function & filter through loaded in to get the
recurring processors and re-introduce caching of payment processors

CRM/Contribute/Form/AbstractEditPayment.php
CRM/Financial/BAO/PaymentProcessor.php

index 03f8dccf1bed365bdf9057c897bd3922e3f746a5..68a96bcd40ed4bcc3671c780eb83d44ef40d0bc3 100644 (file)
@@ -58,7 +58,13 @@ class CRM_Contribute_Form_AbstractEditPayment extends CRM_Contact_Form_Task {
    * @var array current payment processor including a copy of the object in 'object' key
    */
   public $_paymentProcessor;
-  public $_recurPaymentProcessors;
+
+  /**
+   * Available recurring processors.
+   *
+   * @var array
+   */
+  public $_recurPaymentProcessors = array();
 
   /**
    * Array of processor options in the format id => array($id => $label)
@@ -435,11 +441,10 @@ LEFT JOIN  civicrm_contribution on (civicrm_contribution.contact_id = civicrm_co
         if (!empty($processor['description'])) {
           $this->_processors[$id] .= ' : ' . ts($processor['description']);
         }
+        if ($processor['is_recur']) {
+          $this->_recurPaymentProcessors[$id] = $this->_processors[$id];
+        }
       }
-      //get the valid recurring processors.
-      $test = strtolower($this->_mode) == 'test' ? TRUE : FALSE;
-      $recurring = CRM_Core_PseudoConstant::paymentProcessor(FALSE, $test, 'is_recur = 1');
-      $this->_recurPaymentProcessors = array_intersect_key($this->_processors, $recurring);
     }
     $this->assign('recurringPaymentProcessorIds',
       empty($this->_recurPaymentProcessors) ? '' : implode(',', array_keys($this->_recurPaymentProcessors))
index cbe6c24114978bdcbd9605be3bd3b9a828e6b140..f7b40a5436b3c76e9c31434a4842119c25e5fa47 100644 (file)
@@ -322,15 +322,15 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
    * @return array
    */
   public static function getAllPaymentProcessors($mode, $reset = FALSE) {
-    /*
-     * $cacheKey = 'CRM_Financial_BAO_Payment_Processor_' . ($mode ? 'test' : 'all');
-     * if (!$reset) {
-     *   $processors = CRM_Utils_Cache::singleton()->get($cacheKey);
-     *   if (!empty($processors)) {
-     *     return $processors;
-     *   }
-     * }
-     */
+
+    $cacheKey = 'CRM_Financial_BAO_Payment_Processor_' . ($mode ? 'test' : 'all');
+    if (!$reset) {
+      $processors = CRM_Utils_Cache::singleton()->get($cacheKey);
+      if (!empty($processors)) {
+        return $processors;
+      }
+    }
+
     $retrievalParameters = array(
       'is_active' => TRUE,
       'options' => array('sort' => 'is_default DESC, name'),
@@ -342,22 +342,22 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
     elseif ($mode == 'live') {
       $retrievalParameters['is_test'] = 0;
     }
+
     $processors = civicrm_api3('payment_processor', 'get', $retrievalParameters);
     foreach ($processors['values'] as $processor) {
-      $fieldsToProvide = array('user_name', 'password', 'signature', 'subject');
+      $fieldsToProvide = array('user_name', 'password', 'signature', 'subject', 'is_recur');
       foreach ($fieldsToProvide as $field) {
-        //prevent e-notices in processor classes when not configured
+        // Prevent e-notices in processor classes when not configured.
         if (!isset($processor[$field])) {
           $processor[$field] = NULL;
         }
       }
       $processors['values'][$processor['id']]['payment_processor_type'] = $processor['payment_processor_type'] = $processors['values'][$processor['id']]['api.payment_processor_type.getsingle']['name'];
-      $mode = empty($processor['is_test']) ? 'live' : 'test';
-      $processors['values'][$processor['id']]['object'] = CRM_Core_Payment::singleton($mode, $processor);
+      $processors['values'][$processor['id']]['object'] = Civi\Payment\System::singleton()->getByProcessor($processor);
     }
-    /*
-    CRM_Utils_Cache::singleton()->set($cacheKey, $processors);
-     */
+
+    CRM_Utils_Cache::singleton()->set($cacheKey, $processors['values']);
+
     return $processors['values'];
   }
 
@@ -387,13 +387,16 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
       $mode = 'live';
     }
     $processors = self::getAllPaymentProcessors($mode);
+
     if ($capabilities) {
       foreach ($processors as $index => $processor) {
         if (!empty($ids) && !in_array($processor['id'], $ids)) {
           unset ($processors[$index]);
           continue;
         }
-        if (($error = $processor['object']->checkConfig()) != NULL) {
+        // Invalid processors will store a null value in 'object' (e.g. if not all required config fields are present).
+        // This is determined by calling when loading the processor via the $processorObject->checkConfig() function.
+        if (!is_a($processor['object'], 'CRM_Core_Payment')) {
           unset ($processors[$index]);
           continue;
         }