Wiki-Quellcode von Datenbank-Suche
Zuletzt geändert von xwikiadmin am 2025/01/07 11:24
Verstecke letzte Bearbeiter
| author | version | line-number | content |
|---|---|---|---|
| |
1.1 | 1 | {{velocity output="false"}} |
| 2 | #macro (databaseSearchForm) | ||
| 3 | {{html clean="false"}} | ||
| 4 | <form action="$doc.getURL()" id="searchBar" role="search"> | ||
| 5 | <div> | ||
| 6 | <label for="text" class="hidden">$services.localization.render('search.page.query.label')</label> | ||
| 7 | <input type="text" id="text" name="text" class="searchQuery" value="$!escapetool.xml($request.text)" | ||
| 8 | title="$services.localization.render('search.page.bar.query.title')" | ||
| 9 | placeholder="$services.localization.render('search.page.bar.query.tip')" /> | ||
| 10 | <input type="text" name="space" class="suggestSpaces" value="$!escapetool.xml($request.space)" | ||
| 11 | placeholder="$services.localization.render('search.page.bar.spaces.title')" /> | ||
| 12 | <span class='buttonwrapper'> | ||
| 13 | <input type="submit" class="searchButton button" | ||
| 14 | value="$services.localization.render('search.page.bar.submit')" | ||
| 15 | title="$services.localization.render('search.page.bar.submit.title')" /> | ||
| 16 | </span> | ||
| 17 | </div> | ||
| 18 | </form> | ||
| 19 | {{/html}} | ||
| 20 | #end | ||
| 21 | |||
| 22 | #macro (databaseAddResults $statement $params $map) | ||
| 23 | #set ($query = $services.query.hql("$statement order by doc.date desc").addFilter('hidden').setLimit(50)) | ||
| 24 | #foreach ($entry in $params.entrySet()) | ||
| 25 | #set ($query = $query.bindValue($entry.key, $entry.value)) | ||
| 26 | #end | ||
| 27 | #foreach ($localDocRef in $query.execute()) | ||
| 28 | #set ($documentReference = $services.model.resolveDocument($localDocRef)) | ||
| 29 | #if ($services.security.authorization.hasAccess('view', $documentReference)) | ||
| 30 | #set ($discard = $map.put($documentReference, $xwiki.getDocument($documentReference))) | ||
| 31 | #end | ||
| 32 | #end | ||
| 33 | #end | ||
| 34 | |||
| 35 | #macro (databaseSearch $text $list) | ||
| 36 | #set ($results = {}) | ||
| 37 | #set ($matchLocation = '') | ||
| 38 | #set ($params = { | ||
| 39 | 'text': "%$text.replaceAll('([%_!])', '!$1')%" | ||
| 40 | }) | ||
| 41 | ## Search in the specified location, if $request.space is defined | ||
| 42 | #set ($space = $request.space) | ||
| 43 | #if ("$!space" != '') | ||
| 44 | #set ($matchLocation = "(doc.space = :space or doc.space like :spacePrefix escape '!') and") | ||
| 45 | #set ($params.space = $space) | ||
| 46 | #set ($spaceReference = $services.model.resolveSpace($space)) | ||
| 47 | #set ($documentReference = $services.model.createDocumentReference('x', $spaceReference)) | ||
| 48 | #set ($params.spacePrefix = $stringtool.removeEnd($services.model.serialize($documentReference), 'x')) | ||
| 49 | #set ($params.spacePrefix = "$params.spacePrefix.replaceAll('([%_!])', '!$1')%") | ||
| 50 | #end | ||
| 51 | ## Search in the page names | ||
| 52 | #databaseAddResults(", XWikiSpace as space where $matchLocation space.reference = doc.space and ((doc.name <> 'WebHome' and upper(doc.name) like upper(:text) escape '!') or (doc.name = 'WebHome' and upper(space.name) like upper(:text) escape '!'))" $params $results) | ||
| 53 | ## Search in page content | ||
| 54 | #databaseAddResults("where $matchLocation upper(doc.content) like upper(:text) escape '!'" $params $results) | ||
| 55 | ## Search in text fields (simple String properties) | ||
| 56 | #databaseAddResults(", BaseObject as obj, StringProperty as prop where $matchLocation obj.name = doc.fullName and prop.id.id = obj.id and upper(prop.value) like upper(:text) escape '!'" $params $results) | ||
| 57 | ## Search in big text fields (textarea properties) | ||
| 58 | #databaseAddResults(", BaseObject as obj, LargeStringProperty as prop where $matchLocation obj.name = doc.fullName and prop.id.id = obj.id and upper(prop.value) like upper(:text) escape '!'" $params $results) | ||
| 59 | #set ($discard = $list.addAll($collectiontool.sort($results, ['date']))) | ||
| 60 | #end | ||
| 61 | {{/velocity}} | ||
| 62 | |||
| 63 | {{velocity}} | ||
| 64 | #set ($rssMode = $xcontext.action == 'get' || "$!request.xpage" == 'plain') | ||
| 65 | #if (!$rssMode) | ||
| |
2.1 | 66 | #set ($discard = $xwiki.linkx.use($services.webjars.url( |
| 67 | 'org.xwiki.platform:xwiki-platform-search-webjar', | ||
| 68 | 'search.min.css', | ||
| 69 | {'evaluate': true}), {'type': 'text/css', 'rel': 'stylesheet'})) | ||
| |
1.1 | 70 | ## Disable the document extra data: comments, attachments, history... |
| 71 | #set ($displayDocExtra = false) | ||
| 72 | #databaseSearchForm | ||
| 73 | #end | ||
| 74 | #set ($text = "$!request.text") | ||
| 75 | #if ($text != '') | ||
| 76 | #set ($list = []) | ||
| 77 | #databaseSearch($text $list) | ||
| 78 | #if ($rssMode) | ||
| 79 | #set ($feed = $xwiki.feed.getDocumentFeed($list, {})) | ||
| 80 | #set ($feedURI = $doc.getExternalURL("view")) | ||
| 81 | #set ($discard = $feed.setLink($feedURI)) | ||
| 82 | #set ($discard = $feed.setUri($feedURI)) | ||
| 83 | #set ($discard = $feed.setAuthor('XWiki')) | ||
| 84 | #set ($discard = $feed.setTitle($services.localization.render('search.rss', [$text]))) | ||
| 85 | #set ($discard = $feed.setDescription($services.localization.render('search.rss', [$text]))) | ||
| 86 | #set ($discard = $feed.setLanguage("$xcontext.locale")) | ||
| 87 | #set ($discard = $feed.setCopyright($xwiki.getXWikiPreference('copyright'))) | ||
| |
2.1 | 88 | #set ($feedOutput = $xwiki.feed.getFeedOutput($feed, $xwiki.getXWikiPreference('feed_type', 'rss_2.0'))) |
| |
3.1 | 89 | #rawResponse($feedOutput, 'application/rss+xml') |
| |
1.1 | 90 | #else |
| 91 | {{include reference="XWiki.Results"/}} | ||
| 92 | |||
| 93 | {{html clean="false"}} | ||
| 94 | #set ($rssURL = $doc.getURL('get', $escapetool.url({ | ||
| 95 | 'outputSyntax': 'plain', | ||
| 96 | 'space': $space, | ||
| 97 | 'text': $text | ||
| 98 | }))) | ||
| 99 | <a href="$rssURL" class="hasIcon iconRSS"> | ||
| 100 | $services.localization.render('search.rss', ["[$escapetool.xml($text)]"]) | ||
| 101 | </a> | ||
| 102 | {{/html}} | ||
| 103 | #end | ||
| 104 | #end | ||
| 105 | {{/velocity}} |