diff --git a/workflow/engine/classes/model/BpmnActivity.php b/workflow/engine/classes/model/BpmnActivity.php index db801c4ff..8063107a8 100644 --- a/workflow/engine/classes/model/BpmnActivity.php +++ b/workflow/engine/classes/model/BpmnActivity.php @@ -16,6 +16,17 @@ require_once 'classes/model/om/BaseBpmnActivity.php'; */ class BpmnActivity extends BaseBpmnActivity { + private $bound; + + public function __construct($generateUid = true) + { + $this->bound = new BpmnBound(); + $this->bound->setBouElementType(lcfirst(str_replace(__NAMESPACE__, '', __CLASS__))); + $this->bound->setBouElement('pm_canvas'); + $this->bound->setBouContainer('bpmnDiagram'); + } + + /* DEPRECATED, IT WILL BE REMOVED SOON public function create($data, $generateUid = true) { // validate foreign keys, they must be present into data array @@ -48,16 +59,46 @@ class BpmnActivity extends BaseBpmnActivity $bound->setBouElement('pm_canvas'); $bound->setBouContainer('bpmnDiagram'); $bound->save(); - } + }*/ - public function update($data) + + // OVERRIDES + + public function fromArray($data) { - $this->fromArray($data, BasePeer::TYPE_FIELDNAME); - $this->save(); + parent::fromArray($data, BasePeer::TYPE_FIELDNAME); - // update related bound - $bound = BpmnBound::findOneBy(BpmnBoundPeer::ELEMENT_UID, $this->getActUid()); - $bound->fromArray($data, BasePeer::TYPE_FIELDNAME); - $bound->save(); + // try resolve the related bound + if (array_key_exists('BOU_UID', $data)) { + //$bound = BpmnBound::findByElement('Activity', $this->getActUid()); + $bound = BpmnBoundPeer::retrieveByPK($data['BOU_UID']); + + if (is_object($bound)) { + $this->bound = $bound; + } + } + + $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); } + + public function save($con = null) + { + parent::save($con); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $this->bound->save($con); + } + } + + public function toArray($keyType = BasePeer::TYPE_PHPNAME) + { + $data = parent::toArray($keyType); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $data = array_merge($data, $this->bound->toArray($keyType)); + } + + return $data; + } + } // BpmnActivity diff --git a/workflow/engine/classes/model/BpmnBound.php b/workflow/engine/classes/model/BpmnBound.php index 602472795..a2995e716 100644 --- a/workflow/engine/classes/model/BpmnBound.php +++ b/workflow/engine/classes/model/BpmnBound.php @@ -28,4 +28,15 @@ class BpmnBound extends BaseBpmnBound return $rs->getRow(); } + + public static function findByElement($type, $uid) + { + $bouElementType = 'bpmn' . ucfirst(strtolower($type)); + + $c = new Criteria('workflow'); + $c->add(BpmnBoundPeer::ELEMENT_UID, $uid, CRITERIA::EQUAL); + $c->add(BpmnBoundPeer::BOU_ELEMENT_TYPE, $bouElementType, CRITERIA::EQUAL); + + return BpmnBoundPeer::doSelectOne($c); + } } // BpmnBound diff --git a/workflow/engine/classes/model/BpmnEvent.php b/workflow/engine/classes/model/BpmnEvent.php index 7e58c1207..f9c9fee95 100644 --- a/workflow/engine/classes/model/BpmnEvent.php +++ b/workflow/engine/classes/model/BpmnEvent.php @@ -14,6 +14,54 @@ require_once 'classes/model/om/BaseBpmnEvent.php'; * * @package classes.model */ -class BpmnEvent extends BaseBpmnEvent { +class BpmnEvent extends BaseBpmnEvent +{ + private $bound; + + public function __construct($generateUid = true) + { + $this->bound = new BpmnBound(); + $this->bound->setBouElementType(lcfirst(str_replace(__NAMESPACE__, '', __CLASS__))); + $this->bound->setBouElement('pm_canvas'); + $this->bound->setBouContainer('bpmnDiagram'); + } + + // OVERRIDES + + public function fromArray($data) + { + parent::fromArray($data, BasePeer::TYPE_FIELDNAME); + + // try resolve the related bound + if (array_key_exists('BOU_UID', $data)) { + $bound = BpmnBoundPeer::retrieveByPK($data['BOU_UID']); + + if (is_object($bound)) { + $this->bound = $bound; + } + } + + $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); + } + + public function save($con = null) + { + parent::save($con); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $this->bound->save($con); + } + } + + public function toArray($keyType = BasePeer::TYPE_PHPNAME) + { + $data = parent::toArray($keyType); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $data = array_merge($data, $this->bound->toArray($keyType)); + } + + return $data; + } } // BpmnEvent diff --git a/workflow/engine/classes/model/BpmnGateway.php b/workflow/engine/classes/model/BpmnGateway.php index 2722a2299..8cd1fb2ae 100644 --- a/workflow/engine/classes/model/BpmnGateway.php +++ b/workflow/engine/classes/model/BpmnGateway.php @@ -14,6 +14,54 @@ require_once 'classes/model/om/BaseBpmnGateway.php'; * * @package classes.model */ -class BpmnGateway extends BaseBpmnGateway { +class BpmnGateway extends BaseBpmnGateway +{ + private $bound; + + public function __construct($generateUid = true) + { + $this->bound = new BpmnBound(); + $this->bound->setBouElementType(lcfirst(str_replace(__NAMESPACE__, '', __CLASS__))); + $this->bound->setBouElement('pm_canvas'); + $this->bound->setBouContainer('bpmnDiagram'); + } + + // OVERRIDES + + public function fromArray($data) + { + parent::fromArray($data, BasePeer::TYPE_FIELDNAME); + + // try resolve the related bound + if (array_key_exists('BOU_UID', $data)) { + $bound = BpmnBoundPeer::retrieveByPK($data['BOU_UID']); + + if (is_object($bound)) { + $this->bound = $bound; + } + } + + $this->bound->fromArray($data, BasePeer::TYPE_FIELDNAME); + } + + public function save($con = null) + { + parent::save($con); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $this->bound->save($con); + } + } + + public function toArray($keyType = BasePeer::TYPE_PHPNAME) + { + $data = parent::toArray($keyType); + + if (is_object($this->bound) && get_class($this->bound) == 'BpmnBound') { + $data = array_merge($data, $this->bound->toArray($keyType)); + } + + return $data; + } } // BpmnGateway diff --git a/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php b/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php index 6bb01f8d3..91ffe6ace 100644 --- a/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php +++ b/workflow/engine/src/ProcessMaker/Adapter/Bpmn/Model.php @@ -100,7 +100,7 @@ class Model */ $lanesets = array_key_exists('laneset', $diagramData) ? $diagramData['laneset'] : array(); - $lanes = array_key_exists('lane', $diagramData) ? $diagramData['lanes'] : array(); + $lanes = array_key_exists('lanes', $diagramData) ? $diagramData['lanes'] : array(); $activities = array_key_exists('activities', $diagramData) ? $diagramData['activities'] : array(); $events = array_key_exists('events', $diagramData) ? $diagramData['events'] : array(); $gateways = array_key_exists('gateways', $diagramData) ? $diagramData['gateways'] : array(); @@ -345,7 +345,7 @@ class Model $project = array_change_key_case($project); $project['diagrams'] = array($diagram); - $project['diagrams'][0]['lanesets'] = $lanesets; + $project['diagrams'][0]['laneset'] = $lanesets; $project['diagrams'][0]['lanes'] = $lanes; $project['diagrams'][0]['activities'] = $activities; $project['diagrams'][0]['events'] = $events; @@ -370,13 +370,19 @@ class Model public static function updateProject($prjUid, $projectUpdated) { + echo 'PRJ_UID ->: ' . $prjUid . PHP_EOL; + $project = ProjectPeer::retrieveByPK($prjUid); $project->setPrjName($projectUpdated['prj_name']); $project->setPrjUpdateDate(date("Y-m-d H:i:s")); $project->save(); + //print_r($project->toArray()); + $diagramData = $projectUpdated['diagrams'][0]; + //print_r($diagramData); die; + $diagram = DiagramPeer::retrieveByPK($diagramData['dia_uid']); $diagram->setDiaName($diagramData['dia_name']); @@ -386,9 +392,14 @@ class Model $diagram->save(); - $processData = self::getBpmnObjectBy('Process', ProcessPeer::PRJ_UID, $prjUid); + $processData = self::getBpmnObjectBy('Process', ProcessPeer::PRJ_UID, $prjUid, true); + + //print_r($processData); die; $process = ProcessPeer::retrieveByPK($processData['pro_uid']); + + //print_r($process); die; + $process->setProName($process->getProName()); $process->save(); @@ -400,16 +411,77 @@ class Model public static function updateDiagram($diff) { - return false; + echo 'DIFF'.PHP_EOL; print_r($diff); + + //return false; + $mapId = array(); + + // updating objects + foreach ($diff['updated'] as $element => $items) { + foreach ($items as $data) { + $data = array_change_key_case((array) $data, CASE_UPPER); + //print_r($data); die; + + // the calls in switch sentence are setting and saving the related BpmnBound objects too, + // because methods: save(), fromArray(), toArray() are beautifully extended + // of Activity, Event and Gateway classes ;) atte. @erik + + switch ($element) { + case 'laneset': + break; + + case 'lanes': + break; + + case 'activities': + $activity = ActivityPeer::retrieveByPk($data['ACT_UID']); + $activity->fromArray($data); + $activity->save(); + break; + + case 'events': + $event = EventPeer::retrieveByPk($data['EVN_UID']); + $event->fromArray($data); + $event->save(); + break; + + case 'gateways': + $gateway = GatewayPeer::retrieveByPk($data['GAT_UID']); + $gateway->fromArray($data); + $gateway->save(); + break; + + case 'flows': + break; + + case 'artifacts': + break; + } + } + } + + die; // Creating new objects foreach ($diff['new'] as $element => $items) { foreach ($items as $data) { + print_r($data); die; switch ($element) { - case 'activities': - $data = array_change_key_case((array) $data, CASE_UPPER); - $activity = new Activity(); - $activity->create($data); + case 'laneset': + $lanesetData = array_change_key_case((array) $data, CASE_UPPER); + + $laneset = new Laneset(); + $laneset->fromArray($lanesetData, BasePeer::TYPE_FIELDNAME); + $laneset->setLnsUid(Hash::generateUID()); + $laneset->setPrjUid($prjUid); + $laneset->setProUid($proUid); + $laneset->save(); + $lnsUid = $laneset->getLnsUid(); + $oldLnsUid = $lanesetData['LNS_UID']; + + $uids[] = array('old_uid' => $oldLnsUid, 'new_uid' => $lnsUid, 'object' => 'laneset'); + $mapId['laneset'][$oldLnsUid] = $lnsUid; + break; } } @@ -467,9 +539,10 @@ class Model $checksum[$element] = self::getArrayChecksum($savedProject['diagrams'][0][$element], $key); } + foreach ($diagramElements as $key => $element) { foreach ($updatedProject['diagrams'][0][$element] as $item) { - if (in_array($item[$key], $newRecords[$element]) || in_array($item[$key], $deletedRecords[$element])) { + if (array_key_exists($element, $newRecords) && (in_array($item[$key], $newRecords[$element]) || in_array($item[$key], $deletedRecords[$element]))) { // skip new or deleted records continue; } diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project.php b/workflow/engine/src/Services/Api/ProcessMaker/Project.php index cbab45842..a15b82420 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project.php @@ -63,6 +63,7 @@ class Project extends Api function put($prjUid, $request_data) { try { + $project = BpmnModel::updateProject($prjUid, $request_data); return $project;