PHPackages                             punktde/archivist - 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. punktde/archivist

ActiveNeos-package

punktde/archivist
=================

A Neos CMS package that automatically sorts nodes into a predefined structure which is created on the fly.

2.8.3(2y ago)1839.0k↓35.7%10[1 PRs](https://github.com/punktDe/archivist/pulls)MITPHPPHP ^7.2 || ^8.0

Since Feb 4Pushed 5mo ago7 watchersCompare

[ Source](https://github.com/punktDe/archivist)[ Packagist](https://packagist.org/packages/punktde/archivist)[ RSS](/packages/punktde-archivist/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (28)Used By (0)

PunktDe.Archivist
=================

[](#punktdearchivist)

[![Travis Build Status](https://camo.githubusercontent.com/5eb06c066cd5d2ba90921f6291a575ac473f51882ce9a7de56391d7d65c8fbe4/68747470733a2f2f7472617669732d63692e6f72672f70756e6b7444652f6172636869766973742e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/punktDe/archivist) [![Latest Stable Version](https://camo.githubusercontent.com/d2e0af759eb7b39af0a1f8634d104f151ea07147215b43ce43d123010df1a560/68747470733a2f2f706f7365722e707567782e6f72672f70756e6b7464652f6172636869766973742f762f737461626c65)](https://packagist.org/packages/punktde/archivist) [![Total Downloads](https://camo.githubusercontent.com/008bf35c3954b1a0d665643d68b0b0098f5522c5ffb017ccfd41534994e1d892/68747470733a2f2f706f7365722e707567782e6f72672f70756e6b7464652f6172636869766973742f646f776e6c6f616473)](https://packagist.org/packages/punktde/archivist)

**Purpose of this package:** Automatically sorts nodes into a predefined structure which is created on the fly.

Neos has some drawbacks, if you store lots of Node - like news for example - on the same hierarchical level. Especially the backend trees are getting slow and confusing. This package automatically sorts this nodes in a configured and automatically created hierarchy.

Configuration
-------------

[](#configuration)

You can configure the behavior differently for every triggering node type. The configuration options are best explained by example. These examples are taken from `Configuration/Testing/Settings.yaml`and are thus automatically tested.

### Simple Example

[](#simple-example)

Configuration for the nodeType 'PunktDe.Archivist.TriggerNode'. The sorting is triggered if a node of this type is created or if a property on this node is changed. This node is then available as 'node' in the other parts of the configuration

```
PunktDe:
  Archivist:
    sortingInstructions:

      'PunktDe.Archivist.TriggerNode':

        # The query selecting the root node of the automatically created hierarchy
        hierarchyRoot: "${q(site).find('[instanceof Neos.ContentRepository.Testing:Page]').get(0)}"

        # Optional: The sorting of the nodes inside the target hierarchy. Can be the name of a property
        # or an eel expression like seen below
        sorting: title

        # Optional: Trigger sorting only, when condition is met. Can be used to make sure that required properties are set as expected.
        condition: "${node.properties.date != null}"

        # In the context is evaluated first. You can define variables here which you can use in
        # the remaining configuration
        context:
          publishDate: "${node.properties.date}"

        # Automatically publish the created document hierarchy
        publishHierarchy: true

        # Definition of the auto-generated hierarchy
        hierarchy:
          -
            # The type of the hierarchy-node
            type: 'PunktDe.Archivist.HierarchyNode'

            # Properties of the new created node.
            properties:
              name: "${Date.year(publishDate)}"
              title: "${Date.year(publishDate)}"
              hiddenInIndex: "${true}"

            # The property which is identical throughout all nodes of this level
            identity: title

            # An eel query that describes the sorting condition
            sorting: "${q(a).property('title') < q(b).property('title')}"
          -
            type: 'PunktDe.Archivist.HierarchyNode'
            properties:
              name: "${Date.month(publishDate)}"
              title: "${Date.month(publishDate)}"
            identity: title

            # Simple sorting on a property
            sorting: title

```

### Example with a triggering content node

[](#example-with-a-triggering-content-node)

A content node triggers the move of its parent document node. For example, if you have a title node which should be considered to move the page.

```
PunktDe:
  Archivist:
    sortingInstructions:
      'PunktDe.Archivist.TriggerContentNode':

        # The query selecting the root node of the automatically created hierarchy
        hierarchyRoot: "${q(site).find('[instanceof Neos.ContentRepository.Testing:Page]').get(0)}"

        # Optional: The node to be moved, described by an Eel query.
        # This defaults to the triggering node if not set. The triggering node is available as "node".
        # If the affected node is not found by the operation is skipped.
        # This can for example be used if a change in a content node should move its parent document node
        #
        affectedNode: "${q(node).parent('[instanceof Neos.ContentRepository.Testing:Document]').get(0)}"

        # Definition of the auto-generated hierarchy
        hierarchy:
          -
            # The type of the hierarchy-node
            type: 'PunktDe.Archivist.HierarchyNode'

            # Properties of the new created node.
            properties:
              name: "${Archivist.buildSortingCharacter(title)}"
              title: "${Archivist.buildSortingCharacter(title)}"

```

### Define multiple configurations for the same NodeType

[](#define-multiple-configurations-for-the-same-nodetype)

In addition to

```
PunktDe:
  Archivist:
    sortingInstructions:
      MyNode.Type:
        hierarchyRoot: # ...
```

you can now do this:

```
PunktDe:
  Archivist:
    sortingInstructions:
      MyNode.Type:
        foo1:
          hierarchyRoot:  # ...
        foo2:
          hierarchyRoot:  # ...
```

Make sure, to define a `conditon` to not run several configurations on the same Node action.

Archivist Eel Helper
--------------------

[](#archivist-eel-helper)

`Archivist.buildSortingCharacter(string, position = 0, length = 1)` Generates upper case sorting characters from the given string. Starting position and length can be defined.

###  Health Score

51

—

FairBetter than 96% of packages

Maintenance49

Moderate activity, may be stable

Popularity39

Limited adoption so far

Community21

Small or concentrated contributor base

Maturity78

Established project with proven stability

 Bus Factor1

Top contributor holds 90.9% 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 ~88 days

Recently: every ~318 days

Total

26

Last Release

819d ago

Major Versions

1.3.1 → 2.0.02018-04-24

PHP version history (3 changes)1.0.0PHP ^7.0

2.3.0PHP ^7.2

2.8.1PHP ^7.2 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/0fad3b9ab04057e586b701aca7a8dbbf9598718114cdfd6bf85dada030f7688e?d=identicon)[punktde](/maintainers/punktde)

---

Top Contributors

[![daniellienert](https://avatars.githubusercontent.com/u/642226?v=4)](https://github.com/daniellienert "daniellienert (140 commits)")[![andrehoffmann30](https://avatars.githubusercontent.com/u/23524251?v=4)](https://github.com/andrehoffmann30 "andrehoffmann30 (5 commits)")[![jonnitto](https://avatars.githubusercontent.com/u/4510166?v=4)](https://github.com/jonnitto "jonnitto (2 commits)")[![fnkr](https://avatars.githubusercontent.com/u/616991?v=4)](https://github.com/fnkr "fnkr (2 commits)")[![skurfuerst](https://avatars.githubusercontent.com/u/190777?v=4)](https://github.com/skurfuerst "skurfuerst (1 commits)")[![theDex](https://avatars.githubusercontent.com/u/3844381?v=4)](https://github.com/theDex "theDex (1 commits)")[![freund0](https://avatars.githubusercontent.com/u/36633130?v=4)](https://github.com/freund0 "freund0 (1 commits)")[![haase-fabian](https://avatars.githubusercontent.com/u/55744962?v=4)](https://github.com/haase-fabian "haase-fabian (1 commits)")[![paavo](https://avatars.githubusercontent.com/u/1118783?v=4)](https://github.com/paavo "paavo (1 commits)")

---

Tags

neoscms

### Embed Badge

![Health badge](/badges/punktde-archivist/health.svg)

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

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[neos/neos-ui

Neos CMS UI written in React

2661.0M104](/packages/neos-neos-ui)[neos/neos

An open source Content Application Platform based on Flow. A set of core Content Management features is resting within a larger context that allows you to build a perfectly customized experience for your users.

116989.0k674](/packages/neos-neos)[neos/neos-base-distribution

Neos Base Distribution

4464.9k](/packages/neos-neos-base-distribution)[flowpack/media-ui

This module allows managing media assets including pictures, videos, audio and documents.

2184.5k2](/packages/flowpack-media-ui)[shel/neos-colorpicker

A plugin for Neos CMS which provides a colorpicker editor

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

PHPackages © 2026

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