Modifications pour le document Solr Search Macros
Modifié par Florent Charton le 2026/03/13 11:04
Depuis la version 4.1
modifié par Florent Charton
sur 2026/01/13 15:01
sur 2026/01/13 15:01
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-search-solr-ui/17.10.2]
À la version 1.1
modifié par superadmin
sur 2022/06/20 08:49
sur 2022/06/20 08:49
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-search-solr-ui/13.10.6]
Résumé
-
Propriétés de la Page (2 modifications, 0 ajouts, 0 suppressions)
Détails
- Propriétés de la Page
-
- Auteur du document
-
... ... @@ -1,1 +1,1 @@ 1 - xwiki:XWiki.fcharton1 +XWiki.superadmin - Contenu
-
... ... @@ -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,23 @@ 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 - <label class='sr-only' for='search-page-bar-input'> 35 - $escapetool.xml($services.localization.render('search.page.bar.query.title')) 36 - </label> 32 + <input type="search" name="text" class="form-control withTip useTitleAsTip" 33 + 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>37 + <span class="sr-only">$services.localization.render('search.page.bar.submit')</span> 41 41 </button> 42 42 </span> 43 43 </div> 44 44 </div> 42 + </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.111 + ||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">113 + <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">116 + <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> ... ... @@ -189,18 +189,11 @@ 189 189 #else 190 190 #set ($facetPrettyName = $facetField.name) 191 191 #end 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"> 196 - $services.icon.renderHTML('caret-down') 197 - </button> 198 - </label> 199 - </div> 181 + <div class="search-facet-header">$escapetool.xml($facetPrettyName)</div> 200 200 #end 201 201 202 202 #macro (displaySearchFacetBody $facetField) 203 - <div id="$escapetool.xml($facetField.name)-dropdown" class="search-facet-body">185 + <div class="search-facet-body"> 204 204 #set ($facetDisplayer = $solrConfig.facetDisplayers.get($facetField.name)) 205 205 #if (!$facetDisplayer && $facetField.name.startsWith('property.')) 206 206 ## Choose a facet displayer based on the property type. ... ... @@ -250,10 +250,6 @@ 250 250 #end 251 251 252 252 #macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer) 253 - #displaySearchFacetValue($facetValue $customQueryStringParameters $customValueDisplayer false) 254 -#end 255 - 256 -#macro (displaySearchFacetValue $facetValue $customQueryStringParameters $customValueDisplayer $displayToggle) 257 257 #set ($selectedValues = []) 258 258 #if ($facetRequestValues) 259 259 #set ($discard = $selectedValues.addAll($facetRequestValues.subList(0, $facetRequestValues.size()))) ... ... @@ -268,8 +268,8 @@ 268 268 #set ($discard = $queryStringParameters.putAll($customQueryStringParameters)) 269 269 #end 270 270 #extendQueryString($url $queryStringParameters) 271 - < ahref="$url"class="itemName#if ($selected) selected#end#if ($facetValue.name == '') empty#end"272 - #if ($ facetValue.name!= '')data-facetvalue="$escapetool.xml($facetValue.name)"#end>249 + <div class="itemCount">$facetValue.count</div> 250 + <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)) ... ... @@ -285,13 +285,7 @@ 285 285 $escapetool.xml($facetPrettyValue) 286 286 #end 287 287 </a> 288 - <div class="itemCount">$facetValue.count</div> 289 - #if ($displayToggle) 290 - <button class="btn btn-xs facet-value-toggle"> 291 - <span class='sr-only'>$escapetool.xml($facetPrettyValue)</span> 292 - $services.icon.renderHTML('caret-down') 293 - </button> 294 - #end 266 + <div class="clearfloats"></div> 295 295 #end 296 296 297 297 #** ... ... @@ -314,7 +314,7 @@ 314 314 #end 315 315 #end 316 316 317 -#macro ( _displaySearchResultsControls)289 +#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 - ((( 298 + (% class="search-options" %) 299 + * {{translation key="solr.options"/}} 300 + #if($highlightEnabled)#extendQueryString($url {'highlight': [false]})#else#extendQueryString($url {'highlight': [true]})#end 301 + * [[{{translation key="solr.options.highlight"/}}>>path:${url}||class="options-item#if($highlightEnabled) active#end" title="$services.localization.render('solr.options.highlight.title')"]] 302 + #if($facetEnabled)#extendQueryString($url {'facet': [false]})#else#extendQueryString($url {'facet': [true]})#end 303 + * [[{{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 - ))) 305 + (% class="search-results-sort" %) 306 + * {{translation key="solr.sortBy"/}} 307 + #foreach ($entry in $defaultSortOrder.entrySet()) 308 + #set ($class = 'sort-item') 309 + #set ($sortOrderIndicator = $NULL) 310 + #set ($targetSortOrder = $entry.value) 311 + #if ($sort == $entry.key) 312 + #set ($class = "$class active") 313 + #set ($sortOrderHint = $services.localization.render("solr.sortOrder.$sortOrder")) 314 + #set ($sortOrderIndicator = "(% class=""sort-item-order"" title=""$sortOrderHint"" %)$sortOrderSymbol.get($sortOrder)(%%)") 315 + #set ($targetSortOrder = "#if ($sortOrder == 'asc')desc#{else}asc#end") 316 + #end 317 + #extendQueryString($url {'sort': [$entry.key], 'sortOrder': [$targetSortOrder]}) 318 + * [[{{translation key="solr.sortBy.$entry.key"/}}$!sortOrderIndicator>>path:${url}||class="$class"]] 319 + #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') 364 + <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})",396 + "#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})")418 + #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 469 +#macro (displayUserProfileLink $userReference $userName) 470 +#if ($userReference) 471 +## We could test if the specified user exists but we want to speed up the search. 472 +<a href="$xwiki.getURL($userReference)">$escapetool.xml($userName)</a>## 473 +#else 474 +$services.localization.render('core.users.unknownUser')## 475 +#end 476 +#end 477 + 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> 501 + ## We wrap the link in a DIV because otherwise the HTML cleaning generates a paragraph. 502 + <div> 503 + <a href="#" class="search-result-highlightAll hidden"> 504 + $escapetool.xml($services.localization.render('solr.result.highlightAll')) 505 + </a> 506 + </div> 560 560 #end 561 561 #end 562 562 #end ... ... @@ -628,10 +628,9 @@ 628 628 ## Set query parameters. 629 629 #set ($discard = $query.setLimit($rows)) 630 630 #set ($discard = $query.setOffset($start)) 631 - #set ($discard = $query.addFilter('searchExclusions/solr')) 632 632 #set ($discard = $query.bindValue('sort', "${sort} ${sortOrder}")) 633 633 #set ($discard = $query.bindValue('tie', $solrConfig.tieBreaker)) 634 - #set ($discard = $query.bindValue('mm', $solrConfig.minShouldMatch)) 580 + #set ($discard = $query.bindValue('mm', $solrConfig.minShouldMatch)) 635 635 #setQueryFields($query) 636 636 #setPhraseFields($query) 637 637 #setFacetFields($query) ... ... @@ -833,7 +833,10 @@ 833 833 #end 834 834 ## 835 835 ## Pagination 836 - #getAndValidateQueryLimitFromRequest('rows', 10, $rows) 782 + #set ($rows = $numbertool.toNumber($request.rows).intValue()) 783 + #if ("$!rows" == '') 784 + #set ($rows = 10) 785 + #end 837 837 #set ($start = $numbertool.toNumber($request.firstIndex).intValue()) 838 838 #if ("$!start" == '') 839 839 #set ($start = 0) ... ... @@ -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()837 + #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 ((( 851 + #displaySearchResultsSort() 852 + 907 907 #displaySearchResults() 908 908 ))) 909 909 ))) 910 - #else 911 - #_displaySearchFormEnd() 912 912 #end 913 913 ))) 914 914 #set($void = $services.progress.popLevel()) ... ... @@ -950,7 +950,8 @@ 950 950 ## 951 951 ## Output the feed. 952 952 ## 953 - #rawResponse($xwiki.feed.getFeedOutput($feed, 'rss_2.0'), 'application/rss+xml') 897 + #set ($discard = $response.setContentType('application/rss+xml')) 898 + $xwiki.feed.getFeedOutput($feed, 'rss_2.0') 954 954 #end 955 955 956 956 #macro (handleSolrSearchRequest)