Files
luos/workflow/engine/controllers/pmTablesProxy.php
Luis Fernando Saisa Lopez e4a362ed69 BUG 15089 "Pmtables: Problema al importar la data..." SOLVED
- Pmtables: Problema al importar la data de tipo Autoincrementable
- Problema resuelto, el problema que se tenia era por los archivos que crea propel especificamente los archivos Peer,
  al momento de hacer la insercióe los campos se eliminaba la columna donde se tenia los Primary Key ocasionando que
  se cree nuevamente. Se valida la importacion de los pmTables cuando son de tipo Autoincrementable logrando a que
  cuando se importe un pmTable mantenga los íices que se tenia al momento de exportarlos.
2014-06-10 16:42:49 -04:00

1582 lines
67 KiB
PHP
Executable File

<?php
/**
* pmTablesProxy
*
* @author Erik Amaru Ortiz <erik@colosa.com, aortiz.erik@gmail.com>
* @inherits HttpProxyController
* @access public
*/
require_once 'classes/model/AdditionalTables.php';
class pmTablesProxy extends HttpProxyController
{
protected $className;
protected $classPeerName;
protected $dynUid;
/**
* get pmtables list
*
* @param string $httpData->start
* @param string $httpData->limit
* @param string $httpData->textFilter
*/
public function getList ($httpData)
{
G::LoadClass( 'configuration' );
G::LoadClass( 'processMap' );
G::LoadClass( 'pmTable' );
$configurations = new Configurations();
$processMap = new processMap();
// setting parameters
$config = $configurations->getConfiguration( 'additionalTablesList', 'pageSize', '', $_SESSION['USER_LOGGED'] );
$env = $configurations->getConfiguration( 'ENVIRONMENT_SETTINGS', '' );
$limit_size = isset( $config->pageSize ) ? $config['pageSize'] : 20;
$start = isset( $httpData->start ) ? $httpData->start : 0;
$limit = isset( $httpData->limit ) ? $httpData->limit : $limit_size;
$filter = isset( $httpData->textFilter ) ? $httpData->textFilter : '';
$pro_uid = isset( $httpData->pro_uid ) ? $httpData->pro_uid : null;
if ($pro_uid !== null) {
$process = $pro_uid == '' ? array ('not_equal' => $pro_uid
) : array ('equal' => $pro_uid);
$addTables = AdditionalTables::getAll( $start, $limit, $filter, $process );
$c = $processMap->getReportTablesCriteria( $pro_uid );
$oDataset = RoutePeer::doSelectRS( $c );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$reportTablesOldList = array ();
while ($oDataset->next()) {
$reportTablesOldList[] = $oDataset->getRow();
}
$addTables['count'] += count( $reportTablesOldList );
foreach ($reportTablesOldList as $i => $oldRepTab) {
$addTables['rows'][] = array ('ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'],'PRO_UID' => $oldRepTab['PRO_UID'],'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION'] == 'wf' ? 'workflow' : 'rp'),'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'],'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'],'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'],'TYPE' => 'CLASSIC' );
}
} else {
$addTables = AdditionalTables::getAll( $start, $limit, $filter );
}
foreach ($addTables['rows'] as $i => $table) {
try {
$con = Propel::getConnection( pmTable::resolveDbSource( $table['DBS_UID'] ) );
$stmt = $con->createStatement();
$rs = $stmt->executeQuery( 'SELECT COUNT(*) AS NUM_ROWS from ' . $table['ADD_TAB_NAME'] );
if ($rs->next()) {
$r = $rs->getRow();
$addTables['rows'][$i]['NUM_ROWS'] = $r['NUM_ROWS'];
} else {
$addTables['rows'][$i]['NUM_ROWS'] = 0;
}
//removing the prefix "PMT" to allow alphabetical order (just in view)
if (substr( $addTables['rows'][$i]['ADD_TAB_NAME'], 0, 4 ) == 'PMT_') {
$addTables['rows'][$i]['ADD_TAB_NAME'] = substr( $addTables['rows'][$i]['ADD_TAB_NAME'], 4 );
}
} catch (Exception $e) {
$addTables['rows'][$i]['NUM_ROWS'] = G::LoadTranslation( 'ID_TABLE_NOT_FOUND' );
}
}
return $addTables;
}
/**
* get processesList
*/
public function getProcessList ()
{
require_once 'classes/model/Process.php';
$process = new Process();
return $process->getAll();
}
/**
* get database connection list
*/
public function getDbConnectionsList ()
{
if (! isset( $_SESSION['PROCESS'] )) {
$_SESSION['PROCESS'] = $_POST['PRO_UID'];
}
G::LoadClass( 'dbConnections' );
$proUid = $_POST['PRO_UID'];
$dbConn = new DbConnections();
$dbConnections = $dbConn->getConnectionsProUid( $proUid );
$defaultConnections = array (array ('DBS_UID' => 'workflow','DBS_NAME' => 'Workflow'
),array ('DBS_UID' => 'rp','DBS_NAME' => 'REPORT'
)
);
$dbConnections = array_merge( $defaultConnections, $dbConnections );
return $dbConnections;
}
/**
* get dynaform fields
*
* @param string $httpData->PRO_UID
* @param string $httpData->TYPE
* @param string $httpData->GRID_UID
*/
public function getDynafields ($httpData)
{
G::LoadClass( 'reportTables' );
$aFields['FIELDS'] = array ();
$aFields['PRO_UID'] = $httpData->PRO_UID;
$dynFields = array ();
if (isset( $httpData->TYPE ) && $httpData->TYPE == 'GRID') {
$aProcessGridFields = Array ();
if (isset( $httpData->GRID_UID )) {
list ($gridName, $gridId) = explode( '-', $httpData->GRID_UID );
$this->dynUid = $gridId;
$httpData->textFilter = isset( $httpData->textFilter ) ? $httpData->textFilter : null;
$dynFields = $this->_getDynafields( $aFields['PRO_UID'], 'grid', $httpData->start, $httpData->limit, $httpData->textFilter );
} else {
if (isset( $_SESSION['_cache_pmtables'] )) {
unset( $_SESSION['_cache_pmtables'] );
}
$gridFields = $this->_getGridFields( $aFields['PRO_UID'] );
foreach ($gridFields as $gfield) {
$dynFields[] = array ('FIELD_UID' => $gfield['name'] . '-' . $gfield['xmlform'],'FIELD_NAME' => $gfield['name']
);
}
}
} else {
// normal dynaform
$httpData->textFilter = isset( $httpData->textFilter ) ? $httpData->textFilter : null;
$dynFields = $this->_getDynafields( $aFields['PRO_UID'], 'xmlform', $httpData->start, $httpData->limit, $httpData->textFilter );
}
return $dynFields;
}
public function updateAvDynafields ($httpData)
{
$indexes = explode( ',', $httpData->indexes );
$fields = array ();
$httpData->isset = $httpData->isset == 'true' ? true : false;
if (isset( $_SESSION['_cache_pmtables'] ) && $_SESSION['_cache_pmtables']['pro_uid'] == $httpData->PRO_UID) {
foreach ($indexes as $i) {
if (is_numeric( $i )) {
if (isset( $_SESSION['_cache_pmtables']['rows'][$i] )) {
$_SESSION['_cache_pmtables']['rows'][$i]['_isset'] = $httpData->isset;
if ($httpData->isset) {
$_SESSION['_cache_pmtables']['count'] ++;
} else {
$_SESSION['_cache_pmtables']['count'] --;
}
$fields[] = $_SESSION['_cache_pmtables']['rows'][$i]['FIELD_NAME'];
}
} else {
$index = $_SESSION['_cache_pmtables']['indexes'][$i];
$_SESSION['_cache_pmtables']['rows'][$index]['_isset'] = $httpData->isset;
}
}
}
return $fields;
}
/**
* save pm table
*/
public function save ($httpData, $alterTable = true)
{
//require_once 'classes/model/AdditionalTables.php';
//require_once 'classes/model/Fields.php';
try {
$result = new stdClass();
ob_start();
$data = (array) $httpData;
$data['PRO_UID'] = trim( $data['PRO_UID'] );
$data['columns'] = G::json_decode( stripslashes( $httpData->columns ) ); //decofing data columns
$isReportTable = $data['PRO_UID'] != '' ? true : false;
$oAdditionalTables = new AdditionalTables();
$oFields = new Fields();
$repTabClassName = $oAdditionalTables->getPHPName( $data['REP_TAB_NAME'] );
$columns = $data['columns'];
// Reserved Words Table
$reservedWords = array ('ALTER','CLOSE','COMMIT','CREATE','DECLARE','DELETE','DROP','FETCH','FUNCTION','GRANT','INDEX','INSERT','OPEN','REVOKE','ROLLBACK','SELECT','SYNONYM','TABLE','UPDATE','VIEW','APP_UID','ROW','PMTABLE' );
// Reserved Words Field
$reservedWordsPhp = array ('case','catch','cfunction','class','clone','const','continue','declare','default','do','else','elseif','enddeclare','endfor','endforeach','endif','endswitch','endwhile','extends','final','for','foreach','function','global','goto','if','implements','interface','instanceof','private','namespace','new','old_function','or','throw','protected','public','static','switch','xor','try','use','var','while'
);
$reservedWordsSql = G::reservedWordsSql();
// verify if exists.
if ($data['REP_TAB_UID'] == '' || (isset( $httpData->forceUid ) && $httpData->forceUid)) {
//new report table
if ($isReportTable && $alterTable) {
//setting default columns
$defaultColumns = $this->_getReportTableDefaultColumns( $data['REP_TAB_TYPE'] );
$columns = array_merge( $defaultColumns, $columns );
}
/**
* validations *
*/
if (is_array( $oAdditionalTables->loadByName( $data['REP_TAB_NAME'] ) )) {
throw new Exception( G::loadTranslation( 'ID_PMTABLE_ALREADY_EXISTS', array ($data['REP_TAB_NAME']
) ) );
}
if (in_array( strtoupper( $data["REP_TAB_NAME"] ), $reservedWords ) || in_array( strtoupper( $data["REP_TAB_NAME"] ), $reservedWordsSql )) {
throw (new Exception( G::LoadTranslation( "ID_PMTABLE_INVALID_NAME", array ($data["REP_TAB_NAME"]
) ) ));
}
}
//backward compatility
foreach ($columns as $i => $column) {
if (in_array( strtoupper( $columns[$i]->field_name ), $reservedWordsSql ) || in_array( strtolower( $columns[$i]->field_name ), $reservedWordsPhp )) {
throw (new Exception( G::LoadTranslation( "ID_PMTABLE_INVALID_FIELD_NAME", array ($columns[$i]->field_name
) ) ));
}
switch ($column->field_type) {
case 'INT':
$columns[$i]->field_type = 'INTEGER';
break;
case 'TEXT':
$columns[$i]->field_type = 'LONGVARCHAR';
break;
// propel DATETIME equivalent is TIMESTAMP
case 'DATETIME':
$columns[$i]->field_type = 'TIMESTAMP';
break;
}
// VALIDATIONS
if ($columns[$i]->field_autoincrement) {
$typeCol = $columns[$i]->field_type;
if (! ($typeCol === 'INTEGER' || $typeCol === 'TINYINT' || $typeCol === 'SMALLINT' || $typeCol === 'BIGINT')) {
$columns[$i]->field_autoincrement = false;
}
}
}
G::LoadClass("pmTable");
$pmTable = new pmTable( $data['REP_TAB_NAME'] );
$pmTable->setDataSource( $data['REP_TAB_CONNECTION'] );
$pmTable->setColumns( $columns );
$pmTable->setAlterTable( $alterTable );
if (isset($data["keepData"]) && $data["keepData"] == 1) {
//PM Table
$pmTable->setKeepData(true);
}
$pmTable->build();
$buildResult = ob_get_contents();
ob_end_clean();
// Updating additional table struture information
$addTabData = array ('ADD_TAB_UID' => $data['REP_TAB_UID'],'ADD_TAB_NAME' => $data['REP_TAB_NAME'],'ADD_TAB_CLASS_NAME' => $repTabClassName,'ADD_TAB_DESCRIPTION' => $data['REP_TAB_DSC'],'ADD_TAB_PLG_UID' => '','DBS_UID' => ($data['REP_TAB_CONNECTION'] ? $data['REP_TAB_CONNECTION'] : 'workflow'),'PRO_UID' => $data['PRO_UID'],'ADD_TAB_TYPE' => $data['REP_TAB_TYPE'],'ADD_TAB_GRID' => $data['REP_TAB_GRID']
);
if ($data['REP_TAB_UID'] == '' || (isset( $httpData->forceUid ) && $httpData->forceUid)) {
//new report table
//create record
$addTabUid = $oAdditionalTables->create( $addTabData );
} else {
//editing report table
//updating record
$addTabUid = $data['REP_TAB_UID'];
$oAdditionalTables->update( $addTabData );
//removing old data fields references
$oCriteria = new Criteria( 'workflow' );
$oCriteria->add( FieldsPeer::ADD_TAB_UID, $data['REP_TAB_UID'] );
FieldsPeer::doDelete( $oCriteria );
}
// Updating pmtable fields
foreach ($columns as $i => $column) {
$field = array ('FLD_UID' => $column->uid,'FLD_INDEX' => $i,'ADD_TAB_UID' => $addTabUid,'FLD_NAME' => $column->field_name,'FLD_DESCRIPTION' => $column->field_label,'FLD_TYPE' => $column->field_type,'FLD_SIZE' => $column->field_size == '' ? null : $column->field_size,'FLD_NULL' => $column->field_null ? 1 : 0,'FLD_AUTO_INCREMENT' => $column->field_autoincrement ? 1 : 0,'FLD_KEY' => $column->field_key ? 1 : 0,'FLD_FOREIGN_KEY' => 0,'FLD_FOREIGN_KEY_TABLE' => '','FLD_DYN_NAME' => $column->field_dyn,'FLD_DYN_UID' => $column->field_uid,'FLD_FILTER' => (isset( $column->field_filter ) && $column->field_filter) ? 1 : 0
);
$oFields->create( $field );
}
if ($isReportTable && $alterTable) {
// the table was create successfully but we're catching problems while populating table
try {
$oAdditionalTables->populateReportTable( $data['REP_TAB_NAME'], $pmTable->getDataSource(), $data['REP_TAB_TYPE'], $data['PRO_UID'], $data['REP_TAB_GRID'], $addTabUid );
} catch (Exception $e) {
$result->message = $result->msg = $e->getMessage();
}
}
$result->success = true;
$result->message = $result->msg = $buildResult;
} catch (Exception $e) {
$result = new stdClass();
$buildResult = ob_get_contents();
ob_end_clean();
$result->success = false;
// if it is a propel exception message
if (preg_match( '/(.*)\s\[(.*):\s(.*)\]\s\[(.*):\s(.*)\]/', $e->getMessage(), $match )) {
$result->message = $result->msg = $match[3];
$result->type = ucfirst( $pmTable->getDbConfig()->adapter );
} else {
$result->message = $result->msg = $e->getMessage();
$result->type = G::loadTranslation( 'ID_EXCEPTION' );
}
$result->trace = $e->getTraceAsString();
}
return $result;
}
/**
* delete pm table
*
* @param string $httpData->rows
*/
public function delete ($httpData)
{
$result = new stdClass();
$rows = G::json_decode( stripslashes( $httpData->rows ) );
$errors = '';
$count = 0;
foreach ($rows as $row) {
try {
$at = new AdditionalTables();
$table = $at->load( $row->id );
if (! isset( $table )) {
require_once 'classes/model/ReportTable.php';
$rtOld = new ReportTable();
$existReportTableOld = $rtOld->load( $row->id );
if (count($existReportTableOld) == 0) {
throw new Exception( G::LoadTranslation('ID_TABLE_NOT_EXIST_SKIPPED') );
}
}
if ($row->type == 'CLASSIC') {
G::LoadClass( 'reportTables' );
$rp = new reportTables();
$rp->deleteReportTable( $row->id );
$count ++;
} else {
$at->deleteAll( $row->id );
$count ++;
}
} catch (Exception $e) {
$tableName = isset( $table['ADD_TAB_NAME'] ) ? $table['ADD_TAB_NAME'] : $row->id;
$errors .= $e->getMessage() . "\n";
continue;
}
}
if ($errors == '') {
$result->success = true;
$result->message = $count.G::LoadTranslation( 'ID_TABLES_REMOVED_SUCCESSFULLY' );
} else {
$result->success = false;
$result->message = $count. G::LoadTranslation( 'ID_TABLES_REMOVED_WITH_ERRORS' ) .$errors;
}
$result->errors = $errors;
return $result;
}
/**
* get pm tables data
*
* @param string $httpData->id
* @param string $httpData->start
* @param string $httpData->limit
*/
public function dataView ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
G::LoadClass( 'configuration' );
$co = new Configurations();
$config = $co->getConfiguration( 'additionalTablesData', 'pageSize', '', $_SESSION['USER_LOGGED'] );
$limit_size = isset( $config['pageSize'] ) ? $config['pageSize'] : 20;
$start = isset( $httpData->start ) ? $httpData->start : 0;
$limit = isset( $httpData->limit ) ? $httpData->limit : $limit_size;
$filter = isset( $httpData->textFilter ) ? $httpData->textFilter : '';
$additionalTables = new AdditionalTables();
$table = $additionalTables->load( $httpData->id, true );
if ($filter != '') {
$result = $additionalTables->getAllData( $httpData->id, $start, $limit, true, $filter);
} else {
$result = $additionalTables->getAllData( $httpData->id, $start, $limit );
}
$primaryKeys = $additionalTables->getPrimaryKeys();
if (is_array($result['rows'])) {
foreach ($result['rows'] as $i => $row) {
$primaryKeysValues = array ();
foreach ($primaryKeys as $key) {
$primaryKeysValues[] = isset( $row[$key['FLD_NAME']] ) ? $row[$key['FLD_NAME']] : '';
}
$result['rows'][$i]['__index__'] = G::encrypt( implode( ',', $primaryKeysValues ), 'pmtable' );
}
} else {
$result['rows'] = array();
}
return $result;
}
/**
* create pm tables record
*
* @param string $httpData->rows
*/
public function dataCreate ($httpData, $codification = 'json')
{
if ($codification == 'base64') {
$rows = unserialize( base64_decode( $httpData->rows ) );
} else {
$rows = G::json_decode( $httpData->rows );
}
try {
require_once 'classes/model/AdditionalTables.php';
$additionalTables = new AdditionalTables();
$table = $additionalTables->load( $httpData->id, true );
$primaryKeys = $additionalTables->getPrimaryKeys();
$this->className = $table['ADD_TAB_CLASS_NAME'];
$this->classPeerName = $this->className . 'Peer';
$row = (array) $rows;
$row = array_merge( array_change_key_case( $row, CASE_LOWER ), array_change_key_case( $row, CASE_UPPER ) );
$toSave = false;
if (! file_exists( PATH_WORKSPACE . 'classes/' . $this->className . '.php' )) {
throw new Exception( 'Create::' . G::loadTranslation( 'ID_PMTABLE_CLASS_DOESNT_EXIST', $this->className ) );
}
require_once PATH_WORKSPACE . 'classes/' . $this->className . '.php';
eval( '$obj = new ' . $this->className . '();' );
if (count( $row ) > 0) {
eval( '$con = Propel::getConnection(' . $this->classPeerName . '::DATABASE_NAME);' );
$obj->fromArray( $row, BasePeer::TYPE_FIELDNAME );
if ($obj->validate()) {
$obj->save();
$toSave = true;
$primaryKeysValues = array ();
foreach ($primaryKeys as $primaryKey) {
$method = 'get' . AdditionalTables::getPHPName( $primaryKey['FLD_NAME'] );
$primaryKeysValues[] = $obj->$method();
}
} else {
$msg = '';
foreach ($obj->getValidationFailures() as $objValidationFailure) {
$msg .= $objValidationFailure->getMessage() . "\n";
}
throw new Exception( G::LoadTranslation('ID_ERROR_TRYING_INSERT'). '"' . $table['ADD_TAB_NAME'] . "\"\n" . $msg );
}
$index = G::encrypt( implode( ',', $primaryKeysValues ), 'pmtable' );
} else {
$toSave = false;
}
if ($toSave) {
$result->success = true;
$result->message = G::LoadTranslation('ID_RECORD_SAVED_SUCCESFULLY');
$result->rows = $obj->toArray( BasePeer::TYPE_FIELDNAME );
$result->rows['__index__'] = $index;
} else {
$result->success = false;
$result->rows = array ();
$result->message = '$$';
}
} catch (Exception $e) {
$result->success = false;
$result->rows = array ();
$result->message = $e->getMessage();
}
return $result;
}
/**
* update pm tables record
*
* @param string $httpData->id
*/
public function dataUpdate ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
$oAdditionalTables = new AdditionalTables();
$table = $oAdditionalTables->load( $httpData->id, true );
$primaryKeys = $oAdditionalTables->getPrimaryKeys( 'keys' );
$this->className = $table['ADD_TAB_CLASS_NAME'];
$this->classPeerName = $this->className . 'Peer';
$sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
if (! file_exists( $sPath . $this->className . '.php' )) {
throw new Exception( 'Update:: ' . G::loadTranslation( 'ID_PMTABLE_CLASS_DOESNT_EXIST', $this->className ) );
}
require_once $sPath . $this->className . '.php';
$rows = G::json_decode( stripslashes( $httpData->rows ) );
if (is_array( $rows )) {
foreach ($rows as $row) {
$row = (array) $row;
$result = $this->_dataUpdate( $row, $primaryKeys );
}
} else {
//then is object
$row = (array) $rows;
$result = $this->_dataUpdate( $row, $primaryKeys );
}
$this->success = $result;
$this->message = $result ? G::loadTranslation( 'ID_UPDATED_SUCCESSFULLY' ) : G::loadTranslation( 'ID_UPDATE_FAILED' );
}
/**
* remove a pm tables record
*
* @param string $httpData->id
*/
public function dataDestroy ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
$oAdditionalTables = new AdditionalTables();
$table = $oAdditionalTables->load( $httpData->id, true );
$this->className = $table['ADD_TAB_CLASS_NAME'];
$this->classPeerName = $this->className . 'Peer';
$sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
if (! file_exists( $sPath . $this->className . '.php' )) {
throw new Exception( 'Destroy:: ' . G::loadTranslation( 'ID_PMTABLE_CLASS_DOESNT_EXIST', $this->className ) );
}
require_once $sPath . $this->className . '.php';
$this->success = $this->_dataDestroy( $httpData->rows );
$this->message = $this->success ? G::loadTranslation( 'ID_DELETED_SUCCESSFULLY' ) : G::loadTranslation( 'ID_DELETE_FAILED' );
}
/**
* import a CSV to pm tables record
*
* @param string $httpData->id
*/
public function importCSV ($httpData)
{
if (preg_match( '/[\x00-\x08\x0b-\x0c\x0e\x1f]/', file_get_contents( $_FILES['form']['tmp_name']['CSV_FILE'] ) ) === 0) {
$filename = $_FILES['form']['name']['CSV_FILE'];
if ($oFile = fopen( $_FILES['form']['tmp_name']['CSV_FILE'], 'r' )) {
require_once 'classes/model/AdditionalTables.php';
$oAdditionalTables = new AdditionalTables();
$aAdditionalTables = $oAdditionalTables->load( $_POST['form']['ADD_TAB_UID'], true );
$sErrorMessages = '';
$i = 1;
$swHead = false;
while (($aAux = fgetcsv( $oFile, 4096, $_POST['form']['CSV_DELIMITER'] )) !== false) {
if (! is_null( $aAux[0] )) {
if (count( $aAdditionalTables['FIELDS'] ) > count( $aAux )) {
$this->success = false;
$this->message = G::LoadTranslation( 'INVALID_FILE' );
return 0;
}
if ($i == 1) {
$j = 0;
foreach ($aAdditionalTables['FIELDS'] as $aField) {
if ($aField['FLD_NAME'] === $aAux[$j]) {
$swHead = true;
}
$j ++;
}
}
if ($swHead == false) {
$aData = array ();
$j = 0;
foreach ($aAdditionalTables['FIELDS'] as $aField) {
$aData[$aField['FLD_NAME']] = (isset( $aAux[$j] ) ? $aAux[$j] : '');
if ($aData[$aField['FLD_NAME']] == '') {
switch ($aField['FLD_TYPE']) {
case 'DATE':
case 'TIMESTAMP':
$aData[$aField['FLD_NAME']] = null;
break;
}
}
$j ++;
}
try {
if (! $oAdditionalTables->saveDataInTable( $_POST['form']['ADD_TAB_UID'], $aData )) {
$sErrorMessages .= G::LoadTranslation( 'ID_DUPLICATE_ENTRY_PRIMARY_KEY' ) . ', ' . G::LoadTranslation( 'ID_LINE' ) . ' ' . $i . '. ';
}
} catch (Exception $oError) {
$sErrorMessages .= G::LoadTranslation( 'ID_ERROR_INSERT_LINE' ) . ': ' . G::LoadTranslation( 'ID_LINE' ) . ' ' . $i . '. ';
}
} else {
$swHead = false;
}
$i ++;
}
}
fclose( $oFile );
}
if ($sErrorMessages != '') {
$this->success = false;
$this->message = $sErrorMessages;
} else {
$this->success = true;
$this->message = G::loadTranslation( 'ID_FILE_IMPORTED_SUCCESSFULLY', array ($filename
) );
}
} else {
$sMessage = G::LoadTranslation( 'ID_UPLOAD_VALID_CSV_FILE' );
$this->success = false;
$this->message = $sMessage;
}
}
/**
* export a pm tables record to CSV
*
* @param string $httpData->id
*/
public function exportCSV ($httpData)
{
try {
$link = '';
$size = '';
$META = 'Content';
$bytesSaved = 0;
require_once 'classes/model/AdditionalTables.php';
$oAdditionalTables = new AdditionalTables();
$aAdditionalTables = $oAdditionalTables->load( $_POST['ADD_TAB_UID'], true );
$sErrorMessages = '';
$sDelimiter = $_POST['CSV_DELIMITER'];
$resultData = $oAdditionalTables->getAllData( $_POST['ADD_TAB_UID'], null, null, false );
$rows = $resultData['rows'];
$count = $resultData['count'];
$PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP;
$filenameOnly = strtolower( $aAdditionalTables['ADD_TAB_NAME'] . "_" . date( "Y-m-d" ) . '_' . date( "Hi" ) . ".csv" );
$filename = $PUBLIC_ROOT_PATH . $filenameOnly;
$fp = fopen( $filename, "wb" );
foreach ($rows as $keyCol => $cols) {
$SDATA = "";
$cnt = count( $cols );
foreach ($cols as $key => $val) {
$SDATA .= $val;
if (-- $cnt > 0) {
$SDATA .= $sDelimiter;
}
}
$SDATA .= "\n";
$bytesSaved += fwrite( $fp, $SDATA );
}
fclose( $fp );
// $filenameLink = "pmTables/streamExported?f=$filenameOnly";
$filenameLink = "streamExported?f=$filenameOnly";
$size = round( ($bytesSaved / 1024), 2 ) . " Kb";
$filename = $filenameOnly;
$link = $filenameLink;
$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;
}
/**
* import a pm table
*
* @param string $httpData->id
*/
public function import ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
try {
$result = new stdClass();
$errors = '';
$overWrite = isset( $_POST['form']['OVERWRITE'] ) ? true : false;
//save the file
if ($_FILES['form']['error']['FILENAME'] !== 0) {
throw new Exception( G::loadTranslation( 'ID_PMTABLE_UPLOADING_FILE_PROBLEM' ) );
}
$oAdditionalTables = new AdditionalTables();
$tableNameMap = array ();
$processQueue = array ();
$processQueueTables = array ();
$PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP;
$filename = $_FILES['form']['name']['FILENAME'];
$tempName = $_FILES['form']['tmp_name']['FILENAME'];
G::uploadFile( $tempName, $PUBLIC_ROOT_PATH, $filename );
$fileContent = file_get_contents( $PUBLIC_ROOT_PATH . $filename );
if (strpos( $fileContent, '-----== ProcessMaker Open Source Private Tables ==-----' ) === false) {
throw new Exception( G::loadTranslation( 'ID_PMTABLE_INVALID_FILE' ) );
}
$fp = fopen( $PUBLIC_ROOT_PATH . $filename, "rb" );
$fsData = intval( fread( $fp, 9 ) ); //reading the metadata
$sType = fread( $fp, $fsData );
// first create the tables structures
while (! feof( $fp )) {
switch ($sType) {
case '@META':
$fsData = intval( fread( $fp, 9 ) );
$METADATA = fread( $fp, $fsData );
break;
case '@SCHEMA':
$fsUid = intval( fread( $fp, 9 ) );
$uid = fread( $fp, $fsUid );
$fsData = intval( fread( $fp, 9 ) );
$schema = fread( $fp, $fsData );
$contentSchema = unserialize( $schema );
$additionalTable = new additionalTables();
$tableExists = $additionalTable->loadByName( $contentSchema['ADD_TAB_NAME'] );
$tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME'];
if ($overWrite) {
if ($tableExists !== false) {
$additionalTable->deleteAll( $tableExists['ADD_TAB_UID'] );
}
} else {
if ($tableExists !== false) {
// some table exists with the same name
// renaming...
$tNameOld = $contentSchema['ADD_TAB_NAME'];
$newTableName = $contentSchema['ADD_TAB_NAME'] . '_' . date( 'YmdHis' );
$contentSchema['ADD_TAB_UID'] = G::generateUniqueID();
$contentSchema['ADD_TAB_NAME'] = $newTableName;
$contentSchema['ADD_TAB_CLASS_NAME'] = additionalTables::getPHPName( $newTableName );
//mapping the table name for posterior uses
$tableNameMap[$tNameOld] = $contentSchema['ADD_TAB_NAME'];
}
}
// validating invalid bds_uid in old tables definition -> mapped to workflow
if (! $contentSchema['DBS_UID'] || $contentSchema['DBS_UID'] == '0' || ! $contentSchema['DBS_UID']) {
$contentSchema['DBS_UID'] = 'workflow';
}
$columns = array ();
foreach ($contentSchema['FIELDS'] as $field) {
$column = array ('uid' => '','field_uid' => '','field_name' => $field['FLD_NAME'],'field_dyn' => isset( $field['FLD_DYN_NAME'] ) ? $field['FLD_DYN_NAME'] : '','field_label' => isset( $field['FLD_DESCRIPTION'] ) ? $field['FLD_DESCRIPTION'] : '','field_type' => $field['FLD_TYPE'],'field_size' => $field['FLD_SIZE'],'field_key' => isset( $field['FLD_KEY'] ) ? $field['FLD_KEY'] : 0,'field_null' => isset( $field['FLD_NULL'] ) ? $field['FLD_NULL'] : 1,'field_autoincrement' => isset( $field['FLD_AUTO_INCREMENT'] ) ? $field['FLD_AUTO_INCREMENT'] : 0
);
$columns[] = $column;
}
$tableData = new stdClass();
$tableData->REP_TAB_UID = $contentSchema['ADD_TAB_UID'];
$tableData->REP_TAB_NAME = $contentSchema['ADD_TAB_NAME'];
$tableData->REP_TAB_DSC = $contentSchema['ADD_TAB_DESCRIPTION'];
$tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID'];
if (isset( $_POST["form"]["PRO_UID"] ) && ! empty( $_POST["form"]["PRO_UID"] )) {
$tableData->PRO_UID = $_POST["form"]["PRO_UID"];
} else {
$tableData->PRO_UID = isset( $contentSchema["PRO_UID"] ) ? $contentSchema["PRO_UID"] : "";
}
$tableData->REP_TAB_TYPE = isset( $contentSchema['ADD_TAB_TYPE'] ) ? $contentSchema['ADD_TAB_TYPE'] : '';
$tableData->REP_TAB_GRID = isset( $contentSchema['ADD_TAB_GRID'] ) ? $contentSchema['ADD_TAB_GRID'] : '';
$tableData->columns = G::json_encode( $columns );
$tableData->forceUid = true;
//save the table
$alterTable = false;
$result = $this->save( $tableData, $alterTable );
if ($result->success) {
$processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME'];
} else {
$errors .= 'Error creating table: ' . $tableData->REP_TAB_NAME . '-> ' . $result->message . "\n\n";
}
break;
case '@DATA':
$fstName = intval( fread( $fp, 9 ) );
$tableName = fread( $fp, $fstName );
$fsData = intval( fread( $fp, 9 ) );
if ($fsData > 0) {
$data = fread( $fp, $fsData );
}
break;
}
$fsData = intval( fread( $fp, 9 ) ); //reading the metadata
if ($fsData > 0) {
// reading next block type
$sType = fread( $fp, $fsData );
} else {
break;
}
}
fclose( $fp );
G::loadClass( 'pmTable' );
foreach ($processQueueTables as $dbsUid => $tables) {
$pmTable = new pmTable();
ob_start();
$pmTable->buildModelFor( $dbsUid, $tables );
$buildResult = ob_get_contents();
ob_end_clean();
$errors .= $pmTable->upgradeDatabaseFor( $pmTable->getDataSource(), $tables );
}
$fp = fopen( $PUBLIC_ROOT_PATH . $filename, "rb" );
$fsData = intval( fread( $fp, 9 ) );
$sType = fread( $fp, $fsData );
// data processing
while (! feof( $fp )) {
switch ($sType) {
case '@META':
$fsData = intval( fread( $fp, 9 ) );
$METADATA = fread( $fp, $fsData );
break;
case '@SCHEMA':
$fsUid = intval( fread( $fp, 9 ) );
$uid = fread( $fp, $fsUid );
$fsData = intval( fread( $fp, 9 ) );
$schema = fread( $fp, $fsData );
$contentSchema = unserialize( $schema );
$additionalTable = new additionalTables();
$table = $additionalTable->loadByName( $tableNameMap[$contentSchema['ADD_TAB_NAME']] );
if ($table['PRO_UID'] != '') {
// is a report table, try populate it
$additionalTable->populateReportTable( $table['ADD_TAB_NAME'], pmTable::resolveDbSource( $table['DBS_UID'] ), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID'] );
}
break;
case '@DATA':
$fstName = intval( fread( $fp, 9 ) );
$tableName = fread( $fp, $fstName );
$fsData = intval( fread( $fp, 9 ) );
if ($fsData > 0) {
$data = fread( $fp, $fsData );
$contentData = unserialize( $data );
$tableName = $tableNameMap[$tableName];
$oAdditionalTables = new AdditionalTables();
$table = $oAdditionalTables->loadByName( $tableName );
$isReport = $table['PRO_UID'] !== '' ? true : false;
if ($table !== false) {
if (! $isReport) {
if (count( $contentData ) > 0) {
$oAdditionalTables->load( $table['ADD_TAB_UID'], true );
$primaryKeys = $oAdditionalTables->getPrimaryKeys();
// Obtain a list of columns
$primaryKeyColumn = array();
foreach ($contentData as $key => $row) {
$primaryKeyColumn[$key] = $row[$primaryKeys[0]['FLD_NAME']];
}
unset($row);
array_multisort($primaryKeyColumn, SORT_ASC, $contentData);
foreach ($contentData as $row) {
$data = new StdClass();
$data->id = $table['ADD_TAB_UID'];
$data->rows = base64_encode( serialize( $row ) );
$res = $this->dataCreate( $data, 'base64' );
if (! $res->success) {
$errors .= $res->message;
}
}
}
}
}
}
break;
}
$fsData = intval( fread( $fp, 9 ) );
if ($fsData > 0) {
$sType = fread( $fp, $fsData );
} else {
break;
}
}
////////////
if ($errors == '') {
$result->success = true;
$msg = G::loadTranslation( 'ID_PMTABLE_IMPORT_SUCCESS', array ($filename
) );
} else {
$result->success = false;
$result->errorType = 'warning';
$msg = G::loadTranslation( 'ID_PMTABLE_IMPORT_WITH_ERRORS', array ($filename
) ) . "\n\n" . $errors;
}
$result->message = $msg;
} catch (Exception $e) {
$result = new stdClass();
$result->errorType = 'error';
$result->buildResult = ob_get_contents();
ob_end_clean();
$result->success = false;
// if it is a propel exception message
if (preg_match( '/(.*)\s\[(.*):\s(.*)\]\s\[(.*):\s(.*)\]/', $e->getMessage(), $match )) {
$result->message = $match[3];
$result->type = G::loadTranslation( 'ID_ERROR' );
} else {
$result->message = $e->getMessage();
$result->type = G::loadTranslation( 'ID_EXCEPTION' );
}
//$result->trace = $e->getTraceAsString();
}
return $result;
}
/**
* Export PM tables
*
* @author : Erik Amaru Ortiz <aortiz.erik@gmail.com>
*/
public function export ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
$at = new AdditionalTables();
$tablesToExport = G::json_decode( stripslashes( $httpData->rows ) );
try {
$result = new stdClass();
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) {
$tableRecord = $at->load( $table->ADD_TAB_UID );
$tableData = $at->getAllData( $table->ADD_TAB_UID, null, null, false );
$table->ADD_TAB_NAME = $tableRecord['ADD_TAB_NAME'];
$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, null, null, false );
$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 = "<pre>" . $META . "</pre>";
$filename = $filenameOnly;
$link = $filenameLink;
$result->success = true;
$result->filename = $filenameOnly;
$result->link = $link;
$result->message = "Generated file: $filenameOnly, size: $size";
} catch (Exception $e) {
$result = new stdClass();
$result->success = false;
$result->message = $e->getMessage();
}
return $result;
}
public function exportList ()
{
require_once 'classes/model/AdditionalTables.php';
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( AdditionalTablesPeer::ADD_TAB_UID );
$oCriteria->addSelectColumn( AdditionalTablesPeer::ADD_TAB_NAME );
$oCriteria->addSelectColumn( AdditionalTablesPeer::ADD_TAB_DESCRIPTION );
$oCriteria->addSelectColumn( "'" . G::LoadTranslation( 'ID_ACTION_EXPORT' ) . "' as 'CH_SCHEMA'" );
$oCriteria->addSelectColumn( "'" . G::LoadTranslation( 'ID_ACTION_EXPORT' ) . "' as 'CH_DATA'" );
$uids = explode( ',', $_GET['id'] );
foreach ($uids as $UID) {
if (! isset( $CC )) {
$CC = $oCriteria->getNewCriterion( AdditionalTablesPeer::ADD_TAB_UID, $UID, Criteria::EQUAL );
} else {
$CC->addOr( $oCriteria->getNewCriterion( AdditionalTablesPeer::ADD_TAB_UID, $UID, Criteria::EQUAL ) );
}
}
$oCriteria->add( $CC );
$oCriteria->addAnd( $oCriteria->getNewCriterion( AdditionalTablesPeer::ADD_TAB_UID, '', Criteria::NOT_EQUAL ) );
$oDataset = AdditionalTablesPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$addTables = Array ();
while ($oDataset->next()) {
$addTables[] = $oDataset->getRow();
}
return $addTables;
}
public function updateTag ($httpData)
{
require_once 'classes/model/AdditionalTables.php';
$oAdditionalTables = new AdditionalTables();
$uid = $_REQUEST['ADD_TAB_UID'];
$value = $_REQUEST['value'];
$repTabData = array ('ADD_TAB_UID' => $uid,'ADD_TAB_TAG' => $value
);
$oAdditionalTables->update( $repTabData );
}
/**
* - protected functions (non callable from controller outside) -
*/
/**
* Update data from a addTable record
*
* @param $row
*/
public function _dataUpdate ($row, $primaryKeys)
{
$keys = G::decrypt( $row['__index__'], 'pmtable' );
$keys = explode( ',', $keys );
unset( $row['__index__'] );
$params = array ();
foreach ($keys as $key) {
$params[] = is_numeric( $key ) ? $key : "'$key'";
}
$obj = null;
eval( '$obj = ' . $this->classPeerName . '::retrieveByPk(' . implode( ',', $params ) . ');' );
if (is_object( $obj )) {
foreach ($row as $key => $value) {
// validation, don't modify primary keys
if (in_array( $key, $primaryKeys )) {
throw new Exception( G::loadTranslation( 'ID_DONT_MODIFY_PK_VALUE', array ($key
) ) );
}
$action = 'set' . AdditionalTables::getPHPName( $key );
$obj->$action( $value );
}
if ($r = $obj->validate()) {
$obj->save();
$result = true;
} else {
$msg = '';
foreach ($obj->getValidationFailures() as $objValidationFailure) {
$msg .= $objValidationFailure->getMessage() . "\n";
}
throw new Exception( $msg );
}
} else {
$result = false;
}
return $result;
}
/**
* Update data from a addTable record
*
* @param $row
*/
public function _dataDestroy ($row)
{
$row = G::decrypt( $row, 'pmtable' );
$row = str_replace( '"', '', $row );
$keys = explode( ',', $row );
$params = array ();
foreach ($keys as $key) {
$params[] = is_numeric( $key ) ? $key : "'$key'";
}
$obj = null;
eval( '$obj = ' . $this->classPeerName . '::retrieveByPk(' . implode( ',', $params ) . ');' );
if (is_object( $obj )) {
$obj->delete();
return true;
} else {
return false;
}
}
public function genDataReport ($httpData)
{
$result = new stdClass();
G::loadClass( 'pmTable' );
require_once 'classes/model/AdditionalTables.php';
$result->message = '';
$result->success = true;
$additionalTables = new AdditionalTables();
$table = $additionalTables->load( $httpData->id );
if ($table['PRO_UID'] != '') {
$additionalTables->populateReportTable( $table['ADD_TAB_NAME'], pmTable::resolveDbSource( $table['DBS_UID'] ), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID'] );
$result->message = 'generated for table ' . $table['ADD_TAB_NAME'];
}
return $result;
}
/**
* Get report table default columns
*
* @param $type
*/
protected function _getReportTableDefaultColumns ($type = 'NORMAL')
{
$defaultColumns = array ();
$application = new stdClass(); //APPLICATION KEY
$application->uid = '';
$application->field_dyn = '';
$application->field_uid = '';
$application->field_name = 'APP_UID';
$application->field_label = 'APP_UID';
$application->field_type = 'VARCHAR';
$application->field_size = 32;
$application->field_dyn = '';
$application->field_key = 1;
$application->field_null = 0;
$application->field_filter = false;
$application->field_autoincrement = false;
array_push( $defaultColumns, $application );
$application = new stdClass(); //APP_NUMBER
$application->uid = '';
$application->field_dyn = '';
$application->field_uid = '';
$application->field_name = 'APP_NUMBER';
$application->field_label = 'APP_NUMBER';
$application->field_type = 'INTEGER';
$application->field_size = 11;
$application->field_dyn = '';
$application->field_key = 0;
$application->field_null = 0;
$application->field_filter = false;
$application->field_autoincrement = false;
array_push( $defaultColumns, $application );
$application = new stdClass(); //APP_STATUS
$application->uid = '';
$application->field_dyn = '';
$application->field_uid = '';
$application->field_name = 'APP_STATUS';
$application->field_label = 'APP_STATUS';
$application->field_type = 'VARCHAR';
$application->field_size = 10;
$application->field_dyn = '';
$application->field_key = 0;
$application->field_null = 0;
$application->field_filter = false;
$application->field_autoincrement = false;
array_push( $defaultColumns, $application );
//if it is a grid report table
if ($type == 'GRID') {
//GRID INDEX
$gridIndex = new stdClass();
$gridIndex->uid = '';
$gridIndex->field_dyn = '';
$gridIndex->field_uid = '';
$gridIndex->field_name = 'ROW';
$gridIndex->field_label = 'ROW';
$gridIndex->field_type = 'INTEGER';
$gridIndex->field_size = '11';
$gridIndex->field_dyn = '';
$gridIndex->field_key = 1;
$gridIndex->field_null = 0;
$gridIndex->field_filter = false;
$gridIndex->field_autoincrement = false;
array_push( $defaultColumns, $gridIndex );
}
return $defaultColumns;
}
/**
* Get all dynaform fields from a process (without grid fields)
*
* @param $proUid
* @param $type [values:xmlform/grid]
*/
public function _getDynafields2 ($proUid, $type = 'xmlform')
{
require_once 'classes/model/Dynaform.php';
$fields = array ();
$fieldsNames = array ();
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( DynaformPeer::DYN_FILENAME );
$oCriteria->add( DynaformPeer::PRO_UID, $proUid );
$oCriteria->add( DynaformPeer::DYN_TYPE, $type );
$oDataset = DynaformPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$excludeFieldsList = array ('title','subtitle','link','file','button','reset','submit','listbox','checkgroup','grid','javascript'
);
$labelFieldsTypeList = array ('dropdown','checkbox','radiogroup','yesno'
);
while ($aRow = $oDataset->getRow()) {
if (file_exists( PATH_DYNAFORM . PATH_SEP . $aRow['DYN_FILENAME'] . '.xml' )) {
$G_FORM = new Form( $aRow['DYN_FILENAME'], PATH_DYNAFORM, SYS_LANG );
if ($G_FORM->type == 'xmlform' || $G_FORM->type == '') {
foreach ($G_FORM->fields as $fieldName => $fieldNode) {
if (! in_array( $fieldNode->type, $excludeFieldsList ) && ! in_array( $fieldName, $fieldsNames )) {
$fields[] = array ('name' => $fieldName,'type' => $fieldNode->type,'label' => $fieldNode->label
);
$fieldsNames[] = $fieldName;
if (in_array( $fieldNode->type, $labelFieldsTypeList ) && ! in_array( $fieldName . '_label', $fieldsNames )) {
$fields[] = array ('name' => $fieldName . '_label','type' => $fieldNode->type,'label' => $fieldNode->label . '_label'
);
$fieldsNames[] = $fieldName;
}
}
}
}
}
$oDataset->next();
}
return $fields;
}
public function _getDynafields ($proUid, $type = 'xmlform', $start = null, $limit = null, $filter = null)
{
$cache = 1;
if (! isset( $_SESSION['_cache_pmtables'] ) || (isset( $_SESSION['_cache_pmtables'] ) && $_SESSION['_cache_pmtables']['pro_uid'] != $proUid) || (isset( $_SESSION['_cache_pmtables'] ) && $_SESSION['_cache_pmtables']['dyn_uid'] != $this->dynUid)) {
require_once 'classes/model/Dynaform.php';
$cache = 0;
$fields = array ();
$fieldsNames = array ();
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( DynaformPeer::DYN_FILENAME );
$oCriteria->add( DynaformPeer::PRO_UID, $proUid );
$oCriteria->add( DynaformPeer::DYN_TYPE, $type );
if (isset( $this->dynUid )) {
$oCriteria->add( DynaformPeer::DYN_UID, $this->dynUid );
}
$oDataset = DynaformPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
$excludeFieldsList = array ('title','subtitle','link','file','button','reset','submit','listbox','checkgroup','grid','javascript', ''
);
$labelFieldsTypeList = array ('dropdown','radiogroup');
G::loadSystem( 'dynaformhandler' );
$index = 0;
while ($aRow = $oDataset->getRow()) {
if (file_exists( PATH_DYNAFORM . PATH_SEP . $aRow['DYN_FILENAME'] . '.xml' )) {
$dynaformHandler = new dynaformHandler( PATH_DYNAFORM . $aRow['DYN_FILENAME'] . '.xml' );
$nodeFieldsList = $dynaformHandler->getFields();
foreach ($nodeFieldsList as $node) {
$arrayNode = $dynaformHandler->getArray( $node );
$fieldName = $arrayNode['__nodeName__'];
$fieldType = isset($arrayNode['type']) ? $arrayNode['type']: '';
$fieldValidate = ( isset($arrayNode['validate'])) ? $arrayNode['validate'] : '';
if (! in_array( $fieldType, $excludeFieldsList ) && ! in_array( $fieldName, $fieldsNames ) ) {
$fields[] = array (
'FIELD_UID' => $fieldName . '-' . $fieldType,
'FIELD_NAME' => $fieldName,
'FIELD_VALIDATE'=>$fieldValidate,
'_index' => $index ++,
'_isset' => true
);
$fieldsNames[] = $fieldName;
if (in_array( $fieldType, $labelFieldsTypeList ) && ! in_array( $fieldName . '_label', $fieldsNames )) {
$fields[] = array (
'FIELD_UID' => $fieldName . '_label' . '-' . $fieldType,
'FIELD_NAME' => $fieldName . '_label',
'FIELD_VALIDATE'=>$fieldValidate,
'_index' => $index ++,
'_isset' => true
);
$fieldsNames[] = $fieldName;
}
}
}
}
$oDataset->next();
}
sort( $fields );
// if is a editing
$fieldsEdit = array ();
if (isset( $_SESSION['ADD_TAB_UID'] )) {
require_once 'classes/model/AdditionalTables.php';
$additionalTables = new AdditionalTables();
$table = $additionalTables->load( $_SESSION['ADD_TAB_UID'], true );
foreach ($table['FIELDS'] as $i => $field) {
array_push( $fieldsEdit, $field['FLD_DYN_NAME'] );
}
} //end editing
$indexes = array();
foreach ($fields as $i => $field) {
$fields[$i]['_index'] = $i;
$indexes[$field['FIELD_NAME']] = $i;
if (in_array( $field['FIELD_NAME'], $fieldsEdit )) {
$fields[$i]['_isset'] = false;
}
}
$_SESSION['_cache_pmtables']['pro_uid'] = $proUid;
$_SESSION['_cache_pmtables']['dyn_uid'] = $this->dynUid;
$_SESSION['_cache_pmtables']['rows'] = $fields;
$_SESSION['_cache_pmtables']['count'] = count( $fields );
$_SESSION['_cache_pmtables']['indexes'] = $indexes;
} //end reload
$fields = array ();
$tmp = array ();
foreach ($_SESSION['_cache_pmtables']['rows'] as $i => $row) {
if (isset( $filter ) && $filter != '') {
if ($row['_isset'] && stripos( $row['FIELD_NAME'], $filter ) !== false) {
$tmp[] = $row;
}
} else {
if ($row['_isset']) {
$tmp[] = $row;
}
}
}
$fields = array_slice( $tmp, $start, $limit );
return array ('cache' => $cache,'count' => count( $tmp ),'rows' => $fields
);
}
/**
* Get all dynaform grid fields from a process
*
* @param $proUid
* @param $gridId
*/
public function _getGridDynafields ($proUid, $gridId)
{
$fields = array ();
$fieldsNames = array ();
$excludeFieldsList = array ('title','subtitle','link','file','button','reset','submit','listbox','checkgroup','grid','javascript'
);
$labelFieldsTypeList = array ('dropdown','checkbox','radiogroup','yesno'
);
$G_FORM = new Form( $proUid . '/' . $gridId, PATH_DYNAFORM, SYS_LANG, false );
if ($G_FORM->type == 'grid') {
foreach ($G_FORM->fields as $fieldName => $fieldNode) {
if (! in_array( $fieldNode->type, $excludeFieldsList ) && ! in_array( $fieldName, $fieldsNames )) {
$fields[] = array ('name' => $fieldName,'type' => $fieldNode->type,'label' => $fieldNode->label
);
$fieldsNames[] = $fieldName;
if (in_array( $fieldNode->type, $labelFieldsTypeList ) && ! in_array( $fieldName . '_label', $fieldsNames )) {
$fields[] = array ('name' => $fieldName . '_label','type' => $fieldNode->type,'label' => $fieldNode->label . '_label'
);
$fieldsNames[] = $fieldName;
}
}
}
}
return $fields;
}
/**
* Get all dynaform fields inside all grids from a process
*
* @param $proUid
*/
public function _getGridFields ($proUid)
{
require_once 'classes/model/Dynaform.php';
G::loadSystem( 'dynaformhandler' );
$aFields = array ();
$aFieldsNames = array ();
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( DynaformPeer::DYN_FILENAME );
$oCriteria->add( DynaformPeer::PRO_UID, $proUid );
$oCriteria->add( DynaformPeer::DYN_TYPE, 'xmlform' );
$oDataset = DynaformPeer::doSelectRS( $oCriteria );
$oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oDataset->next();
while ($aRow = $oDataset->getRow()) {
//$G_FORM = new Form($aRow['DYN_FILENAME'], PATH_DYNAFORM, SYS_LANG);
$dynaformHandler = new dynaformHandler( PATH_DYNAFORM . $aRow['DYN_FILENAME'] . '.xml' );
$nodeFieldsList = $dynaformHandler->getFields();
foreach ($nodeFieldsList as $node) {
$arrayNode = $dynaformHandler->getArray( $node );
$fieldName = $arrayNode['__nodeName__'];
$fieldType = $arrayNode['type'];
if ($fieldType == 'grid') {
if (! in_array( $fieldName, $aFieldsNames )) {
$aFields[] = array ('name' => $fieldName,'xmlform' => str_replace( $proUid . '/', '', $arrayNode['xmlgrid'] )
);
$aFieldsNames[] = $fieldName;
}
}
}
$oDataset->next();
}
return $aFields;
}
}