ViewsBlock.php

Contains \Drupal\views\Plugin\Block\ViewsBlock.

Namespace

Drupal\views\Plugin\Block

File

drupal/core/modules/views/lib/Drupal/views/Plugin/Block/ViewsBlock.php
View source
<?php

/**
 * @file
 * Contains \Drupal\views\Plugin\Block\ViewsBlock.
 */
namespace Drupal\views\Plugin\Block;

use Drupal\block\BlockBase;
use Drupal\Component\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;

/**
 * Provides a generic Views block.
 *
 * @Plugin(
 *   id = "views_block",
 *   admin_label = @Translation("Views Block"),
 *   module = "views",
 *   derivative = "Drupal\views\Plugin\Derivative\ViewsBlock"
 * )
 */
class ViewsBlock extends BlockBase {

  /**
   * The View executable object.
   *
   * @var \Drupal\views\ViewExecutable
   */
  protected $view;

  /**
   * The display ID being used for this View.
   *
   * @var string
   */
  protected $displayID;

  /**
   * Overrides \Drupal\Component\Plugin\PluginBase::__construct().
   */
  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    list($plugin, $delta) = explode(':', $this
      ->getPluginId());
    list($name, $this->displayID) = explode('-', $delta, 2);

    // Load the view.
    $this->view = views_get_view($name);
  }

  /**
   * Overrides \Drupal\block\BlockBase::access().
   */
  public function access() {
    return $this->view
      ->access($this->displayID);
  }

  /**
   * Overrides \Drupal\block\BlockBase::form().
   */
  public function form($form, &$form_state) {
    $form = parent::form($form, $form_state);

    // Set the default label to '' so the views internal title is used.
    $form['label']['#default_value'] = '';
    $form['label']['#access'] = FALSE;
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function build() {
    if ($output = $this->view
      ->executeDisplay($this->displayID)) {
      $output = $this->view
        ->executeDisplay($this->displayID);

      // Set the label to the title configured in the view.
      $this->configuration['label'] = filter_xss_admin($this->view
        ->getTitle());

      // Before returning the block output, convert it to a renderable array
      // with contextual links.
      $this
        ->addContextualLinks($output);
      $this->view
        ->destroy();
      return $output;
    }
    return array();
  }

  /**
   * Converts Views block content to a renderable array with contextual links.
   *
   * @param string|array $output
   *   An string|array representing the block. This will be modified to be a
   *   renderable array, containing the optional '#contextual_links' property (if
   *   there are any contextual links associated with the block).
   * @param string $block_type
   *   The type of the block. If it's 'block' it's a regular views display,
   *   but 'exposed_filter' exist as well.
   */
  protected function addContextualLinks(&$output, $block_type = 'block') {

    // Do not add contextual links to an empty block.
    if (!empty($output)) {

      // Contextual links only work on blocks whose content is a renderable
      // array, so if the block contains a string of already-rendered markup,
      // convert it to an array.
      if (is_string($output)) {
        $output = array(
          '#markup' => $output,
        );
      }

      // Add the contextual links.
      views_add_contextual_links($output, $block_type, $this->view, $this->displayID);
    }
  }

}

Classes

Namesort descending Description
ViewsBlock Provides a generic Views block.