1<?php 2 3namespace Drupal\layout_builder; 4 5use Drupal\Core\Database\Connection; 6use Drupal\Core\Entity\EntityInterface; 7 8/** 9 * Service class to track inline block usage. 10 */ 11class InlineBlockUsage implements InlineBlockUsageInterface { 12 13 /** 14 * The database connection. 15 * 16 * @var \Drupal\Core\Database\Connection 17 */ 18 protected $database; 19 20 /** 21 * Creates an InlineBlockUsage object. 22 * 23 * @param \Drupal\Core\Database\Connection $database 24 * The database connection. 25 */ 26 public function __construct(Connection $database) { 27 $this->database = $database; 28 } 29 30 /** 31 * {@inheritdoc} 32 */ 33 public function addUsage($block_content_id, EntityInterface $entity) { 34 $this->database->merge('inline_block_usage') 35 ->keys([ 36 'block_content_id' => $block_content_id, 37 'layout_entity_id' => $entity->id(), 38 'layout_entity_type' => $entity->getEntityTypeId(), 39 ])->execute(); 40 } 41 42 /** 43 * {@inheritdoc} 44 */ 45 public function getUnused($limit = 100) { 46 $query = $this->database->select('inline_block_usage', 't'); 47 $query->fields('t', ['block_content_id']); 48 $query->isNull('layout_entity_id'); 49 $query->isNull('layout_entity_type'); 50 return $query->range(0, $limit)->execute()->fetchCol(); 51 } 52 53 /** 54 * {@inheritdoc} 55 */ 56 public function removeByLayoutEntity(EntityInterface $entity) { 57 $query = $this->database->update('inline_block_usage') 58 ->fields([ 59 'layout_entity_type' => NULL, 60 'layout_entity_id' => NULL, 61 ]); 62 $query->condition('layout_entity_type', $entity->getEntityTypeId()); 63 $query->condition('layout_entity_id', $entity->id()); 64 $query->execute(); 65 } 66 67 /** 68 * {@inheritdoc} 69 */ 70 public function deleteUsage(array $block_content_ids) { 71 if (!empty($block_content_ids)) { 72 $query = $this->database->delete('inline_block_usage')->condition('block_content_id', $block_content_ids, 'IN'); 73 $query->execute(); 74 } 75 } 76 77 /** 78 * {@inheritdoc} 79 */ 80 public function getUsage($block_content_id) { 81 $query = $this->database->select('inline_block_usage'); 82 $query->condition('block_content_id', $block_content_id); 83 $query->fields('inline_block_usage', ['layout_entity_id', 'layout_entity_type']); 84 $query->range(0, 1); 85 return $query->execute()->fetchObject(); 86 } 87 88} 89