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("
\n"); - $oP->add("

".Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aLeafs), Metamodel::GetName($sClassName))."

\n"); + $oP->add("

".MetaModel::GetClassIcon($sClassName)." ".Dict::Format('UI:Search:Count_ObjectsOf_Class_Found', count($aLeafs), Metamodel::GetName($sClassName))."

\n"); $oP->add("
\n"); $oLeafsFilter->AddCondition('id', $aLeafs, 'IN'); $oBlock = new DisplayBlock($oLeafsFilter, 'list', false); @@ -649,7 +682,7 @@ try { $oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel)); $oP->add("
\n"); - $oP->add("

GetIcon()."\" style=\"vertical-align:middle\"> ".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."

\n"); + $oP->add("

".$oObj->GetIcon()." ".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."

\n"); $oP->add("
\n"); $oP->add("
\n"); @@ -762,7 +795,7 @@ try // Display the creation form $sClassLabel = MetaModel::GetName($sRealClass); $oP->set_title(Dict::Format('UI:CreationPageTitle_Class', $sClassLabel)); - $oP->add("

".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."

\n"); + $oP->add("

".MetaModel::GetClassIcon($sRealClass)." ".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."

\n"); $oP->add("
\n"); $aDefaults = utils::ReadParam('default', array()); $aContext = $oAppContext->GetAsHash(); @@ -777,7 +810,7 @@ try { // Select the derived class to create $sClassLabel = MetaModel::GetName($sClass); - $oP->add("

".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."

\n"); + $oP->add("

".MetaModel::GetClassIcon($sClass)." ".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."

\n"); $oP->add("
\n"); $oP->add('
'); $oP->add('

'.Dict::Format('UI:SelectTheTypeOf_Class_ToCreate', $sClassLabel)); diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 7c5fbceb40..10778b5993 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -53,14 +53,13 @@ $oContext = new UserContext(); $operation = utils::ReadParam('operation', ''); $sFilter = stripslashes(utils::ReadParam('filter', '')); $sEncoding = utils::ReadParam('encoding', 'serialize'); -$sClass = utils::ReadParam('class', 'bizContact'); +$sClass = utils::ReadParam('class', 'MissingAjaxParam'); $sStyle = utils::ReadParam('style', 'list'); switch($operation) { case 'addObjects': require_once('../application/uilinkswizard.class.inc.php'); - $sClass = utils::ReadParam('class', '', 'get'); $sLinkedClass = utils::ReadParam('linkedClass', '', 'get'); $sLinkageAttr = utils::ReadParam('linkageAttr', '', 'get'); @@ -70,26 +69,22 @@ switch($operation) break; case 'searchObjectsToAdd': - require_once('../application/uilinkswizard.class.inc.php'); - - $sClass = utils::ReadParam('class', '', 'get'); - $sLinkedClass = utils::ReadParam('linkedClass', '', 'get'); - $sLinkageAttr = utils::ReadParam('linkageAttr', '', 'get'); - $iObjectId = utils::ReadParam('objectId', '', 'get'); - $oLinksWizard = new UILinksWizard($sClass, $sLinkageAttr, $iObjectId, $sLinkedClass); - $oLinksWizard->SearchObjectsToAdd($oPage, $oContext); + $sRemoteClass = utils::ReadParam('sRemoteClass', ''); + $sAttCode = utils::ReadParam('sAttCode', ''); + $iInputId = utils::ReadParam('iInputId', ''); + $sSuffix = utils::ReadParam('sSuffix', ''); + $aAlreadyLinked = utils::ReadParam('aAlreadyLinked', array()); + $oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix); + $oWidget->SearchObjectsToAdd($oPage, $oContext, $sRemoteClass, $aAlreadyLinked); break; case 'doAddObjects': - require_once('../application/uilinkswizard.class.inc.php'); - - $sClass = utils::ReadParam('class', '', 'get'); - $sLinkedClass = utils::ReadParam('linkedClass', '', 'get'); - $sLinkageAttr = utils::ReadParam('linkageAttr', '', 'get'); - $iObjectId = utils::ReadParam('objectId', '', 'get'); + $sAttCode = utils::ReadParam('sAttCode', ''); + $iInputId = utils::ReadParam('iInputId', ''); + $sSuffix = utils::ReadParam('sSuffix', ''); $aLinkedObjectIds = utils::ReadParam('selectObject', array(), 'get'); - $oLinksWizard = new UILinksWizard($sClass, $sLinkageAttr, $iObjectId, $sLinkedClass); - $oLinksWizard->DoAddObjects($oPage, $oContext, $aLinkedObjectIds); + $oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix); + $oWidget->DoAddObjects($oPage, $oContext, $aLinkedObjectIds); break; case 'wizard_helper_preview': @@ -324,9 +319,9 @@ switch($operation) break; case 'search_form': - $sClass = utils::ReadParam('className', '', 'get'); - $sRootClass = utils::ReadParam('baseClass', '', 'get'); - $currentId = utils::ReadParam('currentId', '', 'get'); + $sClass = utils::ReadParam('className', ''); + $sRootClass = utils::ReadParam('baseClass', ''); + $currentId = utils::ReadParam('currentId', ''); $oFilter = $oContext->NewFilter($sClass); $oSet = new CMDBObjectSet($oFilter); $sHtml = cmdbAbstractObject::GetSearchForm($oPage, $oSet, array('currentId' => $currentId, 'baseClass' => $sRootClass)); diff --git a/pages/xml.navigator.php b/pages/xml.navigator.php index 8a1a486eda..66188dc9c8 100755 --- a/pages/xml.navigator.php +++ b/pages/xml.navigator.php @@ -80,7 +80,7 @@ function GetRelatedObjects(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey()); $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj)); $oLinkedNode->SetAttribute('name', $oTargetObj->GetName()); - $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon())); + $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */))); AddNodeDetails($oLinkedNode, $oTargetObj); $oSubLinks = $oXmlDoc->CreateElement('links'); GetRelatedObjects($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode); @@ -137,7 +137,7 @@ if ($id != 0) $oXmlNode->SetAttribute('id', $oObj->GetKey()); $oXmlNode->SetAttribute('obj_class', get_class($oObj)); $oXmlNode->SetAttribute('name', $oObj->GetName()); - $oXmlNode->SetAttribute('icon', BuildIconPath($oObj->GetIcon())); // Hard coded for the moment + $oXmlNode->SetAttribute('icon', BuildIconPath($oObj->GetIcon(false /* No IMG tag */))); // Hard coded for the moment AddNodeDetails($oXmlNode, $oObj); $oLinks = $oXmlDoc->CreateElement("links");