Commit ee9b61b5781247571dcd07c36e0d330bbf5d6cb1
1 parent
39711233
Extra-advanced search functionality - choose your search terms for each
of filename, description, id, creator, document type, and each of your document fields. git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3088 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
3 changed files
with
173 additions
and
19 deletions
presentation/lookAndFeel/knowledgeTree/js/divSwitch.js
| ... | ... | @@ -8,17 +8,23 @@ function switchDiv(div_id, object) |
| 8 | 8 | var aDocumentDivs = new Array("documentData", "genericMetaData", "typeSpecificMetaData", |
| 9 | 9 | "archiveSettings", "documentRouting", "linkedDocuments"); |
| 10 | 10 | var aFolderDivs = new Array("folderData", "folderRouting", "documentTypes", "folderPermissions"); |
| 11 | + var aSearchDivs = new Array("searchLess", "searchMore"); | |
| 11 | 12 | |
| 12 | 13 | var style_sheet = getStyleObject(div_id); |
| 14 | + var aDivs; | |
| 13 | 15 | if (style_sheet) |
| 14 | 16 | { |
| 15 | 17 | if (object == "document") { |
| 16 | - showAll(aDocumentDivs); | |
| 17 | - hideAll(aDocumentDivs); | |
| 18 | - } else { | |
| 19 | - showAll(aFolderDivs); | |
| 20 | - hideAll(aFolderDivs); | |
| 18 | + aDivs = aDocumentDivs; | |
| 19 | + } | |
| 20 | + if (object == "folder") { | |
| 21 | + aDivs = aFolderDivs; | |
| 22 | + } | |
| 23 | + if (object == "search") { | |
| 24 | + aDivs = aSearchDivs; | |
| 21 | 25 | } |
| 26 | + showAll(aDivs); | |
| 27 | + hideAll(aDivs); | |
| 22 | 28 | changeObjectVisibility(div_id,"visible"); |
| 23 | 29 | } |
| 24 | 30 | else |
| ... | ... | @@ -29,7 +35,7 @@ function switchDiv(div_id, object) |
| 29 | 35 | |
| 30 | 36 | // function hideAll() |
| 31 | 37 | // hides a bunch of divs |
| 32 | -// | |
| 38 | + | |
| 33 | 39 | function hideAll(aDivs) |
| 34 | 40 | { |
| 35 | 41 | for (var i=0; i<aDivs.length; i++) { |
| ... | ... | @@ -132,4 +138,4 @@ function moveObject(objectId, newXCoordinate, newYCoordinate) { |
| 132 | 138 | // we couldn't find the object, so we can't very well move it |
| 133 | 139 | return false; |
| 134 | 140 | } |
| 135 | -} // moveObject | |
| 136 | 141 | \ No newline at end of file |
| 142 | +} // moveObject | ... | ... |
presentation/lookAndFeel/knowledgeTree/search/advancedSearchBL.php
| ... | ... | @@ -28,7 +28,100 @@ |
| 28 | 28 | |
| 29 | 29 | require_once("../../../../config/dmsDefaults.php"); |
| 30 | 30 | |
| 31 | -KTUtil::extractGPC('fForSearch', 'fSearchString', 'fStartIndex', 'fToSearch'); | |
| 31 | +KTUtil::extractGPC('fForSearch', 'fSearchString', 'fShowSection', 'fStartIndex', 'fToSearch'); | |
| 32 | + | |
| 33 | +function searchCriteria ($var) { | |
| 34 | + return preg_match('/^bmd(-?\d+)/', $var); | |
| 35 | +} | |
| 36 | + | |
| 37 | +function criteriaNumber ($var) { | |
| 38 | + return preg_replace('/^bmd(-?\d+)/', '\\1', $var); | |
| 39 | +} | |
| 40 | + | |
| 41 | +function getAdvancedSearchResults($aOrigReq, $iStartIndex) { | |
| 42 | + global $default; | |
| 43 | + $aReq = array(); | |
| 44 | + foreach ($aOrigReq as $k => $v) { | |
| 45 | + if (searchCriteria($k) === 1) { | |
| 46 | + $v = trim($v); | |
| 47 | + if ($v === "") { | |
| 48 | + continue; | |
| 49 | + } | |
| 50 | + if ($v === "-1") { | |
| 51 | + continue; | |
| 52 | + } | |
| 53 | + $aReq[$k] = $v; | |
| 54 | + } | |
| 55 | + } | |
| 56 | + $aIDs = array_unique(array_map("criteriaNumber", array_keys($aReq))); | |
| 57 | + $aSQL = array(); | |
| 58 | + foreach ($aIDs as $iID) { | |
| 59 | + $oCriterion =& Criteria::getCriterionByNumber($iID); | |
| 60 | + $res = $oCriterion->searchSQL($aReq); | |
| 61 | + if (!is_null($res)) { | |
| 62 | + $aSQL[] = $res; | |
| 63 | + } | |
| 64 | + } | |
| 65 | + $aCritParams = array(); | |
| 66 | + $aCritQueries = array(); | |
| 67 | + foreach ($aSQL as $sSQL) { | |
| 68 | + if (is_array($sSQL)) { | |
| 69 | + $aCritQueries[] = $sSQL[0]; | |
| 70 | + $aCritParams = array_merge($aCritParams , $sSQL[1]); | |
| 71 | + } else { | |
| 72 | + $aCritQueries[] = $sSQL; | |
| 73 | + } | |
| 74 | + } | |
| 75 | + $sSQLSearchString = join(" AND ", $aCritQueries); | |
| 76 | + | |
| 77 | + $sQuery = DBUtil::compactQuery(" | |
| 78 | +SELECT | |
| 79 | + F.name AS folder_name, F.id AS folder_id, D.id AS document_id, | |
| 80 | + D.name AS document_name, COUNT(D.id) AS doc_count | |
| 81 | +FROM | |
| 82 | + $default->documents_table AS D | |
| 83 | + INNER JOIN $default->folders_table AS F ON D.folder_id = F.id | |
| 84 | + INNER JOIN $default->document_fields_link_table AS DFL ON DFL.document_id = D.id | |
| 85 | + INNER JOIN $default->document_fields_table AS DF ON DF.id = DFL.document_field_id | |
| 86 | + INNER JOIN $default->search_permissions_table AS SDUL ON SDUL.document_id = D.id | |
| 87 | + INNER JOIN $default->status_table AS SL on D.status_id=SL.id | |
| 88 | +WHERE | |
| 89 | + SDUL.user_id = ? | |
| 90 | + AND SL.name = ? | |
| 91 | + AND ($sSQLSearchString) | |
| 92 | +GROUP BY D.id | |
| 93 | +ORDER BY doc_count DESC"); | |
| 94 | + | |
| 95 | + $aParams = array(); | |
| 96 | + $aParams[] = $_SESSION["userID"]; | |
| 97 | + $aParams[] = "Live"; | |
| 98 | + $aParams = array_merge($aParams, $aCritParams); | |
| 99 | + | |
| 100 | + //var_dump(DBUtil::getResultArray(array($sQuery, $aParams))); | |
| 101 | + //exit(0); | |
| 102 | + | |
| 103 | + $aColumns = array("folder_name", "document_name", "doc_count"); | |
| 104 | + $aColumnTypes = array(3,3,1); | |
| 105 | + $aColumnHeaders = array("<font color=\"ffffff\"><img src=$default->graphicsUrl/widgets/dfolder.gif>" . _("Folder") . "</font>","<font color=\"ffffff\">" . _("Document") . "</font>", "<font color=\"ffffff\">" . _("Matches") . "</font>"); | |
| 106 | + $aLinkURLs = array("$default->rootUrl/control.php?action=browse","$default->rootUrl/control.php?action=viewDocument"); | |
| 107 | + $aDBQueryStringColumns = array("document_id","folder_id"); | |
| 108 | + $aQueryStringVariableNames = array("fDocumentID", "fFolderID"); | |
| 109 | + | |
| 110 | + $oPatternBrowse = & new PatternBrowseableSearchResults(array($sQuery, $aParams), 10, $aColumns, $aColumnTypes, $aColumnHeaders, $aLinkURLs, $aDBQueryStringColumns, $aQueryStringVariableNames); | |
| 111 | + $oPatternBrowse->setStartIndex($iStartIndex); | |
| 112 | + $oPatternBrowse->setSearchText(""); | |
| 113 | + | |
| 114 | + $sRefreshMessage = "<table><tr><td align=\"center\">" . _("If your browser displays a 'Warning: Page has Expired' message when you attempt to return to these search results, please click your browser's 'Refresh' button") . "</td></tr></table>"; | |
| 115 | + return renderHeading(_("Advanced Search")) . $oPatternBrowse->render() . $sRefreshMessage . getSearchVariablesHtml($sSearchString, $sStatus, $sMetaTagIDs); | |
| 116 | +} | |
| 117 | + | |
| 118 | +function dealWithAdvancedSearch($aReq, $iStartIndex) { | |
| 119 | + global $main; | |
| 120 | + $oPatternCustom = & new PatternCustom(); | |
| 121 | + $oPatternCustom->setHtml(getAdvancedSearchResults($aReq, $iStartIndex)); | |
| 122 | + $main->setCentralPayload($oPatternCustom); | |
| 123 | + $main->render(); | |
| 124 | +} | |
| 32 | 125 | |
| 33 | 126 | if (checkSession()) { |
| 34 | 127 | require_once("$default->fileSystemRoot/lib/visualpatterns/PatternBrowsableSearchResults.inc"); |
| ... | ... | @@ -43,8 +136,14 @@ if (checkSession()) { |
| 43 | 136 | |
| 44 | 137 | require_once("$default->fileSystemRoot/presentation/webpageTemplate.inc"); |
| 45 | 138 | |
| 139 | + if (!isset($fStartIndex)) { | |
| 140 | + $fStartIndex = 1; | |
| 141 | + } | |
| 142 | + | |
| 46 | 143 | if (strlen($fForSearch)) { |
| 47 | - if (strlen($fSearchString) > 0) { | |
| 144 | + if (array_key_exists('advancedSearch_x', $_REQUEST)) { | |
| 145 | + dealWithAdvancedSearch($_REQUEST, $fStartIndex); | |
| 146 | + } else if (strlen($fSearchString) > 0) { | |
| 48 | 147 | $oPatternCustom = & new PatternCustom(); |
| 49 | 148 | |
| 50 | 149 | //display search results |
| ... | ... | @@ -52,24 +151,20 @@ if (checkSession()) { |
| 52 | 151 | |
| 53 | 152 | if (strlen($sMetaTagIDs) > 0) { |
| 54 | 153 | $sSQLSearchString = getSQLSearchString($fSearchString); |
| 55 | - | |
| 56 | - if (!isset($fStartIndex)) { | |
| 57 | - $fStartIndex = 1; | |
| 58 | - } | |
| 59 | 154 | $oPatternCustom->setHtml(getSearchResults($sMetaTagIDs, $sSQLSearchString, $fStartIndex, $fSearchString, $fToSearch)); |
| 60 | 155 | $main->setCentralPayload($oPatternCustom); |
| 61 | 156 | $main->render(); |
| 62 | 157 | } else { |
| 63 | - | |
| 64 | 158 | $oPatternCustom->setHtml(getSearchPage($fSearchString)); |
| 65 | 159 | $main->setCentralPayload($oPatternCustom); |
| 66 | 160 | $main->setErrorMessage(_("Please select at least one criteria to search by")); |
| 67 | 161 | $main->setHasRequiredFields(true); |
| 68 | 162 | $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); |
| 163 | + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')"); | |
| 69 | 164 | $main->render(); |
| 70 | 165 | } |
| 71 | 166 | } else { |
| 72 | - $sMetaTagIDs = getChosenMetaDataTags(); | |
| 167 | + $sMetaTagIDs = getChosenMetaDataTags($_POST); | |
| 73 | 168 | $aMetaTagIDs = explode(",", $sMetaTagIDs); |
| 74 | 169 | $oPatternCustom = & new PatternCustom(); |
| 75 | 170 | $oPatternCustom->setHtml(getSearchPage($fSearchString, $aMetaTagIDs)); |
| ... | ... | @@ -77,6 +172,7 @@ if (checkSession()) { |
| 77 | 172 | $main->setErrorMessage(_("Please enter text to search on")); |
| 78 | 173 | $main->setHasRequiredFields(true); |
| 79 | 174 | $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); |
| 175 | + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')"); | |
| 80 | 176 | $main->render(); |
| 81 | 177 | } |
| 82 | 178 | |
| ... | ... | @@ -87,6 +183,7 @@ if (checkSession()) { |
| 87 | 183 | $main->setHasRequiredFields(true); |
| 88 | 184 | $main->setCentralPayload($oPatternCustom); |
| 89 | 185 | $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); |
| 186 | + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')"); | |
| 90 | 187 | $main->render(); |
| 91 | 188 | } |
| 92 | 189 | } | ... | ... |
presentation/lookAndFeel/knowledgeTree/search/advancedSearchUI.inc
| ... | ... | @@ -25,6 +25,8 @@ |
| 25 | 25 | * @package search |
| 26 | 26 | */ |
| 27 | 27 | |
| 28 | +require_once("$default->fileSystemRoot/lib/browse/Criteria.inc"); | |
| 29 | + | |
| 28 | 30 | function getMetaData($aMetaTagIDs) { |
| 29 | 31 | global $default; |
| 30 | 32 | /*ok*/ $sQuery = "SELECT name, id FROM $default->document_fields_table ORDER BY name ASC"; |
| ... | ... | @@ -63,16 +65,40 @@ function getMetaData($aMetaTagIDs) { |
| 63 | 65 | |
| 64 | 66 | return $sToRender; |
| 65 | 67 | } |
| 68 | + | |
| 69 | +function renderSearchSection($sSectionName, $sHeadingText, $bDisplayLink) { | |
| 70 | + static $iColour; | |
| 71 | + if ($bDisplayLink) { | |
| 72 | + $sLink = generateControllerLink("advancedSearch", "fShowSection=$sSectionName", $sHeadingText); | |
| 73 | + } else { | |
| 74 | + $sLink = "<a href=\"#\" onClick=\"switchDiv('$sSectionName', 'search');\">$sHeadingText</a>"; | |
| 75 | + } | |
| 76 | + return "<tr bgcolor=\"" . getColour($iColour) . "\"><td width=\"100%\">$sLink</td></tr>\n"; | |
| 77 | +} | |
| 78 | + | |
| 66 | 79 | function getSearchPage($sSearchString = "", $aMetaTagIDs = array(), $sHeading = null, $bSearchArchive = false) { |
| 67 | 80 | global $default; |
| 68 | 81 | if (is_null($sHeading)) { |
| 69 | 82 | $sHeading = _("Advanced Search"); |
| 70 | 83 | } |
| 84 | + | |
| 71 | 85 | $sToRender = renderHeading($sHeading); |
| 86 | + | |
| 87 | + $sToRender .= "<div id=\"headings\">\n"; | |
| 88 | + $sToRender .= "<table width=\"100%\">"; | |
| 89 | + $sToRender .= renderSearchSection("searchLess", _("Simpler Search"), false); | |
| 90 | + $sToRender .= renderSearchSection("searchMore", _("More Options"), false); | |
| 91 | + $sToRender .= "</table>"; | |
| 92 | + $sToRender .= "</div>"; | |
| 93 | + | |
| 94 | + $sToRender .= "<div id=\"contentDiv\" style=\"position:relative;visibility:hidden;width:500px;\" >\n"; | |
| 95 | + | |
| 96 | + $sToRender .= "<div id=\"searchLess\" style=\"position:absolute;visibility:hidden;left:5px;\" >\n"; | |
| 97 | + | |
| 72 | 98 | $sToRender .= "<table width=\"600\">\n"; |
| 73 | 99 | $sToRender .= "<tr>\n"; |
| 74 | 100 | $sToRender .= "<td>" . _("Search text:") . " <input type=\"text\" size=\"50\" name=\"fSearchString\" value=\"$sSearchString\" />\n"; |
| 75 | - $sToRender .= "<input type=\"image\" src=\"" . KTHtml::getSearchButton() . "\" border=\"0\"/></td>\n"; | |
| 101 | + $sToRender .= "<input name=\"simpleSearch\" type=\"image\" src=\"" . KTHtml::getSearchButton() . "\" border=\"0\"/></td>\n"; | |
| 76 | 102 | $sToRender .= "</tr>\n"; |
| 77 | 103 | |
| 78 | 104 | if ($bSearchArchive) { |
| ... | ... | @@ -94,6 +120,31 @@ function getSearchPage($sSearchString = "", $aMetaTagIDs = array(), $sHeading = |
| 94 | 120 | $sToRender .= "<td> </td>\n"; |
| 95 | 121 | $sToRender .= "</tr>\n"; |
| 96 | 122 | $sToRender .= "</table>\n"; |
| 123 | + $sToRender .= "</div>"; | |
| 124 | + | |
| 125 | + | |
| 126 | + $sToRender .= "<div id=\"searchMore\" style=\"position:absolute;visibility:hidden;left:5px;\">"; | |
| 127 | + | |
| 128 | + $sToRender .= "<form name=\"advancedSearch\" method=\"POST\">"; | |
| 129 | + | |
| 130 | + $sToRender .= "<table width=\"100%\">\n"; | |
| 131 | + $sToRender .= "<tr><td colspan=\"2\"><h3>Built-in metadata</h3></td></tr>"; | |
| 132 | + $aBaseCriteria = Criteria::getBaseCriteria(); | |
| 133 | + foreach ($aBaseCriteria as $k => $v) { | |
| 134 | + $sToRender .= $v->searchDisplay($_REQUEST); | |
| 135 | + } | |
| 136 | + $sToRender .= "<tr><td colspan=\"2\"><h3>Generic metadata</h3></td></tr>"; | |
| 137 | + $aGenericCriteria = Criteria::getGenericCriteria(); | |
| 138 | + foreach ($aGenericCriteria as $k => $v) { | |
| 139 | + $sToRender .= $v->searchDisplay($_REQUEST); | |
| 140 | + } | |
| 141 | + $sToRender .= "</table>\n"; | |
| 142 | + $sToRender .= "<input name=\"advancedSearch\" type=\"image\" src=\"" . KTHtml::getSearchButton() . "\" border=\"0\"/></td>\n"; | |
| 143 | + $sToRender .= "</form>"; | |
| 144 | + | |
| 145 | + $sToRender .= "</div>"; | |
| 146 | + $sToRender .= "</div>"; | |
| 147 | + | |
| 97 | 148 | |
| 98 | 149 | return $sToRender . getSearchValidationJavaScript(); |
| 99 | 150 | } |
| ... | ... | @@ -121,6 +172,7 @@ function getSearchResults($sMetaTagIDs, $sSQLSearchString, $iStartIndex, $sSearc |
| 121 | 172 | $aParams[] = $sStatus; |
| 122 | 173 | |
| 123 | 174 | $default->log->info("getSearchResults $sQuery"); |
| 175 | + | |
| 124 | 176 | $aColumns = array("folder_name", "document_name", "doc_count"); |
| 125 | 177 | $aColumnTypes = array(3,3,1); |
| 126 | 178 | $aColumnHeaders = array("<font color=\"ffffff\"><img src=$default->graphicsUrl/widgets/dfolder.gif>" . _("Folder") . "</font>","<font color=\"ffffff\">" . _("Document") . "</font>", "<font color=\"ffffff\">" . _("Matches") . "</font>"); |
| ... | ... | @@ -137,16 +189,15 @@ function getSearchResults($sMetaTagIDs, $sSQLSearchString, $iStartIndex, $sSearc |
| 137 | 189 | } |
| 138 | 190 | |
| 139 | 191 | function getSearchValidationJavaScript() { |
| 140 | - $sToRender = "\n\n<SCRIPT LANGUAGE=\"javascript\">\n "; | |
| 192 | + /*$sToRender = "\n\n<SCRIPT LANGUAGE=\"javascript\">\n "; | |
| 141 | 193 | $sToRender .= "<!--\n"; |
| 142 | 194 | $sToRender .= "function validateForm() {\n"; |
| 143 | 195 | $sToRender .= "\tif (!(validRequired(document.MainForm.fSearchString, 'Search text'))) {\n"; |
| 144 | 196 | $sToRender .= "\t\treturn false;\n\t}\n"; |
| 145 | 197 | $sToRender .= "\treturn true;\n}\n"; |
| 146 | 198 | $sToRender .= "-->\n"; |
| 147 | - $sToRender .= "</SCRIPT>\n\n"; | |
| 199 | + $sToRender .= "</SCRIPT>\n\n";*/ | |
| 148 | 200 | return $sToRender; |
| 149 | - | |
| 150 | 201 | } |
| 151 | 202 | |
| 152 | 203 | function wasSelected($iID, $aMetaTagIDs) { | ... | ... |