diff --git a/pages/UI.php b/pages/UI.php index 9f49e5404e..758df0220d 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -357,16 +357,48 @@ function UpdateObject(&$oObj) { foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef) { - if ($oAttDef->IsLinkSet()) + if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect()) { - // Link set, the data is a set of link objects, encoded in JSON - $aAttributes[$sAttCode] = trim(utils::ReadPostedParam("attr_$sAttCode", '')); - if (!empty($aAttributes[$sAttCode])) + $aLinks = utils::ReadPostedParam("attr_$sAttCode", ''); + $sLinkedClass = $oAttDef->GetLinkedClass(); + $sExtKeyToRemote = $oAttDef->GetExtKeyToRemote(); + $sExtKeyToMe = $oAttDef->GetExtKeyToMe(); + $oLinkedSet = DBObjectSet::FromScratch($sLinkedClass); + if (is_array($aLinks)) { - $oLinkSet = WizardHelper::ParseJsonSet($oObj, $oAttDef->GetLinkedClass(), $oAttDef->GetExtKeyToMe(), $aAttributes[$sAttCode]); - $oObj->Set($sAttCode, $oLinkSet); - // TO DO: detect a real modification, for now always update !! + foreach($aLinks as $id => $aData) + { + if (is_numeric($id)) + { + if ($id < 0) + { + // New link to be created, the opposite of the id (-$id) is the ID of the remote object + $oLink = MetaModel::NewObject($sLinkedClass); + $oLink->Set($sExtKeyToRemote, -$id); + $oLink->Set($sExtKeyToMe, $oObj->GetKey()); + } + else + { + // Existing link, potentially to be updated... + $oLink = MetaModel::GetObject($sLinkedClass, $id); + } + // Now populate the attributes + foreach($aData as $sName => $value) + { + if (MetaModel::IsValidAttCode($sLinkedClass, $sName)) + { + $oLinkAttDef = MetaModel::GetAttributeDef($sLinkedClass, $sName); + if ($oLinkAttDef->IsWritable()) + { + $oLink->Set($sName, $value); + } + } + } + $oLinkedSet->AddObject($oLink); + } + } } + $oObj->Set($sAttCode, $oLinkedSet); } else if ($oAttDef->IsWritable()) { @@ -426,6 +458,7 @@ try switch($operation) { case 'details': + $sClass = utils::ReadParam('class', ''); $sClassLabel = MetaModel::GetName($sClass); $id = utils::ReadParam('id', ''); @@ -604,7 +637,7 @@ try { $iCount += count($aLeafs); $oP->add("