BlockVariantTrait.php

Same filename in other branches
  1. 4.0.x src/Plugin/BlockVariantTrait.php

Namespace

Drupal\ctools\Plugin

File

src/Plugin/BlockVariantTrait.php

View source
<?php

namespace Drupal\ctools\Plugin;

use Drupal\ctools\Event\BlockVariantEvent;
use Drupal\ctools\Event\BlockVariantEvents;

/**
 * Provides methods for \Drupal\ctools\Plugin\BlockVariantInterface.
 */
trait BlockVariantTrait {
    
    /**
     * The block manager.
     *
     * @var \Drupal\Core\Block\BlockManager
     */
    protected $blockManager;
    
    /**
     * The plugin collection that holds the block plugins.
     *
     * @var \Drupal\ctools\Plugin\BlockPluginCollection
     */
    protected $blockPluginCollection;
    
    /**
     * The event dispatcher.
     *
     * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
     */
    protected $eventDispatcher;
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::getRegionNames()
     */
    public abstract function getRegionNames();
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::getBlock()
     */
    public function getBlock($block_id) {
        return $this->getBlockCollection()
            ->get($block_id);
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::addBlock()
     */
    public function addBlock(array $configuration) {
        $configuration['uuid'] = $this->uuidGenerator()
            ->generate();
        $this->getBlockCollection()
            ->addInstanceId($configuration['uuid'], $configuration);
        $block = $this->getBlock($configuration['uuid']);
        // Allow modules to react to the change.
        $event = new BlockVariantEvent($block, $this);
        $this->eventDispatcher()
            ->dispatch($event, BlockVariantEvents::ADD_BLOCK);
        return $configuration['uuid'];
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::removeBlock()
     */
    public function removeBlock($block_id) {
        $block = $this->getBlock($block_id);
        $this->getBlockCollection()
            ->removeInstanceId($block_id);
        // Allow modules to react to the change.
        $event = new BlockVariantEvent($block, $this);
        $this->eventDispatcher()
            ->dispatch($event, BlockVariantEvents::DELETE_BLOCK);
        return $this;
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::updateBlock()
     */
    public function updateBlock($block_id, array $configuration) {
        $block = $this->getBlock($block_id);
        $existing_configuration = $block->getConfiguration();
        $this->getBlockCollection()
            ->setInstanceConfiguration($block_id, $configuration + $existing_configuration);
        // Allow modules to react to the change.
        $event = new BlockVariantEvent($block, $this);
        $this->eventDispatcher()
            ->dispatch($event, BlockVariantEvents::UPDATE_BLOCK);
        return $this;
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::getRegionAssignment()
     */
    public function getRegionAssignment($block_id) {
        $configuration = $this->getBlock($block_id)
            ->getConfiguration();
        return $configuration['region'] ?? NULL;
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::getRegionAssignments()
     */
    public function getRegionAssignments() {
        // Build an array of the region names in the right order.
        $empty = array_fill_keys(array_keys($this->getRegionNames()), []);
        $full = $this->getBlockCollection()
            ->getAllByRegion();
        // Merge it with the actual values to maintain the ordering.
        return array_intersect_key(array_merge($empty, $full), $empty);
    }
    
    /**
     * @see \Drupal\ctools\Plugin\BlockVariantInterface::getRegionName()
     */
    public function getRegionName($region) {
        $regions = $this->getRegionNames();
        return $regions[$region] ?? '';
    }
    
    /**
     * Gets the block plugin manager.
     *
     * @return \Drupal\Core\Block\BlockManager
     *   The block plugin manager.
     */
    protected function getBlockManager() {
        if (!$this->blockManager) {
            $this->blockManager = \Drupal::service('plugin.manager.block');
        }
        return $this->blockManager;
    }
    
    /**
     * Returns the block plugins used for this display variant.
     *
     * @return \Drupal\Core\Block\BlockPluginInterface[]|\Drupal\ctools\Plugin\BlockPluginCollection
     *   An array or collection of configured block plugins.
     */
    protected function getBlockCollection() {
        if (!$this->blockPluginCollection) {
            $this->blockPluginCollection = new BlockPluginCollection($this->getBlockManager(), $this->getBlockConfig());
        }
        return $this->blockPluginCollection;
    }
    
    /**
     * Gets the event dispatcher.
     *
     * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface
     */
    protected function eventDispatcher() {
        if (!$this->eventDispatcher) {
            $this->eventDispatcher = \Drupal::service('event_dispatcher');
        }
        return $this->eventDispatcher;
    }
    
    /**
     * Returns the UUID generator.
     *
     * @return \Drupal\Component\Uuid\UuidInterface
     */
    protected abstract function uuidGenerator();
    
    /**
     * Returns the configuration for stored blocks.
     *
     * @return array
     *   An array of block configuration, keyed by the unique block ID.
     */
    protected abstract function getBlockConfig();

}

Traits

Title Deprecated Summary
BlockVariantTrait Provides methods for \Drupal\ctools\Plugin\BlockVariantInterface.