소스 검색

- New search form allowing to perform OQL queries for any class of object

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@92 a333f486-631f-4898-b8df-5754b55c2be0
dflaven 16 년 전
부모
커밋
155366d864
5개의 변경된 파일144개의 추가작업 그리고 21개의 파일을 삭제
  1. 38 8
      application/cmdbabstract.class.inc.php
  2. 0 1
      application/displayblock.class.inc.php
  3. 24 0
      css/light-grey.css
  4. 54 0
      pages/UI.php
  5. 28 12
      pages/UniversalSearch.php

+ 38 - 8
application/cmdbabstract.class.inc.php

@@ -386,9 +386,19 @@ abstract class cmdbAbstractObject extends CMDBObject
 	
 	public static function GetSearchForm(web_page $oPage, CMDBObjectSet $oSet, $aExtraParams = array())
 	{
+		static $iSearchFormId = 0;
 		$sHtml = '';
 		$numCols=4;
+		$iSearchFormId++;
 		$sClassName = $oSet->GetFilter()->GetClass();
+
+		$sHtml .= "<div class=\"mini_tabs\" id=\"mini_tabs{$iSearchFormId}\"><ul>
+				   <li><a href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">OQL Query</a></li>
+				   <li><a class=\"selected\" href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">Simple Search</a></li>
+				   </ul></div>\n";
+		// Simple search form
+		$sHtml .= "<div id=\"SimpleSearchForm{$iSearchFormId}\" class=\"mini_tab{$iSearchFormId}\">\n";
+		$sHtml .= "<h1>Search for ".MetaModel::GetName($sClassName)." Objects</h1>\n";
 		$oUnlimitedFilter = new DBObjectSearch($sClassName);
 		$sHtml .= "<form>\n";
 		$index = 0;
@@ -472,14 +482,34 @@ abstract class cmdbAbstractObject extends CMDBObject
 			$sHtml .= "<input type=\"hidden\" name=\"$sName\" value=\"$sValue\">\n";
 		}
 		$sHtml .= "<input type=\"hidden\" name=\"dosearch\" value=\"1\">\n";
-		$sHtml .= "</form>\n";
-		// Soem Debug dumps...
-		//$sHtml .= "<tt>".$oSet->GetFilter()->__DescribeHTML()."</tt><br/>\n";
-		//$sHtml .= "<tt>encoding=\"text/serialize\" : ".$oSet->GetFilter()->serialize()."</tt><br/>\n";
-		//$sHtml .= "<tt>encoding=\"text/sibusql\" : ".$oSet->GetFilter()->ToSibusQL()."</tt><br/>\n";
-		//$sHtml .= "<tt>(Unlimited) ".$oUnlimitedFilter->__DescribeHTML()."</tt><br/>\n";
-		//$sHtml .= "<tt>encoding=\"text/serialize\" : ".$oUnlimitedFilter->serialize()."</tt><br/>\n";
-		//$sHtml .= "<tt>encoding=\"text/sibusql\" : ".$oUnlimitedFilter->ToSibusQL()."</tt>\n";
+		$sHtml .= "</form>\n";		
+		$sHtml .= "</div><!-- Simple search form -->\n";
+
+		// OQL query builder
+		$sHtml .= "<div id=\"OQLQuery{$iSearchFormId}\" style=\"display:none\" class=\"mini_tab{$iSearchFormId}\">\n";
+		$sHtml .= "<h1>OQL Query Builder</h1>\n";
+		$sHtml .= "<form><table style=\"width:80%;\"><tr style=\"vertical-align:top\">\n";
+		$sHtml .= "<td style=\"text-align:right\"><label>SELECT&nbsp;</label><select name=\"oql_class\">";
+		$aClasses = MetaModel::EnumChildClasses($sClassName, ENUM_CHILD_CLASSES_ALL);
+		$sSelectedClass = utils::ReadParam('oql_class', $sClassName);
+		$sOQLClause = utils::ReadParam('oql_clause', '');
+		asort($aClasses);
+		foreach($aClasses as $sChildClass)
+		{
+			$sSelected = ($sChildClass == $sSelectedClass) ? 'selected' : '';
+			$sHtml.= "<option value=\"$sChildClass\" $sSelected>".MetaModel::GetName($sChildClass)."</option>\n";
+		}
+		$sHtml .= "</select>&nbsp;</td><td>\n";
+		$sHtml .= "<textarea name=\"oql_clause\" style=\"width:100%\">$sOQLClause</textarea></td></tr>\n";
+		$sHtml .= "<tr><td colspan=\"2\" style=\"text-align:right\"><input type=\"submit\" value=\" Query \"></td></tr>\n";
+		$sHtml .= "<input type=\"hidden\" name=\"dosearch\" value=\"1\">\n";
+		foreach($aExtraParams as $sName => $sValue)
+		{
+			$sHtml .= "<input type=\"hidden\" name=\"$sName\" value=\"$sValue\">\n";
+		}
+		$sHtml .= "<input type=\"hidden\" name=\"operation\" value=\"search_form\">\n";
+		$sHtml .= "</table></form>\n";
+		$sHtml .= "</div><!-- OQL query form -->\n";
 		return $sHtml;
 	}
 	

