From 65b5a2cc1d47bdcf9d3d9da1f8ee7c73ceef2ce7 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Thu, 21 Jul 2011 18:35:37 -0400 Subject: [PATCH] BUG 0000 PM TABLES - importing issue - fixed the problem when multiples tables are selected to import --- .../engine/classes/model/AdditionalTables.php | 17 +- workflow/engine/controllers/pmTables.php | 11 + workflow/engine/controllers/pmTablesProxy.php | 250 +++++++++++--- workflow/engine/templates/pmTables/data.js | 25 +- workflow/engine/templates/pmTables/export.js | 312 +++++++++--------- workflow/engine/templates/pmTables/list.js | 18 + 6 files changed, 422 insertions(+), 211 deletions(-) diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index 0178bdb33..bea3f8a65 100644 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -1061,15 +1061,17 @@ class AdditionalTables extends BaseAdditionalTables { FieldsPeer::doDelete($oCriteria); //deleting table - if ( isset($aData['DBS_UID']) && $aData['DBS_UID'] != 'wf' && $aData['DBS_UID'] != '') { - $con = Propel::getConnection($aData['DBS_UID']); - $stmt = $con->createStatement(); - $stmt->executeQuery('DROP TABLE '.$aData['ADD_TAB_NAME']); - } else { + if ($aData['DBS_UID'] == 'wf' || $aData['DBS_UID'] == 'workflow' || $aData['DBS_UID'] == '' || $aData['DBS_UID'] == '0' || !$aData['DBS_UID']) { G::LoadSystem('database_' . strtolower(DB_ADAPTER)); $oDataBase = new database(DB_ADAPTER, DB_HOST, DB_USER, DB_PASS, DB_NAME); $oDataBase->iFetchType = MYSQL_NUM; $oDataBase->executeQuery($oDataBase->generateDropTableSQL($aData['ADD_TAB_NAME'])); + } else { + $con = Propel::getConnection($aData['DBS_UID']); + if (is_object($con)) { + $stmt = $con->createStatement(); + $stmt->executeQuery('DROP TABLE '.$aData['ADD_TAB_NAME']); + } } @@ -1216,9 +1218,12 @@ var additionalTablesDataDelete = function(sUID, sKeys) { $con = Propel::getConnection($aData['DBS_UID']); $oCriteria = new Criteria($aData['DBS_UID']); - eval('$oCriteria->addSelectColumn("\'1\' AS DUMMY");'); + //eval('$oCriteria->addSelectColumn("\'1\' AS DUMMY");'); foreach ($aData['FIELDS'] as $aField) { eval('$oCriteria->addSelectColumn(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ');'); + if ($aField['FLD_KEY'] == '1') { + eval('$oCriteria->addAscendingOrderByColumn(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ');'); + } } $oCriteriaCount = clone $oCriteria; diff --git a/workflow/engine/controllers/pmTables.php b/workflow/engine/controllers/pmTables.php index 10b3447e5..ed3df8201 100644 --- a/workflow/engine/controllers/pmTables.php +++ b/workflow/engine/controllers/pmTables.php @@ -28,6 +28,7 @@ class pmTables extends Controller $Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; $this->includeExtJS('pmTables/list', $this->debug); + $this->includeExtJS('pmTables/export', $this->debug); $this->setView('pmTables/list'); //assigning js variables @@ -122,6 +123,16 @@ class pmTables extends Controller $this->setJSVar('EXPORT_TABLES', $toSend); G::RenderPage('publish', 'extJs'); } + + public function streamExported($httpData) + { + $PUBLIC_ROOT_PATH = PATH_DATA.'sites'.PATH_SEP.SYS_SYS.PATH_SEP.'public'.PATH_SEP; + $sFileName = $httpData->f; + + $realPath = $PUBLIC_ROOT_PATH . $sFileName; + G::streamFile ( $realPath, true ); + unlink($realPath); + } /** diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index f15e6fecb..8b7f5a8cd 100644 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -403,6 +403,8 @@ class pmTablesProxy extends HttpProxyController */ public function dataCreate($httpData) { + $rows = G::json_decode($httpData->rows); + require_once 'classes/model/AdditionalTables.php'; $oAdditionalTables = new AdditionalTables(); $table = $oAdditionalTables->load($httpData->id, true); @@ -415,33 +417,63 @@ class pmTablesProxy extends HttpProxyController } require_once $sPath . $this->className . '.php'; - $rows = G::json_decode($httpData->rows); - eval('$obj = new ' .$this->className. '();'); - if (is_array($rows)) { - foreach ($rows as $row) { + $toSave = false; + + if (is_array($rows)) { //multiple + $c = $cs = 0; + foreach ($rows as $i => $row) { + $fieldsCount = 0; + eval('$obj = new ' .$this->className. '();'); foreach ($row as $key => $value) { $action = 'set' . AdditionalTables::getPHPName($key); - $res = $obj->$action($value); + $obj->$action($value); + $fieldsCount++; + $toSave = true; } - $this->success = $res ? true: false; + if ($fieldsCount != 0) { + $c++; + if ($obj->save() > 0) { + $cs++; + } + } + } + + if ($toSave) { + $result->success = $cs == $c ? true: false; + $result->message = 'Saved #' . $c . ' records successfully'; + } + else { + $result->success = false; + $result->message = 'Nothing to do'; } } - else { + else { //single + eval('$obj = new ' .$this->className. '();'); foreach ($rows as $key => $value) { $action = 'set' . AdditionalTables::getPHPName($key); $obj->$action($value); + $toSave = true; + } + if ($toSave) { + if ($obj->save() > 0) { + $rows->__index__ = 5; + $result->success = true; + $result->message = 'Record saved successfully'; + $result->data = (array) $rows; + } + else { + $result->success = false; + $result->message = 'Error Updating records'; + } } - if ($obj->save() >0) { - $this->success = true; - } else { - $this->success = false; + $result->success = true; + $result->data = array('__index__'=>1132); + $result->message = 'Nothing to do'; } } - - - $this->message = $this->success ? 'Saved Successfully' : 'Error Updating record'; + return $result; } /** @@ -509,9 +541,7 @@ class pmTablesProxy extends HttpProxyController public function import($httpData) { require_once 'classes/model/AdditionalTables.php'; - try { - $overWrite = isset($_POST['form']['OVERWRITE'])? true: false; //save the file @@ -524,8 +554,14 @@ class pmTablesProxy extends HttpProxyController $fileContent = file_get_contents($PUBLIC_ROOT_PATH.$filename); - if(strpos($fileContent, '-----== ProcessMaker Open Source Private Tables ==-----') !== false){ - $oMap = new aTablesMap(); + if(strpos($fileContent, '-----== ProcessMaker Open Source Private Tables ==-----') === false) { + $this->success = false; + $this->message = 'INVALID_FILE'; + exit(0); + } + + + $oMap = new aTablesMap(); $fp = fopen($PUBLIC_ROOT_PATH.$filename, "rb"); $fsData = intval(fread($fp, 9)); //reading the metadata @@ -541,7 +577,6 @@ class pmTablesProxy extends HttpProxyController case '@META': $fsData = intval(fread($fp, 9)); $METADATA = fread($fp, $fsData); - //print_r($METADATA); break; case '@SCHEMA': $fsUid = intval(fread($fp, 9)); @@ -550,7 +585,7 @@ class pmTablesProxy extends HttpProxyController $fsData = intval(fread($fp, 9)); $schema = fread($fp, $fsData); $contentSchema = unserialize($schema); - //print_r($contentSchema); + //var_dump($overWrite); print_r($contentSchema); continue; if($overWrite){ $aTable = new additionalTables(); @@ -577,7 +612,12 @@ class pmTablesProxy extends HttpProxyController } } - + + // validating invalid bds_uid in old tables definition -> mapped to workflow + if (!$contentSchema['DBS_UID'] || $contentSchema['DBS_UID'] == '0') { + $contentSchema['DBS_UID'] = 'workflow'; + } + $sAddTabUid = $oAdditionalTables->create( array( 'ADD_TAB_UID' => $contentSchema['ADD_TAB_UID'], @@ -635,19 +675,25 @@ class pmTablesProxy extends HttpProxyController case '@DATA': $fstName = intval(fread($fp, 9)); $tName = fread($fp, $fstName); - $fsData = intval(fread($fp, 9)); - $contentData = unserialize(fread($fp, $fsData)); + $fsData = intval(fread($fp, 9)); - $tName = $oMap->route($tName); - - $oAdditionalTables = new AdditionalTables(); - $tRecord = $oAdditionalTables->loadByName($tName); - - if($tRecord){ - foreach($contentData as $data){ - unset($data['DUMMY']); - $oAdditionalTables->saveDataInTable($tRecord[0]['ADD_TAB_UID'], $data); - } + if ($fsData > 0) { + $data = fread($fp, $fsData); + $contentData = unserialize($data); + + //var_dump($data); print_r($contentData); continue; + + $tName = $oMap->route($tName); + + $oAdditionalTables = new AdditionalTables(); + $tRecord = $oAdditionalTables->loadByName($tName); + + if($tRecord){ + foreach($contentData as $data){ + unset($data['DUMMY']); + $oAdditionalTables->saveDataInTable($tRecord[0]['ADD_TAB_UID'], $data); + } + } } break; } @@ -662,10 +708,7 @@ class pmTablesProxy extends HttpProxyController $this->success = true; $this->message = 'File Imported "'.$filename.'" Successfully'; - } else { - $this->success = false; - $this->message = 'INVALID_FILE'; - } + } } catch(Exception $e){ @@ -674,6 +717,139 @@ class pmTablesProxy extends HttpProxyController } } + /** + * Export PM tables + * @author: Erik Amaru Ortiz + */ + public function export($httpData) + { + require_once 'classes/model/AdditionalTables.php'; + + $tablesToExport = json_decode($httpData->rows); + + try{ + G::LoadCLass('net'); + $net = new NET(G::getIpAddress()); + + G::LoadClass("system"); + + $META = " \n-----== ProcessMaker Open Source Private Tables ==-----\n". + " @Ver: 1.0 Oct-2009\n". + " @Processmaker version: ".System::getVersion()."\n". + " -------------------------------------------------------\n". + " @Export Date: ".date("l jS \of F Y h:i:s A")."\n". + " @Server address: ".getenv('SERVER_NAME')." (".getenv('SERVER_ADDR').")\n". + " @Client address: ".$net->hostname."\n". + " @Workspace: ".SYS_SYS."\n". + " @Export trace back:\n\n"; + + $EXPORT_TRACEBACK = Array(); + $c = 0; + foreach ($tablesToExport as $table) { + $at = new additionalTables(); + $tableData = $at->getAllData($table->ADD_TAB_UID); + $rows = $tableData['rows']; + $count = $tableData['count']; + + array_push($EXPORT_TRACEBACK, Array( + 'uid' => $table->ADD_TAB_UID, + 'name' => $table->ADD_TAB_NAME, + 'num_regs' => $tableData['count'], + 'schema' => $table->_SCHEMA ? 'yes': 'no', + 'data' => $table->_DATA ? 'yes': 'no' + )); + } + + $sTrace = "TABLE UID TABLE NAME\tREGS\tSCHEMA\tDATA\n"; + + foreach($EXPORT_TRACEBACK as $row){ + $sTrace .= "{$row['uid']}\t{$row['name']}\t\t{$row['num_regs']}\t{$row['schema']}\t{$row['data']}\n"; + } + + $META .= $sTrace; + + ///////////////EXPORT PROCESS + $PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP; + + $filenameOnly = strtolower('SYS-'.SYS_SYS."_".date("Y-m-d").'_'.date("Hi").".pmt"); + + $filename = $PUBLIC_ROOT_PATH . $filenameOnly; + $fp = fopen( $filename, "wb"); + + $bytesSaved = 0; + $bufferType = '@META'; + $fsData = sprintf("%09d", strlen($META)); + $fsbufferType = sprintf("%09d", strlen($bufferType)); + $bytesSaved += fwrite($fp, $fsbufferType); //writing the size of $oData + $bytesSaved += fwrite($fp, $bufferType); //writing the $oData + $bytesSaved += fwrite($fp, $fsData); //writing the size of $oData + $bytesSaved += fwrite($fp, $META); //writing the $oData + + foreach($tablesToExport as $table){ + + if ($table->_SCHEMA) { + $oAdditionalTables = new AdditionalTables(); + $aData = $oAdditionalTables->load($table->ADD_TAB_UID, true); + + $bufferType = '@SCHEMA'; + $SDATA = serialize($aData); + $fsUid = sprintf("%09d", strlen($table->ADD_TAB_UID)); + $fsData = sprintf("%09d", strlen ($SDATA)); + $fsbufferType = sprintf("%09d", strlen($bufferType)); + + $bytesSaved += fwrite($fp, $fsbufferType); //writing the size of $oData + $bytesSaved += fwrite($fp, $bufferType); //writing the $oData + $bytesSaved += fwrite($fp, $fsUid ); //writing the size of xml file + $bytesSaved += fwrite($fp, $table->ADD_TAB_UID); //writing the xmlfile + $bytesSaved += fwrite($fp, $fsData); //writing the size of xml file + $bytesSaved += fwrite($fp, $SDATA); //writing the xmlfile + } + + if ($table->_DATA) { + //export data + $oAdditionalTables = new additionalTables(); + $tableData = $oAdditionalTables->getAllData($table->ADD_TAB_UID); + + $SDATA = serialize($tableData['rows']); + $bufferType = '@DATA'; + + $fsbufferType = sprintf("%09d", strlen($bufferType)); + $fsTableName = sprintf("%09d", strlen($table->ADD_TAB_NAME)); + $fsData = sprintf("%09d", strlen ($SDATA)); + + $bytesSaved += fwrite($fp, $fsbufferType); //writing type size + $bytesSaved += fwrite($fp, $bufferType); //writing type + $bytesSaved += fwrite($fp, $fsTableName ); //writing the size of xml file + $bytesSaved += fwrite($fp, $table->ADD_TAB_NAME); //writing the xmlfile + $bytesSaved += fwrite($fp, $fsData); //writing the size of xml file + $bytesSaved += fwrite($fp, $SDATA); //writing the xmlfile + } + } + + fclose ($fp); + + $filenameLink = "pmTables/streamExported?f=$filenameOnly"; + $size = round(($bytesSaved/1024), 2)." Kb"; + $meta = "
".$META."
"; + $filename = $filenameOnly; + $link = $filenameLink; + + // $G_PUBLISH = new Publisher(); + // $G_PUBLISH->AddContent('xmlform', 'xmlform', 'additionalTables/doExport', '', $aFields, ''); + // G::RenderPage('publish', 'raw'); + + $result->success = true; + $result->filename = $filenameOnly; + $result->link = $link; + $result->message = "Generated file: $filenameOnly, size: $size"; + } + catch (Exception $e) { + $result->success = false; + $result->message = $e->getMessage(); + } + + return $result; + } public function exportList() { diff --git a/workflow/engine/templates/pmTables/data.js b/workflow/engine/templates/pmTables/data.js index ce2b093e2..96292f908 100644 --- a/workflow/engine/templates/pmTables/data.js +++ b/workflow/engine/templates/pmTables/data.js @@ -114,7 +114,16 @@ Ext.onReady(function(){ //row editor for table columns grid editor = new Ext.ux.grid.RowEditor({ - saveText: _("ID_UPDATE") + saveText: _("ID_UPDATE"), + listeners: { + afteredit: { + fn:function(rowEditor, obj, data, rowIndex ){ + if (data.phantom === true) { + store.reload(); // only if it is an insert + } + } + } + } }); var proxy = new Ext.data.HttpProxy({ @@ -142,16 +151,16 @@ Ext.onReady(function(){ totalProperty: 'count' }) - store = new Ext.data.GroupingStore({ + store = new Ext.data.Store({ proxy : proxy, reader : reader, writer : writer, // <-- plug a DataWriter into the store just as you would a Reader autoSave: true // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. }); - Ext.data.DataProxy.addListener('write', function(proxy, action, result, res, rs) { + /*Ext.data.DataProxy.addListener('write', function(proxy, action, result, res, rs) { PMExt.notify('UPDATE', 'the record was updated successfully.'); - }); + });*/ // load the store immeditately //store.load(); @@ -225,16 +234,12 @@ Ext.onReady(function(){ sm: smodel, tbar:[newButton,'-',editButton, deleteButton,'-',importButton,{xtype: 'tbfill' }, backButton], bbar: bbarpaging, - listeners: { + /*listeners: { //rowdblclick: EditPMTableRow, render: function(){ this.loadMask = new Ext.LoadMask(this.body, {msg:_('ID_LOADING_GRID')}); } - }, - view: new Ext.grid.GroupingView({ - forceFit:true, - groupTextTpl: '{text}' - }) + },*/ }); infoGrid.on('rowcontextmenu', diff --git a/workflow/engine/templates/pmTables/export.js b/workflow/engine/templates/pmTables/export.js index 961945b8c..c24052f56 100644 --- a/workflow/engine/templates/pmTables/export.js +++ b/workflow/engine/templates/pmTables/export.js @@ -1,169 +1,165 @@ -var store; -var cmodel; -var smodel; -var infoGrid; -var viewport; -var cancelButton; -var exportButton; +var checkColumn; -var w; +var Export = function() { + return { + //config objects + windowConfig : {}, + targetGridConfig : {}, -Ext.onReady(function(){ - Ext.QuickTips.init(); - - var reader = new Ext.data.ArrayReader({}, [{name: 'action'}]); + // defining components + targetGrid : {}, + window : {}, + // init + init : function() { + Ext.form.Field.prototype.msgTarget = 'side'; + Ext.QuickTips.init(); + + this.configure(); - var comboStore = new Ext.data.Store({ - reader: reader, - data: Ext.grid.dummyData - }); - - exportButton = new Ext.Action({ - text: _('ID_EXPORT'), - iconCls: 'silk-add', - icon: '/images/export.png', - handler: ExportPMTables - }); - - cancelButton = new Ext.Action({ - text: _('ID_BACK'), - icon: '/images/back-icon.png', - handler: CancelExport - }); - - store = new Ext.data.GroupingStore( { - proxy : new Ext.data.HttpProxy({ - url: '../pmTablesProxy/exportList?id='+EXPORT_TABLES.UID_LIST - }), - reader : new Ext.data.JsonReader( { - root: '', - fields : [ - {name : 'ADD_TAB_UID'}, - {name : 'ADD_TAB_NAME'}, - {name : 'ADD_TAB_DESCRIPTION'}, - {name : 'CH_SCHEMA'}, - {name : 'CH_DATA'} - ] - }) - }); - - var action_edit = new Ext.form.ComboBox({ - typeAhead: true, - triggerAction: 'all', - mode: 'local', - store: comboStore, - displayField: 'action', - valueField: 'action' - }); - - cmodel = new Ext.grid.ColumnModel({ - defaults: { - width: 10, - sortable: true - }, - columns: [ - new Ext.grid.RowNumberer(), - //smodel, - {id:'ADD_TAB_UID', dataIndex: 'ADD_TAB_UID', hidden:true, hideable:false}, - {header: _('ID_NAME'), dataIndex: 'ADD_TAB_NAME', width: 20, align:'left'}, - {header: _('ID_DESCRIPTION'), dataIndex: 'ADD_TAB_DESCRIPTION', width: 50, hidden:false, align:'left'},//, - {header: _('ID_SCHEMA'), dataIndex: 'CH_SCHEMA', hidden: false, width: 20, editor: action_edit, align: 'center'}, - {header: 'DATA', dataIndex: 'CH_DATA', hidden: false, width: 20, editor: action_edit, align: 'center'} - ] - }); - - infoGrid = new Ext.grid.EditorGridPanel({ - store: store, - cm: cmodel, - width: 600, - height: 300, - title: _('ID_ADDITIONAL_TABLES') + ': ' +_('ID_TITLE_EXPORT_TOOL'), - frame: false, - clicksToEdit: 1, - id: 'infoGrid', - - sm: new Ext.grid.RowSelectionModel({singleSelect: false}), - tbar:[exportButton, {xtype: 'tbfill'} ,cancelButton],//'-', editButton, deleteButton,'-', dataButton,{xtype: 'tbfill'} , importButton, exportButton], - view: new Ext.grid.GroupingView({ - forceFit:true, - groupTextTpl: '{text}' - }) - }); - - infoGrid.store.load(); - - viewport = new Ext.Viewport({ - layout: 'fit', - autoScroll: false, - items: [ - infoGrid - ] - }); - -}); - -//Cancels Export View -CancelExport = function(){ - history.back(); -}; - -//Export Schema/Data from PM Tables -ExportPMTables = function(){ - iGrid = Ext.getCmp('infoGrid'); - var storeExport = iGrid.getStore(); - var UIDs = new Array(); - var SCHs = new Array(); - var DATs = new Array(); - for (var r=0; r