From 0fe7c831149ac8a2ddc0731c1831d3354dbc7e41 Mon Sep 17 00:00:00 2001 From: Brayan Osmar Pereyra Suxo Date: Thu, 13 Mar 2014 17:18:21 -0400 Subject: [PATCH 1/4] Adicion para validar eliminacion de dynaform con dependencias --- .../classes/model/CaseTrackerObject.php | 25 ++++ .../engine/classes/model/ObjectPermission.php | 24 ++++ workflow/engine/classes/model/Step.php | 31 ++++- .../engine/classes/model/StepSupervisor.php | 24 ++++ .../engine/src/BusinessModel/DynaForm.php | 108 +++++++++++++++--- 5 files changed, 196 insertions(+), 16 deletions(-) diff --git a/workflow/engine/classes/model/CaseTrackerObject.php b/workflow/engine/classes/model/CaseTrackerObject.php index 9067fde87..cd433323c 100755 --- a/workflow/engine/classes/model/CaseTrackerObject.php +++ b/workflow/engine/classes/model/CaseTrackerObject.php @@ -160,5 +160,30 @@ class CaseTrackerObject extends BaseCaseTrackerObject throw ($e); } } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigCaseTracker ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( CaseTrackerObjectPeer::CTO_UID ); + $oCriteria->add( CaseTrackerObjectPeer::PRO_UID, $proUid ); + $oCriteria->add( CaseTrackerObjectPeer::CTO_UID_OBJ, $dynUid ); + $oCriteria->add( CaseTrackerObjectPeer::CTO_TYPE_OBJ, 'DYNAFORM' ); + $oDataset = CaseTrackerObjectPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } + } diff --git a/workflow/engine/classes/model/ObjectPermission.php b/workflow/engine/classes/model/ObjectPermission.php index e0e45dcd6..722491bcd 100755 --- a/workflow/engine/classes/model/ObjectPermission.php +++ b/workflow/engine/classes/model/ObjectPermission.php @@ -125,5 +125,29 @@ class ObjectPermission extends BaseObjectPermission $aRow = $oDataset->getRow(); return ($aRow); } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigObjectPermission ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( ObjectPermissionPeer::OP_UID ); + $oCriteria->add( ObjectPermissionPeer::PRO_UID, $proUid ); + $oCriteria->add( ObjectPermissionPeer::OP_OBJ_UID, $dynUid ); + $oCriteria->add( ObjectPermissionPeer::OP_OBJ_TYPE, 'DYNAFORM' ); + $oDataset = ObjectPermissionPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } } diff --git a/workflow/engine/classes/model/Step.php b/workflow/engine/classes/model/Step.php index 78f0b90b0..57f1bbd09 100755 --- a/workflow/engine/classes/model/Step.php +++ b/workflow/engine/classes/model/Step.php @@ -346,7 +346,7 @@ class Step extends BaseStep } /** - * verify if a dynaform is assigned some steps + * verify if a dynaform is assigned some steps * * @param string $sproUid the uid of the process * @param string $sObjUID the uid of the dynaform @@ -405,6 +405,35 @@ class Step extends BaseStep die(); } + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigStep ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( StepPeer::TAS_UID ); + $oCriteria->addSelectColumn( ContentPeer::CON_VALUE ); + $oCriteria->addSelectColumn( StepPeer::STEP_POSITION ); + $oCriteria->add( StepPeer::PRO_UID, $proUid ); + $oCriteria->add( StepPeer::STEP_UID_OBJ, $dynUid ); + $oCriteria->add( StepPeer::STEP_TYPE_OBJ, 'DYNAFORM' ); + $oCriteria->add( ContentPeer::CON_CATEGORY, 'TAS_TITLE'); + $oCriteria->add( ContentPeer::CON_LANG, SYS_LANG); + $oCriteria->addJoin( StepPeer::TAS_UID, ContentPeer::CON_ID, Criteria::INNER_JOIN); + $oDataset = StepPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } + public function getAttribute ($node, $attName) { diff --git a/workflow/engine/classes/model/StepSupervisor.php b/workflow/engine/classes/model/StepSupervisor.php index 529747493..faa3ec31c 100755 --- a/workflow/engine/classes/model/StepSupervisor.php +++ b/workflow/engine/classes/model/StepSupervisor.php @@ -224,5 +224,29 @@ class StepSupervisor extends BaseStepSupervisor $aRow = $oDataset->getRow(); return ($aRow); } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigStepSupervisor ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( StepSupervisorPeer::STEP_UID ); + $oCriteria->add( StepSupervisorPeer::PRO_UID, $proUid ); + $oCriteria->add( StepSupervisorPeer::STEP_UID_OBJ, $dynUid ); + $oCriteria->add( StepSupervisorPeer::STEP_TYPE_OBJ, 'DYNAFORM' ); + $oDataset = StepSupervisorPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } } diff --git a/workflow/engine/src/BusinessModel/DynaForm.php b/workflow/engine/src/BusinessModel/DynaForm.php index 820b24dcd..2664aa1e6 100644 --- a/workflow/engine/src/BusinessModel/DynaForm.php +++ b/workflow/engine/src/BusinessModel/DynaForm.php @@ -139,20 +139,99 @@ class DynaForm * * return bool Return true if a DynaForm is assigned some Steps, false otherwise */ - public function dynaFormAssignedStep($dynaFormUid, $processUid) + public function dynaFormDepends($dynUid, $proUid) { - try { - $step = new \Step(); + $oCriteria = new \Criteria(); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_TYPE ); + $oCriteria->add( \DynaformPeer::DYN_UID, $dynUid ); + $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + $dataDyna = $oDataset->getRow(); - $arrayData = $step->loadInfoAssigDynaform($processUid, $dynaFormUid); + if ($dataDyna['DYN_TYPE'] == 'grid') { + $formsDepend = array(); + \G::LoadSystem( 'dynaformhandler' ); - if (is_array($arrayData)) { - return true; - } else { - return false; + $oCriteria = new \Criteria( 'workflow' ); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_UID ); + $oCriteria->addSelectColumn( \ContentPeer::CON_VALUE ); + $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); + $oCriteria->add( \DynaformPeer::DYN_TYPE, "xmlform" ); + $oCriteria->add( \ContentPeer::CON_CATEGORY, 'DYN_TITLE'); + $oCriteria->add( \ContentPeer::CON_LANG, SYS_LANG); + $oCriteria->addJoin( \DynaformPeer::DYN_UID, \ContentPeer::CON_ID, \Criteria::INNER_JOIN); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + + while ($oDataset->next()) { + $dataForms = $oDataset->getRow(); + $dynHandler = new \dynaFormHandler(PATH_DYNAFORM . $proUid . PATH_SEP . $dataForms["DYN_UID"] . ".xml"); + $dynFields = $dynHandler->getFields(); + foreach ($dynFields as $field) { + $sType = \Step::getAttribute( $field, 'type' ); + if ($sType == 'grid') { + $sxmlgrid = \Step::getAttribute( $field, 'xmlgrid' ); + $aGridInfo = explode( "/", $sxmlgrid ); + if ($aGridInfo[0] == $proUid && $aGridInfo[1] == $dynUid) { + $formsDepend[] = $dataForms["CON_VALUE"]; + } + } + } } - } catch (\Exception $e) { - throw $e; + if (!empty($formsDepend)) { + $message = "You can not delete the grid '$dynUid', because it is in the "; + $message .= (count($formsDepend) == 1) ? 'form' : 'forms'; + $message .= ': ' . implode(', ', $formsDepend); + return $message; + } + } else { + $flagDepend = false; + $stepsDepends = \Step::verifyDynaformAssigStep($dynUid, $proUid); + + $messageSteps = '(0) Depends in steps'; + if (!empty($stepsDepends)) { + $flagDepend = true; + $countSteps = count($stepsDepends); + $messTemp = ''; + foreach ($stepsDepends as $value) { + $messTemp .= ", the task '" . $value['CON_VALUE'] . "' position " . $value['STEP_POSITION']; + } + $messageSteps = "($countSteps) Depends in steps in" . $messTemp; + } + + $stepSupervisorsDepends = \StepSupervisor::verifyDynaformAssigStepSupervisor($dynUid, $proUid); + $messageStepsSupervisors = '(0) Depends in steps supervisor'; + if (!empty($stepSupervisorsDepends)) { + $flagDepend = true; + $countSteps = count($stepSupervisorsDepends); + $messageStepsSupervisors = "($countSteps) Depends in steps supervisor"; + } + + $objectPermissionDepends = \ObjectPermission::verifyDynaformAssigObjectPermission($dynUid, $proUid); + $messageObjectPermission = '(0) Depends in permissions'; + if (!empty($objectPermissionDepends)) { + $flagDepend = true; + $countSteps = count($objectPermissionDepends); + $messageObjectPermission = "($countSteps) Depends in permissions"; + } + + $caseTrackerDepends = \CaseTrackerObject::verifyDynaformAssigCaseTracker($dynUid, $proUid); + $messageCaseTracker = '(0) Depends in case traker'; + if (!empty($caseTrackerDepends)) { + $flagDepend = true; + $countSteps = count($caseTrackerDepends); + $messageCaseTracker = "($countSteps) Depends in case traker"; + } + + if ($flagDepend) { + $message = "You can not delete the dynaform '$dynUid', because it has the following dependencies: \n\n"; + $message .= $messageSteps . ".\n" . $messageStepsSupervisors . ".\n"; + $message .= $messageObjectPermission . ".\n" . $messageCaseTracker; + return $message; + } + return ''; } } @@ -167,9 +246,7 @@ class DynaForm { try { $stepSupervisor = new \StepSupervisor(); - $arrayData = $stepSupervisor->loadInfo($dynaFormUid); - if (is_array($arrayData)) { return true; } else { @@ -381,9 +458,10 @@ class DynaForm $processUid = $arrayDynaFormData["PRO_UID"]; - //Verify data - if ($this->dynaFormAssignedStep($dynaFormUid, $processUid)) { - throw (new \Exception("You cannot delete this Dynaform while it is assigned to a step")); + //Verify dependencies dynaforms + $resultDependeds = $this->dynaFormDepends($dynaFormUid, $processUid); + if ($resultDependeds != '') { + throw (new \Exception($resultDependeds)); } //Delete From aad2ed0c17a917e9063cb4192571885f4c8a4db2 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Thu, 13 Mar 2014 17:33:06 -0400 Subject: [PATCH 2/4] Adding ArrayUtil::sort method, to sort associative arrays by keys --- .../src/ProcessMaker/Util/ArrayUtil.php | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Util/ArrayUtil.php b/workflow/engine/src/ProcessMaker/Util/ArrayUtil.php index af3437948..00f7b5de9 100644 --- a/workflow/engine/src/ProcessMaker/Util/ArrayUtil.php +++ b/workflow/engine/src/ProcessMaker/Util/ArrayUtil.php @@ -13,4 +13,83 @@ class ArrayUtil return $array; } -} \ No newline at end of file + + /** + * Function that sorts an associative array by given array keys + * + * @author Erik Amaru Ortiz + * @param array $data associative contains array data to sort by key. + * @param array $columns contains the key to sort by those them. + * @param mixed $direction this param by default is SORT_ASC, it can contains a value from [SORT_ASC|SORT_DESC] + * php constants, or it can be a array(SORT_ASC,SORT_DESC,..), it must have the same length + * of $columns array. + * @return array + * @throws \Exception + * + * Example: + * $data = array(); + * $data[] = array('volume' => 67, 'edition' => 2); + * $data[] = array('volume' => 86, 'edition' => 1); + * $data[] = array('volume' => 85, 'edition' => 6); + * $data[] = array('volume' => 98, 'edition' => 2); + * $data[] = array('volume' => 86, 'edition' => 6); + * $data[] = array('volume' => 67, 'edition' => 7); + * + * $r = ArrayUtil::sort($data, array("volume", "edition"), array(SORT_DESC, SORT_ASC)); + * print_r($r); + * + * Example Output: + * Array + * ( + * [0] => Array ( + * [volume] => 98 + * [edition] => 2 + * ) + * [1] => Array ( + * [volume] => 86 + * [edition] => 1 + * ) + * [2] => Array ( + * [volume] => 86 + * [edition] => 6 + * ) + * [3] => Array ( + * [volume] => 85 + * [edition] => 6 + * ) + * [4] => Array ( + * [volume] => 67 + * [edition] => 2 + * ) + * [5] => Array ( + * [volume] => 67 + * [edition] => 7 + * ) + * ) + */ + public static function sort($data, $columns, $direction = SORT_ASC) + { + $composedData = array(); + + if (is_array($direction)) { + if (count($direction) !== count($columns)) { + throw new \Exception("Error, \$columns length and \$direction length must be equals."); + } + } + + foreach ($data as $row) { + $j = 0; + foreach ($columns as $i => $col) { + $composedData[$j++][] = $row[$col]; + $composedData[$j++] = is_array($direction) ? $direction[$i] : $direction; + } + } + + $composedData[] = & $data; + + call_user_func_array("array_multisort", $composedData); + + return $data; + } +} + From 99a512d15c65967423d5ae6723577f5fed6d08ef Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Thu, 13 Mar 2014 17:34:36 -0400 Subject: [PATCH 3/4] Removing DBArray dependency in class Task --- workflow/engine/src/BusinessModel/Task.php | 40 +++++----------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/workflow/engine/src/BusinessModel/Task.php b/workflow/engine/src/BusinessModel/Task.php index 500bba6b6..ddbdfe6b1 100644 --- a/workflow/engine/src/BusinessModel/Task.php +++ b/workflow/engine/src/BusinessModel/Task.php @@ -2,6 +2,7 @@ namespace BusinessModel; use \G; +use \ProcessMaker\Util; class Task { @@ -461,14 +462,6 @@ class Task //Array DB $arraydbStep = array(); - - $arraydbStep[] = array( - $this->getFieldNameByFormatFieldName("OBJ_UID") => "char", - $this->getFieldNameByFormatFieldName("OBJ_TITLE") => "char", - $this->getFieldNameByFormatFieldName("OBJ_DESCRIPTION") => "char", - $this->getFieldNameByFormatFieldName("OBJ_TYPE") => "char" - ); - $delimiter = \DBAdapter::getStringDelimiter(); //DynaForms @@ -619,32 +612,15 @@ class Task } } - \G::LoadClass("ArrayPeer"); - - global $_DBArray; - - $_DBArray = (isset($_SESSION["_DBArray"]))? $_SESSION["_DBArray"] : ""; - $_DBArray["STEP"] = $arraydbStep; - - $_SESSION["_DBArray"] = $_DBArray; - - $criteria = new \Criteria("dbarray"); - - $criteria->setDBArrayTable("STEP"); - $criteria->addAscendingOrderByColumn($this->getFieldNameByFormatFieldName("OBJ_TYPE")); - $criteria->addAscendingOrderByColumn($this->getFieldNameByFormatFieldName("OBJ_TITLE")); - - $rsCriteria = \ArrayBasePeer::doSelectRS($criteria); - $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - while ($rsCriteria->next()) { - $row = $rsCriteria->getRow(); - - $arrayAvailableStep[] = $row; + if (! empty($arraydbStep)) { + $arraydbStep = Util\ArrayUtil::sort( + $arraydbStep, + array($this->getFieldNameByFormatFieldName("OBJ_TYPE"), $this->getFieldNameByFormatFieldName("OBJ_TITLE")), + SORT_ASC + ); } - //Return - return $arrayAvailableStep; + return $arraydbStep; } catch (\Exception $e) { throw $e; } From 8e9b30f7061f9c888b7ce92a4814264718faa14f Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Thu, 13 Mar 2014 18:45:45 -0400 Subject: [PATCH 4/4] Removing XmlForm and Smarty class dependency --- gulliver/system/class.dynaformhandler.php | 2 +- workflow/engine/src/BusinessModel/Process.php | 196 +++++++++++++++--- 2 files changed, 168 insertions(+), 30 deletions(-) diff --git a/gulliver/system/class.dynaformhandler.php b/gulliver/system/class.dynaformhandler.php index f2a61df73..559e1b094 100755 --- a/gulliver/system/class.dynaformhandler.php +++ b/gulliver/system/class.dynaformhandler.php @@ -508,7 +508,7 @@ class dynaFormHandler /** * Function getFields * @param array $aFilter - * @return array + * @return DOMElement[] */ public function getFields($aFilter = Array()) { diff --git a/workflow/engine/src/BusinessModel/Process.php b/workflow/engine/src/BusinessModel/Process.php index fcae7d07a..d36128ba7 100644 --- a/workflow/engine/src/BusinessModel/Process.php +++ b/workflow/engine/src/BusinessModel/Process.php @@ -1,6 +1,9 @@ $value) { $arrayVariableAux = $this->getVariableDataFromRecord(array("name" => $value["sName"], "label" => "[ " . \G::LoadTranslation("ID_GRID") . " ]", "type" => "grid")); @@ -1565,36 +1566,15 @@ class Process $dynaForm->throwExceptionIfNotIsGridDynaForm($gridUid, $this->arrayFieldNameForException["gridUid"]); //Get data - $file = PATH_DYNAFORM . $processUid . PATH_SEP . $gridUid . ".xml"; - - if (file_exists($file) && filesize($file) > 0) { - //Load DynaForm - $dynaForm = new \Dynaform(); - - $arrayDynaFormData = $dynaForm->Load($gridUid); - - $dynaFormFilename = $arrayDynaFormData["DYN_FILENAME"]; - - //Fields - $form = new \Form($dynaFormFilename, PATH_DYNAFORM, SYS_LANG); - - $arrayFieldName = array(); - - if ($form->type == "grid") { - foreach ($form->fields as $key => $value) { - if (!in_array($key, $arrayFieldName)) { - $arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $key, "label" => $value->label, "type" => $value->type)); - $arrayFieldName[] = $key; - } - } - } + $fields = self::getVarsGrid($processUid, $gridUid); + foreach ($fields as $field) { + $arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $field["sName"], "label" => $field["sLabel"], "type" => $field["sType"])); } + break; default: //ALL - \G::LoadClass("xmlfield_InputPM"); - - $arrayVar = getDynaformsVars($processUid); + $arrayVar = self::getDynaformsVars($processUid); foreach ($arrayVar as $key => $value) { $arrayVariable[] = $this->getVariableDataFromRecord(array("name" => $value["sName"], "label" => $value["sLabel"], "type" => $value["sType"])); @@ -1646,5 +1626,163 @@ class Process throw $e; } } + + /** + * Function getDynaformsVars + * + * @access public + * @param eter string $sProcessUID + * @param eter boolean $bSystemVars + * @return array + */ + public static function getDynaformsVars ($sProcessUID, $bSystemVars = true, $bIncMulSelFields = 0) + { + $aFields = array (); + $aFieldsNames = array (); + if ($bSystemVars) { + $aAux = G::getSystemConstants(); + foreach ($aAux as $sName => $sValue) { + $aFields[] = array ('sName' => $sName,'sType' => 'system','sLabel' => G::LoadTranslation('ID_TINY_SYSTEM_VARIABLES')); + } + //we're adding the ping variable to the system list + $aFields[] = array ('sName' => 'PIN','sType' => 'system','sLabel' => G::LoadTranslation('ID_TINY_SYSTEM_VARIABLES')); + } + + $aInvalidTypes = array("title", "subtitle", "file", "button", "reset", "submit", "javascript"); + $aMultipleSelectionFields = array("listbox", "checkgroup", "grid"); + + if ($bIncMulSelFields != 0) { + $aInvalidTypes = array_merge( $aInvalidTypes, $aMultipleSelectionFields ); + } + + $oCriteria = new Criteria( 'workflow' ); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_FILENAME ); + $oCriteria->add( \DynaformPeer::PRO_UID, $sProcessUID ); + $oCriteria->add( \DynaformPeer::DYN_TYPE, 'xmlform' ); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + + while ($aRow = $oDataset->getRow()) { + if (is_file(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml")) { + $dyn = new \dynaFormHandler(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml"); + + if ($dyn->getHeaderAttribute("type") !== "xmlform" && $dyn->getHeaderAttribute("type") !== "") { // skip it, if that is not a xmlform + $oDataset->next(); + continue; + } + + $fields = $dyn->getFields(); + + foreach ($fields as $field) { + $label = ""; + if ($field->hasChildNodes()) { + $child = $field->getElementsByTagName(SYS_LANG)->length ? $field->getElementsByTagName(SYS_LANG): $field->getElementsByTagName("en"); + $label = $child->item(0) ? $child->item(0)->textContent : ""; + } + + if (! in_array($field->getAttribute("type"), $aInvalidTypes) && ! in_array($field->tagName, $aFieldsNames)) { + $aFieldsNames[] = $field->tagName; + $aFields[] = array ( + 'sName' => $field->tagName, + 'sType' => $field->getAttribute("type"), + 'sLabel' => ($field->getAttribute("type") != 'grid' ? $label : '[ ' . G::LoadTranslation('ID_GRID') . ' ]') + ); + } + } + } + + $oDataset->next(); + } + return $aFields; + } + + /** + * Function getGridsVars + * + * @access public + * @param eter string $sProcessUID + * @return array + */ + public static function getGridsVars ($sProcessUID) + { + $aFields = array (); + $aFieldsNames = array (); + + $oCriteria = new Criteria( 'workflow' ); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_FILENAME ); + $oCriteria->add( \DynaformPeer::PRO_UID, $sProcessUID ); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + if (is_file(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml")) { + $dyn = new \dynaFormHandler(PATH_DYNAFORM . $aRow['DYN_FILENAME'] . ".xml"); + + if ($dyn->getHeaderAttribute("type") === "xmlform") { // skip it, if that is not a xmlform + $oDataset->next(); + continue; + } + + $fields = $dyn->getFields(); + + foreach ($fields as $field) { + if ($field->getAttribute("type") !== "grid") { + continue; + } + if (! in_array($field->tagName, $aFieldsNames)) { + $aFieldsNames[] = $field->tagName; + $aFields[] = array ( + 'sName' => $field->tagName, + 'sXmlForm' => $aRow['DYN_FILENAME'] + ); + } + } + } + + $oDataset->next(); + } + return $aFields; + } + + /** + * Function getVarsGrid returns all variables of Grid + * + * @access public + * @param string proUid process ID + * @param string dynUid dynaform ID + * @return array + */ + public static function getVarsGrid ($proUid, $dynUid) + { + $dynaformFields = array (); + $aFieldsNames = array(); + $aFields = array(); + $aInvalidTypes = array("title", "subtitle", "file", "button", "reset", "submit", "javascript"); + $aMultipleSelectionFields = array("listbox", "checkgroup", "grid"); + + if (is_file( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/'. $proUid .'/'.$dynUid. '.xml' ) && filesize( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/'. $proUid .'/'. $dynUid .'.xml' ) > 0) { + $dyn = new \dynaFormHandler( PATH_DATA . '/sites/'. SYS_SYS .'/xmlForms/' .$proUid. '/' . $dynUid .'.xml' ); + $dynaformFields[] = $dyn->getFields(); + + $fields = $dyn->getFields(); + + foreach ($fields as $field) { + if ($field->getAttribute("type") !== "grid") { + continue; + } + if (! in_array($field->getAttribute("type"), $aInvalidTypes) && ! in_array($field->tagName, $aFieldsNames)) { + $aFieldsNames[] = $field->tagName; + $aFields[] = array ( + 'sName' => $field->tagName, + 'sType' => $field->getAttribute("type"), + 'sLabel' => ($field->getAttribute("type") != 'grid' ? $label : '[ ' . G::LoadTranslation('ID_GRID') . ' ]') + ); + } + } + } + + return $aFields; + } }