/**
  * Get error message
  *
  * @param string $validator
  * @param string $fieldName
  * @return string
  */
 public function getErrorMessage($validator = null, $fieldName = null)
 {
     if ($this->errorMessage != "") {
         if ($fieldName != "") {
             $this->errorMessage = str_replace($this->fieldNameMask, $fieldName, $this->errorMessage);
         }
         return $this->errorMessage;
     } else {
         $validator = str_replace('{@validate:', '', $validator);
         $pos1 = strpos($validator, '(');
         $type = substr($validator, 0, $pos1);
         switch ($type) {
             case "date":
                 return MessageHelper::getMessage("VALIDATESVC_DATE_INVALID", array($fieldName));
                 break;
             case "email":
                 return MessageHelper::getMessage("VALIDATESVC_EMAIL_INVALID", array($fieldName));
                 break;
             case "phone":
                 return MessageHelper::getMessage("VALIDATESVC_PHONE_INVALID", array($fieldName));
                 break;
             case "zip":
                 return MessageHelper::getMessage("VALIDATESVC_ZIP_INVALID", array($fieldName));
                 break;
             case "social":
                 return MessageHelper::getMessage("VALIDATESVC_SOCIAL_INVALID", array($fieldName));
                 break;
             case "credit":
                 return MessageHelper::getMessage("VALIDATESVC_CREDIT_INVALID", array($fieldName));
                 break;
             case "street":
                 return MessageHelper::getMessage("VALIDATESVC_STREET_INVALID", array($fieldName));
                 break;
             case "strongPassword":
                 return MessageHelper::getMessage("VALIDATESVC_PASSWORD_NOT_STRONG", array($fieldName));
                 break;
         }
         return MessageHelper::getMessage("VALIDATESVC_INVALID", array($fieldName));
     }
 }
 /**
  * Get openbiz template file path by searching modules/package, /templates
  *
  * @param string $className
  * @return string php library file path
  * */
 public static function getTplFileWithPath($templateFile, $packageName)
 {
     //for not changing a lot things, the best injection point is added theme support here.
     $theme = Openbiz::$app->getCurrentTheme();
     $themePath = $theme;
     // Openbiz::$app->getConfiguration()->GetThemePath($theme);
     if ($themePath) {
         $templateRoot = OPENBIZ_THEME_PATH . "/" . $themePath . "/template";
     } else {
         $templateRoot = SMARTY_TPL_PATH;
     }
     $names = explode(".", $packageName);
     if (count($names) > 0) {
         $moduleName = $names[0];
     }
     $packagePath = str_replace('.', '/', $packageName);
     // check the leading char '@'
     $checkExtModule = true;
     if (strpos($packagePath, '@') === 0) {
         $packagePath = substr($packagePath, 1);
         $checkExtModule = false;
     }
     $searchTpls = array(Openbiz::$app->getModulePath() . "/{$packagePath}/template/{$templateFile}", dirname(Openbiz::$app->getModulePath() . "/{$packagePath}") . "/template/{$templateFile}", Openbiz::$app->getModulePath() . "/{$moduleName}/template/{$templateFile}", $templateRoot . "/{$templateFile}");
     if ($checkExtModule && defined('MODULE_EX_PATH')) {
         array_unshift($searchTpls, MODULE_EX_PATH . "/{$packagePath}/template/{$templateFile}");
     }
     // device
     if (defined('OPENBIZ_CLIENT_DEVICE')) {
         array_unshift($searchTpls, Openbiz::$app->getModulePath() . "/{$moduleName}/template/" . OPENBIZ_CLIENT_DEVICE . "/{$templateFile}");
     }
     foreach ($searchTpls as $tplFile) {
         if (file_exists($tplFile)) {
             return $tplFile;
         }
     }
     $errmsg = MessageHelper::getMessage("UNABLE_TO_LOCATE_TEMPLATE_FILE", array($templateFile));
     trigger_error($errmsg, E_USER_ERROR);
     return null;
 }
 private function executeRpcMethod($objName, $methodName, $params)
 {
     $obj = Openbiz::getObject($objName);
     if ($obj) {
         if (method_exists($obj, $methodName)) {
             if (!$this->validateRequest($obj, $methodName)) {
                 $errmsg = MessageHelper::getMessage("SYS_ERROR_REQUEST_REJECT", array($obj->objectName, $methodName));
                 trigger_error($errmsg, E_USER_ERROR);
             }
             switch (count($params)) {
                 case 0:
                     $rt_val = $obj->{$methodName}();
                     break;
                 case 1:
                     $rt_val = $obj->{$methodName}($params[0]);
                     break;
                 case 2:
                     $rt_val = $obj->{$methodName}($params[0], $params[1]);
                     break;
                 case 3:
                     $rt_val = $obj->{$methodName}($params[0], $params[1], $params[2]);
                     break;
                 default:
                     $rt_val = call_user_func_array(array($obj, $methodName), $params);
             }
         } else {
             $errmsg = MessageHelper::getMessage("SYS_ERROR_METHODNOTFOUND", array($objName, $methodName));
             trigger_error($errmsg, E_USER_ERROR);
         }
     } else {
         $errmsg = MessageHelper::getMessage("SYS_ERROR_CLASSNOTFOUND", array($objName));
         trigger_error($errmsg, E_USER_ERROR);
     }
     $invocationType = $this->request->getInvocationType();
     if ($invocationType == "Invoke") {
         // no RPC invoke, page reloaded -> rerender view
         if ($this->getClientProxy()->hasOutput()) {
             $this->getClientProxy()->printOutput();
         }
     } else {
         if ($invocationType == "RPCInvoke") {
             // RPC invoke
             if ($this->getClientProxy()->hasOutput()) {
                 if ($_REQUEST['jsrs'] == 1) {
                     echo "<html><body><form name=\"jsrs_Form\"><textarea name=\"jsrs_Payload\" id=\"jsrs_Payload\">";
                 }
                 $this->getClientProxy()->printOutput();
                 if ($_REQUEST['jsrs'] == 1) {
                     echo "</textarea></form></body></html>";
                 }
             } else {
                 return $rt_val;
             }
         }
     }
 }