index.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. <?php
  2. require_once('../application/application.inc.php');
  3. require_once('../application/nicewebpage.class.inc.php');
  4. require_once('../application/dialogstack.class.inc.php');
  5. require_once('../application/startup.inc.php');
  6. $oPage = new NiceWebPage("The very first iTop page");
  7. $oPage->no_cache();
  8. MetaModel::CheckDefinitions();
  9. // new API - MetaModel::DBCheckFormat();
  10. // not necessary, and time consuming!
  11. // MetaModel::DBCheckIntegrity();
  12. // Comment by Rom: MetaModel::GetSubclasses("logRealObject") retourne la totale
  13. // utiliser IsRootClass pour savoir si une classe obtenue est une classe feuille ou non
  14. $aTopLevelClasses = array('bizService', 'bizLocation', 'bizContact', 'logInfra', 'bizDocument', 'bizObject');
  15. function ReadParam($sName, $defaultValue = "")
  16. {
  17. return isset($_REQUEST[$sName]) ? $_REQUEST[$sName] : $defaultValue;
  18. }
  19. function DisplaySelectOrg($oPage, $sCurrentOrganization, $iContext)
  20. {
  21. global $oContext;
  22. //$oSearchFilter = new CMDBSearchFilter("bizOrganization");
  23. $oSearchFilter = $oContext->NewFilter("bizOrganization");
  24. $oPage->p($oSearchFilter->serialize());
  25. $oSet = new CMDBObjectSet($oSearchFilter);
  26. if ($oSet->Count() == 0)
  27. {
  28. $oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
  29. $oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0;text-align:center\">\n");
  30. $oPage->p("No organization found.\n");
  31. $oPage->p($oSearchFilter->__DescribeHTML());
  32. $oPage->add("</div>\n");
  33. $oPage->add("</div>\n");
  34. }
  35. else
  36. {
  37. $oCurrentOrganization = null;
  38. $oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
  39. $oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0;text-align:center\">\n");
  40. $oPage->add("<form method=\"get\"\">\n");
  41. $oPage->add("Select the context:\n");
  42. $oPage->add("<select name=\"ctx\">\n");
  43. $oPage->add("<option value=\"1\"".($iContext == 1 ? "selected" : "").">See everything (no context)</option>\n");
  44. $oPage->add("<option value=\"2\"".($iContext == 2 ? "selected" : "").">See only the iTop organization</option>\n");
  45. $oPage->add("<option value=\"3\"".($iContext == 3 ? "selected" : "").">See only organizations which name contains 'o', and contact in France (tel. contains +33)</option>\n");
  46. $oPage->add("</select>\n");
  47. $oPage->p("");
  48. $oPage->add("Select an organization: \n");
  49. $oPage->add("<select name=\"org\"\">\n");
  50. while($oOrg = $oSet->Fetch())
  51. {
  52. if ($sCurrentOrganization == $oOrg->GetKey())
  53. {
  54. $oCurrentOrganization = $oOrg;
  55. $sSelected = " selected";
  56. }
  57. else
  58. {
  59. $sSelected = "";
  60. }
  61. $oPage->add("<option value=\"".$oOrg->GetKey()."\"$sSelected>".$oOrg->Get('name')."</option>\n");
  62. }
  63. $oPage->add("</select>\n");
  64. $oPage->add("<input type=\"submit\" value=\" Search \">\n");
  65. $oPage->add("</form>\n");
  66. if ($oCurrentOrganization != null)
  67. {
  68. $oCurrentOrganization->DisplayDetails($oPage);
  69. }
  70. $oPage->add("</div>\n");
  71. $oPage->add("</div>\n");
  72. }
  73. }
  74. function DisplayDetails(WebPage $oPage, $sClassName, $sKey)
  75. {
  76. global $oContext;
  77. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  78. $oObj = $oContext->GetObject($sClassName, $sKey);
  79. $oPage->p("Details of ".MetaModel::GetName($sClassName)." - $sKey");
  80. $oObj->DisplayDetails($oPage);
  81. // Modified by rom
  82. $aLinks = array();
  83. $aLinks[] = "<a href=\"?operation=changeslog&class=$sClassName&key=$sKey\">View changes log</a>";
  84. $aLinks[] = "<a href=\"?operation=edit&class=$sClassName&key=$sKey\">Edit this object</a>";
  85. $aLinks[] = "<a href=\"?operation=delete&class=$sClassName&key=$sKey\">Delete this object (no confirmation!)</a>";
  86. // By rom
  87. foreach (MetaModel::EnumLinkingClasses($sClassName) as $sLinkClass => $aRemoteClasses)
  88. {
  89. foreach($aRemoteClasses as $sExtKeyAttCode => $sRemoteClass)
  90. {
  91. // #@# quick and dirty: guess the extkey attcode from link to current class
  92. // later, this information should be part of the biz model
  93. $sExtKeyToMe = "";
  94. foreach(MetaModel::ListAttributeDefs($sLinkClass) as $sAttCode=>$oAttDef)
  95. {
  96. if ($oAttDef->IsExternalKey() && $oAttDef->GetTargetClass() == $sClassName)
  97. {
  98. $sExtKeyToMe = $sAttCode;
  99. break;
  100. }
  101. }
  102. if (empty($sExtKeyToMe))
  103. {
  104. $oPage->p("Houston... could not find the external key for $sClassName in $sLinkClass");
  105. }
  106. else
  107. {
  108. $oFilter = new CMDBSearchFilter($sRemoteClass); // just a dummy empty one for edition
  109. $sButton = "<div>\n";
  110. $sButton .= "<form action=\"./advanced_search.php\" method=\"post\">\n";
  111. $aOnOKArgs = array("operation"=>"addlinks", "linkclass"=>$sLinkClass, "extkeytome"=>$sExtKeyToMe, "extkeytopartner"=>$sExtKeyAttCode);
  112. $sButton .= dialogstack::RenderEditableField("Add links with $sRemoteClass", "filter", $oFilter->serialize(), true, "", $aOnOKArgs);
  113. $sButton .= "</form>\n";
  114. $sButton .= "</div>\n";
  115. $aLinks[] = $sButton;
  116. }
  117. }
  118. }
  119. $sLinks = implode("&nbsp;/&nbsp;", $aLinks);
  120. $oPage->p($sLinks);
  121. }
  122. // By Rom
  123. function DisplayChangesLog(WebPage $oPage, $sClassName, $sKey)
  124. {
  125. global $oContext;
  126. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  127. $oObj = $oContext->GetObject($sClassName, $sKey);
  128. $oPage->p("Changes log for ".MetaModel::GetName($sClassName)." - $sKey");
  129. $oObj->DisplayChangesLog($oPage);
  130. $oPage->p("<a href=\"?operation=details&class=$sClassName&key=$sKey\">View details</a>");
  131. $oPage->p("<a href=\"?operation=edit&class=$sClassName&key=$sKey\">Edit this object</a>");
  132. $oPage->p("<a href=\"?operation=delete&class=$sClassName&key=$sKey\">Delete this object (no confirmation!)</a>");
  133. }
  134. function DumpObjectsAsCSV(WebPage $oPage, $sClassName, $oSearchFilter = null, $sSeparator = ",")
  135. {
  136. global $oContext;
  137. $aHeader = array();
  138. $aHeader[] = 'pkey';
  139. foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef)
  140. {
  141. $aHeader[] = $oAttDef->GetLabel();
  142. }
  143. $oPage->Add(join($sSeparator, $aHeader)."\n");
  144. if ($oSearchFilter == null)
  145. {
  146. $oSearchFilter = $oContext->NewFilter($sClassName);
  147. }
  148. $oObjectSet = new CMDBObjectSet($oSearchFilter);
  149. while ($oObj = $oObjectSet->Fetch())
  150. {
  151. $aRow = array();
  152. $aRow[] = $oObj->GetKey();
  153. foreach($oObj->GetAttributesList($sClassName) as $sAttCode)
  154. {
  155. $aRow[] = $oObj->GetAsCSV($sAttCode);
  156. }
  157. $oPage->Add(join($sSeparator, $aRow)."\n");
  158. }
  159. }
  160. function DumpObjects(WebPage $oPage, $sClassName, CMDBSearchFilter $oSearchFilter = null)
  161. {
  162. global $oContext;
  163. if ($oSearchFilter == null)
  164. {
  165. //$oSearchFilter = new CMDBSearchFilter($sClassName);
  166. $oSearchFilter = $oContext->NewFilter($sClassName);
  167. }
  168. $aAttribs = array();
  169. foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef)
  170. {
  171. $aAttribs['key'] = array('label' => 'key', 'description' => 'Primary Key');
  172. $aAttribs[$sAttCode] = array('label' => $oAttDef->GetLabel(), 'description' => $oAttDef->GetDescription());
  173. }
  174. $oObjectSet = new CMDBObjectSet($oSearchFilter);
  175. $aValues = array();
  176. while ($oObj = $oObjectSet->Fetch())
  177. {
  178. $aRow['key'] = "<a href=\"./index.php?operation=details&class=$sClassName&key=".$oObj->GetKey()."\">".$oObj->GetKey()."</a>";
  179. foreach($oObj->GetAttributesList($sClassName) as $sAttCode)
  180. {
  181. $aRow[$sAttCode] = $oObj->GetAsHTML($sAttCode);
  182. }
  183. $aValues[] = $aRow;
  184. }
  185. $oPage->table($aAttribs, $aValues);
  186. }
  187. function DisplayEditForm(WebPage $oPage, $sClassName, $sKey)
  188. {
  189. global $oContext;
  190. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  191. $oObj = $oContext->GetObject($sClassName, $sKey);
  192. if ($oObj == null)
  193. {
  194. $oPage->p("You are not allowed to edit this object.");
  195. return;
  196. }
  197. $oPage->p("Edition of ".MetaModel::GetName($sClassName)." - $sKey\n");
  198. $aDetails = array();
  199. $oPage->add("<form method=\"post\">\n");
  200. foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef)
  201. {
  202. if (!$oAttDef->IsExternalField())
  203. {
  204. if ($oAttDef->IsExternalKey())
  205. {
  206. //External key, display a combo
  207. $sTargetClass = $oAttDef->GetTargetClass();
  208. //$oFilter = new CMDBSearchFilter($sTargetClass);
  209. $oFilter = $oContext->NewFilter($sTargetClass);
  210. $oSet = new CMDBObjectSet($oFilter);
  211. $sValue = "<select name=\"attr[$sAttCode]\">\n";
  212. while($oTargetObj = $oSet->Fetch())
  213. {
  214. if ($oObj->Get($sAttCode) == $oTargetObj->GetKey())
  215. {
  216. $sSelected = " selected";
  217. }
  218. else
  219. {
  220. $sSelected = "";
  221. }
  222. $sValue .= "<option value=\"".$oTargetObj->GetKey()."\"$sSelected>".$oTargetObj->Get('name')."</option>\n";
  223. }
  224. $sValue .= "</select>\n";
  225. }
  226. else
  227. {
  228. $sValue = "<input size=\"50\" name=\"attr[$sAttCode]\" value=\"".($oObj->Get($sAttCode))."\">";
  229. }
  230. $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sValue);
  231. }
  232. }
  233. $oPage->details($aDetails);
  234. $oPage->add("<input type=\"hidden\" name=\"key\" value=\"$sKey\">\n");
  235. $oPage->add("<input type=\"hidden\" name=\"class\" value=\"$sClassName\">\n");
  236. $oPage->add("<input type=\"hidden\" name=\"operation\" value=\"update\">\n");
  237. $oPage->add("<input type=\"submit\" value=\" Update \">\n");
  238. $oPage->add("<form method=\"post\">\n");
  239. }
  240. function DisplayCreationForm(WebPage $oPage, $sClassName)
  241. {
  242. global $oContext;
  243. $oPage->p("New $sClassName\n");
  244. $aDetails = array();
  245. $oPage->add("<form method=\"post\">\n");
  246. foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode=>$oAttDef)
  247. {
  248. if (!$oAttDef->IsExternalField())
  249. {
  250. if ($oAttDef->IsExternalKey())
  251. {
  252. //External key, display a combo
  253. $sTargetClass = $oAttDef->GetTargetClass();
  254. //$oFilter = new CMDBSearchFilter($sTargetClass);
  255. $oFilter = $oContext->NewFilter($sTargetClass);
  256. $oSet = new CMDBObjectSet($oFilter);
  257. $sValue = "<select name=\"attr[$sAttCode]\">\n";
  258. while($oTargetObj = $oSet->Fetch())
  259. {
  260. $sValue .= "<option value=\"".$oTargetObj->GetKey()."\">".$oTargetObj->Get('name')."</option>\n";
  261. }
  262. $sValue .= "</select>\n";
  263. }
  264. else
  265. {
  266. $sValue = "<input size=\"50\" name=\"attr[$sAttCode]\" value=\"".$oAttDef->GetDefaultValue()."\">";
  267. }
  268. $aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sValue);
  269. }
  270. }
  271. $oPage->details($aDetails);
  272. $oPage->add("<input type=\"hidden\" name=\"class\" value=\"$sClassName\">\n");
  273. $oPage->add("<input type=\"hidden\" name=\"operation\" value=\"create\">\n");
  274. $oPage->add("<input type=\"submit\" value=\" Create \">\n");
  275. $oPage->add("<form method=\"post\">\n");
  276. }
  277. function UpdateObject(WebPage $oPage, $sClassName, $sKey, $aAttributes)
  278. {
  279. global $oContext;
  280. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  281. $oObj = $oContext->GetObject($sClassName, $sKey);
  282. if ($oObj == null)
  283. {
  284. $oPage->p("You are not allowed to edit this object.");
  285. return;
  286. }
  287. $oPage->p("Update of $sClassName - $sKey");
  288. foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef)
  289. {
  290. if (isset($aAttributes[$sAttCode]))
  291. {
  292. $oObj->Set($sAttCode, $aAttributes[$sAttCode]);
  293. }
  294. }
  295. if ($oObj->CheckToUpdate())
  296. {
  297. // By rom
  298. // $oObj->DBUpdate();
  299. $oMyChange = MetaModel::NewObject("CMDBChange");
  300. $oMyChange->Set("date", time());
  301. $oMyChange->Set("userinfo", "Made by somebody");
  302. $iChangeId = $oMyChange->DBInsert();
  303. $oObj->DBUpdateTracked($oMyChange);
  304. $oPage->p(MetaModel::GetName($sClassName)." updated\n");
  305. }
  306. else
  307. {
  308. $oPage->p("<strong>Error: object can not be updated!</strong>\n");
  309. $oObj->DBRevert(); // restore default values!
  310. }
  311. // By Rom
  312. // $oObj->DisplayDetails($oPage);
  313. // replaced by...
  314. DisplayDetails($oPage, $sClassName, $sKey);
  315. $oPage->p("<a href=\"\">Return to main page</a>");
  316. }
  317. function DeleteObject(WebPage $oPage, $sClassName, $sKey)
  318. {
  319. global $oContext;
  320. $sClassLabel = MetaModel::GetName($sClassName);
  321. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  322. $oObj = $oContext->GetObject($sClassName, $sKey);
  323. if ($oObj == null)
  324. {
  325. $oPage->p("You are not allowed to delete this object.");
  326. return;
  327. }
  328. $oPage->p("Deletion of $sClassLabel - $sKey");
  329. if ($oObj->CheckToDelete())
  330. {
  331. // By Rom
  332. //$oObj->DBDelete();
  333. $oMyChange = MetaModel::NewObject("CMDBChange");
  334. $oMyChange->Set("date", time());
  335. $oMyChange->Set("userinfo", "Made by somebody");
  336. $iChangeId = $oMyChange->DBInsert();
  337. $oObj->DBDeleteTracked($oMyChange);
  338. $oPage->p("$sClassLabel deleted\n");
  339. }
  340. else
  341. {
  342. $oPage->p("<strong>Error: object can not be deleted!</strong>\n");
  343. // By Rom
  344. DisplayDetails($oPage, $sClassName, $sKey);
  345. }
  346. $oPage->p("<a href=\"\">Return to main page</a>");
  347. }
  348. function CreateObject(WebPage $oPage, $sClassName, $aAttributes)
  349. {
  350. $oObj = MetaModel::NewObject($sClassName);
  351. $sClassLabel = MetaModel::GetName(get_class($oObj));
  352. $oPage->p("Creation of $sClassLabel object.");
  353. foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef)
  354. {
  355. if (isset($aAttributes[$sAttCode]))
  356. {
  357. $oObj->Set($sAttCode, $aAttributes[$sAttCode]);
  358. }
  359. }
  360. list($bRes, $aIssues) = $oObj->CheckToInsert();
  361. if ($bRes)
  362. {
  363. // By rom
  364. // $oObj->DBInsert();
  365. $oMyChange = MetaModel::NewObject("CMDBChange");
  366. $oMyChange->Set("date", time());
  367. $oMyChange->Set("userinfo", "Made by somebody");
  368. $iChangeId = $oMyChange->DBInsert();
  369. $oObj->DBInsertTracked($oMyChange);
  370. $oPage->p($sClassLabel." created\n");
  371. // By Rom
  372. // $oObj->DisplayDetails($oPage);
  373. // replaced by...
  374. DisplayDetails($oPage, get_class($oObj), $oObj->GetKey());
  375. }
  376. else
  377. {
  378. $oPage->p("<strong>Error: object can not be created!</strong>\n");
  379. $oPage->add("<ul>Issues:");
  380. foreach($aIssues as $sErrorMsg)
  381. {
  382. $oPage->add("<li>$sErrorMsg</li>");
  383. }
  384. $oPage->add("</ul>");
  385. }
  386. $oPage->p("<a href=\"\">Return to main page</a>");
  387. }
  388. // By Rom
  389. function AddLinks($oPage, $sClassName, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKeyToPartner, $sFilter)
  390. {
  391. global $oContext;
  392. $sClassLabel = MetaModel::GetName($sClassName);
  393. //$oObj = MetaModel::GetObject($sClassName, $sKey);
  394. $oObj = $oContext->GetObject($sClassName, $sKey);
  395. if ($oObj == null)
  396. {
  397. $oPage->p("You are not allowed to modify (create links on) this object.");
  398. return;
  399. }
  400. $oPage->p("Creating links for $sClassLabel - $sKey");
  401. $oFilter = CMDBSearchFilter::unserialize($sFilter);
  402. $oPage->p("Linking to ".$oFilter->__DescribeHTML());
  403. $oObjSet = new CMDBObjectSet($oFilter);
  404. if ($oObjSet->Count() != 0)
  405. {
  406. while($oPartnerObj = $oObjSet->Fetch())
  407. {
  408. $oNewLink = MetaModel::NewObject($sLinkClass);
  409. $oNewLink->Set($sExtKeyToMe, $sKey);
  410. $oNewLink->Set($sExtKeyToPartner, $oPartnerObj->GetKey());
  411. list($bRes, $aIssues) = $oNewLink->CheckToInsert();
  412. if ($bRes)
  413. {
  414. $oMyChange = MetaModel::NewObject("CMDBChange");
  415. $oMyChange->Set("date", time());
  416. $oMyChange->Set("userinfo", "Made by somebody");
  417. $iChangeId = $oMyChange->DBInsert();
  418. $oNewLink->DBInsertTracked($oMyChange);
  419. $oPage->p(MetaModel::GetName($sLinkClass)." created\n");
  420. }
  421. else
  422. {
  423. $oPage->p("<strong>Error: link can not be created!</strong>\n");
  424. $oPage->add("<ul>Issues:");
  425. foreach($aIssues as $sErrorMsg)
  426. {
  427. $oPage->add("<li>$sErrorMsg</li>");
  428. }
  429. $oPage->add("</ul>");
  430. }
  431. }
  432. }
  433. else
  434. {}
  435. }
  436. ///////////////////////////////////////////////////////////////////////////////////////////////////
  437. //
  438. // M a i n P r o g r a m
  439. //
  440. ///////////////////////////////////////////////////////////////////////////////////////////////////
  441. $operation = ReadParam('operation', '');
  442. $iContext = ReadParam('ctx', 1);
  443. $oContext = new UserContext();
  444. switch($iContext)
  445. {
  446. case 2: // See only the organization 'ITOP'
  447. $oContext->AddCondition('bizOrganization', 'pkey', 'ITOP', '=');
  448. $oContext->AddCondition('logRealObject', 'organization', 'ITOP', '=');
  449. break;
  450. case 3: // See only the organization containing 'o' and contacts containing +33
  451. $oContext->AddCondition('Organization', 'name', 'o', 'Contains');
  452. //$oContext->AddCondition('Object', 'orgname', 'o', 'Contains');
  453. $oContext->AddCondition('Contact', 'phone', '+33', 'Contains');
  454. break;
  455. case 1: // No limitation
  456. default:
  457. // nothing to do
  458. }
  459. dialogstack::DeclareCaller("Main navigation menu");
  460. switch($operation)
  461. {
  462. case 'details':
  463. $sClass = ReadParam('class');
  464. $sKey = ReadParam('key');
  465. DisplayDetails($oPage, $sClass, $sKey);
  466. break;
  467. // By rom
  468. case 'changeslog':
  469. $sClass = ReadParam('class');
  470. $sKey = ReadParam('key');
  471. DisplayChangesLog($oPage, $sClass, $sKey);
  472. break;
  473. case 'edit':
  474. $sClass = ReadParam('class');
  475. $sKey = ReadParam('key');
  476. DisplayEditForm($oPage, $sClass, $sKey);
  477. break;
  478. case 'update':
  479. $sClass = ReadParam('class');
  480. $sKey = ReadParam('key');
  481. $aAttributes = ReadParam('attr', array());
  482. UpdateObject($oPage, $sClass, $sKey, $aAttributes);
  483. break;
  484. case 'new':
  485. $sClass = ReadParam('class');
  486. DisplayCreationForm($oPage, $sClass);
  487. break;
  488. case 'create':
  489. $sClass = ReadParam('class');
  490. $aAttributes = ReadParam('attr', array());
  491. CreateObject($oPage, $sClass, $aAttributes);
  492. break;
  493. case 'delete':
  494. $sClass = ReadParam('class');
  495. $sKey = ReadParam('key');
  496. DeleteObject($oPage, $sClass, $sKey);
  497. break;
  498. case 'direct':
  499. $sFilter = ReadParam('filter');
  500. $sFormat = ReadParam('format', 'html');
  501. $oSearchFilter = CMDBSearchFilter::unserialize($sFilter);
  502. switch($sFormat)
  503. {
  504. case 'csv':
  505. $oPage->small_p($oSearchFilter->__DescribeHTML());
  506. $oPage->Add("<TEXTAREA ROWS=\"30\" COLS=\"100\">");
  507. DumpObjectsAsCSV($oPage, $oSearchFilter->GetClass(), $oSearchFilter);
  508. $oPage->Add("</TEXTAREA>");
  509. break;
  510. case 'xls':
  511. $oPage->add_header('Content-disposition: attachment;filename=served.xls'); // Will fool Excel
  512. $oPage->add_header('Content-Type: application/vnd.ms-excel'); // Will fool Excel
  513. DumpObjects($oPage, $oSearchFilter->GetClass(), $oSearchFilter);
  514. break;
  515. case 'html':
  516. default:
  517. $oSet = new CMDBObjectSet($oSearchFilter);
  518. cmdbAbstractObject::DisplaySet($oPage, $oSet);
  519. }
  520. break;
  521. case 'addlinks':
  522. $sClass = ReadParam('class');
  523. $sKey = ReadParam('key');
  524. $sLinkClass = ReadParam('linkclass');
  525. $sExtKeyToMe = ReadParam('extkeytome');
  526. $sExtKeyToPartner = ReadParam('extkeytopartner');
  527. $sFilter = ReadParam('filter');
  528. AddLinks($oPage, $sClass, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKeyToPartner, $sFilter);
  529. break;
  530. default:
  531. $sCurrentOrganization = ReadParam('org', '');
  532. $sActiveTab = ReadParam('classname', '');
  533. DisplaySelectOrg($oPage, $sCurrentOrganization, $iContext);
  534. if ($sCurrentOrganization != "")
  535. {
  536. $oPage->add("<div id=\"classesTabs\" class=\"light\">\n");
  537. $oPage->add("<ul>\n");
  538. $index = 1;
  539. $iActiveTabIndex = 1; // By default the first tab is the active one
  540. foreach( $aTopLevelClasses as $sClassName)
  541. {
  542. if ($sClassName == $sActiveTab)
  543. {
  544. $iActiveTabIndex = $index;
  545. }
  546. $oPage->add("\t<li><a href=\"#tab_$sClassName\">$sClassName</a></li>\n");
  547. $index++;
  548. }
  549. $oPage->add("</ul>\n");
  550. foreach( $aTopLevelClasses as $sClassName)
  551. {
  552. $sClassLabel = MetaModel::GetName($sClassName);
  553. $oPage->add("<div id=\"tab_$sClassName\">");
  554. if (count(MetaModel::GetSubclasses($sClassName)) > 0)
  555. {
  556. $sActiveSubclass = ReadParam('subclassname', '');
  557. foreach(MetaModel::GetSubclasses($sClassName) as $sSubclassName)
  558. {
  559. $sSubclassLabel = MetaModel::GetName($sSubclassName);
  560. //$oSearchFilter = new CMDBSearchFilter($sSubclassName);
  561. $oSearchFilter = $oContext->NewFilter($sSubclassName);
  562. $oSearchFilter ->AddCondition('org_id', $sCurrentOrganization, '=');
  563. $oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
  564. $oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0\">\n");
  565. $oPage->p("<strong>$sSubclassLabel</strong> - ".MetaModel::GetClassDescription($sSubclassName));
  566. $oPage->add("<form method=\"get\">\n");
  567. $oPage->add("<input type=\"hidden\" name=\"classname\" value=\"$sClassName\">\n");
  568. $oPage->add("<input type=\"hidden\" name=\"subclassname\" value=\"$sSubclassName\">\n");
  569. $oPage->add("<input type=\"hidden\" name=\"ctx\" value=\"$iContext\">\n");
  570. $oPage->add("<input type=\"hidden\" name=\"org\" value=\"$sCurrentOrganization\">\n");
  571. foreach( MetaModel::GetClassFilterDefs($sSubclassName) as $sFilterCode=>$oFilterDef)
  572. {
  573. $sFilterValue = "";
  574. if (($sActiveTab == $sClassName) && ($sActiveSubclass == $sSubclassName))
  575. {
  576. $sFilterValue = ReadParam($sFilterCode, '');
  577. if (!empty($sFilterValue))
  578. {
  579. $oSearchFilter->AddCondition($sFilterCode, $sFilterValue, 'Contains');
  580. }
  581. }
  582. $oPage->add($oFilterDef->GetLabel().": <input name=\"$sFilterCode\" value=\"$sFilterValue\"/>&nbsp;\n");
  583. }
  584. $oPage->add("<input type=\"submit\" value=\"Search\">\n");
  585. $oPage->add("</form>\n");
  586. $oPage->add("</div>\n");
  587. $oSet = new CMDBObjectSet($oSearchFilter);
  588. $iMatchesCount = $oSet->Count();
  589. if ($iMatchesCount == 0)
  590. {
  591. $oPage->p("No $sSubclassLabel matches these criteria.");
  592. $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
  593. }
  594. else
  595. {
  596. $oPage->p("$iMatchesCount item(s) found.");
  597. cmdbAbstractObject::DisplaySet($oPage, $oSet);
  598. }
  599. $oPage->p("<a href=\"?operation=new&class=$sSubclassName\">Create a new $sSubclassLabel</a>\n");
  600. $oPage->add("</div>\n");
  601. }
  602. }
  603. else
  604. {
  605. // No subclasses, list the form directly
  606. //$oSearchFilter = new CMDBSearchFilter($sClassName);
  607. $oSearchFilter = $oContext->NewFilter($sClassName);
  608. $oSearchFilter ->AddCondition('org_id', $sCurrentOrganization, '=');
  609. $oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
  610. $oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0\">\n");
  611. $oPage->p("<strong>$sClassLabel</strong> - ".MetaModel::GetClassDescription($sClassName));
  612. $oPage->add("<form method=\"get\">\n");
  613. $oPage->add("<input type=\"hidden\" name=\"classname\" value=\"$sClassName\">\n");
  614. $oPage->add("<input type=\"hidden\" name=\"org\" value=\"$sCurrentOrganization\">\n");
  615. $oPage->add("<input type=\"hidden\" name=\"ctx\" value=\"$iContext\">\n");
  616. foreach( MetaModel::GetClassFilterDefs($sClassName) as $sFilterCode=>$oFilterDef)
  617. {
  618. $sFilterValue = "";
  619. if ($sActiveTab == $sClassName)
  620. {
  621. $sFilterValue = ReadParam($sFilterCode, '');
  622. if (!empty($sFilterValue))
  623. {
  624. $oSearchFilter->AddCondition($sFilterCode, $sFilterValue, 'Contains');
  625. }
  626. }
  627. $oPage->add($oFilterDef->GetLabel().": <input name=\"$sFilterCode\" value=\"$sFilterValue\"/>&nbsp;\n");
  628. }
  629. $oPage->add("<input type=\"submit\" value=\"Search\">\n");
  630. $oPage->add("</form>\n");
  631. $oPage->add("</div>\n");
  632. $oPage->add("<div style=\"padding:0.25em;background-color:#fff\">\n");
  633. $oSet = new CMDBObjectSet($oSearchFilter);
  634. $iMatchesCount = $oSet->Count();
  635. if ($iMatchesCount == 0)
  636. {
  637. $oPage->p("No $sClassLabel matches these criteria.");
  638. $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
  639. }
  640. else
  641. {
  642. $oPage->p("$iMatchesCount item(s) found.");
  643. cmdbAbstractObject::DisplaySet($oPage, $oSet);
  644. $oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
  645. }
  646. $oPage->p("<a href=\"?operation=new&ctx=$iContext&class=$sClassName\">Create a new $sClassLabel</a>\n");
  647. $oPage->add("</div>\n");
  648. $oPage->add("</div>\n");
  649. }
  650. $oPage->add("</div>\n");
  651. }
  652. $oPage->add("</div>\n");
  653. $oPage->add_script('$(function() {$("#classesTabs > ul").tabs( '.$iActiveTabIndex.', { fxFade: true, fxSpeed: \'fast\' } );});');
  654. }
  655. }
  656. $oPage->output();
  657. ?>