+ 0 - 1
application/displayblock.class.inc.php

@@ -308,7 +308,6 @@ class DisplayBlock
 			$iSearchSectionId = 1;
 			$sStyle = (isset($aExtraParams['open']) && ($aExtraParams['open'] == 'true')) ? 'SearchDrawer' : 'SearchDrawer DrawerClosed';
 			$sHtml .= "<div id=\"Search_$iSearchSectionId\" class=\"$sStyle\">\n";
-			$sHtml .= "<h1>Search form for ".Metamodel::GetName($this->m_oSet->GetClass())."</h1>\n";
 			$oPage->add_ready_script("\$(\"#LnkSearch_$iSearchSectionId\").click(function() {\$(\"#Search_$iSearchSectionId\").slideToggle('normal'); $(\"#LnkSearch_$iSearchSectionId\").toggleClass('open');});");
 			$sHtml .= cmdbAbstractObject::GetSearchForm($oPage, $this->m_oSet, $aExtraParams);
 	 		$sHtml .= "</div>\n";

+ 24 - 0
css/light-grey.css

@@ -631,3 +631,27 @@ div.HRDrawer {
 	border: 0;
 	display: block;
 }
+.mini_tabs a {
+	text-decoration: none;
+	font-weight:bold;
+	color: #ccc;
+	background-color:#333;
+	padding-left: 1em;
+	padding-right: 1em;
+	padding-bottom: 0.25em;
+}
+.mini_tabs a.selected {
+	color: #fff;
+	background-color:  #83b217;
+	padding-top: 0.25em;
+}
+.mini_tabs ul {
+	margin: -10px;
+}
+.mini_tabs ul li {
+	float: right;
+	list-style: none;
+	nopadding-left: 1em;
+	nopadding-right: 1em;
+	margin-top: 0;
+}

+ 54 - 0
pages/UI.php

@@ -73,6 +73,60 @@ switch($operation)
 		}
 	break;
 	
+	case 'search_form':
+		$sOQLClass = utils::ReadParam('oql_class', '');
+		$sOQLClause = utils::ReadParam('oql_clause', '');
+		$sFormat = utils::ReadParam('format', '');
+		$bSearchForm = utils::ReadParam('search_form', true);
+		if (empty($sOQLClass))
+		{
+			$oP->set_title("iTop - Error");
+			$oP->add("<p>'oql_class' must be specifed for this operation.</p>\n");
+		}
+		else
+		{
+			$oP->set_title("iTop - Search results");
+			$sOQL = "SELECT $sOQLClass $sOQLClause";
+			try
+			{
+				$oFilter = DBObjectSearch::FromOQL($sOQL); // To Do: Make sure we don't bypass security
+				$oSet = new DBObjectSet($oFilter);
+				if ($bSearchForm)
+				{
+					$oBlock = new DisplayBlock($oFilter, 'search', false);
+					$oBlock->Display($oP, 0);
+				}
+				if (strtolower($sFormat) == 'csv')
+				{
+					$oBlock = new DisplayBlock($oFilter, 'csv', false);
+					$oBlock->Display($oP, 0);
+				}
+				else
+				{
+					$oBlock = new DisplayBlock($oFilter, 'list', false);
+					$oBlock->Display($oP, 0);
+				}
+			}
+			catch(CoreException $e)
+			{
+				$oFilter = new DBObjectSearch($sOQLClass); // To Do: Make sure we don't bypass security
+				$oSet = new DBObjectSet($oFilter);
+				if ($bSearchForm)
+				{
+					$oBlock = new DisplayBlock($oFilter, 'search', false);
+					$oBlock->Display($oP, 0);
+				}
+				$oP->P("<b>Error incorrect OQL query:</b>");
+				$oP->P($e->getHtmlDesc());
+			}
+			catch(Exception $e)
+			{
+				$oP->p('<b>An error occured while running the query:</b>');
+				$oP->p($e->getMessage());
+			}
+		}
+	break;
+	
 	case 'search':
 		$sFilter = utils::ReadParam('filter', '');
 		$sFormat = utils::ReadParam('format', '');

