You are here

public function BlockBase::build in Display Suite 8.4

Same name and namespace in other branches
  1. 8.2 src/Plugin/DsField/BlockBase.php \Drupal\ds\Plugin\DsField\BlockBase::build()
  2. 8.3 src/Plugin/DsField/BlockBase.php \Drupal\ds\Plugin\DsField\BlockBase::build()

Renders a field.

Return value

array A renderable array representing the content of the field.

Overrides DsFieldBase::build

File

src/Plugin/DsField/BlockBase.php, line 74

Class

BlockBase
The base plugin to create DS block fields.

Namespace

Drupal\ds\Plugin\DsField

Code

public function build() {

  // Get block.
  $block = $this
    ->getBlock();

  // Apply block config.
  $block_config = $this
    ->blockConfig();
  $block
    ->setConfiguration($block_config);
  $add_wrappers = isset($this
    ->getFieldConfiguration()['properties']['add_block_wrappers']) ? $this
    ->getFieldConfiguration()['properties']['add_block_wrappers'] : FALSE;
  if ($block
    ->access(\Drupal::currentUser())) {

    // Inject context values.
    if ($block instanceof ContextAwarePluginInterface) {
      $contexts = $this->contextRepository
        ->getRuntimeContexts(array_values($block
        ->getContextMapping()));
      $this->contextHandler
        ->applyContextMapping($block, $contexts);
    }
    $block_build = $block
      ->build();

    // If the user has chosen to add the block wrappers, theme as a block.
    if ($add_wrappers) {

      // @see \Drupal\block\BlockViewBuilder::buildPreRenderableBlock
      // @see template_preprocess_block()
      $render_element = [
        '#theme' => 'block',
        '#attributes' => [],
        '#configuration' => $block
          ->getConfiguration(),
        '#plugin_id' => $block
          ->getPluginId(),
        '#base_plugin_id' => $block
          ->getBaseId(),
        '#derivative_plugin_id' => $block
          ->getDerivativeId(),
        'content' => $block_build,
      ];
    }
    else {

      // Otherwise just use the block build.
      $render_element = $block_build;
    }

    // Merge cache contexts, tags and max-age.
    if ($contexts = $block
      ->getCacheContexts()) {
      $render_element['#cache']['contexts'] = [];
      if (isset($block_build['#cache']) && isset($block_build['contexts']) && is_array($block_build['#cache']['contexts'])) {
        $render_element['#cache']['contexts'] = $block_build['#cache']['contexts'];
      }
      $render_element['#cache']['contexts'] = array_unique(array_merge($render_element['#cache']['contexts'], $contexts));
    }
    if ($tags = $block
      ->getCacheTags()) {
      $render_element['#cache']['tags'] = [];
      if (isset($block_build['#cache']) && isset($block_build['tags']) && is_array($block_build['#cache']['tags'])) {
        $render_element['#cache']['tags'] = $block_build['#cache']['tags'];
      }
      $render_element['#cache']['tags'] = array_unique(array_merge($render_element['#cache']['tags'], $tags));
    }

    // Add the block base config cache tag.
    $render_element['#cache']['tags'][] = 'config:ds.block_base';
    $max_age = $block
      ->getCacheMaxAge();
    if (is_numeric($max_age) && !isset($render_element['#cache']['max-age'])) {
      $render_element['#cache']['max-age'] = $max_age;
    }

    // Return an empty array if there is nothing to render.
    return Element::isEmpty($render_element) ? [] : $render_element;
  }
  return [];
}