no_cache(); MetaModel::CheckDefinitions(); // new API - MetaModel::DBCheckFormat(); // not necessary, and time consuming! // MetaModel::DBCheckIntegrity(); // Comment by Rom: MetaModel::GetSubclasses("logRealObject") retourne la totale // utiliser IsRootClass pour savoir si une classe obtenue est une classe feuille ou non $aTopLevelClasses = array('bizService', 'bizLocation', 'bizContact', 'logInfra', 'bizDocument', 'bizObject'); function ReadParam($sName, $defaultValue = "") { return isset($_REQUEST[$sName]) ? $_REQUEST[$sName] : $defaultValue; } function DisplaySelectOrg($oPage, $sCurrentOrganization, $iContext) { global $oContext; //$oSearchFilter = new CMDBSearchFilter("bizOrganization"); $oSearchFilter = $oContext->NewFilter("bizOrganization"); $oPage->p($oSearchFilter->serialize()); $oSet = new CMDBObjectSet($oSearchFilter); if ($oSet->Count() == 0) { $oPage->add("
\n"); $oPage->add("
\n"); $oPage->p("No organization found.\n"); $oPage->p($oSearchFilter->__DescribeHTML()); $oPage->add("
\n"); $oPage->add("
\n"); } else { $oCurrentOrganization = null; $oPage->add("
\n"); $oPage->add("
\n"); $oPage->add("
\n"); $oPage->add("Select the context:\n"); $oPage->add("\n"); $oPage->p(""); $oPage->add("Select an organization: \n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("
\n"); if ($oCurrentOrganization != null) { $oCurrentOrganization->DisplayDetails($oPage); } $oPage->add("
\n"); $oPage->add("
\n"); } } function DisplayDetails(web_page $oPage, $sClassName, $sKey) { global $oContext; //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); $oPage->p("Details of ".MetaModel::GetName($sClassName)." - $sKey"); $oObj->DisplayDetails($oPage); // Modified by rom $aLinks = array(); $aLinks[] = "View changes log"; $aLinks[] = "Edit this object"; $aLinks[] = "Delete this object (no confirmation!)"; // By rom foreach (MetaModel::EnumLinkingClasses($sClassName) as $sLinkClass => $aRemoteClasses) { foreach($aRemoteClasses as $sExtKeyAttCode => $sRemoteClass) { // #@# quick and dirty: guess the extkey attcode from link to current class // later, this information should be part of the biz model $sExtKeyToMe = ""; foreach(MetaModel::ListAttributeDefs($sLinkClass) as $sAttCode=>$oAttDef) { if ($oAttDef->IsExternalKey() && $oAttDef->GetTargetClass() == $sClassName) { $sExtKeyToMe = $sAttCode; break; } } if (empty($sExtKeyToMe)) { $oPage->p("Houston... could not find the external key for $sClassName in $sLinkClass"); } else { $oFilter = new CMDBSearchFilter($sRemoteClass); // just a dummy empty one for edition $sButton = "
\n"; $sButton .= "
\n"; $aOnOKArgs = array("operation"=>"addlinks", "linkclass"=>$sLinkClass, "extkeytome"=>$sExtKeyToMe, "extkeytopartner"=>$sExtKeyAttCode); $sButton .= dialogstack::RenderEditableField("Add links with $sRemoteClass", "filter", $oFilter->serialize(), true, "", $aOnOKArgs); $sButton .= "
\n"; $sButton .= "
\n"; $aLinks[] = $sButton; } } } $sLinks = implode(" / ", $aLinks); $oPage->p($sLinks); } // By Rom function DisplayChangesLog(web_page $oPage, $sClassName, $sKey) { global $oContext; //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); $oPage->p("Changes log for ".MetaModel::GetName($sClassName)." - $sKey"); $oObj->DisplayChangesLog($oPage); $oPage->p("View details"); $oPage->p("Edit this object"); $oPage->p("Delete this object (no confirmation!)"); } function DumpObjectsAsCSV(web_page $oPage, $sClassName, $oSearchFilter = null, $sSeparator = ",") { global $oContext; $aHeader = array(); $aHeader[] = 'pkey'; foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef) { $aHeader[] = $oAttDef->GetLabel(); } $oPage->Add(join($sSeparator, $aHeader)."\n"); if ($oSearchFilter == null) { $oSearchFilter = $oContext->NewFilter($sClassName); } $oObjectSet = new CMDBObjectSet($oSearchFilter); while ($oObj = $oObjectSet->Fetch()) { $aRow = array(); $aRow[] = $oObj->GetKey(); foreach($oObj->GetAttributesList($sClassName) as $sAttCode) { $aRow[] = $oObj->GetAsCSV($sAttCode); } $oPage->Add(join($sSeparator, $aRow)."\n"); } } function DumpObjects(web_page $oPage, $sClassName, CMDBSearchFilter $oSearchFilter = null) { global $oContext; if ($oSearchFilter == null) { //$oSearchFilter = new CMDBSearchFilter($sClassName); $oSearchFilter = $oContext->NewFilter($sClassName); } $aAttribs = array(); foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef) { $aAttribs['key'] = array('label' => 'key', 'description' => 'Primary Key'); $aAttribs[$sAttCode] = array('label' => $oAttDef->GetLabel(), 'description' => $oAttDef->GetDescription()); } $oObjectSet = new CMDBObjectSet($oSearchFilter); $aValues = array(); while ($oObj = $oObjectSet->Fetch()) { $aRow['key'] = "GetKey()."\">".$oObj->GetKey().""; foreach($oObj->GetAttributesList($sClassName) as $sAttCode) { $aRow[$sAttCode] = $oObj->GetAsHTML($sAttCode); } $aValues[] = $aRow; } $oPage->table($aAttribs, $aValues); } function DisplayEditForm(web_page $oPage, $sClassName, $sKey) { global $oContext; //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); if ($oObj == null) { $oPage->p("You are not allowed to edit this object."); return; } $oPage->p("Edition of ".MetaModel::GetName($sClassName)." - $sKey\n"); $aDetails = array(); $oPage->add("
\n"); foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef) { if (!$oAttDef->IsExternalField()) { if ($oAttDef->IsExternalKey()) { //External key, display a combo $sTargetClass = $oAttDef->GetTargetClass(); //$oFilter = new CMDBSearchFilter($sTargetClass); $oFilter = $oContext->NewFilter($sTargetClass); $oSet = new CMDBObjectSet($oFilter); $sValue = "\n"; } else { $sValue = "Get($sAttCode))."\">"; } $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sValue); } } $oPage->details($aDetails); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); } function DisplayCreationForm(web_page $oPage, $sClassName) { global $oContext; $oPage->p("New $sClassName\n"); $aDetails = array(); $oPage->add("\n"); foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef) { if (!$oAttDef->IsExternalField()) { if ($oAttDef->IsExternalKey()) { //External key, display a combo $sTargetClass = $oAttDef->GetTargetClass(); //$oFilter = new CMDBSearchFilter($sTargetClass); $oFilter = $oContext->NewFilter($sTargetClass); $oSet = new CMDBObjectSet($oFilter); $sValue = "\n"; } else { $sValue = "GetDefaultValue()."\">"; } $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sValue); } } $oPage->details($aDetails); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); } function UpdateObject(web_page $oPage, $sClassName, $sKey, $aAttributes) { global $oContext; //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); if ($oObj == null) { $oPage->p("You are not allowed to edit this object."); return; } $oPage->p("Update of $sClassName - $sKey"); foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef) { if (isset($aAttributes[$sAttCode])) { $oObj->Set($sAttCode, $aAttributes[$sAttCode]); } } if ($oObj->CheckToUpdate()) { // By rom // $oObj->DBUpdate(); $oMyChange = MetaModel::NewObject("CMDBChange"); $oMyChange->Set("date", time()); $oMyChange->Set("userinfo", "Made by somebody"); $iChangeId = $oMyChange->DBInsert(); $oObj->DBUpdateTracked($oMyChange); $oPage->p(MetaModel::GetName($sClassName)." updated\n"); } else { $oPage->p("Error: object can not be updated!\n"); $oObj->DBRevert(); // restore default values! } // By Rom // $oObj->DisplayDetails($oPage); // replaced by... DisplayDetails($oPage, $sClassName, $sKey); $oPage->p("Return to main page"); } function DeleteObject(web_page $oPage, $sClassName, $sKey) { global $oContext; $sClassLabel = MetaModel::GetName($sClassName); //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); if ($oObj == null) { $oPage->p("You are not allowed to delete this object."); return; } $oPage->p("Deletion of $sClassLabel - $sKey"); if ($oObj->CheckToDelete()) { // By Rom //$oObj->DBDelete(); $oMyChange = MetaModel::NewObject("CMDBChange"); $oMyChange->Set("date", time()); $oMyChange->Set("userinfo", "Made by somebody"); $iChangeId = $oMyChange->DBInsert(); $oObj->DBDeleteTracked($oMyChange); $oPage->p("$sClassLabel deleted\n"); } else { $oPage->p("Error: object can not be deleted!\n"); // By Rom DisplayDetails($oPage, $sClassName, $sKey); } $oPage->p("Return to main page"); } function CreateObject(web_page $oPage, $sClassName, $aAttributes) { $oObj = MetaModel::NewObject($sClassName); $sClassLabel = MetaModel::GetName(get_class($oObj)); $oPage->p("Creation of $sClassLabel object."); foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef) { if (isset($aAttributes[$sAttCode])) { $oObj->Set($sAttCode, $aAttributes[$sAttCode]); } } if ($oObj->CheckToInsert()) { // By rom // $oObj->DBInsert(); $oMyChange = MetaModel::NewObject("CMDBChange"); $oMyChange->Set("date", time()); $oMyChange->Set("userinfo", "Made by somebody"); $iChangeId = $oMyChange->DBInsert(); $oObj->DBInsertTracked($oMyChange); $oPage->p($sClassLabel." created\n"); // By Rom // $oObj->DisplayDetails($oPage); // replaced by... DisplayDetails($oPage, get_class($oObj), $oObj->GetKey()); } else { $oPage->p("Error: object can not be created!\n"); } $oPage->p("Return to main page"); } // By Rom function AddLinks($oPage, $sClassName, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKeyToPartner, $sFilter) { global $oContext; $sClassLabel = MetaModel::GetName($sClassName); //$oObj = MetaModel::GetObject($sClassName, $sKey); $oObj = $oContext->GetObject($sClassName, $sKey); if ($oObj == null) { $oPage->p("You are not allowed to modify (create links on) this object."); return; } $oPage->p("Creating links for $sClassLabel - $sKey"); $oFilter = CMDBSearchFilter::unserialize($sFilter); $oPage->p("Linking to ".$oFilter->__DescribeHTML()); $oObjSet = new CMDBObjectSet($oFilter); if ($oObjSet->Count() != 0) { while($oPartnerObj = $oObjSet->Fetch()) { $oNewLink = MetaModel::NewObject($sLinkClass); $oNewLink->Set($sExtKeyToMe, $sKey); $oNewLink->Set($sExtKeyToPartner, $oPartnerObj->GetKey()); if ($oNewLink->CheckToInsert()) { $oMyChange = MetaModel::NewObject("CMDBChange"); $oMyChange->Set("date", time()); $oMyChange->Set("userinfo", "Made by somebody"); $iChangeId = $oMyChange->DBInsert(); $oNewLink->DBInsertTracked($oMyChange); $oPage->p(MetaModel::GetName($sLinkClass)." created\n"); } else { $oPage->p("Error: link can not be created!\n"); } } } else {} } /////////////////////////////////////////////////////////////////////////////////////////////////// // // M a i n P r o g r a m // /////////////////////////////////////////////////////////////////////////////////////////////////// $operation = ReadParam('operation', ''); $iContext = ReadParam('ctx', 1); $oContext = new UserContext(); switch($iContext) { case 2: // See only the organization 'ITOP' $oContext->AddCondition('bizOrganization', 'pkey', 'ITOP', '='); $oContext->AddCondition('logRealObject', 'organization', 'ITOP', '='); break; case 3: // See only the organization containing 'o' and contacts containing +33 $oContext->AddCondition('Organization', 'name', 'o', 'Contains'); //$oContext->AddCondition('Object', 'orgname', 'o', 'Contains'); $oContext->AddCondition('Contact', 'phone', '+33', 'Contains'); break; case 1: // No limitation default: // nothing to do } dialogstack::DeclareCaller("Main navigation menu"); switch($operation) { case 'details': $sClass = ReadParam('class'); $sKey = ReadParam('key'); DisplayDetails($oPage, $sClass, $sKey); break; // By rom case 'changeslog': $sClass = ReadParam('class'); $sKey = ReadParam('key'); DisplayChangesLog($oPage, $sClass, $sKey); break; case 'edit': $sClass = ReadParam('class'); $sKey = ReadParam('key'); DisplayEditForm($oPage, $sClass, $sKey); break; case 'update': $sClass = ReadParam('class'); $sKey = ReadParam('key'); $aAttributes = ReadParam('attr', array()); UpdateObject($oPage, $sClass, $sKey, $aAttributes); break; case 'new': $sClass = ReadParam('class'); DisplayCreationForm($oPage, $sClass); break; case 'create': $sClass = ReadParam('class'); $aAttributes = ReadParam('attr', array()); CreateObject($oPage, $sClass, $aAttributes); break; case 'delete': $sClass = ReadParam('class'); $sKey = ReadParam('key'); DeleteObject($oPage, $sClass, $sKey); break; case 'direct': $sFilter = ReadParam('filter'); $sFormat = ReadParam('format', 'html'); $oSearchFilter = CMDBSearchFilter::unserialize($sFilter); switch($sFormat) { case 'csv': $oPage->small_p($oSearchFilter->__DescribeHTML()); $oPage->Add(""); break; case 'xls': $oPage->add_header('Content-disposition: attachment;filename=served.xls'); // Will fool Excel $oPage->add_header('Content-Type: application/vnd.ms-excel'); // Will fool Excel DumpObjects($oPage, $oSearchFilter->GetClass(), $oSearchFilter); break; case 'html': default: $oSet = new CMDBObjectSet($oSearchFilter); cmdbAbstractObject::DisplaySet($oPage, $oSet); } break; case 'addlinks': $sClass = ReadParam('class'); $sKey = ReadParam('key'); $sLinkClass = ReadParam('linkclass'); $sExtKeyToMe = ReadParam('extkeytome'); $sExtKeyToPartner = ReadParam('extkeytopartner'); $sFilter = ReadParam('filter'); AddLinks($oPage, $sClass, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKeyToPartner, $sFilter); break; default: $sCurrentOrganization = ReadParam('org', ''); $sActiveTab = ReadParam('classname', ''); DisplaySelectOrg($oPage, $sCurrentOrganization, $iContext); if ($sCurrentOrganization != "") { $oPage->add("
\n"); $oPage->add("\n"); foreach( $aTopLevelClasses as $sClassName) { $sClassLabel = MetaModel::GetName($sClassName); $oPage->add("
"); if (count(MetaModel::GetSubclasses($sClassName)) > 0) { $sActiveSubclass = ReadParam('subclassname', ''); foreach(MetaModel::GetSubclasses($sClassName) as $sSubclassName) { $sSubclassLabel = MetaModel::GetName($sSubclassName); //$oSearchFilter = new CMDBSearchFilter($sSubclassName); $oSearchFilter = $oContext->NewFilter($sSubclassName); $oSearchFilter ->AddCondition('org_id', $sCurrentOrganization, '='); $oPage->add("
\n"); $oPage->add("
\n"); $oPage->p("$sSubclassLabel - ".MetaModel::GetClassDescription($sSubclassName)); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); foreach( MetaModel::GetClassFilterDefs($sSubclassName) as $sFilterCode=>$oFilterDef) { $sFilterValue = ""; if (($sActiveTab == $sClassName) && ($sActiveSubclass == $sSubclassName)) { $sFilterValue = ReadParam($sFilterCode, ''); if (!empty($sFilterValue)) { $oSearchFilter->AddCondition($sFilterCode, $sFilterValue, 'Contains'); } } $oPage->add($oFilterDef->GetLabel().":  \n"); } $oPage->add("\n"); $oPage->add("\n"); $oPage->add("
\n"); $oSet = new CMDBObjectSet($oSearchFilter); $iMatchesCount = $oSet->Count(); if ($iMatchesCount == 0) { $oPage->p("No $sSubclassLabel matches these criteria."); $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")"); } else { $oPage->p("$iMatchesCount item(s) found."); cmdbAbstractObject::DisplaySet($oPage, $oSet); } $oPage->p("Create a new $sSubclassLabel\n"); $oPage->add("
\n"); } } else { // No subclasses, list the form directly //$oSearchFilter = new CMDBSearchFilter($sClassName); $oSearchFilter = $oContext->NewFilter($sClassName); $oSearchFilter ->AddCondition('org_id', $sCurrentOrganization, '='); $oPage->add("
\n"); $oPage->add("
\n"); $oPage->p("$sClassLabel - ".MetaModel::GetClassDescription($sClassName)); $oPage->add("
\n"); $oPage->add("\n"); $oPage->add("\n"); $oPage->add("\n"); foreach( MetaModel::GetClassFilterDefs($sClassName) as $sFilterCode=>$oFilterDef) { $sFilterValue = ""; if ($sActiveTab == $sClassName) { $sFilterValue = ReadParam($sFilterCode, ''); if (!empty($sFilterValue)) { $oSearchFilter->AddCondition($sFilterCode, $sFilterValue, 'Contains'); } } $oPage->add($oFilterDef->GetLabel().":  \n"); } $oPage->add("\n"); $oPage->add("
\n"); $oPage->add("
\n"); $oPage->add("
\n"); $oSet = new CMDBObjectSet($oSearchFilter); $iMatchesCount = $oSet->Count(); if ($iMatchesCount == 0) { $oPage->p("No $sClassLabel matches these criteria."); $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")"); } else { $oPage->p("$iMatchesCount item(s) found."); cmdbAbstractObject::DisplaySet($oPage, $oSet); $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")"); } $oPage->p("Create a new $sClassLabel\n"); $oPage->add("
\n"); $oPage->add("
\n"); } $oPage->add("
\n"); } $oPage->add("
\n"); $oPage->add_script('$(function() {$("#classesTabs > ul").tabs( '.$iActiveTabIndex.', { fxFade: true, fxSpeed: \'fast\' } );});'); } } $oPage->output(); ?>