@@ -382,26 +382,34 @@ public function getDataFromEditmode($data, $object = null, $params = [])
382382        /** @var AbstractObject|string $bridgeClass */ 
383383        $ bridgeClass  = $ this  ->getBridgeFullClassName ();
384384        $ idSourceFieldKey  = $ sourceClassDef ->getName () . '_id ' ;
385- 
385+          
386386        foreach  ($ data  as  $ objectData ) {
387387            $ sourceId  = $ objectData [$ idSourceFieldKey ];
388388            $ bridgeObjectId  = $ this  ->getBridgeIdBySourceAndOwner ($ object , $ bridgeClass , $ sourceId );
389389
390390            $ 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. 
391392            /** @var Concrete $bridgeObject */ 
392393            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 ));
400412                }
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 ));
405413            } else  {
406414                $ bridgeObject  = $ bridgeClass ::getById ($ bridgeObjectId );
407415            }
@@ -542,16 +550,16 @@ private function getBridgeFullClassName()
542550    private  function  getBridgeIdBySourceAndOwner ($ object , $ bridgeClass , $ sourceId )
543551    {
544552        $ 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 );
550553
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 );
551561
552-         $ stmt  = $ db ->query ($ select );
553- 
554-         return  $ stmt ->fetch (PDO ::FETCH_COLUMN , 0 );
562+         return  $ select ->execute ()->fetchOne ();
555563    }
556564
557565    /** 
@@ -660,6 +668,9 @@ public function checkValidity($data, $omitMandatoryCheck = false, $params = [])
660668
661669        /** @var Concrete $objectBridge */ 
662670        foreach  ($ data  as  $ objectBridge ) {
671+             if  (!$ objectBridge ) {
672+                 continue ;
673+             }
663674            $ bridgeClassFullName  = $ this  ->getBridgeFullClassName ();
664675            if  (!($ objectBridge  instanceof  $ bridgeClassFullName )) {
665676                throw  new  Element \ValidationException ('Expected  '  . $ bridgeClassFullName , 1574671790 );
@@ -920,7 +931,6 @@ public function synchronizeWithMasterDefinition(ClassDefinition\Data $masterDefi
920931        $ this  ->bridgeAllowedClassName  = $ masterDefinition ->bridgeAllowedClassName ;
921932        $ this  ->bridgeVisibleFields  = $ masterDefinition ->bridgeVisibleFields ;
922933        $ this  ->sourceHiddenFields  = $ masterDefinition ->sourceHiddenFields ;
923-         $ this  ->bridgeVisibleFields  = $ masterDefinition ->bridgeVisibleFields ;
924934        $ this  ->bridgeHiddenFields  = $ masterDefinition ->bridgeHiddenFields ;
925935        $ this  ->bridgeField  = $ masterDefinition ->bridgeField ;
926936        $ this  ->bridgeFolder  = $ masterDefinition ->bridgeFolder ;
0 commit comments