Today we released another Neos 9 Beta.
A late new years gift to you
Thanks to all who contributed <3.
Upgrade instructions from Beta 17
previous beta → Neos 9 Beta-17 Release
In your composer.json you should require 9.0.0-beta18
for all Neos packages from the development distribution and for the NeosUi as well as Flow:
"neos/flow": "9.0.0-beta18",
"neos/neos": "9.0.0-beta18",
"neos/neos-ui": "9.0.0-beta18"
The database can be migrated the following way:
A setup to apply the latest schema adjustments:
./flow doctrine:migrate
./flow cr:setup
Note to publish your legacy node copy’s to the live workspace
We want to emphasise again as in the last betas, that copy nodes was refactored.
In case you’re running on a project with events from before Beta16 and used the copy nodes button in the Neos Ui, the legacy copy nodes events must be published to the live workspace before the final release of Neos 9. After the release they will always be discarded.
To detect those cases please use:
./flow migrateevents:copynodesstatus
In case you don’t understand the output feel free to ask.
Features
1.)
Highlight
New workspace module
- FEATURE: New workspace module (fusion & htmx) v1
- FEATURE: Add Rebase Workspace button to Workspace UI
- Neos Ui Adjustments
Introduces new HTMX based UI with improved usability for the workspace overview based on the package Shel.Neos.WorkspaceModule.
This change is the first milestone for the new package Neos.Workspace.Ui rewriting its templates to Fusion & HTMX as well as the server logic.
New features:
- New interactive Ui with popup modals, and navigation
- Improved workspace review
- Rebasing workspaces and super rudimentary conflict detection
- Changing visibility to private or shared → a new role assignment Ui is in the works
- and more
2.)
Highlight
One-click document publishing in the Neos Ui
- FEATURE: Simplify publish workflow
- BUGFIX: Improve conflict resolution edge-cases in sync and publish workflow
Neos beta 10 introduced a new publishing confirmation modal that provides information and will run the publish or discard operation when continuing.
The simple workflow of publishing the current document was optimised to be directly executed with one click, without any confirmation or result dialog like in Neos 8.
Further the conflict resolution workflow in combination with publishing was hardened by fixing some edge-cases.
3.) !!! Improved content repository core stability & debugging
- TASK: Add correlation id and debug metadata to events
- !!! TASK: Throw exceptions in unnecessary rebase and publish cases
- BUGFIX: Ensure that its not attempted to publish 0 events
Correlation ids and debug information
The command class name is now partially encoded into the event with a random suffix, allowing to identify a publishing sequence while debugging the event log.
Further content stream forking and reopening are also enriched with debug information in the metadata.
Also structure adjustments, content stream pruner and importer write custom correlation ids allowing to determine how the even landed in the store.
No no-op content repository commands
The last beta started to introduce a more strict philosophy, that each command must lead to at least one event.
Instead of failing during command handling for SetNodeProperties
and SetNodeReferences
will ensure that on create()
there are properties to change.
For publishing commands no-ops are only partially prevented via create()
- for example, by ensuring that PublishIndividualNodesFromWorkspace::$nodesToPublish
is not empty,
but additionally if publishing or rebasing was not necessary a new WorkspaceCommandSkipped
exception will be thrown during handling instead of writing no events. No events are published.
Workspace publishing/discarding
Command skipped if there are no (selected) publishable changes.
To avoid this exception being thrown into the outer world it should be caught and logged or the case were its
likely that the operation might be a noop can easily be determined beforehand via Workspace::hasPublishableChanges()
:
if ($workspace->hasPublishableChanges()) {
$contentRepository->handle(...);
}
Workspace rebase
Command skipped if the workspace is not outdated.
Workspace base change
Command skipped when attempting to change the base workspace to the currently set base workspace.
Note:
The case is not handled gracefully with a no-op as there would be no traces (emitted events) of the handled command,
and the original content stream id is kept (for publish operations).
This exception denoting the operation is obsolete should harden the interaction and make behaviour more explicit.
4.) Risen from ashes: FlowQuery context()
operation
Reintroduction of the context FlowQuery operation known from Neos 8.3.
Supported options:
- workspaceName
- dimensions
- invisibleContentShown
The API for the options was left intact though some concepts are now named differently in the core. The context operation should thus not be seen as forever-staying feature and will likely be deprecated and replaced with more explicit ways which fit better the current naming scheme and API.
${q(node).context({'workspaceName': 'other-workspace'})}
${q(node).context({'dimensions': {'language': ['de']}})}
${q(node).context({'invisibleContentShown': true})}
Due to fundamental changes these options from 8.3 cannot be supported and will throw an exception:
- currentDateTime
- targetDimensions
- removedContentShown
- inaccessibleContentShown
5.) Removed dead policies / routes with Neos 9
- TASK: Remove policy for removed
Neos\Neos\Service\Controller\NodeController
- TASK: Remove policy for removed fluid widgets
- TASK: Properly re-remove obsolete legacy
userInformation.personalWorkspaceName
in policy for workspaces - !!! TASK: Remove obsolete legacy yaml policy for workspaces
Neos 9 removed a lot of dead routes from the old ember js user interface
as well as the previous workspace permissions configured in yaml like Workspaces.ManageOwnWorkspaces
and more.
These changes finalised the removal of the dead policies and routes.
6) Slowly modernising the Neos Ui react codebase
- !!!FEATURE: Centralize error handling (already in last beta)
- !!!FEATURE: Reform i18n mechanism
- BUGFIX: Forgiving
I18nRegistry.translate
for strings with colons andundefined
We are in the slow process to modernise some of the Neos Ui concepts. There have been many drafts and discussions of the direction, and it would be promising to centralise some of the backend concepts that are similar for all backend modules, like the drawer on the left and the user dropdown and so forth.
The Ui would provide the outer “shell” and the content module or any other would live inside: RFC: Future of the Neos package architecture (`Neos.Neos` in particular)
For that we must decouple some parts from the global Neos Ui only redux store like flash-messages and also decouple the translation logic from the Neos Ui only concept of registries.
Instead, in the Neos Ui uses now standalone functions like translate()
and showFlashMessage()
which will simplify a lot of code and be eventually part of the outer “shell” and separate from the content module.
Bugfixes
Neos
- BUGFIX: Remove import site from site creation module and fix delete sites (9.0)
- BUGFIX: Asset usage prevent orphaned asset usage entries in case of a rebase with conflicts
- BUGFIX: Handle nodes with missing UriPathSegments in uriPathProjection
- BUGFIX: Fix class usages in UsageController
- BUGFIX: reimplement
appendExceedingArguments
for preview route - BUGFIX: Raw content mode for nodes without node type
- BUGFIX: Ensure cache flushing for asset changes works with foreign workspaces
Dev only relevant
List of things
Flow
Neos
- FEATURE: Introduce signal when cache entry tags have been flushed.
- !!! FEATURE: Drop twitter bootstrap dependency
- BUGFIX: Fix typo in member variable
- TASK: Remove obsolete
findContentStream(s)
- TASK: Make nullable parameter explicit to become PHP 8.4 compatible
- TASK: Document that scatter does NOT move fallbacks!
- TASK: Deprecate additional site kickstart generators and show helpful output for default afx case