drupal-civicrm/sites/all/modules/civicrm/Civi/Payment/System.php
2018-01-14 13:10:16 +00:00

136 lines
3.5 KiB
PHP

<?php
namespace Civi\Payment;
/**
* Class System
* @package Civi\Payment
*/
class System {
/**
* @var System
*/
private static $singleton;
/**
* @var array cache
*/
private $cache = array();
/**
* @return \Civi\Payment\System
*/
public static function singleton() {
if (!self::$singleton) {
self::$singleton = new self();
}
return self::$singleton;
}
/**
* Starting from the processor as an array retrieve the processor as an object.
*
* If there is no valid configuration it will not be retrieved.
*
* @param array $processor
* @param bool $force
* Override the config check. This is required in uninstall as no valid instances exist
* but will deliberately not work with any valid processors.
*
* @return CRM_Core_Payment|NULL
*
* @throws \CRM_Core_Exception
*/
public function getByProcessor($processor, $force = FALSE) {
$id = $force ? 0 : $processor['id'];
if (!isset($this->cache[$id]) || $force) {
$ext = \CRM_Extension_System::singleton()->getMapper();
if ($ext->isExtensionKey($processor['class_name'])) {
$paymentClass = $ext->keyToClass($processor['class_name'], 'payment');
require_once $ext->classToPath($paymentClass);
}
else {
$paymentClass = 'CRM_Core_' . $processor['class_name'];
if (empty($paymentClass)) {
throw new \CRM_Core_Exception('no class provided');
}
require_once str_replace('_', DIRECTORY_SEPARATOR, $paymentClass) . '.php';
}
$processorObject = new $paymentClass(!empty($processor['is_test']) ? 'test' : 'live', $processor);
if (!$force && $processorObject->checkConfig()) {
$processorObject = NULL;
}
else {
$processorObject->setPaymentProcessor($processor);
}
$this->cache[$id] = $processorObject;
}
return $this->cache[$id];
}
/**
* Get payment processor by it's ID.
*
* @param int $id
*
* @return \CRM_Core_Payment|NULL
* @throws \CiviCRM_API3_Exception
*/
public function getById($id) {
if ($id == 0) {
return new \CRM_Core_Payment_Manual();
}
$processor = civicrm_api3('payment_processor', 'getsingle', array('id' => $id, 'is_test' => NULL));
return self::getByProcessor($processor);
}
/**
* @param string $name
* @param bool $is_test
*
* @return \CRM_Core_Payment|NULL
* @throws \CiviCRM_API3_Exception
*/
public function getByName($name, $is_test) {
$processor = civicrm_api3('payment_processor', 'getsingle', array('name' => $name, 'is_test' => $is_test));
return self::getByProcessor($processor);
}
/**
* Flush processors from static cache.
*
* This is particularly used for tests.
*/
public function flushProcessors() {
$this->cache = array();
\CRM_Financial_BAO_PaymentProcessor::getAllPaymentProcessors('all', TRUE);
\CRM_Financial_BAO_PaymentProcessor::getAllPaymentProcessors('live', TRUE);
\CRM_Financial_BAO_PaymentProcessor::getAllPaymentProcessors('test', TRUE);
}
/**
* Sometimes we want to instantiate a processor object when no valid instance exists (eg. when uninstalling a
* processor).
*
* This function does not load instance specific details for the processor.
*
* @param string $className
*
* @return \Civi\Payment\CRM_Core_Payment|NULL
* @throws \CiviCRM_API3_Exception
*/
public function getByClass($className) {
return $this->getByProcessor(array(
'class_name' => $className,
'id' => 0,
'is_test' => 0,
),
TRUE);
}
}