7.3.0 (2021-12-09)

Overview of merged pull requests

  • Packages: Media Neos

FEATURE: Add Neos.CliSetup package

The package contains the commands

./flow welcome - Show a welcome message with informations how to setup neos via cli. This should be used later as post-create-project-cmd for the neos-distributions. ./flow setup:database - Configure the database connection interactively ./flow setup:imagehandler - Configure the image handling interactively

The solution is implemented as a separate package in the development collection for the following reasons: - The browser based setup tools Neos.Setup + Neos.NeosSetup may get deprecated one day - The commands are not added to an existing package as they should be uninstallable - The development should happen in the dev-collection to be able to evolve with Neos

  • Resolves: #3506

  • Packages: CliSetup

FEATURE: AFX shorthand for @if and @process / generate keys

resolves: https://github.com/neos/fusion-afx/issues/29

Automatically generates key for @if and @process when no one is specified. Multiple meta properties transpile to: @if.if_1’ and @if.if_2

Demo `html # afx <Vendor.Site:Prototype @if={eel1} image.@if={eel2} /> `

```ts # fusion Vendor.Site:Prototype {

@if.if_1 = ${eel1} image.@if.if_1 = ${eel2}


Resolves: https://github.com/neos/fusion-afx/issues/29

  • Packages: Neos Fusion.Afx

FEATURE: Allow the format `avif for thumbnail generation. <https://github.com/neos/neos-development-collection/pull/3135>`_

As with webp the format has to be supported by the library behind imagine aswell. Currently avif is only supported by imagick > 7.0.10-25 and libheif > 1.7.0.

  • Resolves: #3132

  • Packages: Media

FEATURE: Show asset collections and tag for read-only asset sources

Asset sources have a method isReadOnly() to tell whether they are read-only or not. A read-only asset source does not allow their content to be changed.

With this change, that read-only state is no longer coupled to the display of asset collections and tags in the media browser. Asset sources thus are free to implement a “connection” to asset collections and tags in any reasonable way.

  • Fixes: #3480

  • Packages: Neos Media.Browser

FEATURE: Introduce ThumbnailRefreshed signal to the Neos.Media package

Packages like MOC.ImageOptimizer that are necessary for achieving optimal performance currently have to use unstable apis (aspects) to get access to freshly created image-crops. The existing signals ThumbnailPersisted and ThumbnailCreated do not cover this usecase yet.

This change introduces the ThumbnailRefreshed signal to the Neos.Media package that can be used by package authors to optimize the rendered thumbnails further before they are presented to the user.

  • Packages: Neos Media

FEATURE: Filter by collections in media:removeunused

The assets, the media:removeunused command takes into account can now be filtered by collections by specifying a comma-separated list of collection titles with the —only-collections

  • Packages: Neos Media

FEATURE: Fusion/AFX escaped attribute names (paths) with dots inside

fixes #3112 and fixes closed https://github.com/neos/fusion-afx/issues/34

## What will be possible: This makes it possible to use f.x. dots in attributes and thus Alpinejs in AFX and Fusion. If you escape the attribute/path, the Fusion parser will not disturb you and wont make a nested object path out of it, as before.

### AFX: `html <div '@foo.bar'='baz'></div> `

### Fusion: ```ts Neos.Fusion:Tag {

attributes.@foo.bar’ = ‘baz’


### Fusion ast (simplified): ```json {

