Änderungen von Dokument Solr Search Macros
am 2025/12/16 11:14
am 2025/11/08 02:44
Zusammenfassung
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -4,11 +4,13 @@ 4 4 #set ($rangePattern = $regextool.compile('^[\[{](.+) TO (.+)[\]}]$')) 5 5 #set ($wildcardPattern = $regextool.compile('^\(.*\*.*\)$')) 6 6 7 -#macro ( _displaySearchFormBegin)7 +#macro (displaySearchForm) 8 8 #set($void = $services.progress.startStep('#displaySearchForm')) 9 9 {{html clean="false"}} 10 - <form class="search-form" action="$doc.getURL()" role="search"> 10 + <form class="search-form row" action="$doc.getURL()" role="search"> 11 11 <div class="hidden"> 12 + <input type="hidden" name="sort" value="$!escapetool.xml($sort)"/> 13 + <input type="hidden" name="sortOrder" value="$!escapetool.xml($sortOrder)"/> 12 12 <input type="hidden" name="highlight" value="$highlightEnabled"/> 13 13 <input type="hidden" name="facet" value="$facetEnabled"/> 14 14 ## The parameter used to determine if the request has been redirected with default search filters. ... ... @@ -25,36 +25,26 @@ 25 25 #end 26 26 #end 27 27 </div> 28 - <div class="s earch-bar">30 + <div class="col-xs-12 col-sm-6"> 29 29 <div class="input-group"> 30 - <input id="search-page-bar-input" type="search" name="text" class="form-control" 31 - title="$escapetool.xml($services.localization.render('search.page.bar.query.title'))" 32 - placeholder="$escapetool.xml($services.localization.render('search.page.bar.query.title'))" 33 - value="$escapetool.xml($text)"/> 34 34 <label class='sr-only' for='search-page-bar-input'> 35 - $escapetool.xml($services.localization.render('search.page.bar.query.title'))33 + $services.localization.render('search.page.bar.query.title') 36 36 </label> 35 + <input id='search-page-bar-input' type='search' name='text' class='form-control withTip useTitleAsTip' 36 + title="$services.localization.render('search.page.bar.query.title')" value="$escapetool.xml($text)"/> 37 37 <span class="input-group-btn"> 38 38 <button type="submit" class="btn btn-primary"> 39 39 $services.icon.renderHTML('search') 40 - <span >$escapetool.xml($services.localization.render('search.page.bar.submit'))</span>40 + <span class="sr-only">$services.localization.render('search.page.bar.submit')</span> 41 41 </button> 42 42 </span> 43 43 </div> 44 44 </div> 45 + </form> 45 45 {{/html}} 46 46 #set($void = $services.progress.endStep()) 47 47 #end 48 48 49 -## We make sure the html block in this macro is not considered as inline to avoid generating extra `p` tags. 50 -#macro (_displaySearchFormEnd) 51 - 52 - {{html clean="false"}} 53 - </form> 54 - {{/html}} 55 - 56 -#end 57 - 58 58 #macro (displaySearchDebugInfo) 59 59 (% class="search-debug" %)((( 60 60 === Debug Information === ... ... @@ -119,12 +119,12 @@ 119 119 #end 120 120 #extendQueryString($url $resetParameters) 121 121 [[{{translation key="solr.facets.resetAll"}}>>path:$url 122 - ||class="search-facets-action-reset force-no-underline"]]## Continue in the same paragraph.114 + ||class="search-facets-action-reset"]]## Continue in the same paragraph. 123 123 {{html clean="false"}} 124 - <a href="#" class="search-facets-action-collapseAll hidden force-no-underline">116 + <a href="#" class="search-facets-action-collapseAll hidden"> 125 125 $escapetool.xml($services.localization.render('solr.facets.collapseAll')) 126 126 </a> 127 - <a href="#" class="search-facets-action-expandAll hidden force-no-underline">119 + <a href="#" class="search-facets-action-expandAll hidden"> 128 128 $escapetool.xml($services.localization.render('solr.facets.expandAll')) 129 129 </a> 130 130 <span class="clearfloats"></span> ... ... @@ -190,12 +190,12 @@ 190 190 #set ($facetPrettyName = $facetField.name) 191 191 #end 192 192 <div class="search-facet-header"> 193 - <label>$escapetool.xml($facetPrettyName) 194 - <button class="btn btn-xs facet-toggle" 195 - aria-controls="$escapetool.xml($facetField.name)-dropdown"> 185 + <span id="$escapetool.xml($facetField.name)-toggler-hint">$escapetool.xml($facetPrettyName)</span> 186 + <button class="btn btn-xs facet-toggler" 187 + aria-controls="$escapetool.xml($facetField.name)-dropdown" 188 + aria-labelledby="$escapetool.xml($facetField.name)-toggler-hint"> 196 196 $services.icon.renderHTML('caret-down') 197 197 </button> 198 - </label> 199 199 </div> 200 200 #end 201 201 ... ... @@ -253,7 +253,7 @@ 253 253 #displaySearchFacetValue($facetValue $customQueryStringParameters $customValueDisplayer false) 254 254 #end 255 255 256 -#macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer $displayToggle) 248 +#macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer $displayToggler) 257 257 #set ($selectedValues = []) 258 258 #if ($facetRequestValues) 259 259 #set ($discard = $selectedValues.addAll($facetRequestValues.subList(0, $facetRequestValues.size()))) ... ... @@ -268,8 +268,7 @@ 268 268 #set ($discard = $queryStringParameters.putAll($customQueryStringParameters)) 269 269 #end 270 270 #extendQueryString($url $queryStringParameters) 271 - <a href="$url" class="itemName#if ($selected) selected#end#if ($facetValue.name == '') empty#end" 272 - #if ($facetValue.name != '')data-facet-value="$escapetool.xml($facetValue.name)"#end> 263 + <a href="$url" class="itemName#if ($selected) selected#end#if ($facetValue.name == '') empty#end"> 273 273 #if ($facetValue.name == '') 274 274 #set ($facetPrettyValueKey = "solr.field.${facetField.name}.emptyValue") 275 275 #if (!$services.localization.get($facetPrettyValueKey)) ... ... @@ -286,8 +286,8 @@ 286 286 #end 287 287 </a> 288 288 <div class="itemCount">$facetValue.count</div> 289 - #if ($displayToggle) 290 - <button class="btn btn-xs facet-value-toggle"> 280 + #if ($displayToggler) 281 + <button class="btn btn-xs facet-value-toggler"> 291 291 <span class='sr-only'>$escapetool.xml($facetPrettyValue)</span> 292 292 $services.icon.renderHTML('caret-down') 293 293 </button> ... ... @@ -314,7 +314,7 @@ 314 314 #end 315 315 #end 316 316 317 -#macro ( _displaySearchResultsControls)308 +#macro (displaySearchResultsSort) 318 318 #set ($defaultSortOrder = $solrConfig.sortFields.get($type)) 319 319 #if (!$defaultSortOrder) 320 320 #set ($defaultSortOrder = {'score': 'desc'}) ... ... @@ -323,63 +323,28 @@ 323 323 'asc': $services.icon.render('caret-up'), 324 324 'desc': $services.icon.render('caret-down') 325 325 }) 326 - (% class='search-results-controls' %) 327 - ((( 317 + (% class="search-options" %) 318 + * {{translation key="solr.options"/}} 319 + #if($highlightEnabled)#extendQueryString($url {'highlight': [false]})#else#extendQueryString($url {'highlight': [true]})#end 320 + * [[{{translation key="solr.options.highlight"/}}>>path:${url}||class="options-item#if($highlightEnabled) active#end" title="$services.localization.render('solr.options.highlight.title')"]] 321 + #if($facetEnabled)#extendQueryString($url {'facet': [false]})#else#extendQueryString($url {'facet': [true]})#end 322 + * [[{{translation key="solr.options.facet"/}}>>path:${url}||class="options-item#if($facetEnabled) active#end" title="$services.localization.render('solr.options.facet.title')"]] 328 328 329 - {{html clean="false"}} 330 - <div class="search-results-sort"> 331 - <label for="sort-by-input" class="sr-only">$escapetool.xml($services.localization.render('search.solr.sortBy.hint'))</label>## 332 - <select id="sort-by-input" name="sort"> 333 - #foreach ($entry in $defaultSortOrder.entrySet()) 334 - <option class="sort-item" value="$entry.key" #if($sort == $entry.key)selected='selected'#end> 335 - #set ($sortOptionNameList = $entry.key.split('_')) 336 - #set ($camelCasedSortOptionName = $sortOptionNameList.get(0)) 337 - #foreach ($namePart in $sortOptionNameList.subList(1, $sortOptionNameList.size())) 338 - #set ($camelCasedSortOptionName = "${camelCasedSortOptionName}$stringtool.capitalize($namePart)") 339 - #end 340 - $escapetool.xml($services.localization.render("search.solr.sortBy.field.$camelCasedSortOptionName")) 341 - </option> 342 - #end 343 - </select>## 344 - <label class="form-control" title="$escapetool.xml($services.localization.render("search.solr.sortOrder.$sortOrder"))">## 345 - <input id="sort-order-input" type="checkbox" name="sortOrder" value="asc" #if ("$!sortOrder" == 'asc')checked="checked"#end/>## 346 - $services.icon.renderHTML('sort-descending')## 347 - $services.icon.renderHTML('sort-ascending')## 348 - <span class="sr-only">$escapetool.xml($services.localization.render("search.solr.sortOrder.$sortOrder"))</span>## 349 - </label>## 350 - </div> 351 - <div class="search-options"> 352 - <ul>## 353 - <li>## 354 - <label>## 355 - <input id="option-highlight-input" type="checkbox" class="options-item" value="true" 356 - data-query-name="highlight" 357 - aria-describedby="option-highlight-description" 358 - title="$escapetool.xml($services.localization.render('solr.options.highlight.title'))" 359 - #if($highlightEnabled)checked#end/>## 360 - $escapetool.xml($services.localization.render('search.solr.options.showHighlight'))## 361 - </label>## 362 - <span id="option-highlight-description" class="sr-only"> 363 - $escapetool.xml($services.localization.render('solr.options.highlight.title')) 364 - </span>## 365 - </li>## 366 - <li>## 367 - <label>## 368 - <input id="option-facet-input" type="checkbox" class="options-item" value="true" data-query-name="facet" 369 - aria-describedby="option-facet-description" 370 - title="$escapetool.xml($services.localization.render('solr.options.facet.title'))" 371 - #if($facetEnabled)checked#end/>## 372 - $escapetool.xml($services.localization.render('search.solr.options.showFacet')) 373 - </label>## 374 - <span id="option-facet-description" class="sr-only"> 375 - $escapetool.xml($services.localization.render('solr.options.facet.title')) 376 - </span>## 377 - </li>## 378 - </ul>## 379 - </div> 380 - {{/html}} 381 - 382 - ))) 324 + (% class="search-results-sort" %) 325 + * {{translation key="solr.sortBy"/}} 326 + #foreach ($entry in $defaultSortOrder.entrySet()) 327 + #set ($class = 'sort-item') 328 + #set ($sortOrderIndicator = $NULL) 329 + #set ($targetSortOrder = $entry.value) 330 + #if ($sort == $entry.key) 331 + #set ($class = "$class active") 332 + #set ($sortOrderHint = $services.localization.render("solr.sortOrder.$sortOrder")) 333 + #set ($sortOrderIndicator = "(% class=""sort-item-order"" title=""$sortOrderHint"" %)$sortOrderSymbol.get($sortOrder)(%%)") 334 + #set ($targetSortOrder = "#if ($sortOrder == 'asc')desc#{else}asc#end") 335 + #end 336 + #extendQueryString($url {'sort': [$entry.key], 'sortOrder': [$targetSortOrder]}) 337 + * [[{{translation key="solr.sortBy.$entry.key"/}}$!sortOrderIndicator>>path:${url}||class="$class"]] 338 + #end 383 383 #end 384 384 385 385 #macro (extendQueryString $url $extraParameters) ... ... @@ -424,8 +424,7 @@ 424 424 ## Add the parameters required to output the RSS feed instead of the search UI. 425 425 #set ($discard = $parameters.put('outputSyntax', 'plain')) 426 426 #set ($discard = $parameters.put('media', 'rss')) 427 - <a href="$doc.getURL('get', $escapetool.url($parameters))"> 428 - $services.icon.renderHTML('rss') 383 + <a href="$doc.getURL('get', $escapetool.url($parameters))" class="hasIcon iconRSS"> 429 429 $services.localization.render('search.rss', ["[$escapetool.xml($text)]"]) 430 430 </a> 431 431 {{/html}} ... ... @@ -457,7 +457,7 @@ 457 457 #displaySearchResultLocation() 458 458 <div class="search-result-author"> 459 459 $services.localization.render('core.footer.modification', [ 460 - "#displayUser($searchResult.author {'useInlineHTML':true})",415 + "#displayUserProfileLink($searchResult.author $searchResult.author_display)", 461 461 $xwiki.formatDate($searchResult.date) 462 462 ]) 463 463 </div> ... ... @@ -479,7 +479,7 @@ 479 479 </h2> 480 480 #displaySearchResultLocation($searchResult) 481 481 <div class="search-result-uploader"> 482 - #set ($uploader = "#displayUser($searchResult.attauthor.get(0) {'useInlineHTML':true})")437 + #set ($uploader = "#displayUserProfileLink($searchResult.attauthor.get(0) $searchResult.attauthor_display.get(0))") 483 483 #set ($uploadDate = $xwiki.formatDate($searchResult.attdate.get(0))) 484 484 #set ($fileSize = "#dynamicsize($searchResult.attsize.get(0))") 485 485 $services.localization.render('solr.result.uploadedBy', [$uploader, $uploadDate, $fileSize]) ... ... @@ -530,6 +530,15 @@ 530 530 </div> 531 531 #end 532 532 488 +#macro (displayUserProfileLink $userReference $userName) 489 +#if ($userReference) 490 +## We could test if the specified user exists but we want to speed up the search. 491 +<a href="$xwiki.getURL($userReference)">$escapetool.xml($userName)</a>## 492 +#else 493 +$services.localization.render('core.users.unknownUser')## 494 +#end 495 +#end 496 + 533 533 #macro (displaySearchResultHighlighting $searchResult) 534 534 #getSearchResultHighlighting($searchResult $highlighting) 535 535 #if ($highlighting.size() > 0) ... ... @@ -553,10 +553,12 @@ 553 553 #end 554 554 </dl> 555 555 #if ($highlighting.size() > 1) 556 - <button class="search-result-highlightAll btn btn-xs btn-default hidden"> 557 - $escapetool.xml($services.localization.render('solr.result.highlightAll')) 558 - $services.icon.renderHTML('right') 559 - </button> 520 + ## We wrap the link in a DIV because otherwise the HTML cleaning generates a paragraph. 521 + <div> 522 + <a href="#" class="search-result-highlightAll hidden"> 523 + $escapetool.xml($services.localization.render('solr.result.highlightAll')) 524 + </a> 525 + </div> 560 560 #end 561 561 #end 562 562 #end ... ... @@ -844,8 +844,6 @@ 844 844 #if ("$!sort" == '') 845 845 #set ($sort = 'score') 846 846 #end 847 - ## If at any point this default behavior is changed, be extra careful with "#sort-order-input" initialization. 848 - ## We assume here that empty values are mapped to "desc" (meaning that we use "asc" as the checkbox value). 849 849 #set ($sortOrder = $request.sortOrder) 850 850 #if ("$!sortOrder" == '') 851 851 #set ($sortOrder = 'desc') ... ... @@ -887,15 +887,12 @@ 887 887 {{/html}} 888 888 889 889 #end 890 - # _displaySearchFormBegin()854 + #displaySearchForm() 891 891 #if ($text != '') 892 892 #getSearchResults() 893 - #_displaySearchResultsControls() 894 - #_displaySearchFormEnd() 895 895 #if ($debug) 896 896 #displaySearchDebugInfo() 897 897 #end 898 - 899 899 (% class="search-results-container row" %)((( 900 900 #if ($facetEnabled) 901 901 (% class="col-xs-12 col-sm-4 col-sm-push-8 col-md-3 col-md-push-9" %)((( ... ... @@ -904,11 +904,11 @@ 904 904 #end 905 905 (% class="search-results-left col-xs-12#if ($facetEnabled) col-sm-8 col-sm-pull-4 col-md-9 col-md-pull-3#end" %) 906 906 ((( 868 + #displaySearchResultsSort() 869 + 907 907 #displaySearchResults() 908 908 ))) 909 909 ))) 910 - #else 911 - #_displaySearchFormEnd() 912 912 #end 913 913 ))) 914 914 #set($void = $services.progress.popLevel())
Community

