class Block

Same name in this branch
  1. main core/modules/views/src/Plugin/views/display/Block.php \Drupal\views\Plugin\views\display\Block
  2. main core/modules/block/src/Plugin/migrate/source/Block.php \Drupal\block\Plugin\migrate\source\Block
  3. main core/lib/Drupal/Core/Block/Attribute/Block.php \Drupal\Core\Block\Attribute\Block
  4. main core/lib/Drupal/Core/Block/Annotation/Block.php \Drupal\Core\Block\Annotation\Block
Same name and namespace in other branches
  1. 11.x core/modules/views/src/Plugin/views/display/Block.php \Drupal\views\Plugin\views\display\Block
  2. 11.x core/modules/block/src/Entity/Block.php \Drupal\block\Entity\Block
  3. 11.x core/modules/block/src/Plugin/migrate/source/Block.php \Drupal\block\Plugin\migrate\source\Block
  4. 11.x core/lib/Drupal/Core/Block/Attribute/Block.php \Drupal\Core\Block\Attribute\Block
  5. 11.x core/lib/Drupal/Core/Block/Annotation/Block.php \Drupal\Core\Block\Annotation\Block
  6. 10 core/modules/views/src/Plugin/views/display/Block.php \Drupal\views\Plugin\views\display\Block
  7. 10 core/modules/block/src/Entity/Block.php \Drupal\block\Entity\Block
  8. 10 core/modules/block/src/Plugin/migrate/source/Block.php \Drupal\block\Plugin\migrate\source\Block
  9. 10 core/lib/Drupal/Core/Block/Attribute/Block.php \Drupal\Core\Block\Attribute\Block
  10. 10 core/lib/Drupal/Core/Block/Annotation/Block.php \Drupal\Core\Block\Annotation\Block
  11. 9 core/modules/views/src/Plugin/views/display/Block.php \Drupal\views\Plugin\views\display\Block
  12. 9 core/modules/block/src/Entity/Block.php \Drupal\block\Entity\Block
  13. 9 core/modules/block/src/Plugin/migrate/source/Block.php \Drupal\block\Plugin\migrate\source\Block
  14. 9 core/lib/Drupal/Core/Block/Annotation/Block.php \Drupal\Core\Block\Annotation\Block
  15. 8.9.x core/modules/views/src/Plugin/views/display/Block.php \Drupal\views\Plugin\views\display\Block
  16. 8.9.x core/modules/block/src/Entity/Block.php \Drupal\block\Entity\Block
  17. 8.9.x core/modules/block/src/Plugin/migrate/source/Block.php \Drupal\block\Plugin\migrate\source\Block
  18. 8.9.x core/lib/Drupal/Core/Block/Annotation/Block.php \Drupal\Core\Block\Annotation\Block

Defines a Block configuration entity class.

Attributes

#[ConfigEntityType(id: 'block', label: new TranslatableMarkup('Block'), label_collection: new TranslatableMarkup('Blocks'), label_singular: new TranslatableMarkup('block'), label_plural: new TranslatableMarkup('blocks'), entity_keys: [ 'id' => 'id', 'status' => 'status', ], handlers: [ 'access' => BlockAccessControlHandler::class, 'view_builder' => BlockViewBuilder::class, 'list_builder' => BlockListBuilder::class, 'form' => [ 'default' => BlockForm::class, 'delete' => BlockDeleteForm::class, ], ], links: [ 'delete-form' => '/admin/structure/block/manage/{block}/delete', 'edit-form' => '/admin/structure/block/manage/{block}', 'enable' => '/admin/structure/block/manage/{block}/enable', 'disable' => '/admin/structure/block/manage/{block}/disable', ], admin_permission: 'administer blocks', label_count: [ 'singular' => '@count block', 'plural' => '@count blocks', ], lookup_keys: [ 'theme', ], config_export: [ 'id', 'theme', 'region', 'weight', 'provider', 'plugin', 'settings', 'visibility', ])]

Hierarchy

Expanded class hierarchy of Block

