@@ -382,26 +382,34 @@ public function getDataFromEditmode($data, $object = null, $params = [])
382
382
/** @var AbstractObject|string $bridgeClass */
383
383
$ bridgeClass = $ this ->getBridgeFullClassName ();
384
384
$ idSourceFieldKey = $ sourceClassDef ->getName () . '_id ' ;
385
-
385
+
386
386
foreach ($ data as $ objectData ) {
387
387
$ sourceId = $ objectData [$ idSourceFieldKey ];
388
388
$ bridgeObjectId = $ this ->getBridgeIdBySourceAndOwner ($ object , $ bridgeClass , $ sourceId );
389
389
390
390
$ sourceObject = $ sourceClass ::getById ($ sourceId );
391
+ // If there is no id check for existing key instead. This is to prevent creating multiple versions of the same bridge object.
391
392
/** @var Concrete $bridgeObject */
392
393
if (!$ bridgeObjectId ) {
393
- $ bridgeObject = new $ bridgeClass ;
394
- $ parent = Model \DataObject \Service::createFolderByPath ($ this ->bridgeFolder );
395
- if (!$ parent instanceof AbstractObject) {
396
- throw new \InvalidArgumentException (
397
- sprintf ('Parent not found at "%s" please check your object bridge configuration "Bridge folder" ' , $ this ->bridgeFolder ),
398
- 1574671788
399
- );
394
+ $ key = $ this ->bridgePrefix . $ object ->getId () . '_ ' . $ sourceObject ->getId ();
395
+ $ existingBridgeObject = $ bridgeClass ::getByKey ($ key )->getObjects ();
396
+
397
+ if (!empty ($ existingBridgeObject )) {
398
+ $ bridgeObject = $ existingBridgeObject [0 ];
399
+ } else {
400
+ $ bridgeObject = new $ bridgeClass ;
401
+ $ parent = Model \DataObject \Service::createFolderByPath ($ this ->bridgeFolder );
402
+ if (!$ parent instanceof AbstractObject) {
403
+ throw new \InvalidArgumentException (
404
+ sprintf ('Parent not found at "%s" please check your object bridge configuration "Bridge folder" ' , $ this ->bridgeFolder ),
405
+ 1574671788
406
+ );
407
+ }
408
+ $ bridgeObject ->setParent ($ parent );
409
+ $ bridgeObject ->setKey ($ this ->bridgePrefix . $ object ->getId () . '_ ' . $ sourceObject ->getId ());
410
+ // Make sure its unique else saving will throw an error
411
+ $ bridgeObject ->setKey (Model \DataObject \Service::getUniqueKey ($ bridgeObject ));
400
412
}
401
- $ bridgeObject ->setParent ($ parent );
402
- $ bridgeObject ->setKey ($ this ->bridgePrefix . $ object ->getId () . '_ ' . $ sourceObject ->getId ());
403
- // Make sure its unique else saving will throw an error
404
- $ bridgeObject ->setKey (Model \DataObject \Service::getUniqueKey ($ bridgeObject ));
405
413
} else {
406
414
$ bridgeObject = $ bridgeClass ::getById ($ bridgeObjectId );
407
415
}
@@ -542,16 +550,16 @@ private function getBridgeFullClassName()
542
550
private function getBridgeIdBySourceAndOwner ($ object , $ bridgeClass , $ sourceId )
543
551
{
544
552
$ db = Db::get ();
545
- $ select = $ db ->select ()
546
- ->from (['dor ' => 'object_relations_ ' . $ object ::classId ()], [])
547
- ->joinInner (['dp_objects ' => 'object_ ' . $ bridgeClass ::classId ()], 'dor.dest_id = dp_objects.oo_id AND dor.type = "object" ' , ['oo_id ' ])
548
- ->where ('dor.src_id = ? ' , $ object ->getId ())
549
- ->where ('dp_objects. ' . $ this ->bridgeField . '__id = ? ' , $ sourceId );
550
553
554
+ $ select = $ db ->createQueryBuilder ()
555
+ ->select ("dp_objects.oo_id " )
556
+ ->from ('object_relations_ ' . $ object ::classId (), 'dor ' )
557
+ ->innerJoin ('dor ' , 'object_ ' . $ bridgeClass ::classId (), 'dp_objects ' , 'dor.dest_id = dp_objects.oo_id AND dor.type = "object" ' )
558
+ // ->joinInner(['dp_objects' => 'object_' . $bridgeClass::classId()], 'dor.dest_id = dp_objects.oo_id AND dor.type = "object"', ['oo_id'])
559
+ ->where ('dor.src_id = ' . $ object ->getId ())
560
+ ->andWhere ('dp_objects. ' . $ this ->bridgeField . '__id = ' . $ sourceId );
551
561
552
- $ stmt = $ db ->query ($ select );
553
-
554
- return $ stmt ->fetch (PDO ::FETCH_COLUMN , 0 );
562
+ return $ select ->execute ()->fetchOne ();
555
563
}
556
564
557
565
/**
@@ -660,6 +668,9 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = [])
660
668
661
669
/** @var Concrete $objectBridge */
662
670
foreach ($ data as $ objectBridge ) {
671
+ if (!$ objectBridge ) {
672
+ continue ;
673
+ }
663
674
$ bridgeClassFullName = $ this ->getBridgeFullClassName ();
664
675
if (!($ objectBridge instanceof $ bridgeClassFullName )) {
665
676
throw new Element \ValidationException ('Expected ' . $ bridgeClassFullName , 1574671790 );
@@ -920,7 +931,6 @@ public function synchronizeWithMasterDefinition(ClassDefinition\Data $masterDefi
920
931
$ this ->bridgeAllowedClassName = $ masterDefinition ->bridgeAllowedClassName ;
921
932
$ this ->bridgeVisibleFields = $ masterDefinition ->bridgeVisibleFields ;
922
933
$ this ->sourceHiddenFields = $ masterDefinition ->sourceHiddenFields ;
923
- $ this ->bridgeVisibleFields = $ masterDefinition ->bridgeVisibleFields ;
924
934
$ this ->bridgeHiddenFields = $ masterDefinition ->bridgeHiddenFields ;
925
935
$ this ->bridgeField = $ masterDefinition ->bridgeField ;
926
936
$ this ->bridgeFolder = $ masterDefinition ->bridgeFolder ;
0 commit comments