Commit ee9b61b5781247571dcd07c36e0d330bbf5d6cb1

Authored by nbm
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
presentation/lookAndFeel/knowledgeTree/js/divSwitch.js
@@ -8,17 +8,23 @@ function switchDiv(div_id, object) @@ -8,17 +8,23 @@ function switchDiv(div_id, object)
8 var aDocumentDivs = new Array("documentData", "genericMetaData", "typeSpecificMetaData", 8 var aDocumentDivs = new Array("documentData", "genericMetaData", "typeSpecificMetaData",
9 "archiveSettings", "documentRouting", "linkedDocuments"); 9 "archiveSettings", "documentRouting", "linkedDocuments");
10 var aFolderDivs = new Array("folderData", "folderRouting", "documentTypes", "folderPermissions"); 10 var aFolderDivs = new Array("folderData", "folderRouting", "documentTypes", "folderPermissions");
  11 + var aSearchDivs = new Array("searchLess", "searchMore");
11 12
12 var style_sheet = getStyleObject(div_id); 13 var style_sheet = getStyleObject(div_id);
  14 + var aDivs;
13 if (style_sheet) 15 if (style_sheet)
14 { 16 {
15 if (object == "document") { 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 changeObjectVisibility(div_id,"visible"); 28 changeObjectVisibility(div_id,"visible");
23 } 29 }
24 else 30 else
@@ -29,7 +35,7 @@ function switchDiv(div_id, object) @@ -29,7 +35,7 @@ function switchDiv(div_id, object)
29 35
30 // function hideAll() 36 // function hideAll()
31 // hides a bunch of divs 37 // hides a bunch of divs
32 -// 38 +
33 function hideAll(aDivs) 39 function hideAll(aDivs)
34 { 40 {
35 for (var i=0; i<aDivs.length; i++) { 41 for (var i=0; i<aDivs.length; i++) {
@@ -132,4 +138,4 @@ function moveObject(objectId, newXCoordinate, newYCoordinate) { @@ -132,4 +138,4 @@ function moveObject(objectId, newXCoordinate, newYCoordinate) {
132 // we couldn't find the object, so we can't very well move it 138 // we couldn't find the object, so we can't very well move it
133 return false; 139 return false;
134 } 140 }
135 -} // moveObject  
136 \ No newline at end of file 141 \ No newline at end of file
  142 +} // moveObject
presentation/lookAndFeel/knowledgeTree/search/advancedSearchBL.php
@@ -28,7 +28,100 @@ @@ -28,7 +28,100 @@
28 28
29 require_once("../../../../config/dmsDefaults.php"); 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 if (checkSession()) { 126 if (checkSession()) {
34 require_once("$default->fileSystemRoot/lib/visualpatterns/PatternBrowsableSearchResults.inc"); 127 require_once("$default->fileSystemRoot/lib/visualpatterns/PatternBrowsableSearchResults.inc");
@@ -43,8 +136,14 @@ if (checkSession()) { @@ -43,8 +136,14 @@ if (checkSession()) {
43 136
44 require_once("$default->fileSystemRoot/presentation/webpageTemplate.inc"); 137 require_once("$default->fileSystemRoot/presentation/webpageTemplate.inc");
45 138
  139 + if (!isset($fStartIndex)) {
  140 + $fStartIndex = 1;
  141 + }
  142 +
46 if (strlen($fForSearch)) { 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 $oPatternCustom = & new PatternCustom(); 147 $oPatternCustom = & new PatternCustom();
49 148
50 //display search results 149 //display search results
@@ -52,24 +151,20 @@ if (checkSession()) { @@ -52,24 +151,20 @@ if (checkSession()) {
52 151
53 if (strlen($sMetaTagIDs) > 0) { 152 if (strlen($sMetaTagIDs) > 0) {
54 $sSQLSearchString = getSQLSearchString($fSearchString); 153 $sSQLSearchString = getSQLSearchString($fSearchString);
55 -  
56 - if (!isset($fStartIndex)) {  
57 - $fStartIndex = 1;  
58 - }  
59 $oPatternCustom->setHtml(getSearchResults($sMetaTagIDs, $sSQLSearchString, $fStartIndex, $fSearchString, $fToSearch)); 154 $oPatternCustom->setHtml(getSearchResults($sMetaTagIDs, $sSQLSearchString, $fStartIndex, $fSearchString, $fToSearch));
60 $main->setCentralPayload($oPatternCustom); 155 $main->setCentralPayload($oPatternCustom);
61 $main->render(); 156 $main->render();
62 } else { 157 } else {
63 -  
64 $oPatternCustom->setHtml(getSearchPage($fSearchString)); 158 $oPatternCustom->setHtml(getSearchPage($fSearchString));
65 $main->setCentralPayload($oPatternCustom); 159 $main->setCentralPayload($oPatternCustom);
66 $main->setErrorMessage(_("Please select at least one criteria to search by")); 160 $main->setErrorMessage(_("Please select at least one criteria to search by"));
67 $main->setHasRequiredFields(true); 161 $main->setHasRequiredFields(true);
68 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); 162 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1");
  163 + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')");
69 $main->render(); 164 $main->render();
70 } 165 }
71 } else { 166 } else {
72 - $sMetaTagIDs = getChosenMetaDataTags(); 167 + $sMetaTagIDs = getChosenMetaDataTags($_POST);
73 $aMetaTagIDs = explode(",", $sMetaTagIDs); 168 $aMetaTagIDs = explode(",", $sMetaTagIDs);
74 $oPatternCustom = & new PatternCustom(); 169 $oPatternCustom = & new PatternCustom();
75 $oPatternCustom->setHtml(getSearchPage($fSearchString, $aMetaTagIDs)); 170 $oPatternCustom->setHtml(getSearchPage($fSearchString, $aMetaTagIDs));
@@ -77,6 +172,7 @@ if (checkSession()) { @@ -77,6 +172,7 @@ if (checkSession()) {
77 $main->setErrorMessage(_("Please enter text to search on")); 172 $main->setErrorMessage(_("Please enter text to search on"));
78 $main->setHasRequiredFields(true); 173 $main->setHasRequiredFields(true);
79 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); 174 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1");
  175 + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')");
80 $main->render(); 176 $main->render();
81 } 177 }
82 178
@@ -87,6 +183,7 @@ if (checkSession()) { @@ -87,6 +183,7 @@ if (checkSession()) {
87 $main->setHasRequiredFields(true); 183 $main->setHasRequiredFields(true);
88 $main->setCentralPayload($oPatternCustom); 184 $main->setCentralPayload($oPatternCustom);
89 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1"); 185 $main->setFormAction($_SERVER["PHP_SELF"] . "?fForSearch=1");
  186 + $main->setOnLoadJavaScript("switchDiv('" . (isset($fShowSection) ? $fShowSection : "searchLess") . "', 'search')");
90 $main->render(); 187 $main->render();
91 } 188 }
92 } 189 }
presentation/lookAndFeel/knowledgeTree/search/advancedSearchUI.inc
@@ -25,6 +25,8 @@ @@ -25,6 +25,8 @@
25 * @package search 25 * @package search
26 */ 26 */
27 27
  28 +require_once("$default->fileSystemRoot/lib/browse/Criteria.inc");
  29 +
28 function getMetaData($aMetaTagIDs) { 30 function getMetaData($aMetaTagIDs) {
29 global $default; 31 global $default;
30 /*ok*/ $sQuery = "SELECT name, id FROM $default->document_fields_table ORDER BY name ASC"; 32 /*ok*/ $sQuery = "SELECT name, id FROM $default->document_fields_table ORDER BY name ASC";
@@ -63,16 +65,40 @@ function getMetaData($aMetaTagIDs) { @@ -63,16 +65,40 @@ function getMetaData($aMetaTagIDs) {
63 65
64 return $sToRender; 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 function getSearchPage($sSearchString = "", $aMetaTagIDs = array(), $sHeading = null, $bSearchArchive = false) { 79 function getSearchPage($sSearchString = "", $aMetaTagIDs = array(), $sHeading = null, $bSearchArchive = false) {
67 global $default; 80 global $default;
68 if (is_null($sHeading)) { 81 if (is_null($sHeading)) {
69 $sHeading = _("Advanced Search"); 82 $sHeading = _("Advanced Search");
70 } 83 }
  84 +
71 $sToRender = renderHeading($sHeading); 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 $sToRender .= "<table width=\"600\">\n"; 98 $sToRender .= "<table width=\"600\">\n";
73 $sToRender .= "<tr>\n"; 99 $sToRender .= "<tr>\n";
74 $sToRender .= "<td>" . _("Search text:") . " <input type=\"text\" size=\"50\" name=\"fSearchString\" value=\"$sSearchString\" />\n"; 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 $sToRender .= "</tr>\n"; 102 $sToRender .= "</tr>\n";
77 103
78 if ($bSearchArchive) { 104 if ($bSearchArchive) {
@@ -94,6 +120,31 @@ function getSearchPage($sSearchString = &quot;&quot;, $aMetaTagIDs = array(), $sHeading = @@ -94,6 +120,31 @@ function getSearchPage($sSearchString = &quot;&quot;, $aMetaTagIDs = array(), $sHeading =
94 $sToRender .= "<td>&nbsp</td>\n"; 120 $sToRender .= "<td>&nbsp</td>\n";
95 $sToRender .= "</tr>\n"; 121 $sToRender .= "</tr>\n";
96 $sToRender .= "</table>\n"; 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 return $sToRender . getSearchValidationJavaScript(); 149 return $sToRender . getSearchValidationJavaScript();
99 } 150 }
@@ -121,6 +172,7 @@ function getSearchResults($sMetaTagIDs, $sSQLSearchString, $iStartIndex, $sSearc @@ -121,6 +172,7 @@ function getSearchResults($sMetaTagIDs, $sSQLSearchString, $iStartIndex, $sSearc
121 $aParams[] = $sStatus; 172 $aParams[] = $sStatus;
122 173
123 $default->log->info("getSearchResults $sQuery"); 174 $default->log->info("getSearchResults $sQuery");
  175 +
124 $aColumns = array("folder_name", "document_name", "doc_count"); 176 $aColumns = array("folder_name", "document_name", "doc_count");
125 $aColumnTypes = array(3,3,1); 177 $aColumnTypes = array(3,3,1);
126 $aColumnHeaders = array("<font color=\"ffffff\"><img src=$default->graphicsUrl/widgets/dfolder.gif>" . _("Folder") . "</font>","<font color=\"ffffff\">" . _("Document") . "</font>", "<font color=\"ffffff\">" . _("Matches") . "</font>"); 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,16 +189,15 @@ function getSearchResults($sMetaTagIDs, $sSQLSearchString, $iStartIndex, $sSearc
137 } 189 }
138 190
139 function getSearchValidationJavaScript() { 191 function getSearchValidationJavaScript() {
140 - $sToRender = "\n\n<SCRIPT LANGUAGE=\"javascript\">\n "; 192 + /*$sToRender = "\n\n<SCRIPT LANGUAGE=\"javascript\">\n ";
141 $sToRender .= "<!--\n"; 193 $sToRender .= "<!--\n";
142 $sToRender .= "function validateForm() {\n"; 194 $sToRender .= "function validateForm() {\n";
143 $sToRender .= "\tif (!(validRequired(document.MainForm.fSearchString, 'Search text'))) {\n"; 195 $sToRender .= "\tif (!(validRequired(document.MainForm.fSearchString, 'Search text'))) {\n";
144 $sToRender .= "\t\treturn false;\n\t}\n"; 196 $sToRender .= "\t\treturn false;\n\t}\n";
145 $sToRender .= "\treturn true;\n}\n"; 197 $sToRender .= "\treturn true;\n}\n";
146 $sToRender .= "-->\n"; 198 $sToRender .= "-->\n";
147 - $sToRender .= "</SCRIPT>\n\n"; 199 + $sToRender .= "</SCRIPT>\n\n";*/
148 return $sToRender; 200 return $sToRender;
149 -  
150 } 201 }
151 202
152 function wasSelected($iID, $aMetaTagIDs) { 203 function wasSelected($iID, $aMetaTagIDs) {