+ 28 - 12
pages/UniversalSearch.php

@@ -18,12 +18,13 @@ $oP = new iTopWebPage("iTop - Universal search", $currentOrganization);
 // From now on the context is limited to the the selected organization ??
 
 // Now render the content of the page
-$sClassName = utils::ReadParam('class', 'bizOrganization');
+$sOQLClass = utils::ReadParam('oql_class', 'bizOrganization');
+$sOQLClause = utils::ReadParam('oql_clause', '');
+$sClassName = utils::ReadParam('class', $sOQLClass);
 $sFilter = utils::ReadParam('filter', '');
 $sOperation = utils::ReadParam('operation', '');
 
 // First part: select the class to search for
-$oP->add("<div id=\"TopPane\">");
 $oP->add("<form>");
 $oP->add("<input type=\"hidden\" name=\"org_id\" value=\"$currentOrganization\" />");
 $oP->add("Select the class to search: <select style=\"width: 150px;\" id=\"select_class\" name=\"class\" onChange=\"this.form.submit();\">");
@@ -31,29 +32,44 @@ foreach(MetaModel::GetClasses('bizmodel') as $sClass)
 {
 	$sDescription = MetaModel::GetClassDescription($sClass);
 	$sSelected = ($sClass == $sClassName) ? " SELECTED" : "";
-	$oP->add("<option value=\"$sClass\" title=\"$sDescription\"$sSelected>$sClass</option>");
+	$oP->add("<option value=\"$sClass\" title=\"$sDescription\"$sSelected>".MetaModel::GetName($sClass)."</option>");
 }
 $oP->add("</select></form>");
 
-// Second part: advanced search form:
-$oFilter = null;
-if (!empty($sFilter))
+try 
 {
-	$oFilter = CMDBSearchFilter::unserialize($sFilter);
+	if ($sOperation == 'search_form')
+	{
+			$sOQL = "SELECT $sOQLClass $sOQLClause";
+			$oFilter = DBObjectSearch::FromOQL($sOQL);
+	}
+	else
+	{
+		// Second part: advanced search form:
+		if (!empty($sFilter))
+		{
+			$oFilter = CMDBSearchFilter::unserialize($sFilter);
+		}
+		else if (!empty($sClassName))
+		{
+			$oFilter = new CMDBSearchFilter($sClassName);
+		}
+	}
 }
-else if (!empty($sClassName))
+catch (CoreException $e)
 {
 	$oFilter = new CMDBSearchFilter($sClassName);
+	$oP->P("<b>Error:</b>");
+	$oP->P($e->getHtmlDesc());
 }
 
 if ($oFilter != null)
 {
-	$oSet =new CMDBObjectSet($oFilter);
-	cmdbAbstractObject::DisplaySearchForm($oP, $oSet, array('org_id' => $currentOrganization, 'class' => $sClassName));
-	$oP->add("</div>\n");
+	$oSet = new CMDBObjectSet($oFilter);
+	$oBlock = new DisplayBlock($oFilter, 'search', false);
+	$oBlock->Display($oP, 0);
 
 	// Search results	
-	$oP->add("<div id=\"BottomPane\">");
 	$oResultBlock = new DisplayBlock($oFilter, 'list', false);
 	$oResultBlock->RenderContent($oP);