Skip to main content

Plone addon for filtering collection results.

Project description

collective.collectionfilter

Faceted navigation filter for collection results.

This Plone 5 addon allows you to filter collections results for additional catalog metadata. For example, you can add a subject filter, but also a filter for authors or portal types. This can also be used to build tag clouds.

The filter types can be extended (see: collective.collectionfilter.vocabularies).

There are three portlets/tiles available for filtering:

Collection Filter

a list with values (select, radio, checkbox, link) you can filter on

Collection Search

a SearchableText input field to do a fulltextsearch on the collection results

Collection Maps

a LeafletJS map which shows and filters IGeolocatable items on it (this feature is available if collective.geolocationbehavior is installed and the behavior is activated on a contenttype. See installation notes below)

Collection Result Listing Sort

a list of indexes where the user can sort the filtered result listing

Filter Results with portlets

Add as many of the filter portlets above to any context you want (most likely the source collection) and assign a collection with results to it.

When you select values from the filter the results are loaded asynchronously inside the container with the selector defined in the field Content Selector. Make sure the selector exists on the source collection template and on the target page which shows the filtered results.

Mosaic Integration

The three tiles can be added within the Mosaic editor multiple times. Just select them in the Insert menu and assign a collection to it. To show the results of the collection simply add a Existing Content tile which links to the same collection your filter tiles are assigned with.

TODO: right now the collection needs a default_view template, which wraps the result list with a unique selector inside the #content-core container. so the collectionfilter can load the filtered result correctly from the collection into the container inside the existing content tile.

Geolocation filter support

If collective.geolocationbehavior is installed, this package provides a LeafletJS Maps tile/portlet which shows each item of a collection result if the IGeolocatable information is available. In addition you can activate the Narrow down results checkbox 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 GroupByCriteria

collective.collectionfilter.vocabularies.GroupByCriteria is 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 the collective.collectionfilter message catalog as standard display_modifier (you can register translations under the collective.collectionfilter domain to translate index values).

If you need a special display_modifier, or index or metadata columns do not have the same identifier, you can modify this data structure. For that, register an adapter for IGroupByModifier, which adapts to the GroupByCriteria utility. Within this adapter, you can modify the already populated _groupby attribute (do not use the groupby, 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: 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: 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 by collective.collectionfilter.vocabularies.GroupByCriteria.groupby.

Compatibility

This package is compatible with Plone 5 and above. Note that in 5.0 some functionality is reduced such as AJAX loading of search results. If your theme doesn’t work well with AJAX loading this can be overridden in the registery or via diazo.

Author

  • Johannes Raggam

  • Peter Holzer

This package is based on collective.portlet.collectionfilter and collective.portlet.collectionbysubject.

Changelog

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:

  • fix filter_type for indexes without operator capability. 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 of filter_value [petschki]

3.2.1 (2019-08-07)

Bug fixes:

  • fix bug introduced with pattern option ajaxLoad [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]

  • Constrain target collection to 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]

  • Fix None value in safe_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 empty filterClassName. [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 the cache_time setting and replace it with cache_enabled.

  • collectionsearch.pt: changed view attribute header_title to title.

  • Depend on plone.app.contenttypes. All target collections must provide plone.app.contenttypes.behaviors.collection.ICollection interface. The result method 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 styling

New:

  • 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 a sort_key_function key to the IQueryModifier dict to allow for a different sort key function when sorting the values.

  • Add a index_modifier key to the IQueryModifier indexes dict to allow transforming of index search values. For KeywordIndex indices the index_modifier is automatically set to encode the value to utf-8.

  • Add a value_blacklist key to the IQueryModifier indexes dict to allow blacklisting of individual index values.

  • Add view_name configuration parameter to call a special result listing view. This can be used to call a tile instead to call the whole context view.

  • Add content_selector configuration 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 catched.

  • Register the bundle compile files as collectionfilter-bundle-compiled.js and collectionfilter-bundle-compiled.css, so that using plone-compile-resources results in the same files. See: https://github.com/plone/Products.CMFPlone/issues/2437

  • Sort the filter value list for filter title instead filter value.

  • fix collectionsearch portlet [petschki]

  • when providing a custom IGroupByCriteria adapter, 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 where closest DOM method isn’t supported on IE. Fixes #6. [agitator]

  • Register bundle to depend on * to avoid weird Select2 initialization error. [thet]

  • Add input_type option to be able to better select the type of input. Add input_type support for dropdowns. Remove as_input attribute and provide upgrade step for it. [thet]

  • Initial release from collective.portlet.collectionfilter. [thet]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

collective.collectionfilter-3.4.1.tar.gz (63.5 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page