public static BlockViewBuilder::preRender($build)
#pre_render callback for building a block.
Renders the content using the provided block plugin, and then:
- if there is no content, aborts rendering, and makes sure the block won't be rendered.
- if there is content, moves the contextual links from the block content to the block itself.
File
- core/modules/block/src/BlockViewBuilder.php, line 202
Class
- BlockViewBuilder
- Provides a Block view builder.
Namespace
Drupal\block
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public static function preRender( $build ) { $content = $build [ '#block' ]->getPlugin()->build(); // Remove the block entity from the render array, to ensure that blocks // can be rendered without the block config entity. unset( $build [ '#block' ]); if ( $content !== NULL && !Element::isEmpty( $content )) { // Place the $content returned by the block plugin into a 'content' child // element, as a way to allow the plugin to have complete control of its // properties and rendering (for instance, its own #theme) without // conflicting with the properties used above, or alternate ones used by // alternate block rendering approaches in contrib (for instance, Panels). // However, the use of a child element is an implementation detail of this // particular block rendering approach. Semantically, the content returned // by the plugin "is the" block, and in particular, #attributes and // #contextual_links is information about the *entire* block. Therefore, // we must move these properties from $content and merge them into the // top-level element. foreach ( array ( '#attributes' , '#contextual_links' ) as $property ) { if (isset( $content [ $property ])) { $build [ $property ] += $content [ $property ]; unset( $content [ $property ]); } } $build [ 'content' ] = $content ; } // Either the block's content is completely empty, or it consists only of // cacheability metadata. else { // Abort rendering: render as the empty string and ensure this block is // render cached, so we can avoid the work of having to repeatedly // determine whether the block is empty. For instance, modifying or adding // entities could cause the block to no longer be empty. $build = array ( '#markup' => '' , '#cache' => $build [ '#cache' ], ); // If $content is not empty, then it contains cacheability metadata, and // we must merge it with the existing cacheability metadata. This allows // blocks to be empty, yet still bubble cacheability metadata, to indicate // why they are empty. if (! empty ( $content )) { CacheableMetadata::createFromRenderArray( $build ) ->merge(CacheableMetadata::createFromRenderArray( $content )) ->applyTo( $build ); } } return $build ; } |
Please login to continue.