From bc9dadc51763afa0c0680ae0ba50868d5d499874 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Fri, 23 Oct 2015 10:30:12 -0400 Subject: [PATCH] PM-3858 "Revisar el endpoint para suggest..." SOLVED --- .../ProcessMaker/BusinessModel/Variable.php | 105 ++++++++++++++---- 1 file changed, 82 insertions(+), 23 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 75f01fd8c..f05ba0c03 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -296,14 +296,14 @@ class Variable $arrayVariables = array(); while ($aRow = $rsCriteria->getRow()) { - + $VAR_ACCEPTED_VALUES = \G::json_decode($aRow['VAR_ACCEPTED_VALUES'], true); if(sizeof($VAR_ACCEPTED_VALUES)) { $encodeAcceptedValues = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", \G::json_encode($VAR_ACCEPTED_VALUES)); } else { $encodeAcceptedValues = $aRow['VAR_ACCEPTED_VALUES']; } - + $arrayVariables = array('var_uid' => $aRow['VAR_UID'], 'prj_uid' => $aRow['PRJ_UID'], 'var_name' => $aRow['VAR_NAME'], @@ -372,14 +372,14 @@ class Variable $arrayVariables = array(); while ($aRow = $rsCriteria->getRow()) { - + $VAR_ACCEPTED_VALUES = \G::json_decode($aRow['VAR_ACCEPTED_VALUES'], true); if(sizeof($VAR_ACCEPTED_VALUES)) { $encodeAcceptedValues = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", \G::json_encode($VAR_ACCEPTED_VALUES)); } else { $encodeAcceptedValues = $aRow['VAR_ACCEPTED_VALUES']; } - + $arrayVariables[] = array('var_uid' => $aRow['VAR_UID'], 'prj_uid' => $aRow['PRJ_UID'], 'var_name' => $aRow['VAR_NAME'], @@ -674,9 +674,10 @@ class Variable //Set data $variableDbConnectionUid = ""; $variableSql = ""; + + $sqlCondition = ""; + $sqlOrderBy = ""; $sqlLimit = ""; - $variableSqlLimit = ""; - $sqlConditionLike = ""; $criteria = new \Criteria("workflow"); @@ -703,33 +704,91 @@ class Variable //Get data $_SESSION["PROCESS"] = $processUid; - foreach ($arrayVariable as $keyRequest => $valueRequest) { - $keyRequest = strtoupper($keyRequest); + $selectFieldMain = ""; - if ($keyRequest == 'LIMIT') { - if (strpos($variableSql, 'LIMIT')) { - $variableSqlLimit = explode("LIMIT", $variableSql); - $sqlLimit = " LIMIT " . $variableSqlLimit[1]; - $variableSql = $variableSqlLimit[0]; - } else { - $sqlLimit = " LIMIT ". 0 . ", " . $valueRequest; - } + if (preg_match("/^SELECT\s(.+)\sFROM.+$/", $variableSql, $matches)) { + $arrayFields = explode (",", $matches[1]); + + if (!count($arrayFields) > 2) { + throw new \Exception(\G::LoadTranslation("ID_INVALID_QUERY")); + } + + $selectFieldMain = $arrayFields[1]; + } + + $filter = ""; + $filterOption = ""; + + if (array_key_exists("filter", $arrayVariable) && $arrayVariable["filter"] != "") { + $filter = $arrayVariable["filter"]; + $filterOption = "filter"; + } else { + if (array_key_exists("lfilter", $arrayVariable) && $arrayVariable["lfilter"] != "") { + $filter = $arrayVariable["lfilter"]; + $filterOption = "lfilter"; } else { - if (strpos($variableSql, 'WHERE')) { - $sqlConditionLike = " AND " . $keyRequest . " LIKE '%" . $valueRequest . "%'"; - } else { - $sqlConditionLike = " WHERE " . $keyRequest . " LIKE '%" . $valueRequest . "%'"; + if (array_key_exists("rfilter", $arrayVariable) && $arrayVariable["rfilter"] != "") { + $filter = $arrayVariable["rfilter"]; + $filterOption = "rfilter"; } } } - $sqlQuery = $variableSql . $sqlConditionLike . $sqlLimit; + unset($arrayVariable["lfilter"]); + unset($arrayVariable["rfilter"]); + unset($arrayVariable["filter"]); + + if ($filter != "" && $filterOption != "") { + $arrayVariable["filter"] = $filter; + } + + foreach ($arrayVariable as $keyRequest => $valueRequest) { + switch ($keyRequest) { + case "filter": + $arraySearch = array( + "filter" => "%" . $valueRequest . "%", + "lfilter" => $valueRequest . "%", + "rfilter" => "%" . $valueRequest + ); + + $search = $arraySearch[$filterOption]; + + if (strpos($variableSql, "WHERE")) { + $sqlCondition = " AND " . $selectFieldMain . " LIKE '" . $search . "'"; + } else { + $sqlCondition = " WHERE " . $selectFieldMain . " LIKE '" . $search . "'"; + } + break; + case "order_by": + $sqlOrderBy = " ORDER BY " . $selectFieldMain . " " . $valueRequest; + break; + case "limit": + if (strpos($variableSql, "LIMIT")) { + $variableSqlLimit = explode("LIMIT", $variableSql); + $sqlLimit = " LIMIT " . $variableSqlLimit[1]; + $variableSql = $variableSqlLimit[0]; + } else { + $sqlLimit = " LIMIT ". 0 . ", " . $valueRequest; + } + break; + default: + if (strpos($variableSql, 'WHERE')) { + $sqlCondition = " AND " . $keyRequest . " LIKE '%" . $valueRequest . "%'"; + } else { + $sqlCondition = " WHERE " . $keyRequest . " LIKE '%" . $valueRequest . "%'"; + } + break; + } + } + + $sqlQuery = $variableSql . $sqlCondition . $sqlOrderBy . $sqlLimit; + + $sqlQuery = G::replaceDataField($sqlQuery, $arrayVariable); $cnn = \Propel::getConnection(($variableDbConnectionUid . "" != "")? $variableDbConnectionUid : "workflow"); $stmt = $cnn->createStatement(); - $replaceFields = G::replaceDataField($sqlQuery, $arrayVariable); - $rs = $stmt->executeQuery($replaceFields, \ResultSet::FETCHMODE_NUM); + $rs = $stmt->executeQuery($sqlQuery, \ResultSet::FETCHMODE_NUM); while ($rs->next()) { $row = $rs->getRow();