1 31 32 package org.opencms.workplace.tools.searchindex; 33 34 import org.opencms.i18n.CmsMessages; 35 import org.opencms.jsp.CmsJspActionElement; 36 import org.opencms.search.CmsSearch; 37 import org.opencms.search.CmsSearchParameters; 38 import org.opencms.util.CmsStringUtil; 39 import org.opencms.widgets.CmsCheckboxWidget; 40 import org.opencms.widgets.CmsDisplayWidget; 41 import org.opencms.widgets.CmsInputWidget; 42 import org.opencms.widgets.CmsSelectWidget; 43 import org.opencms.widgets.CmsSelectWidgetOption; 44 import org.opencms.widgets.CmsVfsFileWidget; 45 import org.opencms.workplace.CmsDialog; 46 import org.opencms.workplace.CmsWidgetDialogParameter; 47 import org.opencms.workplace.CmsWorkplaceSettings; 48 49 import java.util.Iterator ; 50 import java.util.LinkedList ; 51 import java.util.List ; 52 import java.util.Map ; 53 54 import javax.servlet.http.HttpServletRequest ; 55 import javax.servlet.http.HttpServletResponse ; 56 import javax.servlet.jsp.PageContext ; 57 58 73 public class CmsSearchWidgetDialog extends A_CmsEditSearchIndexDialog { 74 75 76 public static final String PARAM_SEARCH_OBJECT = "searchobject"; 77 78 79 public static final String PARAM_SEARCH_PARAMS = "searchparams"; 80 81 82 protected CmsSearch m_search; 83 84 85 protected CmsSearchParameters m_searchParams; 86 87 92 public CmsSearchWidgetDialog(CmsJspActionElement jsp) { 93 94 super(jsp); 95 96 } 97 98 105 public CmsSearchWidgetDialog(PageContext context, HttpServletRequest req, HttpServletResponse res) { 106 107 this(new CmsJspActionElement(context, req, res)); 108 109 } 110 111 130 public void actionToggleElement() { 131 132 super.actionToggleElement(); 133 commitWidgetValues(); 134 } 135 136 144 public String dialogScriptSubmit() { 145 146 StringBuffer html = new StringBuffer (512); 147 html.append(submitJS()); 148 html.append("function submitAction(actionValue, theForm, formName) {\n"); 149 html.append("\tif (theForm == null) {\n"); 150 html.append("\t\ttheForm = document.forms[formName];\n"); 151 html.append("\t}\n"); 152 html.append("\tvar queryOK = validateQuery();\n"); 153 html.append("\ttheForm." + CmsDialog.PARAM_FRAMENAME + ".value = window.name;\n"); 154 html.append("\tif (queryOK) {\n"); 155 html.append("\t\tif (actionValue == '" + CmsDialog.DIALOG_OK + "') {\n"); 156 html.append("\t\t\tloadingOn();\n"); 158 html.append("\t\t\treturn queryOK;\n"); 159 html.append("\t\t}\n"); 160 html.append("\t\ttheForm." + CmsDialog.PARAM_ACTION + ".value = actionValue;\n"); 161 html.append("\t\tsubmitForm(theForm);\n"); 162 html.append("\t}\n"); 163 html.append("\treturn queryOK;\n"); 164 html.append("}\n"); 165 return html.toString(); 166 } 167 168 176 protected boolean closeDialogOnCommit() { 177 178 return false; 179 } 180 181 184 protected String createDialogHtml(String dialog) { 185 186 StringBuffer result = new StringBuffer (1024); 187 188 result.append(createWidgetTableStart()); 189 result.append(createWidgetErrorHeader()); 191 192 if (dialog.equals(PAGES[0])) { 193 194 result.append(dialogBlockStart(key(Messages.GUI_LABEL_SEARCHINDEX_BLOCK_SEARCH_QUERY_0))); 196 result.append(createWidgetTableStart()); 197 result.append(createDialogRowsHtml(0, 5)); 198 result.append(createWidgetTableEnd()); 199 result.append(dialogBlockEnd()); 200 201 result.append(dialogBlockStart(key(Messages.GUI_LABEL_SEARCHINDEX_BLOCK_SEARCH_FIELDS_0))); 203 result.append(createWidgetTableStart()); 204 result.append(createDialogRowsHtml(6, 10)); 205 result.append(createWidgetTableEnd()); 206 result.append(dialogBlockEnd()); 207 } 208 209 result.append(createWidgetTableEnd()); 210 211 return result.toString(); 212 } 213 214 223 protected String defaultActionHtmlContent() { 224 225 StringBuffer result = new StringBuffer (2048); 226 result.append("<form name=\"EDITOR\" id=\"EDITOR\" method=\"post\" action=\"").append(getDialogUri()); 227 result.append("\" class=\"nomargin\" onsubmit=\"return submitAction('").append(DIALOG_OK).append( 228 "', null, 'EDITOR');\">\n"); 229 result.append(dialogContentStart(null)); 230 result.append(buildDialogForm()); 231 result.append(dialogContentEnd()); 232 result.append(dialogButtonsCustom()); 233 result.append(paramsAsHidden()); 234 if (getParamFramename() == null) { 235 result.append("\n<input type=\"hidden\" name=\"").append(PARAM_FRAMENAME).append("\" value=\"\">\n"); 236 } 237 238 result.append(filterCategoryJS()); 240 result.append("</form>\n"); 241 242 String searchResults = createSearchResults(); 246 247 result.append(createCategorySearchResultHtml()); 249 result.append(searchResults); 250 251 result.append(getWidgetHtmlEnd()); 252 result.append(normalizePreviousQueryJS()); 254 255 return result.toString(); 256 } 257 258 262 protected void defineWidgets() { 263 264 super.defineWidgets(); 266 addWidget(new CmsWidgetDialogParameter(m_searchParams, "index", "", PAGES[0], new CmsDisplayWidget(), 1, 1)); 268 addWidget(new CmsWidgetDialogParameter(m_searchParams, "query", "", PAGES[0], new CmsInputWidget(), 1, 1)); 269 addWidget(new CmsWidgetDialogParameter(m_searchParams, "sortName", "", PAGES[0], new CmsSelectWidget( 270 getSortWidgetConfiguration()), 0, 1)); 271 addWidget(new CmsWidgetDialogParameter( 272 m_searchParams.getRoots(), 273 "roots", 274 "/", 275 PAGES[0], 276 new CmsVfsFileWidget(), 277 1, 278 10)); 279 addWidget(new CmsWidgetDialogParameter( 280 m_searchParams.getCategories(), 281 "categories", 282 "", 283 PAGES[0], 284 new CmsInputWidget(), 285 0, 286 6)); 287 288 addWidget(new CmsWidgetDialogParameter(m_searchParams, "calculateCategories", new CmsCheckboxWidget())); 289 290 addWidget(new CmsWidgetDialogParameter(m_searchParams, "searchFieldContent", new CmsCheckboxWidget())); 292 addWidget(new CmsWidgetDialogParameter(m_searchParams, "searchFieldMeta", new CmsCheckboxWidget())); 293 addWidget(new CmsWidgetDialogParameter(m_searchParams, "searchFieldTitle", new CmsCheckboxWidget())); 294 addWidget(new CmsWidgetDialogParameter(m_searchParams, "searchFieldKeywords", new CmsCheckboxWidget())); 295 addWidget(new CmsWidgetDialogParameter(m_searchParams, "searchFieldDescription", new CmsCheckboxWidget())); 296 297 } 298 299 305 protected void initUserObject() { 306 307 super.initUserObject(); 308 Object o = getDialogObject(); 309 if (o == null) { 310 m_searchParams = new CmsSearchParameters(); 311 m_searchParams.setCategories(new CmsHookListSearchCategory(m_searchParams, m_searchParams.getCategories())); 314 m_search = new CmsSearch(); 315 } else { 316 Map dialogObject = (Map )o; 317 m_searchParams = (CmsSearchParameters)dialogObject.get(PARAM_SEARCH_PARAMS); 318 if (m_searchParams == null) { 319 m_searchParams = new CmsSearchParameters(); 320 } 321 m_search = (CmsSearch)dialogObject.get(PARAM_SEARCH_OBJECT); 322 if (m_search == null) { 323 m_search = new CmsSearch(); 324 } 325 } 326 m_searchParams.setSearchIndex(m_index); 327 } 328 329 334 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 335 336 super.initWorkplaceRequestValues(settings, request); 337 Map dialogMap = (Map )getDialogObject(); 338 if (dialogMap != null) { 339 dialogMap.put(PARAM_SEARCH_PARAMS, m_searchParams); 340 dialogMap.put(PARAM_SEARCH_OBJECT, m_search); 341 } 342 343 } 344 345 356 private String createCategorySearchResultHtml() { 357 358 StringBuffer result = new StringBuffer (); 359 if (m_searchParams.isCalculateCategories()) { 360 Map categoryMap = m_search.getSearchResultCategories(); 363 if (categoryMap != null) { 364 result.append(dialogContentStart(null)); 365 result.append(result.append(createWidgetTableStart())); 366 result.append(dialogBlockStart(key( 368 Messages.GUI_LABEL_SEARCHINDEX_BLOCK_SEARCH_CATEGORIES_1, 369 new Object [] {m_searchParams.getQuery()}))); 370 result.append(createWidgetTableStart()); 371 372 result.append("\n<p>\n"); 374 Map.Entry entry; 375 Iterator it = categoryMap.entrySet().iterator(); 376 while (it.hasNext()) { 377 entry = (Map.Entry )it.next(); 378 result.append(" ").append("<a class=\"searchcategory\" HREF=\"#\" onClick=\"filterCategory('"); 379 result.append(entry.getKey()).append("')\")>"); 380 result.append(entry.getKey()); 381 result.append("</a> : "); 382 result.append(entry.getValue()).append("<br>\n"); 383 } 384 result.append("</p>\n"); 385 386 result.append(createWidgetTableEnd()); 387 result.append(dialogBlockEnd()); 388 result.append(createWidgetTableEnd()); 389 result.append(dialogContentEnd()); 390 } 391 } 392 return result.toString(); 393 } 394 395 private String createSearchResults() { 396 397 String query = m_searchParams.getQuery(); 398 StringBuffer result = new StringBuffer (); 399 if (!CmsStringUtil.isEmptyOrWhitespaceOnly(query) && query.length() > 3) { 400 CmsSearchResultView resultView = new CmsSearchResultView(getJsp()); 401 resultView.setSearchRessourceUrl(getJsp().link( 403 "/system/workplace/views/admin/admin-main.jsp?path=/searchindex/singleindex/search&indexname=" 404 + m_index.getName())); 405 m_search.init(getCms()); 406 407 String page = getJsp().getRequest().getParameter("searchPage"); 410 if (!CmsStringUtil.isEmptyOrWhitespaceOnly(page)) { 411 m_searchParams.setSearchPage(Integer.parseInt(page)); 412 } 413 String categories = getJsp().getRequest().getParameter("searchCategories"); 414 if (!CmsStringUtil.isEmptyOrWhitespaceOnly(categories)) { 415 m_searchParams.setCategories(CmsStringUtil.splitAsList(categories, ',')); 416 } 417 418 String searchRoots = getJsp().getRequest().getParameter("searchRoots"); 419 if (!CmsStringUtil.isEmptyOrWhitespaceOnly(searchRoots)) { 420 m_searchParams.setSearchRoots(searchRoots); 421 } 422 m_search.setParameters(m_searchParams); 423 result.append("<div style=\"padding:12px;\">\n").append(resultView.displaySearchResult(m_search)).append( 424 "\n</div>\n"); 425 } else { 426 } 428 return result.toString(); 429 } 430 431 private String filterCategoryJS() { 432 433 StringBuffer result = new StringBuffer (); 434 result.append("<input name=\"dummysearchcategory\" id=\"dummysearchcategory\" type=\"hidden\" value=\"\">\n"); 436 result.append("<input name=\"dummysearchpage\" id=\"dummysearchpage\" type=\"hidden\" value=\"\">\n"); 437 result.append("<script type=\"text/javascript\">\n"); 439 result.append(" function filterCategory(category) {\n"); 440 result.append(" var searchform = document.forms['EDITOR'];\n"); 441 result.append(" var inputFields = searchform.elements;\n"); 442 result.append(" for (var i=0; i<inputFields.length; i++) {\n"); 443 result.append(" if(inputFields[i].name.indexOf('categories') != -1) {\n"); 444 result.append(" inputFields[i].value='';\n"); 445 result.append(" inputFields[i].name='invalidsearchcategory';\n"); 446 result.append(" }\n"); 447 result.append(" }\n"); 448 result.append(" var categoryField = inputFields['dummysearchcategory'];\n"); 451 result.append(" categoryField.name = 'categories.0';\n"); 452 result.append(" categoryField.value = category;\n"); 453 result.append(" inputFields['dummysearchpage'].value = '0';\n"); 455 result.append(" inputFields['dummysearchpage'].name = 'searchpage.0';\n"); 456 result.append(" validateQuery();\n"); 457 result.append(" searchform.submit();\n"); 458 result.append(" }\n"); 459 result.append("</script>\n"); 460 return result.toString(); 461 } 462 463 468 private List getSortWidgetConfiguration() { 469 470 List result = new LinkedList (); 471 CmsMessages messages = Messages.get().getBundle(getLocale()); 472 result.add(new CmsSelectWidgetOption( 473 CmsSearchParameters.SORT_NAMES[0], 474 true, 475 messages.key(Messages.GUI_SELECT_LABEL_SEARCH_SORT_SCORE_0))); 476 result.add(new CmsSelectWidgetOption( 477 CmsSearchParameters.SORT_NAMES[1], 478 false, 479 messages.key(Messages.GUI_SELECT_LABEL_SEARCH_SORT_DATE_CREATED_0))); 480 result.add(new CmsSelectWidgetOption( 481 CmsSearchParameters.SORT_NAMES[2], 482 false, 483 messages.key(Messages.GUI_SELECT_LABEL_SEARCH_SORT_DATE_LAST_MODIFIED_0))); 484 result.add(new CmsSelectWidgetOption( 485 CmsSearchParameters.SORT_NAMES[3], 486 false, 487 messages.key(Messages.GUI_SELECT_LABEL_SEARCH_SORT_TITLE_0))); 488 return result; 489 } 490 491 private String normalizePreviousQueryJS() { 492 493 StringBuffer result = new StringBuffer (); 494 result.append("<script type=\"text/javascript\">\n"); 495 result.append(" function normalizeQueryValue() {\n"); 496 result.append(" var searchform = document.forms['EDITOR'];\n"); 497 result.append(" var query = searchform.elements['query.0'].value;\n"); 498 result.append(" query = decodeURI(query);\n"); 499 result.append(" searchform.elements['query.0'].value = query;\n"); 500 result.append(" return true;\n"); 501 result.append(" }\n"); 502 result.append(" normalizeQueryValue();\n"); 503 result.append("</script>\n"); 504 return result.toString(); 505 } 506 507 private String submitJS() { 508 509 StringBuffer result = new StringBuffer (); 510 result.append(" function validateQuery() {\n"); 511 result.append(" var searchform = document.getElementById(\"EDITOR\");\n"); 512 result.append(" var query = searchform.elements['query.0'].value;\n"); 513 result.append(" searchform.elements['query.0'].value = query;\n"); 514 result.append(" return true;\n"); 515 result.append(" }\n"); 516 return result.toString(); 517 } 518 } 519 | Popular Tags |