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";
- // 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";
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("
");
-// 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);