Commit 92b48ea3483f48192f50b136734c74b2855eb5b1

Authored by Neil Blakey-Milner
1 parent 46769261

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 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 = &quot;&quot;, $aMetaTagIDs = array(), $sHeading =
94 120 $sToRender .= "<td>&nbsp</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) {
... ...