/** * Find the $info and $typeManager for a $key * * @param $key * * @throws CRM_Extension_Exception * @return array * (0 => CRM_Extension_Info, 1 => CRM_Extension_Manager_Interface) */ private function _getInfoTypeHandler($key) { $info = $this->mapper->keyToInfo($key); // throws Exception if (array_key_exists($info->type, $this->typeManagers)) { return array($info, $this->typeManagers[$info->type]); } else { throw new CRM_Extension_Exception("Unrecognized extension type: " . $info->type); } }
/** * Determine public URL of a resource provided by an extension. * * @param string $ext * extension name; use 'civicrm' for core. * @param string $file * file path -- relative to the extension base dir. * @param bool $addCacheCode * * @return string, URL */ public function getUrl($ext, $file = NULL, $addCacheCode = FALSE) { if ($file === NULL) { $file = ''; } if ($addCacheCode) { $file .= '?r=' . $this->getCacheCode(); } // TODO consider caching results return $this->extMapper->keyToUrl($ext) . '/' . $file; }
/** * Function to run hooks in the payment processor class * Load requested payment processor and call the method specified. * * @param string $method - the method to call in the payment processor class * @private */ private function _runPaymentHook(CRM_Extension_Info $info, $method) { // Not concerned about performance at this stage, as these are seldomly performed tasks // (payment processor enable/disable/install/uninstall). May wish to implement some // kind of registry/caching system if more hooks are added. try { $paymentClass = $this->mapper->keyToClass($info->key, 'payment'); $file = $this->mapper->classToPath($paymentClass); if (!file_exists($file)) { CRM_Core_Session::setStatus(ts('Failed to load file (%3) for payment processor (%1) while running "%2"', array(1 => $info->key, 2 => $method, 3 => $file)), '', 'error'); return; } else { require_once $file; } } catch (CRM_Extension_Exception $e) { CRM_Core_Session::setStatus(ts('Failed to determine file path for payment processor (%1) while running "%2"', array(1 => $info->key, 2 => $method)), '', 'error'); return; } // See if we have any instances of this PP defined .. if ($processor_id = CRM_Core_DAO::singleValueQuery("\n SELECT pp.id\n FROM civicrm_extension ext\n INNER JOIN civicrm_payment_processor_type ppt\n ON ext.name = ppt.name\n INNER JOIN civicrm_payment_processor pp\n ON ppt.id = pp.payment_processor_type_id\n WHERE ext.type = 'payment'\n AND ext.full_name = %1\n ", array(1 => array($info->key, 'String')))) { // If so, load params in the usual way .. $paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getPayment($processor_id, NULL); } else { // Otherwise, do the best we can to construct some .. $dao = CRM_Core_DAO::executeQuery("\n SELECT ppt.*\n FROM civicrm_extension ext\n INNER JOIN civicrm_payment_processor_type ppt\n ON ppt.name = ext.name\n WHERE ext.name = %1\n AND ext.type = 'payment'\n ", array(1 => array($info->name, 'String'))); if ($dao->fetch()) { $paymentProcessor = array('id' => -1, 'name' => $dao->title, 'payment_processor_type_id' => $dao->id, 'user_name' => 'nothing', 'password' => 'nothing', 'signature' => '', 'url_site' => $dao->url_site_default, 'url_api' => $dao->url_api_default, 'url_recur' => $dao->url_recur_default, 'url_button' => $dao->url_button_default, 'subject' => '', 'class_name' => $dao->class_name, 'is_recur' => $dao->is_recur, 'billing_mode' => $dao->billing_mode, 'payment_type' => $dao->payment_type); } else { CRM_Core_Error::fatal("Unable to find payment processor in " . __CLASS__ . '::' . __METHOD__); } } // In the case of uninstall, check for instances of PP first. // Don't run hook if any are found. if ($method == 'uninstall' && $paymentProcessor['id'] > 0) { return; } switch ($method) { case 'install': case 'uninstall': case 'enable': case 'disable': // Instantiate PP $processorInstance = $paymentClass::singleton(NULL, $paymentProcessor); // Does PP implement this method, and can we call it? if (method_exists($processorInstance, $method) && is_callable(array($processorInstance, $method))) { // If so, call it ... $processorInstance->{$method}(); } break; default: CRM_Core_Session::setStatus(ts("Unrecognized payment hook (%1) in %2::%3", array(1 => $method, 2 => __CLASS__, 3 => __METHOD__)), '', 'error'); } }
/** * Determine public URL of a resource provided by an extension. * * @param string $ext * extension name; use 'civicrm' for core. * @param string $file * file path -- relative to the extension base dir. * @param bool $addCacheCode * * @return string, URL */ public function getUrl($ext, $file = NULL, $addCacheCode = FALSE) { if ($file === NULL) { $file = ''; } if ($addCacheCode) { $file .= '?r=' . $this->getCacheCode(); } // TODO consider caching results $base = $this->paths->hasVariable($ext) ? $this->paths->getVariable($ext, 'url') : $this->extMapper->keyToUrl($ext) . '/'; return $base . $file; }
/** * Run hooks in the payment processor class. * Load requested payment processor and call the method specified. * * @param CRM_Extension_Info $info * @param string $method * The method to call in the payment processor class. */ private function _runPaymentHook(CRM_Extension_Info $info, $method) { // Not concerned about performance at this stage, as these are seldom performed tasks // (payment processor enable/disable/install/uninstall). May wish to implement some // kind of registry/caching system if more hooks are added. try { $paymentClass = $this->mapper->keyToClass($info->key, 'payment'); $file = $this->mapper->classToPath($paymentClass); if (!file_exists($file)) { CRM_Core_Session::setStatus(ts('Failed to load file (%3) for payment processor (%1) while running "%2"', array(1 => $info->key, 2 => $method, 3 => $file)), '', 'error'); return; } else { require_once $file; } } catch (CRM_Extension_Exception $e) { CRM_Core_Session::setStatus(ts('Failed to determine file path for payment processor (%1) while running "%2"', array(1 => $info->key, 2 => $method)), '', 'error'); return; } $processorDAO = CRM_Core_DAO::executeQuery(" SELECT pp.id, ppt.class_name\n FROM civicrm_extension ext\n INNER JOIN civicrm_payment_processor_type ppt\n ON ext.name = ppt.name\n LEFT JOIN civicrm_payment_processor pp\n ON ppt.id = pp.payment_processor_type_id\n WHERE ext.type = 'payment'\n AND ext.full_name = %1\n ", array(1 => array($info->key, 'String'))); while ($processorDAO->fetch()) { $class_name = $processorDAO->class_name; $processor_id = $processorDAO->id; } if (empty($class_name)) { CRM_Core_Error::fatal("Unable to find payment processor in " . __CLASS__ . '::' . __METHOD__); } // In the case of uninstall, check for instances of PP first. // Don't run hook if any are found. if ($method == 'uninstall' && $processor_id > 0) { return; } switch ($method) { case 'install': case 'uninstall': case 'enable': case 'disable': // Instantiate PP - the getClass function allows us to do this when no payment processor instances exist. $processorInstance = Civi\Payment\System::singleton()->getByClass($class_name); // Does PP implement this method, and can we call it? if (method_exists($processorInstance, $method) && is_callable(array($processorInstance, $method))) { // If so, call it ... $processorInstance->{$method}(); } break; default: CRM_Core_Session::setStatus(ts("Unrecognized payment hook (%1) in %2::%3", array(1 => $method, 2 => __CLASS__, 3 => __METHOD__)), '', 'error'); } }
/** * @return \Composer\Autoload\ClassLoader * @throws \CRM_Extension_Exception * @throws \Exception */ public function buildClassLoader() { $loader = new \Composer\Autoload\ClassLoader(); $statuses = $this->manager->getStatuses(); foreach ($statuses as $key => $status) { if ($status !== CRM_Extension_Manager::STATUS_INSTALLED) { continue; } $path = $this->mapper->keyToBasePath($key); $info = $this->mapper->keyToInfo($key); if (!empty($info->classloader)) { foreach ($info->classloader as $mapping) { switch ($mapping['type']) { case 'psr4': $loader->setPsr4($mapping['prefix'], $path . '/' . $mapping['path']); break; } $result[] = $mapping; } } } return $loader; }