Package: collective.collectionfilter
collective.collectionfilterFaceted navigation filter for collection or contentlisting tiles.This Plone 5 addon allows you to filter listing results for fields which are indexed in the catalog
(Plones internal search tool).
For example, you can add a subject filter, but also a filter for authors or portal types.The filter types can be extended (see:collective.collectionfilter.vocabularies).There are three portlets/tiles available for filtering:Collection Filtera list with values (select, radio, checkbox, link) you can filter onCollection Searcha SearchableText input field to do a fulltextsearch on the collection resultsCollection Mapsa LeafletJS map which shows and filtersIGeolocatableitems on it
(this feature is available ifcollective.geolocationbehavioris installed and the behavior
is activated on a contenttype. See installation notes below)Collection Result Listing Sorta list of indexes where the user can sort the filtered result listingCollection Filter Reseta link to reset all filtersFilter Results of CollectionsAdd as many filter/search portlets directly to a collection.When you select values from the filter the results are loaded asynchronously onto the page (no page refresh).
Unless you turn off ajax loading in the registry or are using Plone 5.0. If you are using special theme or view template
you can customizeContent Selectorand/or`View Template`to ensure ajax loading works correctly.
Make sure the selector exists on the source collection template and on the target page which shows the filtered results.It is also possible to use filter portlets that aren’t directly on a collection by specifying a target collection.
To use ajax loading you will need to ensure your content selector is visible on the page. If not using ajax loading selecting a filter
option will redirect you to the collection.Mosaic IntegrationUse the package extra to install the required dependencies:[buildout]
...
eggs +=
    collective.collectionfilter[mosaic]
...The three tiles can be added within the Mosaic editor multiple times. Just select them in theInsertmenu
and assign a collection to it. To show the results of the collection simply add aContent Listingtile.It’s possible to use multiple content listings and multiple filters on the same page by specifying additional unique classes in
the listing tiles settings and then adding these classes to theContent Selectorsetting of the filter tile.If you want to use filter tiles with a collection then add a content listing tile with the setting to use the query from the context.
It is also possible to use theEmbed contenttile if there is a unique selector on your collection view.Geolocation filter supportIfcollective.geolocationbehavioris installed, this package provides a LeafletJS Maps tile/portlet
which shows each item of a collection result if theIGeolocatableinformation is available.
In addition you can activate theNarrow down resultscheckbox to narrow down the collection result and
other available filter tiles/portlets if the user moves or zooms the map.We provide a package extra to install all required dependencies with their according versions.
Simply do this somewhere in your buildout:[buildout]
...
eggs +=
    collective.collectionfilter[geolocation]
...Overloading GroupByCriteriacollective.collectionfilter.vocabularies.GroupByCriteriais a singleton, registered as global utility and used to provide a list of possible indices, which grouped values will provide your filter criteria.It uses a data structure like this:self._groupby = {
    it: {                   # Index name
        'index': it,             # Name of the index to use
        'metadata': it,          # Name of the metadata column to use
        'display_modifier': _ ,  # Function to prepare the metadata column value for displaying
        'index_modifier': None,  # Function to transform the index search value.
        'value_blacklist': [],   # Blacklist of index values, which should not included in the filter selection. Can be a callable.
        'sort_key_function': lambda it: it['title'].lower(),  # sort key function. defaults to a lower-cased title
    }
    for it in metadata
}As you can see, the standard GroupByCriteriaVocabulary implementation implies, that the index name is the same as the metadata column name.
Also, we use thecollective.collectionfiltermessage catalog as standard display_modifier (you can register translations under thecollective.collectionfilterdomain to translate index values).If you need a specialdisplay_modifier, or index or metadata columns do not have the same identifier, you can modify this data structure.
For that, register an adapter forIGroupByModifier, which adapts to the GroupByCriteria utility.
Within this adapter, you can modify the already populated_groupbyattribute (do not use thegroupby, which is a property method and at this point hasn’t finished).This is how.Write an adapter:# -*- coding: utf-8 -*-
from collective.collectionfilter.interfaces import IGroupByCriteria
from collective.collectionfilter.interfaces import IGroupByModifier
from zope.component import adapter
from zope.interface import implementer


sort_map = {
    'VALUE1': 3,
    'VALUE2': 1,
    'VALUE3': 2,
}


def subjectsort(it):
    # Sorts the value after a fixed sort map
    val = it['title']
    return sort_map.get(val, 0)