53 files declare their use of Block
AreaEntityUITest.php in core/modules/views_ui/tests/src/Functional/AreaEntityUITest.php
AssertBlockAppearsTrait.php in core/modules/block/tests/src/Functional/AssertBlockAppearsTrait.php
BigPipeInterfacePreviewThemeSuggestionsTest.php in core/modules/big_pipe/tests/src/Kernel/BigPipeInterfacePreviewThemeSuggestionsTest.php
block.api.php in core/modules/block/block.api.php
Hooks provided by the Block module.
BlockConfigEntityUnitTest.php in core/modules/block/tests/src/Unit/BlockConfigEntityUnitTest.php

... See full list

230 string references to 'Block'
AjaxFormCacheTest::testBlockForms in core/tests/Drupal/FunctionalJavascriptTests/Ajax/AjaxFormCacheTest.php
Tests AJAX forms in blocks.
AjaxFormCacheTest::testQueryString in core/tests/Drupal/FunctionalJavascriptTests/Ajax/AjaxFormCacheTest.php
Tests AJAX forms on pages with a query string.
AreaDisplayLinkTest::setUp in core/modules/views/tests/src/Kernel/Handler/AreaDisplayLinkTest.php
BigPipeInterfacePreviewThemeSuggestionsTest::setUp in core/modules/big_pipe/tests/src/Kernel/BigPipeInterfacePreviewThemeSuggestionsTest.php
BigPipeThemeHooks::themeSuggestionsBigPipeInterfacePreview in core/modules/big_pipe/src/Hook/BigPipeThemeHooks.php
Implements hook_theme_suggestions_HOOK().

... See full list

File

core/modules/block/src/Entity/Block.php, line 25

Namespace

Drupal\block\Entity
View source
class Block extends ConfigEntityBase implements BlockInterface, EntityWithPluginCollectionInterface {
  
  /**
   * The ID of the block.
   *
   * @var string
   */
  protected $id;
  
  /**
   * The plugin instance settings.
   *
   * @var array
   */
  protected $settings = [];
  
  /**
   * The region this block is placed in.
   *
   * @var string
   */
  protected $region;
  
  /**
   * The block weight.
   *
   * @var int
   */
  protected $weight = 0;
  
  /**
   * The plugin instance ID.
   *
   * @var string
   */
  protected $plugin;
  
  /**
   * The visibility settings for this block.
   *
   * @var array
   */
  protected $visibility = [];
  
  /**
   * The plugin collection that holds the block plugin for this entity.
   *
   * @var \Drupal\block\BlockPluginCollection
   */
  protected $pluginCollection;
  
  /**
   * The available contexts for this block and its visibility conditions.
   *
   * @var array
   */
  protected $contexts = [];
  
  /**
   * The visibility collection.
   *
   * @var \Drupal\Core\Condition\ConditionPluginCollection
   */
  protected $visibilityCollection;
  
  /**
   * The condition plugin manager.
   *
   * @var \Drupal\Core\Executable\ExecutableManagerInterface
   */
  protected $conditionPluginManager;
  
  /**
   * The theme that includes the block plugin for this entity.
   *
   * @var string
   */
  protected $theme;
  
  /**
   * {@inheritdoc}
   */
  public function getPlugin() {
    return $this->getPluginCollection()
      ->get($this->plugin);
  }
  
