Problem/Motivation
There are currently a number of pain points with Layout Builder and how it interacts with the block plugin system as follows:
- without layout builder restrictions module the default number of blocks available to a content editor is overwhelming #3040348: Remove blocks that are not useful within Layout Builder #2977587: Improve block listing in Layout Builder by hiding uncommon block plugins
- without layout builder browser module the UX of the list of blocks isn't great. There is the main list of blocks, which is grouped by categories that don't necessarily make sense, e.g. 'Core' might not mean anything to a content editor. Creating inline blocks is probably the most common function, however that is hidden behind an additional link. Site builders cannot group and rename blocks to suit the site #3069446: Layout builder's "Add Block" sidebar menu UX improvements. Adding icons would break up the list #3010494: Custom images for the layout builder side panel#3111973: Use granular entity type bundle driven field block categories when choosing blocks
- too many field block plugins is overwhelming to the editor and causes performances issues. For example would the editor ever need to place a revision log block? In addition we generate field block plugins for every bundle, field and content entity combination, many of them may not even have layout builder enabled #3257671: Allow an opt out of specific fields from the layout builder UI#3043330: Reduce the number of field blocks created for entities (possibly to zero)
- Additionally, all of the field block plugins expect the content editors to configure a formatter, which is unreasonable. Site builders would prefer to create pre-configured blocks such as 'Short post date' or 'Long post date' and avoid giving these options to content editors.
Proposed resolution
- Per #3043330-95: Reduce the number of field blocks created for entities (possibly to zero) Add a 'legacy mode' settings flag to layout builder.
- Enable this for existing sites.
- With this flag on, a new config entity 'configured layout builder block' is available. This encapsulates
-
- the functionality of layout builder browser (block order, block icon, configurable block category, configurable block label)
- functionality of layout builder restrictions (which regions and sections it can be used in. At present Layout builder restrictions manages this on the view mode configuration but this is overwhelming and often results in a lot of merge conflicts for config YML files. Flipping the restriction management from being on the view display to on the block will reduce this pain and also simplify the UI of adding restrictions. The current UI in contrib is a series of expanding/collapsing details elements and modals to allow for all the possible blocks and sections.
- Be sure to store the regions/section data in a way that would allow onDependencyRemoval to work (E.g. key sections/layouts by provider) and allow reacting to modules providing layouts being disabled.
- Create a configured layout builder block map service, like we have for field map, that would be performant to query which blocks are available for which sections and regions given an entity context.
- When configuring these 'configured layout builder block' config entities, allow the site builder to preconfigure and hide block config options from the content editor - this would allow preconfiguring the new block entity-field block from above to set formatter options - or for example configuring a views block
- These 'configured layout builder block' config entities would also support adding the same field twice. E.g the example from above a 'short post date' and a 'long post date' could be preconfigured by the site builder.
- Having a pre-defined set of 'configured layout builder block' entities would allow front-end teams to work with a known set of options to ensure that everything available had an appropriate front-end representation.
See also #3387154: [PP-1] Move away from derivatives for FieldBlock and instead use block settings for more steps to improve this for field blocks
Remaining tasks
- ✅ Discuss the pain points with product managers (@lauriii, @gabor, @ckrina)
- ✅ Discuss the proposed resolution with subsystem maintainer (@tim.plunkett)
- Discuss the solution with maintainers of LB restrictions and LB browser
- Implement the solution with test coverage
- Reviews
User interface changes
API changes
Data model changes
Release notes snippet
| Comment | File | Size | Author |
|---|---|---|---|
| #18 | 3365551-bc-poc.txt | 4.66 KB | lauriii |
Issue fork drupal-3365551
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
- 3365551-add-the-notion
changes, plain diff MR !4171
Comments
Comment #2
larowlanComment #3
larowlanComment #4
larowlanComment #5
tim.plunkettComment #10
larowlanDiscussed this with @DanielVeza and we agreed to reduce the scope somewhat.
The configurable block to replace the existing field block work can be done separately as that's going to present some major UX challenges that we'll likely need a few rounds of testing on.
Added #3387154: [PP-1] Move away from derivatives for FieldBlock and instead use block settings to split that out into its own separate issue and refined the scope/proposed resolution here.
Comment #11
johnpitcairn commentedI've just had to implement something for a client - the goal was to (almost) completely hide the complex content field block label/formatter settings from site editors who are using layout builder on a single entity, while still allowing site builders to configure defaults for those settings.
We wound up with a custom field block plugin that takes its
::build()formatter settings from a dedicated 'layout_builder' view mode on the entity, and does not add elements for those in::formetc. That works nicely and re-uses existing mechanisms.It would have been great to take those formatter settings from configured display settings on the current view mode, but baked-in core assumptions make that hard:
For site builders, I was thinking it would be no great leap if they could just configure defaults where they normally would for the entity display.
Comment #12
johnpitcairn commentedWhat happens if somebody turns that flag off on a site with legacy layout builder content?
Comment #13
larowlanThe expectation is that if you wanted the new mode, you'd configure all the blocks for the new approach, then toggle off legacy mode.
Comment #14
johnpitcairn commentedOK so legacy mode means "keep existing layout builder block instance config", and the new configured layout builder block is available to configure and use whether that is checked or not? The issue summary implies that's only available if legacy mode is checked.
Can sites keep using existing editor-configured blocks, while adding and using some preconfigured blocks? I can see this being a slow transition for sites with limited resources but lots of existing content.
Comment #15
larowlanYeah that's the plan.
When you switch off legacy mode, the list of blocks shown in the 'choose block' list will draw from the preconfigured ones only.
The content will remain as is. #3387154: [PP-1] Move away from derivatives for FieldBlock and instead use block settings will likely have a more interesting migration path.
Comment #16
johnpitcairn commentedOK and when you switch off legacy mode, existing legacy block instances will remain in the layout, but you wont be able to add new legacy blocks. Gotcha.
Comment #18
lauriiiI discussed this issue with @catch and got inspired to try if we could try to create a runtime BC layer for the block derivatives. I started writing a PoC for the field blocks because they had more complex derivatives. It's not pretty for sure but wanted to post it here for visibility.
Comment #19
catch#18 is very clever indeed, I can't think through all the implications yet, but if we can drop the derivatives and shim the new plugin, and then also encourage people to change their layout config, that would be amazing - can fix both the performance and UX issues much, much quicker that way.
Comment #20
larowlan#18 very neat
Comment #21
wim leersSo … should we continue #18? 😄
Comment #22
catchYes it would be ideal - being able to just drop the existing plugin on existing sites (or at minimum have a killswitch for it which any site can safely turn on) makes the entire process easier, so it's just... all the other bits to do here.
Comment #23
catchComment #24
trackleft2Just wanted to add that the new navigation layout builder may also be able to use this instead of the hard-coded list of allowed blocks. https://git.drupalcode.org/project/drupal/-/blob/11.x/core/modules/navig...
Comment #25
m4oliveiAs @trackleft2 mentioned, the navigation module would also benefit from this work. That's being tracked in #3443833: Provide a way for other modules to flag block plugin implementations as 'navigation safe'.
Although I wonder if the proposed resolution here would cover our use case. The use case for the navigation module is one where we want developers working on new blocks to opt-in their block to be used for Navigation. We currently do this in navigation module by implementing
hook_plugin_filter_TYPE__CONSUMER_alter, and filtering out all blocks except a hardcoded list of exceptions. #3443833: Provide a way for other modules to flag block plugin implementations as 'navigation safe' is currently looking at using a hook to be able to add / alter that hardcoded list. Would the proposed resolution here solve for our problem as well?Comment #26
pameeela commentedI'm removing the blocker tag because since it was added, we've decided to use LB minimally in Drupal CMS. It would still be nice to have, but since #3443833: Provide a way for other modules to flag block plugin implementations as 'navigation safe' is fixed, the only thing this really affects is dashboard config. Since we are shipping with a default config, exposure to users will be quite minimal.