Skip to content

Commit 532e6be

Browse files
Merge pull request #874 from michaelkubina/fix_collections
[BUGFIX] Fix virtual and normal collections
2 parents 254a69f + fd8895a commit 532e6be

File tree

6 files changed

+84
-22
lines changed

6 files changed

+84
-22
lines changed

Classes/Common/SolrSearch.php

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -237,22 +237,35 @@ public function prepare()
237237
. $fields['uid'] . ':' . $this->searchParams['documentId'];
238238
}
239239

240-
// if a collection is given, we prepare the collection query string
240+
// if collections are given, we prepare the collection query string
241241
if ($this->collection) {
242-
if ($this->collection instanceof Collection) {
243-
$collectionsQueryString = '"' . $this->collection->getIndexName() . '"';
244-
} else {
245-
$collectionsQueryString = '';
246-
foreach ($this->collection as $index => $collectionEntry) {
247-
$collectionsQueryString .= ($index > 0 ? ' OR ' : '') . '"' . $collectionEntry->getIndexName() . '"';
242+
$collectionsQueryString = '';
243+
$virtualCollectionsQueryString = '';
244+
foreach ($this->collection as $collectionEntry) {
245+
// check for virtual collections query string
246+
if($collectionEntry->getIndexSearch()) {
247+
$virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR ('. $collectionEntry->getIndexSearch() . ')' ;
248+
} else {
249+
$collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"';
250+
}
251+
}
252+
253+
// distinguish between simple collection browsing and actual searching within the collection(s)
254+
if(!empty($collectionsQueryString)) {
255+
if(empty($query)) {
256+
$collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)';
257+
} else {
258+
$collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))';
248259
}
249260
}
250261

251-
if (empty($query)) {
252-
$params['filterquery'][]['query'] = 'toplevel:true';
253-
$params['filterquery'][]['query'] = 'partof:0';
262+
// virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separatly
263+
if(!empty($virtualCollectionsQueryString)) {
264+
$virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')';
254265
}
255-
$params['filterquery'][]['query'] = 'collection_faceting:(' . $collectionsQueryString . ')';
266+
267+
// combine both querystrings into a single filterquery via OR if both are given, otherwise pass either of those
268+
$params['filterquery'][]['query'] = implode(' OR ', array_filter([$collectionsQueryString, $virtualCollectionsQueryString]));
256269
}
257270

258271
// Set some query parameters.

Classes/Controller/CollectionController.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,13 @@ public function listAction()
100100
} else {
101101
$solr_query .= 'collection:("' . Solr::escapeQuery($collection->getIndexName()) . '")';
102102
}
103-
$params['query'] = $solr_query . ' AND partof:0 AND toplevel:true';
103+
104+
// virtual collection might yield documents, that are not toplevel true or partof anything
105+
if ($collection->getIndexSearch()) {
106+
$params['query'] = $solr_query;
107+
} else {
108+
$params['query'] = $solr_query . ' AND partof:0 AND toplevel:true';
109+
}
104110
$partOfNothing = $solr->search_raw($params);
105111

106112
$params['query'] = $solr_query . ' AND NOT partof:0 AND toplevel:true';

Classes/Controller/ListViewController.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,12 @@ public function mainAction()
7272
{
7373
$this->searchParams = $this->getParametersSafely('searchParameter');
7474

75+
// extract collection(s) from collection parameter
7576
$collection = null;
76-
if ($this->searchParams['collection'] && MathUtility::canBeInterpretedAsInteger($this->searchParams['collection'])) {
77-
$collection = $this->collectionRepository->findByUid($this->searchParams['collection']);
77+
if ($this->searchParams['collection']) {
78+
foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) {
79+
$collection[] = $this->collectionRepository->findByUid($collectionEntry);
80+
}
7881
}
7982

8083
$widgetPage = $this->getParametersSafely('@widget_0');

Classes/Controller/SearchController.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,46 @@ public function makeFacetsMenuArray($facets)
255255
}
256256
}
257257