  /**
   * Encapsulates the creation of the block's LazyPluginCollection.
   *
   * @return \Drupal\Component\Plugin\LazyPluginCollection
   *   The block's plugin collection.
   */
  protected function getPluginCollection() {
    if (!$this->pluginCollection) {
      $this->pluginCollection = new BlockPluginCollection(\Drupal::service('plugin.manager.block'), $this->plugin, $this->get('settings'), $this->id());
    }
    return $this->pluginCollection;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getPluginCollections() {
    return [
      'settings' => $this->getPluginCollection(),
      'visibility' => $this->getVisibilityConditions(),
    ];
  }
  
  /**
   * {@inheritdoc}
   */
  public function getPluginId() {
    return $this->plugin;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getRegion() {
    return $this->region;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getTheme() {
    return $this->theme;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getWeight() {
    return $this->weight;
  }
  
  /**
   * {@inheritdoc}
   */
  public function label() {
    $settings = $this->get('settings');
    if ($settings['label']) {
      return $settings['label'];
    }
    else {
      $definition = $this->getPlugin()
        ->getPluginDefinition();
      return $definition['admin_label'];
    }
  }
  
  /**
   * Sorts active blocks by weight; sorts inactive blocks by name.
   */
  public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
    // Separate enabled from disabled.
    $status = (int) $b->status() - (int) $a->status();
    if ($status !== 0) {
      return $status;
    }
    // Sort by weight.
    $weight = $a->getWeight() - $b->getWeight();
    if ($weight) {
      return $weight;
    }
    // Sort by label.
    return strcmp($a->label(), $b->label());
  }
  
  /**
   * {@inheritdoc}
   */
  public function calculateDependencies() {
    parent::calculateDependencies();
    $this->addDependency('theme', $this->theme);
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getCacheTagsToInvalidate() {
    // Only use the block_list cache tag for blocks as they are usually very
    // rarely updated. Not having per-block cache tags results in a large
    // reduction of unique cache tags on any page that displays blocks.
    return $this->getEntityType()
      ->getListCacheTags();
  }
  
  /**
   * {@inheritdoc}
   */
  public function getVisibility() {
    return $this->getVisibilityConditions()
      ->getConfiguration();
  }
  
  /**
   * {@inheritdoc}
   */
  public function setVisibilityConfig($instance_id, array $configuration) {
    $conditions = $this->getVisibilityConditions();
    if (!$conditions->has($instance_id)) {
      $configuration['id'] = $instance_id;
      $conditions->addInstanceId($instance_id, $configuration);
    }
    else {
      $conditions->setInstanceConfiguration($instance_id, $configuration);
    }
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getVisibilityConditions() {
    if (!isset($this->visibilityCollection)) {
      $this->visibilityCollection = new ConditionPluginCollection($this->conditionPluginManager(), $this->get('visibility'));
    }
    return $this->visibilityCollection;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getVisibilityCondition($instance_id) {
    return $this->getVisibilityConditions()
      ->get($instance_id);
  }
  
  /**
   * Gets the condition plugin manager.
   *
   * @return \Drupal\Core\Executable\ExecutableManagerInterface
   *   The condition plugin manager.
   */
  protected function conditionPluginManager() {
    if (!isset($this->conditionPluginManager)) {
      $this->conditionPluginManager = \Drupal::service('plugin.manager.condition');
    }
    return $this->conditionPluginManager;
  }
  
  /**
   * {@inheritdoc}
   */
  public function setRegion($region) {
    $this->region = $region;
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  public function setWeight($weight) {
    $this->weight = (int) $weight;
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  public function createDuplicateBlock($new_id = NULL, $new_theme = NULL) {
    $duplicate = parent::createDuplicate();
    if (!empty($new_id)) {
      $duplicate->id = $new_id;
    }
    if (!empty($new_theme)) {
      $duplicate->theme = $new_theme;
    }
    return $duplicate;
  }
  
  /**
   * {@inheritdoc}
   */
  public function preSave(EntityStorageInterface $storage) {
    parent::preSave($storage);
    if (!is_int($this->weight)) {
      @trigger_error('Saving a block with a non-integer weight is deprecated in drupal:11.1.0 and removed in drupal:12.0.0. See https://www.drupal.org/node/3462474', E_USER_DEPRECATED);
      $this->setWeight((int) $this->weight);
    }
    // Ensure the region is valid to mirror the behavior of block_rebuild().
    // This is done primarily for backwards compatibility support of
    // \Drupal\block\BlockInterface::BLOCK_REGION_NONE.
    $regions = system_region_list($this->theme);
    if (!isset($this->region, $regions[$this->region]) && $this->status()) {
      $this->setRegion(system_default_region($this->theme))
        ->disable();
    }
  }
  
  /**
   * Validates that a region exists in the active theme.
   *
   * @param null|string $region
   *   The region to validate.
   * @param \Symfony\Component\Validator\Context\ExecutionContextInterface $context
   *   The validation context.
   */
  public static function validateRegion(?string $region, ExecutionContextInterface $context) : void {
    if ($theme = $context->getRoot()
      ->get('theme')
      ->getValue()) {
      if (!array_key_exists($region, system_region_list($theme))) {
        $context->addViolation('This is not a valid region of the %theme theme.', [
          '%theme' => $theme,
        ]);
      }
    }
    else {
      $context->addViolation('This block does not say which theme it appears in.');
    }
  }

}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.