PHPackages                             flowpack/listable - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. flowpack/listable

ActiveNeos-package[Utility &amp; Helpers](/categories/utility)

flowpack/listable
=================

Tiny extension for listing things

4.0.2(10mo ago)35221.5k↓47.3%18[5 issues](https://github.com/Flowpack/Flowpack.Listable/issues)7MITPHPPHP &gt;=8.2

Since Nov 6Pushed 6mo ago4 watchersCompare

[ Source](https://github.com/Flowpack/Flowpack.Listable)[ Packagist](https://packagist.org/packages/flowpack/listable)[ RSS](/packages/flowpack-listable/feed)WikiDiscussions main Synced 2d ago

READMEChangelog (10)Dependencies (1)Versions (30)Used By (7)

Listable
========

[](#listable)

This Neos package solves one problem: help you list any nodes in Fusion. The idea is very simple: you often need to display list of things (e.g. news, articles etc), and the concern of listing items should better be separated from the concern of rendering items. This package provides a solid foundation for listing, while allowing you to take care of rendering stuff on your own.

TL;DR
=====

[](#tldr)

1. Install the package with composer: `composer require flowpack/listable` [Here it is on packagist](https://packagist.org/packages/flowpack/listable).
2. If you want a paginated list, use `Flowpack.Listable:PaginatedCollection`.
3. If you just want a simple list, use `Flowpack.Listable:Collection` (or just `Neos.Fusion:Collection`!).
4. If you need a list with a header and an archive link, wrap you list into `Flowpack.Listable:List`
5. For each of your nodetypes create a new Fusion object of type NodeTypeName + '.Short', or manually define a rendering object.
6. Rely on public API keys when overriding settings.

Fusion objects
==============

[](#fusion-objects)

Keys documented here are considered public API and would be treated with semantic versioning in mind. Extend all other properties at your own risk.

Flowpack.Listable:Collection
----------------------------

[](#flowpacklistablecollection)

This object is just a simple convienince wrapper around `Neos.Fusion:Collection`, use it if you want to save a few keystrokes. It wraps the list with UL and LI tags with a provided name and also set `Flowpack.Listable:ContentCaseShort` as a default for itemRenderer.

Configuration options:

SettingDescriptionDefaultsitemsAn instance of `ElasticSearchQueryBuilder`, `FlowQuery` object or an `array` of nodes'to-be-set'listClassClassname of UL tag''itemClassClassname of LI tag wrapping each item''itemRendererObject used for rendering child items. Within it you get two context vars set: `node` and `iterator`'Flowpack.Listable:ContentCaseShort'itemNameName of the the node context variable'node'iterationNameName of the the iterator context variable'iteration'Example:

```
prototype(My.Custom:Object) < prototype(Flowpack.Listable:Collection) {
  items = ${q(site).find('[instanceof Something.Custom:Here]').sort('date', 'DESC').slice(0, 6).get()}
  listClass = 'MyList'
  itemClass = 'MyList-item'
}

```

It would use the object `Something.Custom:Here.Short` for rendering each item.

Make sure to correctly configure the cache.

Flowpack.Listable:PaginatedCollection
-------------------------------------

[](#flowpacklistablepaginatedcollection)

This object allows you to paginate either **ElasticSearch** results, FlowQuery result objects or pure Node arrays.

Configuration options:

SettingDescriptionDefaultscollectionAn instance of `ElasticSearchQueryBuilder`, `FlowQuery` object or an `array` of nodes'to-be-set'itemsPerPageNumber of items per page when using pagination24maximumNumberOfLinksNumber of page links in pagination15listRendererObject used for rendering the list.'Flowpack.Listable:Collection'showPreviousNextLinksBoolean value used to decide whether the previous and next links should be addedfalseWhen used with ElasticSearch, build the query, but don't execute it, the object will do it for you:

```
prototype(My.Custom:Object) < prototype(Flowpack.Listable:PaginatedCollection) {
  collection = ${Search.query(site).nodeType('Something.Custom:Here').sortDesc('date')}
  itemsPerPage = 12
  prototype(Flowpack.Listable:Collection) {
    listClass = 'MyPaginatedList'
    itemClass = 'MyPaginatedList-item'
  }
}

```

If you have additional URL parameters (e.g for a date filter) you have to register the argument and change the cache entryDiscriminator in order work accordingly. HINT: Do not forget to register a corresponding route for your custom argument.

```
prototype(My.Custom:Object) < prototype(Flowpack.Listable:PaginatedCollection) {
  ...

  prototype(Flowpack.Listable:PaginationParameters) {
    date = ${request.arguments.data}
  }

  @cache {
    entryDiscriminator = ${request.arguments.currentPage + request.arguments.date}
  }

}

```

This object is configured by default to `dynamic` cache mode for pagination to work. All you have to do is add correct `entryTags` and you are all set.

Flowpack.Listable:List
----------------------

[](#flowpacklistablelist)

There's often a need to render a list with a header and an archive link. This object takes your list and wraps it with just that.

Configuration options:

SettingDescriptionDefaultswrapClassClass of the div that wraps the whole object''listTitleTitle of the list''listTitleClassClass of the list title''archiveLinkNodepath for the archive link''archiveLinkTitleTitle of the archive link''archiveLinkClassClassname of the archive link''archiveLinkAdditionalParamsAdditionalParams of the archive link, e.g. `@context.archiveLinkAdditionalParams = ${{archive: 1}}`{}listA list that this object should wrap`value`Example:

```
prototype(My.Custom:Object) < prototype(Flowpack.Listable:PaginatedCollection) {
  @process.list = Flowpack.Listable:List {
    listTitle = 'My List'
    archiveLink = '~/page-path-or-identifier'
    archiveLinkTitle = 'See all news'
  }
  collection = ${q(site).find('[instanceof Something.Custom:Here]').sort('date', 'DESC').slice(0, 6).get()}
}

```

Flowpack.Listable:Pagination
----------------------------

[](#flowpacklistablepagination)

You can also use pagination standalone from the `PaginatedCollection`.

Configuration options:

SettingDescriptionDefaultstotalCountA total count of items'to-be-set'itemsPerPageNumber of items per page24maximumNumberOfLinksA maximum number of links15classA class around pagination'Pagination'itemClassA total count of items'Pagination-item'currentItemClassA class for a current item'isCurrent'currentPageCurrent page, starting with 1`${request.arguments.currentPageshowPreviousNextLinksBoolean value used to decide whether the previous and next links should be addedfalseFlowQuery Helpers you can use
=============================

[](#flowquery-helpers-you-can-use)

filterByDate
------------

[](#filterbydate)

Filter nodes by properties of type date.

sortRecursiveByIndex
--------------------

[](#sortrecursivebyindex)

Sort nodes by their position in the node tree. Please use with care, as this can become a very expensive operation, if you operate on bigger subtrees.

Example:

```
${q(node).children("main").sortRecursiveByIndex('DESC').get()}

```

###  Health Score

59

—

FairBetter than 98% of packages

Maintenance59

Moderate activity, may be stable

Popularity46

Moderate usage in the ecosystem

Community32

Small or concentrated contributor base

Maturity86

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 75.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~132 days

Recently: every ~34 days

Total

28

Last Release

319d ago

Major Versions

0.4.1 → 1.0.x-dev2016-10-28

v1.0 → v2.02016-12-27

v2.0.1 → v3.02017-10-10

3.6.0 → 4.0.02025-04-03

3.6.x-dev → 4.0.22025-08-18

### Community

Maintainers

![](https://www.gravatar.com/avatar/6e7861363bc4d9a01d804fb1823366c3e59f339542e3a4ea89f7cea7b0ea91af?d=identicon)[dimaip](/maintainers/dimaip)

---

Top Contributors

[![dimaip](https://avatars.githubusercontent.com/u/837032?v=4)](https://github.com/dimaip "dimaip (147 commits)")[![dlubitz](https://avatars.githubusercontent.com/u/13046100?v=4)](https://github.com/dlubitz "dlubitz (9 commits)")[![johannessteu](https://avatars.githubusercontent.com/u/769789?v=4)](https://github.com/johannessteu "johannessteu (6 commits)")[![daniellienert](https://avatars.githubusercontent.com/u/642226?v=4)](https://github.com/daniellienert "daniellienert (5 commits)")[![kdambekalns](https://avatars.githubusercontent.com/u/95873?v=4)](https://github.com/kdambekalns "kdambekalns (4 commits)")[![ahaeslich](https://avatars.githubusercontent.com/u/1756367?v=4)](https://github.com/ahaeslich "ahaeslich (3 commits)")[![andrehoffmann30](https://avatars.githubusercontent.com/u/23524251?v=4)](https://github.com/andrehoffmann30 "andrehoffmann30 (3 commits)")[![ComiR](https://avatars.githubusercontent.com/u/11410095?v=4)](https://github.com/ComiR "ComiR (3 commits)")[![Sebobo](https://avatars.githubusercontent.com/u/596967?v=4)](https://github.com/Sebobo "Sebobo (2 commits)")[![gerdemann](https://avatars.githubusercontent.com/u/690536?v=4)](https://github.com/gerdemann "gerdemann (2 commits)")[![jonnitto](https://avatars.githubusercontent.com/u/4510166?v=4)](https://github.com/jonnitto "jonnitto (1 commits)")[![batabana](https://avatars.githubusercontent.com/u/36864084?v=4)](https://github.com/batabana "batabana (1 commits)")[![lorenzulrich](https://avatars.githubusercontent.com/u/1816023?v=4)](https://github.com/lorenzulrich "lorenzulrich (1 commits)")[![mficzel](https://avatars.githubusercontent.com/u/1309380?v=4)](https://github.com/mficzel "mficzel (1 commits)")[![mirkokaufmann](https://avatars.githubusercontent.com/u/2813269?v=4)](https://github.com/mirkokaufmann "mirkokaufmann (1 commits)")[![on3iro](https://avatars.githubusercontent.com/u/8681413?v=4)](https://github.com/on3iro "on3iro (1 commits)")[![Pingu501](https://avatars.githubusercontent.com/u/12086990?v=4)](https://github.com/Pingu501 "Pingu501 (1 commits)")[![rolandschuetz](https://avatars.githubusercontent.com/u/735982?v=4)](https://github.com/rolandschuetz "rolandschuetz (1 commits)")[![danielkestler](https://avatars.githubusercontent.com/u/3976405?v=4)](https://github.com/danielkestler "danielkestler (1 commits)")[![Weissheiten](https://avatars.githubusercontent.com/u/8425188?v=4)](https://github.com/Weissheiten "Weissheiten (1 commits)")

---

Tags

neoscmspagination

### Embed Badge

![Health badge](/badges/flowpack-listable/health.svg)

```
[![Health](https://phpackages.com/badges/flowpack-listable/health.svg)](https://phpackages.com/packages/flowpack-listable)
```

###  Alternatives

[neos/seo

SEO configuration and tools for Neos

141.0M31](/packages/neos-seo)[sitegeist/kaleidoscope

Responsive-images for Neos

29370.3k12](/packages/sitegeist-kaleidoscope)[kaufmanndigital/gdpr-cookieconsent

A ready-to-run package, that integrates an advanced cookie consent banner into your Neos CMS site.

2542.4k](/packages/kaufmanndigital-gdpr-cookieconsent)[techdivision/ckstyles

Neos package which enables you adding your custom style classes for the CkEditor with a simple Yaml configuration

21179.5k](/packages/techdivision-ckstyles)[sitegeist/taxonomy

Manage vocabularies and taxonomies as separate node-hierarchy.

1595.1k1](/packages/sitegeist-taxonomy)[shel/neos-colorpicker

A plugin for Neos CMS which provides a colorpicker editor

14104.7k6](/packages/shel-neos-colorpicker)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
