123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <?php
- require_once('../application/application.inc.php');
- require_once('../application/webpage.class.inc.php');
- require_once('../application/ajaxwebpage.class.inc.php');
- require_once('../application/wizardhelper.class.inc.php');
- require_once('../application/ui.linkswidget.class.inc.php');
- /**
- * Fills the given XML node with te details of the specified object
- */
- function AddNodeDetails(&$oNode, $oObj)
- {
- $aZlist = MetaModel::GetZListItems(get_class($oObj), 'details');
- $aLabels = array();
- $index = 0;
- foreach($aZlist as $sAttCode)
- {
- $oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode);
- $aLabels[] = $oAttDef->GetLabel();
- $oNode->SetAttribute('att_'.$index, $oObj->Get($sAttCode));
- $index++;
- }
- $oNode->SetAttribute('zlist', implode(',', $aLabels));
- }
- /**
- * Get the neighbours i.e. objects linked to the current object
- * @param DBObject $oObj The current object
- */
- function GetNeighbours(DBObject $oObj, &$oLinks, &$oXmlDoc, &$oXmlNode)
- {
- $oContext = new UserContext();
- $aRefs = MetaModel::EnumReferencingClasses(get_class($oObj));
- $aExtKeys = MetaModel::EnumLinkingClasses(get_class($oObj));
- if ((count($aRefs) != 0) || (count($aExtKeys) != 0))
- {
- foreach ($aRefs as $sRemoteClass => $aRemoteKeys)
- {
- foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
- {
- $oFilter = $oContext->NewFilter($sRemoteClass);
- $oFilter->AddCondition($sExtKeyAttCode, $oObj->GetKey());
- $oSet = new DBObjectSet($oFilter);
- if ($oSet->Count() > 0)
- {
- if (substr($sRemoteClass,0,3) == 'lnk')
- {
- // Special processing for "links":
- // Find out the first field which is an external key to another object,
- // and display this object as the one linked to the root object
- $sTargetClass = '';
- $sTargetAttCode = '';
- foreach(MetaModel::ListAttributeDefs($sRemoteClass) as $sAttCode=>$oAttDef)
- {
- if (($sAttCode != $sExtKeyAttCode) && ($oAttDef->IsExternalKey()) )
- {
- $sTargetClass = $oAttDef->GetTargetClass();
- $sTargetAttCode = $sAttCode;
- break;
- }
- }
- if ($sTargetClass != '')
- {
- while( $oRelatedObj = $oSet->Fetch())
- {
- $oTargetObj = $oContext->GetObject($sTargetClass, $oRelatedObj->Get($sTargetAttCode));
- if (is_object($oTargetObj))
- {
- $oLinkingNode = $oXmlDoc->CreateElement('link');
- $oLinkedNode = $oXmlDoc->CreateElement('node');
- $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
- $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
- $oLinkedNode->SetAttribute('name', $oTargetObj->GetName());
- $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon()) );
- AddNodeDetails($oLinkedNode, $oTargetObj);
- $oLinkingNode->AppendChild($oLinkedNode);
- $oLinks->AppendChild($oLinkingNode);
- }
- }
- }
- }
- else
- {
- while( $oRelatedObj = $oSet->Fetch())
- {
- $oLinkingNode = $oXmlDoc->CreateElement('link');
- $oLinkedNode = $oXmlDoc->CreateElement('node');
- $oLinkedNode->SetAttribute('id', $oRelatedObj->GetKey());
- $oLinkedNode->SetAttribute('obj_class', get_class($oRelatedObj));
- $oLinkedNode->SetAttribute('name', $oRelatedObj->GetName());
- $oLinkedNode->SetAttribute('icon', BuildIconPath($oRelatedObj->GetIcon()));
- AddNodeDetails($oLinkedNode, $oRelatedObj);
- $oLinkingNode->AppendChild($oLinkedNode);
- $oLinks->AppendChild($oLinkingNode);
- }
- }
- }
- }
- foreach ($aExtKeys as $sLinkClass => $aRemoteClasses)
- {
- foreach($aRemoteClasses as $sExtKeyAttCode => $sRemoteClass)
- {
- // Special case to exclude such "silos" classes that will be linked
- // to almost all the objects of a chart and thus would make the chart
- // un-readable if all the links are displayed...
- if (($sLinkClass == get_class($oObj)) &&
- ($sRemoteClass != 'Location') &&
- ($sRemoteClass != 'Organization') )
- {
- $oRelatedObj = $oContext->GetObject($sRemoteClass, $oObj->Get($sExtKeyAttCode));
- $oLinkingNode = $oXmlDoc->CreateElement('link');
- $oLinkedNode = $oXmlDoc->CreateElement('node');
- $oLinkedNode->SetAttribute('id', $oRelatedObj->GetKey());
- $oLinkedNode->SetAttribute('obj_class', get_class($oRelatedObj));
- $oLinkedNode->SetAttribute('name', $oRelatedObj->GetName());
- $oLinkedNode->SetAttribute('icon', BuildIconPath($oRelatedObj->GetIcon()));
- AddNodeDetails($oLinkedNode, $oRelatedObj);
- $oLinkingNode->AppendChild($oLinkedNode);
- $oLinks->AppendChild($oLinkingNode);
- }
- }
- }
- }
- $oXmlNode->AppendChild($oLinks);
- }
- }
- /**
- * Get the related objects through the given relation
- * @param DBObject $oObj The current object
- * @param string $sRelation The name of the relation to search with
- */
- function GetRelatedObjects(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode)
- {
- $oContext = new UserContext();
- $aResults = array();
- $oObj->GetRelatedObjects($sRelationName, 1 /* iMaxDepth */, $aResults);
-
- foreach($aResults as $sRelatedClass => $aObjects)
- {
- foreach($aObjects as $id => $oTargetObj)
- {
- if (is_object($oTargetObj))
- {
- $oLinkingNode = $oXmlDoc->CreateElement('link');
- $oLinkingNode->SetAttribute('relation', $sRelationName);
- $oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow
- $oLinkingNode->SetAttribute('debug', 142); // Such relations have a direction, display an arrow
- $oLinkedNode = $oXmlDoc->CreateElement('node');
- $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
- $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
- $oLinkedNode->SetAttribute('name', $oTargetObj->GetName());
- $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon()));
- AddNodeDetails($oLinkedNode, $oTargetObj);
- $oSubLinks = $oXmlDoc->CreateElement('links');
- GetRelatedObjects($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode);
- $oLinkingNode->AppendChild($oLinkedNode);
- $oLinks->AppendChild($oLinkingNode);
- }
- }
- }
- if (count($aResults) > 0)
- {
- $oXmlNode->AppendChild($oLinks);
- }
- }
- function BuildIconPath($sIconPath)
- {
- $sFullURL = utils::GetAbsoluteURL(false, false);
- $iLastSlashPos = strrpos($sFullURL, '/');
- $sFullURLPath = substr($sFullURL, 0, 1 + $iLastSlashPos);
- return $sFullURLPath.$sIconPath;
- }
- require_once('../application/startup.inc.php');
- require_once('../application/loginwebpage.class.inc.php');
- //// For developping the Navigator
- //session_start();
- //$_SESSION['auth_user'] = 'admin';
- //$_SESSION['auth_pwd'] = 'admin2';
- //UserRights::Login($_SESSION['auth_user'], $_SESSION['auth_pwd']); // Set the user's language
- LoginWebPage::DoLogin(); // Check user rights and prompt if needed
- $oPage = new ajax_page("");
- $oPage->no_cache();
- $oContext = new UserContext();
- $sClass = utils::ReadParam('class', 'Contact');
- $id = utils::ReadParam('id', 1);
- $sRelation = utils::ReadParam('relation', 'impact');
- $aValidRelations = MetaModel::EnumRelations();
- if (!in_array($sRelation, $aValidRelations))
- {
- // Not a valid relation, use the default one instead
- $sRelation = 'neighbours';
- }
- if ($id != 0)
- {
- $oObj = $oContext->GetObject($sClass, $id);
- // Build the root XML part
- $oXmlDoc = new DOMDocument( '1.0', 'UTF-8' );
- $oXmlRoot = $oXmlDoc->CreateElement('root');
- $oXmlNode = $oXmlDoc->CreateElement('node');
- $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
- AddNodeDetails($oXmlNode, $oObj);
-
- $oLinks = $oXmlDoc->CreateElement("links");
- switch($sRelation)
- {
- case 'neighbours':
- // Now search for all the neighboor objects and append them
- $oXmlRoot->SetAttribute('title', 'Neighbours of '.$oObj->GetName());
- GetNeighbours($oObj, $oLinks, $oXmlDoc, $oXmlNode);
- $oXmlRoot->SetAttribute('position', 'center');
- break;
-
- default:
- $oXmlRoot->SetAttribute('position', 'left');
- $oXmlRoot->SetAttribute('title', MetaModel::GetRelationDescription($sRelation).' '.$oObj->GetName());
- GetRelatedObjects($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode);
- }
-
- $oXmlRoot->AppendChild($oXmlNode);
- $oXmlDoc->AppendChild($oXmlRoot);
- $oPage->add($oXmlDoc->SaveXML());
- }
- $oPage->output();
- ?>
|