@implementer(IGroupByModifier)
@adapter(IGroupByCriteria)
def groupby_modifier(groupby):
    groupby._groupby['Subject']['display_modifier'] = lambda x, idx: x.upper()
    groupby._groupby['Subject']['sort_key_function'] = subjectsort
    groupby._groupby['my_new_index'] = {
        'index': 'my_new_index',
        'metadata': 'my_new_index_metadata_colum',
        'display_modifier': lambda it, idx: u'this is awesome: {0}'.format(it)
    }Register the adapter:<configure xmlns="http://namespaces.zope.org/zope">
  <adapter factory=".collectionfilter.groupby_modifier" name="modifier_1" />
</configure>Done.Your adapter is called bycollective.collectionfilter.vocabularies.GroupByCriteria.groupby.CompatibilityVersion 5.x is compatible with Plone 6.x+Version 4.x is compatible with Plone 5.2+Version 3.x is compatible with Plone 5.0.x and 5.1.xIf your theme doesn’t work well with AJAX loading this can be overridden in the registry or via diazo.AuthorJohannes RaggamPeter HolzerThis package is based oncollective.portlet.collectionfilterandcollective.portlet.collectionbysubject.5.2.0 (2023-09-27)New features:Add a Reset Button to Reset all Filters.
[toalba, jensens] (reset-button)Bug fixes:Fix German label from ‘Portlet Titel’ to ‘Filtertitel’.
[jensens] (detranslation)5.1.1 (2023-08-08)New features:Implement CSS class for disablingcollectionfilter:reloadevent when
links in enhanced custom filter templates  are designed for other actions
(eg. dropdowns or collapsibles).
[petschki] (#201)Bug fixes:Fix selecting defaultcontent_selectorfor mosaic pages with contentlisting tile.
[petschki] (#202)5.1 (2023-08-02)Bug fixes:Fix filter tiles when more than one contentlisting is on the same page.
[petschki] (#150)Internal:Update configuration files.
[plone devs] (8af8caab)Changelog5.1 (unreleased)Nothing changed yet.5.0 (2023-06-07)implementgeojson_ajaxurlproperty forpat-leafletto load geojson
information asynchronously.
[petschki]Fix translations for swiss german
[agitator]5.0a2 (2022-06-20)Updated classifiers
[petschki]5.0a1 (2022-06-20)Breaking Change:add Plone 6 ES6 compatible Bundleadd Plone 6 ES6 compatible JS and SCSS resourcesadd Plone 6 Javascript Bundle Infrastructureupdate Portlet Template, Plone 6 ready, use the ‘cards’ Elementadd Upgrade Step to remove old registry settingsincrement Version in Metadataadd tox Test Instrastructureupdate github workflow, remove Plone 5 from matrix
[1letter]4.0 (2022-05-10)Breaking Change:Remove Plone 5.0 and 5.1 support.
[petschki]Add idx parameter to display_modifier call, so that we can use the index name to resolve the correct translated
taxonomy titles in collective.taxonomy. This means that the display_modifier method in the groupby_modifier adapters
needs to expect this parameter too!
[MrTango]Features:Add checkbox to reverse output the filters.
[jensens]Support and Test Plone 6.
[jensens]Add a module global COLLECTIONISH_TARGETS to c.c.tiles to register other tiles with collections than plone.app.standardtiles.contentlisting.
[jensens]Bug Fixes:Fixb_startin tiles, where the key is pre/postfixed.
Removes those from new filters too, in order to not be on a page that does not exist for the new filtered result.
[jensens]Not every metadata entry has an index with same name.
Ignore if not a pair.
[jensens]Fix/Workaround for #59 (Int fields in indexes are not working).
[jensens]Hide uninstall profiles from install view.
[jensens]Fix edge cases where “All” wasn’t translated.
[agitator]Ensure aGroupByCriteria’ssort_key_functionfunctionlower()call gets a string.
[jensens]Fixed searches for only non-alphanumeric characters causing an exception to be displayed.
[JeffersonBledsoe]Other:Code-Style Black and Isort
[jensens]3.5.1 (2021-05-26)Updated de and ch-de translations
[agitator]3.5 (2021-05-26)Use collection from context as default.target_collectionis now used to select an alternative collection as result source.
This allows to copy and paste preconfigured collections for reuse without reconfiguring each filter element.
[agitator]Fix search which include the terms “and”, “or” and “not”
[jeffersonbledsoe]3.4.2 (2021-02-25)Do not render filter tiles when page gets AJAX loaded
[petschki]Do not add hidden fieldcollectionfiltermultiple times. Fixes #116
[petschki]3.4.1 (2020-06-18)Separated translation display_modifier for portal_type and Type.
[iham]3.4 (2020-06-16)Features:Add sorting tile/portlet to populate selected sort indexes to enduser
[petschki]Added translation display_modifier for portal_type and Type.
[iham]Bug fixes:fixfilter_typefor indexes withoutoperatorcapability. Fixes #74
[petschki]3.3 (2020-01-22)Fix is_available property
[agitator]Added css_modifier to extend css class of a filter item
[agitator]Fix check for boolean values.
[tmassman]fix translation offilter_value[petschki]3.2.1 (2019-08-07)Bug fixes:fix bug introduced with pattern optionajaxLoad[petschki]3.2 (2019-07-23)Features:Restore 5.0.x compatibility
[djay, quang]Make ajax loading of results and portlets a pattern option is themers can override it
[quang]change collection picker to show parent by default so you don’t have to click backwards
[djay]Bug fixes:Fix double display of portlets profile
[agitator]Fix bug where filter urls was getting utf encoded then made into unicode again
[djay]Fix 5.2 where operators should not be used on all index types
[djay]Fix unfiltered results appearing in next page of batch
[djay]Fix bug where portlets didn’t work without GeoLocation dependencies
[djay]3.1 (2019-06-06)New features:Geolocation filter.
[petschki, thet]Bug fixes:Remove dependency on plone.app.upgrade
[agitator]Constraintarget collectionto a configurable registry value.
The default is['Collection', ].
[petschki]Fix non-interable catalog metadata values for Python 3.
[petschki]Use Map Layer translations from plone.formwidget.geolocation
[petschki]FixNonevalue insafe_interable[petschki]Fix for empty SearchableText field (see #56)
[petschki]3.0 (2019-03-25)Breaking changes:Remove support for Plone < 5.1.
[petschki]New features:Python 3 compatibility.
[petschki]Test setup
[petschki]Bug fixes:fix bug in @@render-portlet for Python 3.
NOTE on Python 3: this required plone.app.portlets >= 4.4.2
[petschki]2.1 (2019-03-22)New features:Python 3 compatibility.
[agitator]Bug fixes:Do not render an emptyfilterClassName.
[thet]patCollectionFilter is not in settings, it’s in view.
[agitator]Fix styles for long/multiline filter terms
[agitator]2.0.1 (2018-12-13)Fix upgrade steps and reapply profile to fix bundle registration
Remove conditional reinitialization - caused problems with other patterns
[agitator]2.0 (2018-12-08)Breaking changes:Remove thecache_timesetting and replace it withcache_enabled.collectionsearch.pt: changed view attributeheader_titletotitle.Depend on plone.app.contenttypes.
All target collections must provideplone.app.contenttypes.behaviors.collection.ICollectioninterface.
Theresultmethod will be callend on this behavior adapter.There is a implicit dependency to Font Awesome for the filter tile edit links.
That has to be revisited to make it work out of the box.Modernized markup for easier stylingNew:Optimize the cache key by including the current language, user roles instead of id and the database counter.Remove the view_name part when populating the browser history with filter changes.
The view_name part is for loading specific AJAX tiles, but should probably not be displayed.Add filter and search tiles.Add asort_key_functionkey to the IQueryModifier dict to allow for a different sort key function when sorting the values.Add aindex_modifierkey to the IQueryModifier indexes dict to allow transforming of index search values.
ForKeywordIndexindices the index_modifier is automatically set to encode the value to utf-8.Add avalue_blacklistkey to the IQueryModifier indexes dict to allow blacklisting of individual index values.Addview_nameconfiguration parameter to call a special result listing view.
This can be used to call a tile instead to call the whole context view.Addcontent_selectorconfiguration parameter to choose a DOM node from the source to inject into the target.Ensure early exit on the content filter traverse handler if it is not needed to run.Make backwards compatible with Plone 5.0
[nngu6036, instification]Bug fixes:When reloading the collection in JavaScript, use the content selector’s parent as base to trigger events on.
The content selector itself is replaced and events cannot be caught.Register the bundle compile files ascollectionfilter-bundle-compiled.jsandcollectionfilter-bundle-compiled.css, so that usingplone-compile-resourcesresults in the same files.
See:https://github.com/plone/Products.CMFPlone/issues/2437Sort the filter value list for filter title instead filter value.fix collectionsearch portlet
[petschki]when providing a customIGroupByCriteriaadapter, fallback to title sorted values if no sort_key_function is given.
[petschki]1.0.1 (2018-02-09)Fix target collection selection via catalog vocabular and RelatedItemsFieldWidget.
[agitator]1.0 (2018-01-27)Implement AJAX search for the collection search portlet.
[thet]Update the history / location bar URL with the current filter URL.
[thet]Fix error whereclosestDOM method isn’t supported on IE.
Fixes #6.
[agitator]Register bundle to depend on*to avoid weird Select2 initialization error.
[thet]Addinput_typeoption to be able to better select the type of input.
Addinput_typesupport for dropdowns.
Removeas_inputattribute and provide upgrade step for it.
[thet]Initial release from collective.portlet.collectionfilter.
[thet]