In HEAD, we MUST render the main content FIRST, because we need that for the title. i.e. we can't just render $page
, we must first render $page['content']
, because $page['content']['#title']
may define the page title, which we need to print as part of $page
's template.
This breaks the stack-based bubbling, because rendering $page['content']
(the main content) first separately means its bubbleable metadata (attachments, cache tags and #post_render_cache
callbacks) won't be part of the stack of metadata being bubbled when rendering $page
. The reason HEAD gets around this are: hacks that use globals to juggle things around, which we've been working to get rid of, plus drupal_render()
not yet being as strict as it should be (a non-recursive (root) call to drupal_render()
that does not result in an empty stack at the end of the root drupal_render()
call does not complain currently, but should throw an exception, because it means bubbleable metadata is being left behind).
As of #9, this is no longer true. It'd still be better if we could enforce this, but we can't. But we can convert many (most?) uses in Drupal 8 HEAD to no longer use $main_content['#title']
. Also see #7.
It also creates an utterly awful DX, the first testament of which is Drupal core itself: its *.routing.yml
files are littered with _title
attributes which are never ever used, because they're overridden by $main_content['#title']
($page['content']['#title']
)!
So: we think we define a title, but then dynamically override it. Or also: we think we override the title in a hook_form_alter()
and then it's never actually overridden due to a change elsewhere, and is then falling back to the static _title
. To top it off, the path-based breadcrumb builder will just look at every single path component along the way⦠including those that don't represent a valid path! E.g. /nl/node/1/translations/add/en/nl
, for which _title = 'Add'
is defined, but it's dynamically overridden using #title
. The breadcrumb builder then gets the titles for /nl/node/1/translations/add/en
and /nl/node/1/translations/add
, which is 'Add'
according to the static title, but in fact neither of those paths are *valid*! They both trigger exceptions. So we get a breadcrumb like Home > NODE TITLE > Translations > Add > Add
, but neither of the two last links work, and this fact is subtly hidden, in part thanks to the combination of _title
and #title
.
An incredibly large percentage of titles is currently broken in this way in Drupal 8 HEAD.
I'd argue something as fundamental as page titles for a CMS should work in a very clear, consistent way, and bubbling is clearly not the best way to achieve that.
Remove the ability to set a dynamic page title using #title
, always use _title
or _title_callback
.
Get green.
None. Except more consistent page titles for entity routes.
No longer able to set/override the page title using #title
on main content returned in a _content
or _form
controller
Postponed
11.0 π₯
base system
Enhances developer experience.
Changes an existing API or subsystem. Not backportable to earlier major versions, unless absolutely required to fix a critical bug.
Not all content is available!
It's likely this issue predates Contrib.social: some issue and comment data are missing.