BxDolRequest.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. define('BX_DOL_REQUEST_ERROR_MODULE_NOT_FOUND', 1);
  10. define('BX_DOL_REQUEST_ERROR_PAGE_NOT_FOUND', 2);
  11. class BxDolRequest extends BxDol
  12. {
  13. function __construct()
  14. {
  15. parent::__construct();
  16. }
  17. public static function processAsFile($aModule, &$aRequest)
  18. {
  19. if(empty($aRequest) || ($sFileName = array_shift($aRequest)) == "")
  20. $sFileName = 'index';
  21. $sFile = BX_DIRECTORY_PATH_MODULES . $aModule['path'] . $sFileName . '.php';
  22. if(!file_exists($sFile))
  23. BxDolRequest::pageNotFound($sFileName, $aModule['uri']);
  24. else {
  25. if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->beginModule('file', ($sPrHash = uniqid(rand())), $aModule, $sFileName);
  26. include($sFile);
  27. if (isset($GLOBALS['bx_profiler'])) $GLOBALS['bx_profiler']->endModule('file', $sPrHash);
  28. }
  29. }
  30. public static function processAsAction($aModule, &$aRequest, $sClass = "Module")
  31. {
  32. $sAction = empty($aRequest) || (isset($aRequest[0]) && empty($aRequest[0])) ? 'Home' : array_shift($aRequest);
  33. $sMethod = 'action' . bx_gen_method_name($sAction);
  34. if(isset($GLOBALS['bx_profiler']))
  35. $GLOBALS['bx_profiler']->beginModule('action', ($sPrHash = uniqid(rand())), $aModule, $sClass, $sMethod);
  36. $mixedRet = BxDolRequest::_perform($aModule, $sClass, $sMethod, $aRequest);
  37. if(isset($GLOBALS['bx_profiler']))
  38. $GLOBALS['bx_profiler']->endModule('action', $sPrHash);
  39. return $mixedRet;
  40. }
  41. public static function processAsService($aModule, $sMethod, $aParams, $sClass = "Module")
  42. {
  43. if (isset($aModule['name']) && 'system' == $aModule['name'] && 'Module' == $sClass)
  44. $sClass = 'BaseServices';
  45. $sMethod = 'service' . bx_gen_method_name($sMethod);
  46. if(isset($GLOBALS['bx_profiler']))
  47. $GLOBALS['bx_profiler']->beginModule('service', ($sPrHash = uniqid(rand())), $aModule, $sClass, $sMethod);
  48. $mixedRet = BxDolRequest::_perform($aModule, $sClass, $sMethod, $aParams, false);
  49. if(isset($GLOBALS['bx_profiler']))
  50. $GLOBALS['bx_profiler']->endModule('service', $sPrHash);
  51. return $mixedRet;
  52. }
  53. public static function serviceExists($mixedModule, $sMethod, $sClass = "Module", $bIgnoreInactive = false)
  54. {
  55. return BxDolRequest::_methodExists($mixedModule, 'service', $sMethod, $sClass, $bIgnoreInactive);
  56. }
  57. public static function actionExists($mixedModule, $sMethod, $sClass = "Module")
  58. {
  59. return BxDolRequest::_methodExists($mixedModule, 'action', $sMethod, $sClass);
  60. }
  61. public static function moduleNotFound($sModule)
  62. {
  63. BxDolRequest::_error('module', $sModule);
  64. }
  65. public static function pageNotFound($sPage, $sModule)
  66. {
  67. BxDolRequest::_error('page', $sPage, $sModule);
  68. }
  69. public static function methodNotFound($sMethod, $sModule)
  70. {
  71. BxDolRequest::_error('method', $sMethod, $sModule);
  72. }
  73. /**
  74. * Check if number of arguments is not less than number of requires arguments
  75. * @return 0 - if number of args is correct
  76. * 1 - if method or class wasn't found
  77. * 2 - if number of args less than number of required arguments
  78. * 3 - if number of args more than number of optional + required arguments
  79. */
  80. public static function checkCall($aModule, $sMethod, $aParams, $sClass)
  81. {
  82. if (isset($aModule['name']) && 'system' == $aModule['name'] && 'Module' == $sClass)
  83. $sClass = 'BaseServices';
  84. $sMethod = 'service' . bx_gen_method_name($sMethod);
  85. $sClass = $aModule['class_prefix'] . $sClass;
  86. $oModule = BxDolRequest::_require($aModule, $sClass);
  87. if($oModule === false)
  88. return 1;
  89. $iArgs = count($aParams);
  90. $r = new ReflectionMethod($sClass, $sMethod);
  91. $iArgsRequired = $r->getNumberOfRequiredParameters();
  92. if ($iArgs < $iArgsRequired)
  93. return 2;
  94. $iArgsAll = $r->getNumberOfParameters();
  95. if ($iArgs > $iArgsAll)
  96. return 3;
  97. return 0;
  98. }
  99. protected static function _perform($aModule, $sClass, $sMethod, $aParams, $bTerminateOnError = true)
  100. {
  101. $sClass = $aModule['class_prefix'] . $sClass;
  102. $oModule = BxDolRequest::_require($aModule, $sClass);
  103. if($oModule === false && $bTerminateOnError)
  104. BxDolRequest::methodNotFound($sMethod, $aModule['uri']);
  105. else if($oModule === false && !$bTerminateOnError)
  106. return false;
  107. $bMethod = method_exists($oModule, $sMethod);
  108. if($bMethod)
  109. return call_user_func_array(array($oModule, $sMethod), $aParams);
  110. else if(!$bMethod && $bTerminateOnError)
  111. BxDolRequest::methodNotFound($sMethod, $aModule['uri']);
  112. else if(!$bMethod && !$bTerminateOnError)
  113. return false;
  114. }
  115. protected static function _require($aModule, $sClass)
  116. {
  117. if(isset($GLOBALS['bxDolClasses'][$sClass]))
  118. return $GLOBALS['bxDolClasses'][$sClass];
  119. $bPath = $aModule['name'] != 'system' && $aModule['path'];
  120. if(($bPath && !preg_match('/^[A-Za-z0-9_]+\/[A-Za-z0-9_]+\/$/', $aModule['path'])) || !preg_match('/^[A-Za-z0-9_]+$/', $sClass))
  121. return false;
  122. if($bPath) {
  123. $sFile = BX_DIRECTORY_PATH_MODULES . $aModule['path'] . 'classes/' . $sClass . '.php';
  124. if(!file_exists($sFile))
  125. return false;
  126. require_once($sFile);
  127. }
  128. if(!class_exists($sClass))
  129. return false;
  130. $GLOBALS['bxDolClasses'][$sClass] = new $sClass($aModule);
  131. return $GLOBALS['bxDolClasses'][$sClass];
  132. }
  133. protected static function _methodExists($mixedModule, $sMethodType, $sMethodName, $sClass = "Module", $bIgnoreInactive = false)
  134. {
  135. $aModule = $mixedModule;
  136. if(is_string($mixedModule)) {
  137. $oModuleQuery = BxDolModuleQuery::getInstance();
  138. $aModule = [];
  139. if($bIgnoreInactive || $oModuleQuery->isEnabledByName($mixedModule))
  140. $aModule = $oModuleQuery->getModuleByName($mixedModule);
  141. }
  142. if (!$aModule)
  143. return false;
  144. if (isset($aModule['name']) && 'system' == $aModule['name'] && 'Module' == $sClass)
  145. $sClass = 'BaseServices';
  146. $sClass = $aModule['class_prefix'] . $sClass;
  147. if(($oModule = BxDolRequest::_require($aModule, $sClass)) === false)
  148. return false;
  149. $sMethod = $sMethodType . bx_gen_method_name($sMethodName);
  150. return method_exists($oModule, $sMethod);
  151. }
  152. protected static function _error($sType, $sParam1 = '', $sParam2 = '')
  153. {
  154. BxDolTemplate::getInstance()->displayPageNotFound(array(
  155. 'title' => _t("_sys_request_" . $sType . "_not_found_cpt"),
  156. 'content' => _t("_sys_request_" . $sType . "_not_found_cnt", bx_process_output($sParam1), bx_process_output($sParam2))
  157. ), BX_PAGE_DEFAULT, BX_DB_PADDING_NO_CAPTION);
  158. }
  159. }
  160. /** @} */