diff --git a/trunk/application/cmdbabstract.class.inc.php b/trunk/application/cmdbabstract.class.inc.php index aaf8bad4f..f95a03eab 100644 --- a/trunk/application/cmdbabstract.class.inc.php +++ b/trunk/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 .= "
\n"; + // Simple search form + $sHtml .= "
\n"; + $sHtml .= "

Search for ".MetaModel::GetName($sClassName)." Objects

\n"; $oUnlimitedFilter = new DBObjectSearch($sClassName); $sHtml .= "
\n"; $index = 0; @@ -472,14 +482,34 @@ abstract class cmdbAbstractObject extends CMDBObject $sHtml .= "\n"; } $sHtml .= "\n"; - $sHtml .= "
\n"; - // Soem Debug dumps... - //$sHtml .= "".$oSet->GetFilter()->__DescribeHTML()."
\n"; - //$sHtml .= "encoding=\"text/serialize\" : ".$oSet->GetFilter()->serialize()."
\n"; - //$sHtml .= "encoding=\"text/sibusql\" : ".$oSet->GetFilter()->ToSibusQL()."
\n"; - //$sHtml .= "(Unlimited) ".$oUnlimitedFilter->__DescribeHTML()."
\n"; - //$sHtml .= "encoding=\"text/serialize\" : ".$oUnlimitedFilter->serialize()."
\n"; - //$sHtml .= "encoding=\"text/sibusql\" : ".$oUnlimitedFilter->ToSibusQL()."\n"; + $sHtml .= "\n"; + $sHtml .= "
\n"; + + // OQL query builder + $sHtml .= "
\n"; + $sHtml .= "

OQL Query Builder

\n"; + $sHtml .= "
\n"; + $sHtml .= "\n"; + $sHtml .= "\n"; + $sHtml .= "\n"; + foreach($aExtraParams as $sName => $sValue) + { + $sHtml .= "\n"; + } + $sHtml .= "\n"; + $sHtml .= "
 \n"; + $sHtml .= "
\n"; + $sHtml .= "
\n"; return $sHtml; } diff --git a/trunk/application/displayblock.class.inc.php b/trunk/application/displayblock.class.inc.php index b12486d5e..33e639952 100644 --- a/trunk/application/displayblock.class.inc.php +++ b/trunk/application/displayblock.class.inc.php @@ -308,7 +308,6 @@ class DisplayBlock $iSearchSectionId = 1; $sStyle = (isset($aExtraParams['open']) && ($aExtraParams['open'] == 'true')) ? 'SearchDrawer' : 'SearchDrawer DrawerClosed'; $sHtml .= "
\n"; - $sHtml .= "

Search form for ".Metamodel::GetName($this->m_oSet->GetClass())."

\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 .= "
\n"; diff --git a/trunk/css/light-grey.css b/trunk/css/light-grey.css index 18f72c2e6..85717cb88 100644 --- a/trunk/css/light-grey.css +++ b/trunk/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; +} diff --git a/trunk/pages/UI.php b/trunk/pages/UI.php index 48bd6081b..45631dd69 100644 --- a/trunk/pages/UI.php +++ b/trunk/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("

'oql_class' must be specifed for this operation.

\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("Error incorrect OQL query:"); + $oP->P($e->getHtmlDesc()); + } + catch(Exception $e) + { + $oP->p('An error occured while running the query:'); + $oP->p($e->getMessage()); + } + } + break; + case 'search': $sFilter = utils::ReadParam('filter', ''); $sFormat = utils::ReadParam('format', ''); diff --git a/trunk/pages/UniversalSearch.php b/trunk/pages/UniversalSearch.php index e649f8d2b..bb4e15647 100644 --- a/trunk/pages/UniversalSearch.php +++ b/trunk/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("
"); $oP->add("
"); $oP->add(""); $oP->add("Select the class to search:
"); -// 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("Error:"); + $oP->P($e->getHtmlDesc()); } if ($oFilter != null) { - $oSet =new CMDBObjectSet($oFilter); - cmdbAbstractObject::DisplaySearchForm($oP, $oSet, array('org_id' => $currentOrganization, 'class' => $sClassName)); - $oP->add("
\n"); + $oSet = new CMDBObjectSet($oFilter); + $oBlock = new DisplayBlock($oFilter, 'search', false); + $oBlock->Display($oP, 0); // Search results - $oP->add("
"); $oResultBlock = new DisplayBlock($oFilter, 'list', false); $oResultBlock->RenderContent($oP);