From b08b134db4948c9e4f7de097288f97aeaac3faa6 Mon Sep 17 00:00:00 2001 From: dheeyi william Date: Tue, 7 Feb 2017 11:33:10 -0400 Subject: [PATCH 01/11] HOR-2654 Execute-query doesn't work when a variable is not sent in the request --- workflow/engine/src/ProcessMaker/BusinessModel/Variable.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 5c2a08274..011370607 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -575,6 +575,11 @@ class Variable $cnn = \Propel::getConnection($dbConnection); $stmt = $cnn->createStatement(); + if (isset($arrayVariable['app_uid']) && !empty($arrayVariable['app_uid'])) { + $case = new \Cases(); + $fields = $case->loadCase($arrayVariable['app_uid']); + $arrayVariable = array_merge($fields['APP_DATA'], $arrayVariable); + } $replaceFields = G::replaceDataField($variableSql, $arrayVariable); $rs = $stmt->executeQuery($replaceFields, \ResultSet::FETCHMODE_NUM); From c8763b42053ca6a36763c1dc98cc585e9ae3e673 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Feb 2017 16:51:27 -0400 Subject: [PATCH 02/11] HOR-2710 --- workflow/engine/classes/class.pmDynaform.php | 31 +++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 09413f3bb..1fd224c00 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -181,6 +181,7 @@ class pmDynaform if (empty($json)) { return; } + $dataGridEnvironment = []; foreach ($json as $key => &$value) { $sw1 = is_array($value); $sw2 = is_object($value); @@ -259,6 +260,9 @@ class pmDynaform $dt = $parsed["SELECT"]; $isWhere = empty($where); + if ($isWhere === false) { + $where = substr_replace($where, " (", 5, 0) . ")"; + } if (!isset($json->queryField) && isset($dt[0]["base_expr"])) { $col = $dt[0]["base_expr"]; $dv = str_replace("'", "''", $json->defaultValue); @@ -628,6 +632,26 @@ class pmDynaform } //grid if ($key === "type" && ($value === "grid")) { + //todo compatibility 'columnWidth' + foreach ($json->columns as $column) { + if (!isset($column->columnWidth) && $column->type !== "hidden") { + $json->layout = "static"; + $column->columnWidth = ""; + } + $column->parentIsGrid = true; + } + //data grid environment + $json->dataGridEnvironment = "onDataGridEnvironment"; + if (isset($this->fields["APP_DATA"])) { + $dataGridEnvironment = $this->fields["APP_DATA"]; + $this->fields["APP_DATA"] = []; + } + } + if ($key === "dataGridEnvironment" && ($value === "onDataGridEnvironment")) { + if (isset($this->fields["APP_DATA"])) { + $this->fields["APP_DATA"] = $dataGridEnvironment; + $dataGridEnvironment = []; + } if (isset($this->fields["APP_DATA"][$json->name])) { //rows $rows = $this->fields["APP_DATA"][$json->name]; @@ -648,13 +672,6 @@ class pmDynaform $json->rows = count($rows); $json->data = $rows; } - //todo compatibility 'columnWidth' - foreach ($json->columns as $column) { - if (!isset($column->columnWidth) && $column->type !== "hidden") { - $json->layout = "static"; - $column->columnWidth = ""; - } - } } //languages if ($this->lang === null && $key === "language" && isset($json->language)) { From 938c8ab5d5722722b79a4ee59c63d40148e36157 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Mon, 20 Feb 2017 14:26:32 -0400 Subject: [PATCH 03/11] HOR-2714 --- workflow/engine/classes/class.case.php | 7 +++--- .../ProcessMaker/BusinessModel/Variable.php | 23 ++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index fd49b293b..13a486231 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -483,7 +483,6 @@ class Cases try { $oUser->load($oApp->getAppInitUser()); $uFields = $oUser->toArray(BasePeer::TYPE_FIELDNAME); - //$aFields['TITLE'] = $oApp->getAppTitle(); $aFields['TITLE'] = $aFields['APP_TITLE']; $aFields['DESCRIPTION'] = $aFields['APP_DESCRIPTION']; $aFields['CREATOR'] = $oUser->getUsrFirstname() . ' ' . $oUser->getUsrLastname(); @@ -514,10 +513,10 @@ class Cases $aFields['DEL_TASK_DUE_DATE'] = $aAppDel['DEL_TASK_DUE_DATE']; $aFields['DEL_FINISH_DATE'] = $aAppDel['DEL_FINISH_DATE']; $aFields['CURRENT_USER_UID'] = $aAppDel['USR_UID']; + //Update the global variables + $aFields['TASK'] = $aAppDel['TAS_UID']; + $aFields['INDEX'] = $aAppDel['DEL_INDEX']; try { - //$oCurUser = new Users(); - //$oCurUser->load($aAppDel['USR_UID']); - //$aFields['CURRENT_USER'] = $oCurUser->getUsrFirstname() . ' ' . $oCurUser->getUsrLastname(); $oCurUser = new Users(); if ($jump != '') { $aCases = $oAppDel->LoadParallel($sAppUid); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 011370607..eadf828a9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -576,9 +576,30 @@ class Variable $stmt = $cnn->createStatement(); if (isset($arrayVariable['app_uid']) && !empty($arrayVariable['app_uid'])) { + $delIndex = isset($arrayVariable["del_index"]) ? $arrayVariable["del_index"] : 0; $case = new \Cases(); - $fields = $case->loadCase($arrayVariable['app_uid']); + $fields = $case->loadCase($arrayVariable['app_uid'], (int) $delIndex); $arrayVariable = array_merge($fields['APP_DATA'], $arrayVariable); + + //Set the global variables + if (!isset($arrayVariable['APPLICATION']) || empty($arrayVariable['APPLICATION'])) { + $arrayVariable['APPLICATION'] = $arrayVariable['app_uid']; + } + if (!isset($arrayVariable['PROCESS']) || empty($arrayVariable['PROCESS'])) { + $arrayVariable['PROCESS'] = $fields['PRO_UID']; + } + if (isset($fields['TASK']) && !empty($fields['TASK'])) { + $arrayVariable['TASK'] = $fields['TASK']; + } + if (isset($fields['INDEX']) && !empty($fields['INDEX'])) { + $arrayVariable['INDEX'] = $fields['INDEX']; + } + $arrayVariable['USER_LOGGED'] = \ProcessMaker\Services\OAuth2\Server::getUserId(); + if (isset($arrayVariable['USER_LOGGED']) && !empty($arrayVariable['USER_LOGGED'])) { + $oUserLogged = new \Users(); + $oUserLogged->load($arrayVariable['USER_LOGGED']); + $arrayVariable['USR_USERNAME'] = $oUserLogged->getUsrUsername(); + } } $replaceFields = G::replaceDataField($variableSql, $arrayVariable); From 56cf190ee109bd671c0dc204b5c19d63185891ea Mon Sep 17 00:00:00 2001 From: william barra Date: Wed, 22 Feb 2017 12:13:16 -0400 Subject: [PATCH 04/11] HOR-2758 Create a new EndPoint to get the Pre-Processed Dynaform Definition for Mobile --- workflow/engine/classes/class.pmDynaform.php | 1 + .../src/ProcessMaker/BusinessModel/Cases.php | 34 +++++++++++++++++++ .../src/ProcessMaker/Services/Api/Light.php | 34 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index a3dc3f43d..e7bf6bec9 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -254,6 +254,7 @@ class pmDynaform } } } + $dtFields = array_merge($this->fields['APP_DATA'], $dtFields); $sql = G::replaceDataField($json->sql, $dtFields); if ($value === "suggest") { $sql = $this->sqlParse($sql, function($parsed, &$select, &$from, &$where, &$groupBy, &$having, &$orderBy, &$limit) use ($json) { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 172feefbf..c73b6e9ff 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -3307,4 +3307,38 @@ class Cases return $arrayAccess; } + + /** + * Get Global System Variables + * @param array $appData + * @param array $dataVariable + * @return array + * @throws \Exception + */ + public static function getGlobalVariables($appData = array(), $dataVariable = array()) + { + $appData = array_change_key_case($appData, CASE_UPPER); + $dataVariable = array_change_key_case($dataVariable, CASE_UPPER); + + if (!isset($dataVariable['APPLICATION']) || empty($dataVariable['APPLICATION'])) { + $dataVariable['APPLICATION'] = (isset($dataVariable['APP_UID']) && $dataVariable['APP_UID'] != '') ? $dataVariable['APP_UID'] : $appData['APPLICATION']; + } + if (!isset($dataVariable['PROCESS']) || empty($dataVariable['PROCESS'])) { + $dataVariable['PROCESS'] = (isset($dataVariable['PRO_UID']) && $dataVariable['PRO_UID'] != '') ? $dataVariable['PRO_UID'] : $appData['PROCESS']; + } + if (isset($appData['TASK']) && !empty($appData['TASK'])) { + $dataVariable['TASK'] = $appData['TASK']; + } + if (isset($appData['INDEX']) && !empty($appData['INDEX'])) { + $dataVariable['INDEX'] = $appData['INDEX']; + } + $dataVariable['USER_LOGGED'] = \ProcessMaker\Services\OAuth2\Server::getUserId(); + if (isset($dataVariable['USER_LOGGED']) && !empty($dataVariable['USER_LOGGED'])) { + $oUserLogged = new \Users(); + $oUserLogged->load($dataVariable['USER_LOGGED']); + $dataVariable['USR_USERNAME'] = $oUserLogged->getUsrUsername(); + } + + return $dataVariable; + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 32757d56a..3d8750a74 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -970,6 +970,40 @@ class Light extends Api return $response; } + /** + * @url GET /project/:prj_uid/dynaformprocessed/:dyn_uid + * + * @param string $dyn_uid {@min 32}{@max 32} + * @param string $prj_uid {@min 32}{@max 32} + */ + public function doGetDynaformProcessed($prj_uid, $dyn_uid, $app_uid = null, $del_index = 0) + { + try { + $dynaForm = new \ProcessMaker\BusinessModel\DynaForm(); + $dynaForm->setFormatFieldNameInUppercase(false); + $_SESSION['PROCESS'] = $prj_uid; + $response = $dynaForm->getDynaForm($dyn_uid); + $result = $this->parserDataDynaForm($response); + $result['formContent'] = (isset($result['formContent']) && $result['formContent'] != null) ? + \G::json_decode($result['formContent']) : ""; + + $caseVariables = array(); + if (!is_null($app_uid)) { + $case = new \Cases(); + $fields = $case->loadCase($app_uid, $del_index); + $caseVariables = array_merge($fields['APP_DATA'], + \ProcessMaker\BusinessModel\Cases::getGlobalVariables($fields['APP_DATA'])); + } + + \G::LoadClass("pmDynaform"); + $pmDynaform = new \pmDynaform(array("APP_DATA" => $caseVariables, "CURRENT_DYNAFORM" => $dyn_uid)); + $pmDynaform->jsonr($result['formContent']); + return $result; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + /** * @url GET /project/:prj_uid/dynaform/:dyn_uid * From e4aea533c0a38f78717526d939baecf0fdd9ebc5 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 23 Feb 2017 16:47:44 -0400 Subject: [PATCH 05/11] HOR-2778 --- .../ProcessMaker/BusinessModel/Variable.php | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index eadf828a9..fac3bf41e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -574,36 +574,15 @@ class Variable $cnn = \Propel::getConnection($dbConnection); $stmt = $cnn->createStatement(); - if (isset($arrayVariable['app_uid']) && !empty($arrayVariable['app_uid'])) { $delIndex = isset($arrayVariable["del_index"]) ? $arrayVariable["del_index"] : 0; $case = new \Cases(); $fields = $case->loadCase($arrayVariable['app_uid'], (int) $delIndex); - $arrayVariable = array_merge($fields['APP_DATA'], $arrayVariable); - - //Set the global variables - if (!isset($arrayVariable['APPLICATION']) || empty($arrayVariable['APPLICATION'])) { - $arrayVariable['APPLICATION'] = $arrayVariable['app_uid']; - } - if (!isset($arrayVariable['PROCESS']) || empty($arrayVariable['PROCESS'])) { - $arrayVariable['PROCESS'] = $fields['PRO_UID']; - } - if (isset($fields['TASK']) && !empty($fields['TASK'])) { - $arrayVariable['TASK'] = $fields['TASK']; - } - if (isset($fields['INDEX']) && !empty($fields['INDEX'])) { - $arrayVariable['INDEX'] = $fields['INDEX']; - } - $arrayVariable['USER_LOGGED'] = \ProcessMaker\Services\OAuth2\Server::getUserId(); - if (isset($arrayVariable['USER_LOGGED']) && !empty($arrayVariable['USER_LOGGED'])) { - $oUserLogged = new \Users(); - $oUserLogged->load($arrayVariable['USER_LOGGED']); - $arrayVariable['USR_USERNAME'] = $oUserLogged->getUsrUsername(); - } + $arrayVariable = array_merge($fields['APP_DATA'], \ProcessMaker\BusinessModel\Cases::getGlobalVariables($fields['APP_DATA'])); } - $replaceFields = G::replaceDataField($variableSql, $arrayVariable); + $sql = G::replaceDataField($variableSql, $arrayVariable); - $rs = $stmt->executeQuery($replaceFields, \ResultSet::FETCHMODE_NUM); + $rs = $stmt->executeQuery($sql, \ResultSet::FETCHMODE_NUM); while ($rs->next()) { $row = $rs->getRow(); @@ -742,6 +721,8 @@ class Variable $fields = $case->getApplicationRecordByPk($arrayVariable['app_uid'], ['$applicationUid' => 'app_uid']); $case = new \Cases(); $appData = $case->unserializeData($fields['APP_DATA']); + $appData = array_merge($appData, \ProcessMaker\BusinessModel\Cases::getGlobalVariables($appData)); + $arrayVariable = array_merge($appData, $arrayVariable); } $_SESSION["PROCESS"] = $processUid; \G::LoadClass("pmDynaform"); From 3400d65531ba78c7e2d424e3b4f206655d423bcc Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Mon, 6 Mar 2017 11:00:37 -0400 Subject: [PATCH 06/11] HOR-2768 --- workflow/engine/classes/class.pmDynaform.php | 25 +-- .../ProcessMaker/BusinessModel/Variable.php | 150 ++++++++++-------- 2 files changed, 96 insertions(+), 79 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 9feb9717c..348a9d710 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -196,8 +196,7 @@ class pmDynaform $fn($json, $key, $value); } //set properties from trigger - $prefixs = self::$prefixs; - if (is_string($value) && in_array(substr($value, 0, 2), $prefixs)) { + if (is_string($value) && in_array(substr($value, 0, 2), self::$prefixs)) { $triggerValue = substr($value, 2); if (isset($this->fields["APP_DATA"][$triggerValue])) { if (!in_array($key, $this->propertiesToExclude)) { @@ -255,7 +254,6 @@ class pmDynaform } } } - $dtFields = array_merge($this->fields['APP_DATA'], $dtFields); $sql = G::replaceDataField($json->sql, $dtFields); if ($value === "suggest") { $sql = $this->sqlParse($sql, function($parsed, &$select, &$from, &$where, &$groupBy, &$having, &$orderBy, &$limit) use ($json) { @@ -268,7 +266,9 @@ class pmDynaform if (!isset($json->queryField) && isset($dt[0]["base_expr"])) { $col = $dt[0]["base_expr"]; $dv = str_replace("'", "''", $json->defaultValue); - $where = $isWhere ? "WHERE " . $col . "='" . $dv . "'" : $where . " AND " . $col . "='" . $dv . "'"; + if ($dv !== "") { + $where = $isWhere ? "WHERE " . $col . "='" . $dv . "'" : $where . " AND " . $col . "='" . $dv . "'"; + } } if (isset($json->queryField) && isset($dt[0]["base_expr"])) { $col = isset($dt[1]["base_expr"]) ? $dt[1]["base_expr"] : $dt[0]["base_expr"]; @@ -723,9 +723,9 @@ class pmDynaform } $data = array(); if (isset($json->dbConnection) && isset($json->sql)) { - $salida = array(); - preg_match_all('/\@(?:([\@\%\#\=\!Qq])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*?)*)\))/', $json->sql, $salida, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE); - $variables = isset($salida[2]) ? $salida[2] : array(); + $result = array(); + preg_match_all('/\@(?:([\@\%\#\=\!Qq])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*?)*)\))/', $json->sql, $result, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE); + $variables = isset($result[2]) ? $result[2] : array(); foreach ($variables as $key => $value) { $jsonSearch = $this->jsonsf(G::json_decode($this->record["DYN_CONTENT"]), $value[0], $json->variable === "" ? "id" : "variable"); $a = $this->getValuesDependentFields($jsonSearch); @@ -734,8 +734,15 @@ class pmDynaform } } if ($json->dbConnection !== "" && $json->dbConnection !== "none" && $json->sql !== "") { - $a = G::replaceDataField($json->sql, $data); - $dt = $this->getCacheQueryData($json->dbConnection, $a, $json->type); + if (isset($this->fields["APP_DATA"])) { + foreach ($this->fields["APP_DATA"] as $keyA => $valueA) { + if (!isset($data[$keyA]) && !is_array($valueA)) { + $data[$keyA] = $valueA; + } + } + } + $sql = G::replaceDataField($json->sql, $data); + $dt = $this->getCacheQueryData($json->dbConnection, $sql, $json->type); $row = isset($dt[0]) ? $dt[0] : []; if (isset($row[0]) && $json->type !== "suggest" && $json->type !== "radio") { $data[$json->variable === "" ? $json->id : $json->variable] = $row[0]; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index fac3bf41e..bd7d249f5 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -552,49 +552,7 @@ class Variable public function executeSql($processUid, $variableName, array $arrayVariable = array()) { try { - $arrayRecord = array(); - - //Verify data - $process = new \ProcessMaker\BusinessModel\Process(); - - $process->throwExceptionIfNotExistsProcess($processUid, strtolower("PRJ_UID")); - - //Set data - \G::LoadClass('pmDynaform'); - $pmDynaform = new \pmDynaform(); - $field = $pmDynaform->searchField($arrayVariable["dyn_uid"], $arrayVariable["field_id"], $processUid); - $dbConnection = "workflow"; - if ($field !== null && !empty($field->dbConnection)) { - $dbConnection = $field->dbConnection; - } - $variableSql = $field !== null ? $field->sql : ""; - - //Get data - $_SESSION["PROCESS"] = $processUid; - - $cnn = \Propel::getConnection($dbConnection); - $stmt = $cnn->createStatement(); - if (isset($arrayVariable['app_uid']) && !empty($arrayVariable['app_uid'])) { - $delIndex = isset($arrayVariable["del_index"]) ? $arrayVariable["del_index"] : 0; - $case = new \Cases(); - $fields = $case->loadCase($arrayVariable['app_uid'], (int) $delIndex); - $arrayVariable = array_merge($fields['APP_DATA'], \ProcessMaker\BusinessModel\Cases::getGlobalVariables($fields['APP_DATA'])); - } - $sql = G::replaceDataField($variableSql, $arrayVariable); - - $rs = $stmt->executeQuery($sql, \ResultSet::FETCHMODE_NUM); - - while ($rs->next()) { - $row = $rs->getRow(); - - $arrayRecord[] = array( - strtolower("VALUE") => $row[0], - strtolower("TEXT") => isset($row[1]) ? $row[1] : $row[0] - ); - } - - //Return - return $arrayRecord; + return $this->executeSqlControl($processUid, $arrayVariable); } catch (\Exception $e) { throw $e; } @@ -715,33 +673,7 @@ class Variable public function executeSqlSuggest($processUid, $variableName, array $arrayVariable = array()) { try { - $appData = array(); - if (isset($arrayVariable['app_uid'])) { - $case = new \ProcessMaker\BusinessModel\Cases(); - $fields = $case->getApplicationRecordByPk($arrayVariable['app_uid'], ['$applicationUid' => 'app_uid']); - $case = new \Cases(); - $appData = $case->unserializeData($fields['APP_DATA']); - $appData = array_merge($appData, \ProcessMaker\BusinessModel\Cases::getGlobalVariables($appData)); - $arrayVariable = array_merge($appData, $arrayVariable); - } - $_SESSION["PROCESS"] = $processUid; - \G::LoadClass("pmDynaform"); - $pmDynaform = new \pmDynaform(array("APP_DATA" => $appData)); - $field = $pmDynaform->searchField($arrayVariable["dyn_uid"], $arrayVariable["field_id"], $processUid); - $field->queryField = true; - $field->queryInputData = $arrayVariable; - $field->queryFilter = isset($arrayVariable["filter"]) ? $arrayVariable["filter"] : ""; - $field->queryStart = isset($arrayVariable["start"]) ? $arrayVariable["start"] : 0; - $field->queryLimit = isset($arrayVariable["limit"]) ? $arrayVariable["limit"] : 10; - $pmDynaform->jsonr($field); - - $result = array(); - if (isset($field->queryOutputData) && is_array($field->queryOutputData)) { - foreach ($field->queryOutputData as $item) { - $result[] = ["value" => $item->value, "text" => $item->label]; - } - } - return $result; + return $this->executeSqlControl($processUid, $arrayVariable); } catch (\Exception $e) { throw $e; } @@ -825,4 +757,82 @@ class Variable } return $vType; } + + /** + * Executes the sql string of a control and returns the data in the queryOutputData + * property of the control. The control returned by the pmDynaform :: searchField + * function is the php representation of the json definition, which can be + * supported by the pmDynaform :: jsonr function. + * The params parameter must contain: dyn_uid, field_id and optionally + * app_uid, del_index, filter, start, limit, and so many related control variables + * to be sent and their corresponding value. + * The parameters: filter, start and limit, are only necessary for the suggest + * control. + * If app_uid is not sent you can not get the appData in an environment where + * only endPoint is used, it is always advisable to send the app_uid and _index. + * Note: You do not get triguer execution values where only endPoint is used. + * @param type $proUid + * @param array $params + * @return array + * @throws \Exception + */ + public function executeSqlControl($proUid, array $params = array()) + { + try { + //Get and clear vector data that does not correspond to variables + //related to a control. + $dynUid = $params["dyn_uid"]; + $fieldId = $params["field_id"]; + $filter = isset($params["filter"]) ? $params["filter"] : ""; + $start = isset($params["start"]) ? $params["start"] : 0; + $limit = isset($params["limit"]) ? $params["limit"] : 10; + $appUid = empty($params["app_uid"]) ? null : $params["app_uid"]; + $delIndex = (int) isset($params["del_index"]) ? $params["del_index"] : 0; + unset($params["dyn_uid"]); + unset($params["field_id"]); + unset($params["app_uid"]); + unset($params["del_index"]); + unset($params["filter"]); + unset($params["start"]); + unset($params["limit"]); + + //Get appData and system variables + if ($appUid !== null) { + $case = new \Cases(); + $fields = $case->loadCase($appUid, $delIndex); + $appData = $fields["APP_DATA"]; + $appData = array_merge($appData, \ProcessMaker\BusinessModel\Cases::getGlobalVariables($appData)); + $params = array_merge($params, $appData); + } + + //This value is required to be able to query the database. + $_SESSION["PROCESS"] = $proUid; + //The pmdynaform class is instantiated + \G::LoadClass("pmDynaform"); + $pmDynaform = new \pmDynaform(array("APP_DATA" => $params)); + + //Get control from dynaform. + //The parameters: queryFilter, queryStart, queryLimit, are only necessary + //for the suggest control, the rest of the controls are ignored. + $field = $pmDynaform->searchField($dynUid, $fieldId, $proUid); + $field->queryField = true; + $field->queryInputData = $params; + $field->queryFilter = $filter; + $field->queryStart = $start; + $field->queryLimit = $limit; + + //Populate control data + $pmDynaform->jsonr($field); + $result = array(); + if (isset($field->queryOutputData) && is_array($field->queryOutputData)) { + foreach ($field->queryOutputData as $item) { + $result[] = ["value" => $item->value, "text" => $item->label]; + } + } + return $result; + } catch (\Exception $e) { + throw $e; + } + } + } From 8aedee9e64a8588eaefd131b8e363265ac20810d Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 7 Mar 2017 10:43:00 -0400 Subject: [PATCH 07/11] HOR-2758-A --- workflow/engine/classes/class.pmDynaform.php | 41 +++++++++++++++++++ .../src/ProcessMaker/Services/Api/Light.php | 1 + 2 files changed, 42 insertions(+) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 348a9d710..caa9c904c 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -2139,4 +2139,45 @@ class pmDynaform return defined("LEAVE_CASE_WARNING") ? LEAVE_CASE_WARNING : 0; } + /** + * Unset a json property from the following controls: text, textarea, dropdown, + * checkbox, checkgroup, radio, datetime, suggest, hidden, file, grid. + * @param stdClass $json + * @param string $property + * @return void + */ + public function jsonUnsetProperty(&$json, $property) + { + if (empty($json)) { + return; + } + foreach ($json as $key => &$value) { + $sw1 = is_array($value); + $sw2 = is_object($value); + if ($sw1 || $sw2) { + $this->jsonUnsetProperty($value, $property); + } + if (!$sw1 && !$sw2) { + if ($key === "type" && ( + $value === "text" || + $value === "textarea" || + $value === "dropdown" || + $value === "checkbox" || + $value === "checkgroup" || + $value === "radio" || + $value === "datetime" || + $value === "suggest" || + $value === "hidden" || + $value === "file" || + $value === "grid")) { + if ($value === "grid" && $property === "data") { + $json->{$property} = []; + } else { + unset($json->{$property}); + } + } + } + } + } + } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index cb7f0f76d..98bfe07ac 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -998,6 +998,7 @@ class Light extends Api \G::LoadClass("pmDynaform"); $pmDynaform = new \pmDynaform(array("APP_DATA" => $caseVariables, "CURRENT_DYNAFORM" => $dyn_uid)); $pmDynaform->jsonr($result['formContent']); + $pmDynaform->jsonUnsetProperty($result['formContent'], "data"); return $result; } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); From 8d2e827d267ed19e6803927aad8ff8f18b0122a9 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 9 Mar 2017 11:12:09 -0400 Subject: [PATCH 08/11] HOR-2818 --- workflow/engine/classes/class.pmDynaform.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index caa9c904c..c8bbdd065 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -634,6 +634,7 @@ class pmDynaform } //grid if ($key === "type" && ($value === "grid")) { + $columnsDataVariable = []; //todo compatibility 'columnWidth' foreach ($json->columns as $column) { if (!isset($column->columnWidth) && $column->type !== "hidden") { @@ -641,12 +642,27 @@ class pmDynaform $column->columnWidth = ""; } $column->parentIsGrid = true; + //save dataVariable value, only for columns control + if (!empty($column->dataVariable) && is_string($column->dataVariable)) { + if (in_array(substr($column->dataVariable, 0, 2), self::$prefixs)) { + $dataVariableValue = substr($column->dataVariable, 2); + if (!in_array($dataVariableValue, $columnsDataVariable)) { + $columnsDataVariable[] = $dataVariableValue; + } + } + } } //data grid environment $json->dataGridEnvironment = "onDataGridEnvironment"; if (isset($this->fields["APP_DATA"])) { $dataGridEnvironment = $this->fields["APP_DATA"]; $this->fields["APP_DATA"] = []; + //restore AppData with dataVariable definition, only for columns control + foreach ($columnsDataVariable as $dge) { + if (isset($dataGridEnvironment[$dge])) { + $this->fields["APP_DATA"][$dge] = $dataGridEnvironment[$dge]; + } + } } } if ($key === "dataGridEnvironment" && ($value === "onDataGridEnvironment")) { From 2c16e2f351dae64faa8f442676731e5dfa4e0f19 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 9 Mar 2017 12:29:53 -0400 Subject: [PATCH 09/11] HOR-2826 --- workflow/engine/src/ProcessMaker/BusinessModel/Variable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index bd7d249f5..b30cbb274 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -802,7 +802,7 @@ class Variable $fields = $case->loadCase($appUid, $delIndex); $appData = $fields["APP_DATA"]; $appData = array_merge($appData, \ProcessMaker\BusinessModel\Cases::getGlobalVariables($appData)); - $params = array_merge($params, $appData); + $params = array_merge($appData, $params); } //This value is required to be able to query the database. From 2744516933dc2cc064f0b3babff4ea30e60d81ce Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 9 Mar 2017 15:42:54 -0400 Subject: [PATCH 10/11] HOR-2758-B --- workflow/engine/src/ProcessMaker/Services/Api/Light.php | 1 - 1 file changed, 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 98bfe07ac..cb7f0f76d 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -998,7 +998,6 @@ class Light extends Api \G::LoadClass("pmDynaform"); $pmDynaform = new \pmDynaform(array("APP_DATA" => $caseVariables, "CURRENT_DYNAFORM" => $dyn_uid)); $pmDynaform->jsonr($result['formContent']); - $pmDynaform->jsonUnsetProperty($result['formContent'], "data"); return $result; } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); From c222d66acb4ce96e06f5a6775f379b904b7f4ad1 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 10 Mar 2017 16:36:55 -0400 Subject: [PATCH 11/11] HOR-2833 --- workflow/engine/classes/class.pmDynaform.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index c8bbdd065..500bb6be1 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -577,6 +577,17 @@ class pmDynaform $json->inputDocuments = array($row["INP_DOC_UID"]); } } + if ($key === "type" && ($value === "multipleFile")) { + $json->data = new stdClass(); + $json->data->value = ""; + $json->data->label = ""; + if (isset($this->fields["APP_DATA"][$json->name])) { + $json->data->value = $this->fields["APP_DATA"][$json->name]; + } + if (isset($this->fields["APP_DATA"][$json->name . "_label"])) { + $json->data->label = $this->fields["APP_DATA"][$json->name . "_label"]; + } + } //synchronize var_label if ($key === "type" && ($value === "dropdown" || $value === "suggest" || $value === "radio")) { if (isset($this->fields["APP_DATA"]["__VAR_CHANGED__"]) && in_array($json->name, explode(",", $this->fields["APP_DATA"]["__VAR_CHANGED__"]))) { @@ -678,7 +689,7 @@ class pmDynaform $cells = array(); foreach ($json->columns as $column) { //data - if ($column->type === "text" || $column->type === "textarea" || $column->type === "dropdown" || $column->type === "suggest" || $column->type === "datetime" || $column->type === "checkbox" || $column->type === "file" || $column->type === "link" || $column->type === "hidden") { + if ($column->type === "text" || $column->type === "textarea" || $column->type === "dropdown" || $column->type === "suggest" || $column->type === "datetime" || $column->type === "checkbox" || $column->type === "file" || $column->type === "multipleFile" || $column->type === "link" || $column->type === "hidden") { array_push($cells, array( "value" => isset($row[$column->name]) ? $row[$column->name] : "", "label" => isset($row[$column->name . "_label"]) ? $row[$column->name . "_label"] : (isset($row[$column->name]) ? $row[$column->name] : "")