Implemented enhancement #130: keywords to narrow the scope of the global search

SVN:trunk[1369]
This commit is contained in:
Denis Flaven
2011-07-26 14:18:33 +00:00
parent b6bcade4c0
commit 751ab5a4b4
3 changed files with 43 additions and 6 deletions

View File

@@ -582,7 +582,7 @@ EOF
}
echo "</style>\n";
}
echo "<link rel=\"search\" type=\"application/opensearchdescription+xml\" title=\"iTop\" href=\"./opensearch.xml.php\" />\n";
echo "<link rel=\"search\" type=\"application/opensearchdescription+xml\" title=\"iTop\" href=\"".utils::GetAbsoluteUrlAppRoot()."opensearch.xml.php\" />\n";
echo "</head>\n";
echo "<body>\n";
@@ -606,7 +606,7 @@ EOF
}
// Render the text of the global search form
$sText = Utils::ReadParam('text', '');
$sText = htmlentities(utils::ReadParam('text', ''), ENT_QUOTES, 'UTF-8');
$sOnClick = "";
if (empty($sText))
{

View File

@@ -310,13 +310,23 @@ abstract class MetaModel
return self::GetName($sClass);
}
}
final static public function GetClassFromLabel($sClassLabel)
final static public function GetClassFromLabel($sClassLabel, $bCaseSensitive = true)
{
foreach(self::GetClasses() as $sClass)
{
if (self::GetName($sClass) == $sClassLabel)
if ($bCaseSensitive)
{
return $sClass;
if (self::GetName($sClass) == $sClassLabel)
{
return $sClass;
}
}
else
{
if (strcasecmp(self::GetName($sClass), $sClassLabel) == 0)
{
return $sClass;
}
}
}
return null;

View File

@@ -627,6 +627,22 @@ try
$iBlock = 0;
// Search in full text mode in all the classes
$aMatches = array();
$sClassName = '';
// Check if a class name/label is supplied to limit the search
if (preg_match('/^(.+):(.+)$/', $sFullText, $aMatches))
{
$sClassName = $aMatches[1];
if (MetaModel::IsValidClass($sClassName))
{
$sFullText = $aMatches[2];
}
elseif ($sClassName = MetaModel::GetClassFromLabel($sClassName, false /* => not case sensitive */))
{
$sFullText = $aMatches[2];
}
}
if (preg_match('/^"(.*)"$/', $sFullText, $aMatches))
{
// The text is surrounded by double-quotes, remove the quotes and treat it as one single expression
@@ -637,7 +653,18 @@ try
// Split the text on the blanks and treat this as a search for <word1> AND <word2> AND <word3>
$aFullTextNeedles = explode(' ', $sFullText);
}
foreach(MetaModel::GetClasses('searchable') as $sClassName)
// Search is limited ot a given class, or not...
if (empty($sClassName))
{
$aSearchClasses = MetaModel::GetClasses('searchable');
}
else
{
$aSearchClasses = MetaModel::EnumChildClasses($sClassName, ENUM_CHILD_CLASSES_ALL);
}
foreach($aSearchClasses as $sClassName)
{
$oFilter = new DBObjectSearch($sClassName);
foreach($aFullTextNeedles as $sSearchText)