258+
// if collections are given, we prepare the collection query string
259+
// extract collections from collection parameter
260+
$collection = null;
261+
if ($this->searchParams['collection']) {
262+
foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) {
263+
$collection[] = $this->collectionRepository->findByUid($collectionEntry);
264+
}
265+
266+
}
267+
if ($collection) {
268+
$collectionsQueryString = '';
269+
$virtualCollectionsQueryString = '';
270+
foreach ($collection as $collectionEntry) {
271+
// check for virtual collections query string
272+
if($collectionEntry->getIndexSearch()) {
273+
$virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR ('. $collectionEntry->getIndexSearch() . ')' ;
274+
}
275+
else {
276+
$collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"';
277+
}
278+
}
279+
280+
// distinguish between simple collection browsing and actual searching within the collection(s)
281+
if(!empty($collectionsQueryString)) {
282+
if(empty($searchParams['query'])) {
283+
$collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)';
284+
} else {
285+
$collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))';
286+
}
287+
}
288+
289+
// virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separatly
290+
if(!empty($virtualCollectionsQueryString)) {
291+
$virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')';
292+
}
293+
294+
// combine both querystrings into a single filterquery via OR if both are given, otherwise pass either of those
295+
$search['params']['filterquery'][]['query'] = implode(" OR ", array_filter([$collectionsQueryString, $virtualCollectionsQueryString]));
296+
}
297+
258298
// add filter query for date search
259299
if (!empty($this->searchParams['dateFrom']) && !empty($this->searchParams['dateTo'])) {
260300
// combine dateFrom and dateTo into filterquery as range search

Resources/Private/Partials/ListView/SortingForm.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454

5555
</f:form.select>
5656
<f:form.hidden property="collection" value="{lastSearch.collection}" />
57-
<f:form.hidden property="collections" value="{settings.collections}" />
5857
<f:form.hidden property="query" value="{lastSearch.query}" />
5958
<f:form.hidden property="fulltext" value="{lastSearch.fulltext}" />
6059
<f:if condition="{lastSearch.dateFrom} || {lastSearch.dateTo}">

Resources/Private/Templates/Search/Main.html

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,20 @@
4444
<label for="tx-dlf-search-fulltext-yes-{viewData.uniqueId}"><f:translate key="search.inFulltext"/></label>
4545
</f:if>
4646

47+
<f:comment><!-- Add list of collections as parameter when configured in search plugin --></f:comment>
4748
<f:if condition="{settings.searchIn} == 'collection' || {settings.searchIn} == 'all'">
48-
<f:form.hidden property="collections" value="{settings.collections}" />
49+
<f:form.hidden property="collection" value="{settings.collections}" />
4950
</f:if>
5051

5152
<f:if condition="{settings.searchIn} == 'document' || {settings.searchIn} == 'all'">
5253
<f:form.hidden property="documentId" value="{currentDocument.uid}" />
5354
<input type="hidden" name="tx_dlf[id]" value="{currentDocument.uid}" />
5455
</f:if>
5556

56-
<!-- Add current collection if using on collection single view -->
57+
<f:comment><!-- Add current collection(s) if using on collection single view or collections-search --></f:comment>
5758
<f:if condition="{lastSearch.collection}">
5859
<f:then>
59-
<input type="hidden" name="collection" value="{lastSearch.collection}" />
60+
<f:form.hidden property="collection" value="{lastSearch.collection}" />
6061
</f:then>
6162
</f:if>
6263

@@ -125,12 +126,12 @@
125126
<li class="tx-dlf-search-cur">
126127
<f:if condition="{lastSearch.dateFrom} || {lastSearch.dateTo}">
127128
<f:then>
128-
<f:link.action title="{f:translate(key:'search.resetFacet', arguments:{0: '{values.title}'})}" additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][dateFrom]':'{lastSearch.dateFrom}', 'tx_dlf_search[searchParameter][dateTo]':'{lastSearch.dateTo}'}">
129+
<f:link.action title="{f:translate(key:'search.resetFacet', arguments:{0: '{values.title}'})}" additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][collection]':'{lastSearch.collection}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][dateFrom]':'{lastSearch.dateFrom}', 'tx_dlf_search[searchParameter][dateTo]':'{lastSearch.dateTo}'}">
129130
{values.title} ({values.count})
130131
</f:link.action>
131132
</f:then>
132133
<f:else>
133-
<f:link.action title="{f:translate(key:'search.resetFacet', arguments:{0: '{values.title}'})}" additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}'}">
134+
<f:link.action title="{f:translate(key:'search.resetFacet', arguments:{0: '{values.title}'})}" additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][collection]':'{lastSearch.collection}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}'}">
134135
{values.title} ({values.count})
135136
</f:link.action>
136137
</f:else>
@@ -141,12 +142,12 @@
141142
<li class="tx-dlf-search-no">
142143
<f:if condition="{lastSearch.dateFrom} || {lastSearch.dateTo}">
143144
<f:then>
144-
<f:link.action additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][dateFrom]':'{lastSearch.dateFrom}', 'tx_dlf_search[searchParameter][dateTo]':'{lastSearch.dateTo}'}">
145+
<f:link.action additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][collection]':'{lastSearch.collection}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][dateFrom]':'{lastSearch.dateFrom}', 'tx_dlf_search[searchParameter][dateTo]':'{lastSearch.dateTo}'}">
145146
{values.title} ({values.count})
146147
</f:link.action>
147148
</f:then>
148149
<f:else>
149-
<f:link.action additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}'}">
150+
<f:link.action additionalParams="{'tx_dlf_search[searchParameter][fq]':'{values.queryColumn}', 'tx_dlf_search[searchParameter][query]':'{lastSearch.query}', 'tx_dlf_search[searchParameter][collection]':'{lastSearch.collection}', 'tx_dlf_search[searchParameter][fulltext]':'{lastSearch.fulltext}', 'tx_dlf_search[searchParameter][order]':'{lastSearch.order}', 'tx_dlf_search[searchParameter][orderBy]':'{lastSearch.orderBy}', 'tx_dlf_search[searchParameter][extQuery]':'{lastSearch.extQuery}', 'tx_dlf_search[searchParameter][extField]':'{lastSearch.extField}', 'tx_dlf_search[searchParameter][extOperator]':'{lastSearch.extField}'}">
150151
{values.title} ({values.count})
151152
</f:link.action>
152153
</f:else>

0 commit comments

Comments
 (0)