Wir benutzen Slack, um miteinander zu kommunizieren. Melde Dich an und werde Teil unserer Maker-Community!
Frage? FAQ!
Du hast eine Frage, die sich nicht direkt im Wiki findet?
Natürlich kannst Du die Frage jederzeit gerne in der Slack Community stellen. Bevor Du das machst, schau doch bitte einmal auf unserer Homepage bei den Häufig gestellten Fragen vorbei. Wir versuchen diese Fragen stets aktuell zu halten, eventuell hilft Dir das ja schon weiter.
Offene Werkstatt
Ohne Anmeldung einfach vorbei kommen. Am besten bringst Du direkt den ausgefüllten Haftungsauschluss mit.
Jeden Donnerstag ab 19 Uhr
Während der offenen Werkstatt kannst Du einfach vorbei kommen und an Deinem Projekt arbeiten. Bitte beachte aber, dass zur Verwendung der Maschinen eine Einweisung erforderlich ist, die Du gegebenfalls vorher absolvieren musst. Wenn ein Mitglied mit entsprechender Einweisung vor Ort ist und Zeit hat, helfen wir natürlich gerne aus. Dies können wir aber nicht garantieren, da Rundgänge Priorität haben.
Sprich Dich idealerweise schon vor der offenen Werkstatt mit einem Mitglied in unserem Slack ab. So kannst Du sicherstellen, dass Du auf jeden Fall arbeiten kannst.
Übrigens: Du kannst Dich mit einem Mitglied gerne auch außerhalb der offenen Werkstattzeiten zum Arbeiten verabreden!
Führungen und Rundgänge
Im Rahmen der offenen Werkstatt bieten wir euch auch gerne einen Rundgang durch unsere Werkstatt. Hier könnt ihr den Verein und unser Konzept kennenlernen sowie die Maschinen und Möglichkeiten der Werkstatt gezeigt bekommen.
Jeden Donnerstag wird eine Führung angeboten:
- Um 19:15 Uhr (bitte um 19:00 Uhr da sein)
Der Rundgang dauert ca. 45 Minuten und ihr habt natürlich auch die Möglichkeit, eure Fragen loszuwerden.
Bitte beachtet folgendes: Die Werkstatt beinhaltet gefährliche Maschinen. Bringt daher bitte nach Möglichkeit den ausgefüllten und unterschrieben Haftungsauschluss schon mit. Dieser kann aber auch vor Ort ausgefüllt werden, das verzögert allerdings die Abläufe.