namespace Drupal\block_content\Entity;
+use Drupal\block_content\Access\RefinableDependentAccessTrait;
use Drupal\Core\Entity\EditorialContentEntityBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
* @ContentEntityType(
* id = "block_content",
* label = @Translation("Custom block"),
+ * label_collection = @Translation("Custom blocks"),
+ * label_singular = @Translation("custom block"),
+ * label_plural = @Translation("custom blocks"),
+ * label_count = @PluralTranslation(
+ * singular = "@count custom block",
+ * plural = "@count custom blocks",
+ * ),
* bundle_label = @Translation("Custom block type"),
* handlers = {
* "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage",
*/
class BlockContent extends EditorialContentEntityBase implements BlockContentInterface {
+ use RefinableDependentAccessTrait;
+
/**
* The theme the block is being created in.
*
*/
public function postSave(EntityStorageInterface $storage, $update = TRUE) {
parent::postSave($storage, $update);
- static::invalidateBlockPluginCache();
+ if ($this->isReusable() || (isset($this->original) && $this->original->isReusable())) {
+ static::invalidateBlockPluginCache();
+ }
}
/**
*/
public static function postDelete(EntityStorageInterface $storage, array $entities) {
parent::postDelete($storage, $entities);
- static::invalidateBlockPluginCache();
+ /** @var \Drupal\block_content\BlockContentInterface $block */
+ foreach ($entities as $block) {
+ if ($block->isReusable()) {
+ // If any deleted blocks are reusable clear the block cache.
+ static::invalidateBlockPluginCache();
+ return;
+ }
+ }
}
/**
->setTranslatable(TRUE)
->setRevisionable(TRUE);
+ $fields['reusable'] = BaseFieldDefinition::create('boolean')
+ ->setLabel(t('Reusable'))
+ ->setDescription(t('A boolean indicating whether this block is reusable.'))
+ ->setTranslatable(FALSE)
+ ->setRevisionable(FALSE)
+ ->setDefaultValue(TRUE);
+
return $fields;
}
return $this;
}
+ /**
+ * {@inheritdoc}
+ */
+ public function isReusable() {
+ return (bool) $this->get('reusable')->value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setReusable() {
+ return $this->set('reusable', TRUE);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setNonReusable() {
+ return $this->set('reusable', FALSE);
+ }
+
/**
* Invalidates the block plugin cache after changes and deletions.
*/