“__objectType”: “Neos.Fusion:Tag”, “attributes”: {

“@foo.bar”: “baz”



### HTML Output: `html <div @foo.bar="baz"></div> `

## Whats currently the ‘problem’:

  • AFX doesnt allow quoted attribute identifiers

  • The Fusion parser splits at dots inside quotes too, making those paths nested.

So the above AFX code will not transpile to Fusion and trow an Error: Error during AFX-parsing: <div> Unexpected character "'" in identifier "" - It just means that quotes are not tolerated yet, which will be allowed with this pr. (see also https://github.com/neos/fusion-afx/issues/34)

The above Fusion code is possible but will lead to a different AST (than expected): You can see, that the the quoted attribute '@foo.bar' will still be split at the dots and there will be a nested array instead of a simple key => (string)value pair. ```json {

“__objectType”: “Neos.Fusion:Tag”, “attributes”: {

“@foo”: {

“bar’”: “baz”




To archive the ‘expected’ ast, the SPLIT_PATTERN_OBJECTPATH in the parser was adjusted to ignore dots inside of quotes.

  • Packages: Neos Fusion.Afx Fusion

FEATURE: Allow setting the position of backend modules

What I did

This change only makes it possible for the menu when displayed inside backend modules other than the content module. The content module needs an additional change in the Neos.UI.

Try the following setting to move the media module after the workspace module:

```yaml Neos:


position: ‘after workspaces’


  • Packages: Neos

!!! BUGFIX: Always show current node in breadcrumb

Fix #3407

  • Neos.Neos:BreadcrumbMenu was using node, this is fixed and use documentNode now

  • ``Neos.Neos:BreadcrumbMenuItems `` returned the nodes in the wrong order

  • On both prototypes the current node is now always rendered, even when it is hidden in index

  • Packages: Neos

!!! BUGFIX: Set the default for new shortcut nodes to “parent”

Currently the default is firstChidNode which leads to error when adding a new shortcut, as there will never be a child node in this case while targeting the parent in this case

  • Related: #3256

  • Packages: Neos

BUGFIX: Add missing documentation of third parameter in sort operation

This will fix #3238

  • Packages: Neos

BUGFIX: Add possibility to trigger build manually

Sometimes the build process doesn’t start on a new pull request. With this change, we could trigger it manually and don’t have to close and reopen the pull request

  • Packages: .github

BUGFIX: Make NodeSearchService use new variable to search for identifier patterns

I just stumbled upon an issue, which was partly solved by this PR.

In short, the parameter $term is modified by the foreach loop and thus another value than the original parameter is forwarded to $this->nodeDataRepository->findByProperties($term. Thus the findByProperties from NodeSearchService doesn’t work anymore as it was long time ago.

I’ve also considered the notes from @kdambekalns, except from

> * pass $searchTerm (not $term) to the NodeDataRepository to fix the actual bug

Instead of using $searchTerm I introduced a separate variable.The idea was to revert the overwritten $term and keep the original intention of the method as it was before and the search for an identifier is just an additional feature without changing the old code in any way including variable names and argument types for NodeDataRepository::findByProperties.

  • Packages: Neos

BUGFIX: Exclude “/sites”-node from dimension-migration

  • Fixes: #3109

  • Packages: ContentRepository

BUGFIX: prevent failure for disabled superTypes

When there are disabled superTypes in NodeTypes, an exception is thrown. This happens when a superType is disabled in a NodeType and no specific editor is defined.

```yaml ‘My.Package:FormElement’:


‘Neos.Form.Builder:FormElement’: true ‘Neos.Form.Builder:LabelMixin’: false


type: string ui:

label: i18n


This issue was introduced in #3395

Closes #3520

  • Packages: Neos

Revert “BUGFIX: Remove broken @FlowIgnoreValidation from ContentRepository context”

Reverts #3411 since this introduced a regression. The new fix has been implemented in Flow: https://github.com/neos/flow-development-collection/pull/2632

  • Fixes: #3515

  • Packages: Fusion.Afx ContentRepository

BUGFIX: Render labels of authentication providers

What I did Extended the array that is used in the view. So that we have the provider identifier and the label. So we use a structure like


identifier: ‘Neos.Neos:Backend’ label: ‘Neos Backend label’

}, {

identifier: ‘Neos.Neos:FooName’ label: ‘Neos Backend Foo’



How to verify it

  1. Configure a second authentication provider

  2. go to the user management in the backend

  3. create a new user

  4. check the drop down

  • Fixes: #3488

  • Packages: Media.Browser Neos

BUGFIX: apply editor defaults in creation dialog elements

Adjusts the DefaultPropertyEditorPostprocessor such that it respects the configured property editor defaults not only for node _properties_ but for _creationDialog elements_ too.

This also fixes the default behavior for properties slightly by making sure that editor defaults from Neos.Neos.userInterface.inspector.editors are applied even if no corresponding Neos.Neos.userInterface.inspector.dataTypes exists

  • Fixes: #3471

  • Packages: Media.Browser Neos

BUGFIX: NodeTypesLoader respect package overrides

The NodeTypesLoader introduced in FLOW 7.2 does not allow to override NodeTypes in the newly introduced NodeTypes directory. This is because, the Configuration directory is loaded in a separate loop after the NodeTypes directory.

For example, the NodeType Neos.Neos:ContentCollection cannot be overriden in the NodeTypes directory, because it is loaded in Neos.Neos/Configuration. This means, everything defined in the NodeTypes directory of a custom package is overriden by the Neos.Neos/Configuration NodeType.

This PR uses a single $packages loop to first load from the NodeTypes directory, directly followed by the Configuration for a given $package.

How to verify it

Try to modify Neos.Neos:ContentCollection like this ``` ‘Neos.Neos:ContentCollection’:


‘*’: false

` in a ``NodeTypes directory.

  • Packages: Neos ContentRepository

BUGFIX: Improve message for node property conversion errors

This wraps the property mapper exceptions within Node::getProperty() in order to throw a more useful exception.

  • Fixes: #3420

  • Packages: Media.Browser Neos

BUGFIX: Prevent exception when deleting an electronic address

When you delete an electronic address we throw a flash message that the address has been delete for the given user. We had the issue that the PersonName object could not be transformed to a string that is needed for the flash message.

What I did

Use the full name of the PersonName object instead of the direct PersonName object for the flash message.

How to verify it

  1. Open the user module

  2. Edit a user

  3. Optionally create a electronic address

  4. Delete a electronic address

  5. check the flash message

  • Fixes: #3435

  • Packages: Media.Browser Neos

BUGFIX: Include Memo fusion

The Neos.Fusion:Memo object was introduced with Neos 7.2 but the include somehow slipped through. This change adds the missing include to the Root.fusion

  • Resolves: #3510

  • Packages: Media.Browser Neos Fusion

BUGFIX: Fix wrong translation strings

These were reversed somehow…

  • Packages: Media.Browser Neos

BUGFIX: Fix two errors in Modules.xlf

Fixes a duplicate id and the use of literal HTML tags in XLIFF.

  • Packages: Media Neos

BUGFIX: Only use accounts that have Neos users attached

Since Neos 5.2.0 the use of frontend logins is broken. When logging in, an exception is thrown. The exact exception varies, but can be traced to Unexpected user type "". An account with the identifier "…" exists, but the corresponding party is not a Neos User. eventually.

This change fixes that by not using getUser() directly, but doing more checks and eventually just returning null if no Neos user can be found for the authenticated tokens.

  • Related: #2577

  • Fixes: #3088

  • Packages: Media Neos

BUGFIX: Flush content cache of pages with internal links when target changes

This extends \\Neos\\Neos\\Fusion\\Cache\\ContentCacheFlusher::registerChangeOnNodeIdentifier() such that it flushes dynamic node tags, too.


The Neos.Neos:ConvertUris processor invokes \\Neos\\Fusion\\Core\\Runtime::addCacheTag() for every converted node and asset link leading to a cache tag of <type>DynamicTag_<id> (e.g. NodeDynamicTag_12345) to be added to the current RuntimeContentCache.

This fix makes sure that those dynamic node tags are also flushed whenever a node is changed.

  • Fixes: #3482

  • Packages: Neos

BUGFIX: Media Browser - Make font visible on tag hover

What I did To make the tag name visible when hovering an active tag /collection/asset source I changed the background color to blue.

How I did it On hover the background color of a button changes to blue while the font color changes to white

How to verify it In the media browser, if you have a lot of tags(more than 25 Tags), the collections and tags are displayed as ‘buttons’. On hovering an active button, the text is white on blue.

  • Resolves: #3461

  • Packages: Media.Browser

BUGFIX: Collapse afx whitespace connected to newlines to spaces inside of text literals

The removal of all whitespaces connected to newlines yields unexpected results in text literals. This change adjusts the behavior and converts newlines and connected whitespaces inside of text literals to a single space. Whitespaces and connected newlines at the beginning and end of text literals are still removed.

So the following afx code: ``` <h1>

This is a string literal with multiple lines that shall collapse to spaces.

</h1> ` will be transpiled as: ` Neos.Fusion:Tag {

tagName = ‘h1’ content = ‘This is a string literal with multiple lines that shall collapse to spaces.’


instead of: ``` Neos.Fusion:Tag {

tagName = ‘h1’ content = ‘This is a string literalwith multiple linesthat shall collapseto spaces.’


  • Relates: #3331

  • Packages: .github Fusion.Afx

BUGFIX: Enable translations for overridden selectbox options

What I did / How I did it

I altered the NodeTypeConfigurationEnrichmentAspect so that it takes the node type inheritance chain into account when translating select box option labels in the respective inspector editor configuration.

This addresses an issue originally reported in the UI repo: https://github.com/neos/neos-ui/issues/2005

How to verify it

You’ll need a mixin NodeType that provides a select box property with internationalized option labels like this:


type: string defaultValue: ‘primary’ ui:

label: i18n reloadIfChanged: true inspector:

group: style position: 10 editor: ‘Neos.Neos/Inspector/Editors/SelectBoxEditor’ editorOptions:


label: i18n


label: i18n


label: i18n


label: i18n


label: i18n


label: i18n

` (let's call this one ``Vendor.Site:Mixin.BrandColor)

Then you’ll need a second node type that inherits from Vendor.Site:Mixin.BrandColor and adds an new internationalized option to the property brandColor:


defaultValue: ‘none’ ui:


label: ‘i18n’


Before the fix the new option will show up as a plain string "i18n". After the fix the new option will show up as an XLIFF-translation address (bound to the node type that added the option).

Additional remarks

Imho, the entire NodeTypeConfigurationEnrichmentAspect should actually be moved out of the Neos.Neos package and into the UI package (All of these translations are an exclusive UI concern). Doing that would be out-of-scope for a bugfix though.

  • To be precise: There are no tests for this aspect to begin with and would be extremely difficult to add them. I’d suggest to move this concern over to the UI and handle it in a more testable manner.

  • Packages: Neos

BUGFIX: Prevent error when setting collection prop in ContentCollectionRenderer

When using the ContentCollectionRenderer directly and setting the backwards compatible collection prop (to still support Neos 4.3) to a valid array of nodes the following error appears due to the missing object definition:

` No Fusion object found in path ".../collectionA<Neos.Neos:ContentCollectionRenderer>/items/__meta/process/collectionLegacy `

What I did

Define the backwards compatible process as simple expression instead of an object without implementation

How to verify it

Try the following code somewhere in the demo site:

``` myCollection = Neos.Neos:ContentCollectionRenderer {

collection = ${q(site).find(‘[instanceof Neos.Demo:Content.Text]’).get()}


  • Packages: Neos

BUGFIX: Allow searching by tag after searching by searchterm in the MediaBrowser

What I did 1. Go to the Neos Media Browser and enter a search term 2. Remove the search term so that there is an empty string as search 3. Search again 4. Use any tag on the left side to search by tag

After clicking on the Tag I would expect to see results by tag since the search field is empty. The search still tries search by the empty string and does not call the method findByTag.

How I did it In the controller where the search happens do not only check if the searchterm is null but also check if the searchterm is empty

How to verify it After searching by searchterm, then searching by an empty string you can then search by Tag.

  • Fixes: #3455

  • Packages: Media.Browser

!!! TASK: Fusion Parser deprecate namespace alias

related #3498

Add deprecation notice for the namespace to the parser and corresponding interface.

## Starting with Neos version 8, this code will not work anymore:

### alias a namespace ` namespace: Foo = Acme.Demo video = Foo:YouTube `

### use the default Neos.Fusion namespace you will need to fully declare the namespace (add Neos.Fusion: infront) ` content = DataStructure ` or ` root = Page `

  • Packages: Fusion.Afx Fusion

TASK: Add release notes for 7.3

  • Packages: Neos

TASK: Create trace for absorbed exception

Without this, it’s a lot harder to debug absorbed exceptions.

  • Packages: Fusion

TASK: Add missing inversedBy Doctrine mapping

Update the Doctrine Mapping of the Tag model, for ./flow doctrine:validate to not fail

  • Fixes: #3264

  • Packages: Neos Media

TASK: Use indented heredoc syntax for AFX tests

The indentation of heredoc and nowdoc was added in PHP 7.3 which is the minimal supported version of php. This change adjusts the tests of the afx service to use the indented syntax to improve readability a lot.


  • Packages: Fusion.Afx

TASK: Document new case-insensitve operators

With the merge of https://github.com/neos/flow-development-collection/pull/2600 new case-insensitive operators are introduced and also documented

  • Fixes: #3511

  • Packages: Neos

TASK: Simplify rules, handle markdown files in .editorconfig

Aligns the file with the one in the Flow development collection.

TASK: inline ‘docs’ and cleaner code for Neos.Neos:ContentCollection

Fusion Neos.Neos:ContentCollection: * cleaner class.@process.collectionClass * added some information about the caching as can be found in the root caching config. * doc note for nodePath

Since the Neos.Neos:ContentCollection fusion prototype is at some point found by a neos beginner, i think it makes sense to explain certain things inline and make the code less verbose.

  • Packages: Neos

TASK: Use 4 spaces for composer.json in editorconfig

4 spaces is what Composer uses itself…

TASK: Set default quality for pngs when using vips

The vips-imagine integration actually uses png_quality to set the resulting png quality instead of falling back to quality.

See https://github.com/rokka-io/imagine-vips/blob/master/lib/Imagine/Vips/Image.php#L979

GD and Imagick ignore the option. This leads to much smaller file size without loosing quality in comparison to IM and GD.

What I did

Set png_quality as the other format qualities.

How to verify it

Install and configure Vips in any Neos project and recreate png thumbnails. Compare file sizes. Or use (non-news) test script https://gist.github.com/Sebobo/94dd8ea909d2ed6ae813b7df70c20dc1

  • Packages: Media

TASK: added german translations for user management

What I did I added some german translations, which are relevant for german users concerning the user management.

How to verify it Set the Interface Language of your user to German and read the notifications/messages when trying different actions in the user management like adding/deleting/creating user accounts or electronical addresses.

  • Packages: Neos

Detailed log