Chris@17
|
1 <?php
|
Chris@17
|
2
|
Chris@17
|
3 namespace Drupal\layout_builder;
|
Chris@17
|
4
|
Chris@17
|
5 use Drupal\Core\Database\Connection;
|
Chris@17
|
6 use Drupal\Core\Entity\EntityInterface;
|
Chris@17
|
7
|
Chris@17
|
8 /**
|
Chris@17
|
9 * Service class to track inline block usage.
|
Chris@17
|
10 *
|
Chris@17
|
11 * @internal
|
Chris@17
|
12 */
|
Chris@17
|
13 class InlineBlockUsage {
|
Chris@17
|
14
|
Chris@17
|
15 /**
|
Chris@17
|
16 * The database connection.
|
Chris@17
|
17 *
|
Chris@17
|
18 * @var \Drupal\Core\Database\Connection
|
Chris@17
|
19 */
|
Chris@17
|
20 protected $database;
|
Chris@17
|
21
|
Chris@17
|
22 /**
|
Chris@17
|
23 * Creates an InlineBlockUsage object.
|
Chris@17
|
24 *
|
Chris@17
|
25 * @param \Drupal\Core\Database\Connection $database
|
Chris@17
|
26 * The database connection.
|
Chris@17
|
27 */
|
Chris@17
|
28 public function __construct(Connection $database) {
|
Chris@17
|
29 $this->database = $database;
|
Chris@17
|
30 }
|
Chris@17
|
31
|
Chris@17
|
32 /**
|
Chris@17
|
33 * Adds a usage record.
|
Chris@17
|
34 *
|
Chris@17
|
35 * @param int $block_content_id
|
Chris@17
|
36 * The block content id.
|
Chris@17
|
37 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@17
|
38 * The layout entity.
|
Chris@17
|
39 */
|
Chris@17
|
40 public function addUsage($block_content_id, EntityInterface $entity) {
|
Chris@17
|
41 $this->database->merge('inline_block_usage')
|
Chris@17
|
42 ->keys([
|
Chris@17
|
43 'block_content_id' => $block_content_id,
|
Chris@17
|
44 'layout_entity_id' => $entity->id(),
|
Chris@17
|
45 'layout_entity_type' => $entity->getEntityTypeId(),
|
Chris@17
|
46 ])->execute();
|
Chris@17
|
47 }
|
Chris@17
|
48
|
Chris@17
|
49 /**
|
Chris@17
|
50 * Gets unused inline block IDs.
|
Chris@17
|
51 *
|
Chris@17
|
52 * @param int $limit
|
Chris@17
|
53 * The maximum number of block content entity IDs to return.
|
Chris@17
|
54 *
|
Chris@17
|
55 * @return int[]
|
Chris@17
|
56 * The entity IDs.
|
Chris@17
|
57 */
|
Chris@17
|
58 public function getUnused($limit = 100) {
|
Chris@17
|
59 $query = $this->database->select('inline_block_usage', 't');
|
Chris@17
|
60 $query->fields('t', ['block_content_id']);
|
Chris@17
|
61 $query->isNull('layout_entity_id');
|
Chris@17
|
62 $query->isNull('layout_entity_type');
|
Chris@17
|
63 return $query->range(0, $limit)->execute()->fetchCol();
|
Chris@17
|
64 }
|
Chris@17
|
65
|
Chris@17
|
66 /**
|
Chris@17
|
67 * Remove usage record by layout entity.
|
Chris@17
|
68 *
|
Chris@17
|
69 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@17
|
70 * The layout entity.
|
Chris@17
|
71 */
|
Chris@17
|
72 public function removeByLayoutEntity(EntityInterface $entity) {
|
Chris@17
|
73 $query = $this->database->update('inline_block_usage')
|
Chris@17
|
74 ->fields([
|
Chris@17
|
75 'layout_entity_type' => NULL,
|
Chris@17
|
76 'layout_entity_id' => NULL,
|
Chris@17
|
77 ]);
|
Chris@17
|
78 $query->condition('layout_entity_type', $entity->getEntityTypeId());
|
Chris@17
|
79 $query->condition('layout_entity_id', $entity->id());
|
Chris@17
|
80 $query->execute();
|
Chris@17
|
81 }
|
Chris@17
|
82
|
Chris@17
|
83 /**
|
Chris@17
|
84 * Delete the inline blocks' the usage records.
|
Chris@17
|
85 *
|
Chris@17
|
86 * @param int[] $block_content_ids
|
Chris@17
|
87 * The block content entity IDs.
|
Chris@17
|
88 */
|
Chris@17
|
89 public function deleteUsage(array $block_content_ids) {
|
Chris@17
|
90 if (!empty($block_content_ids)) {
|
Chris@17
|
91 $query = $this->database->delete('inline_block_usage')->condition('block_content_id', $block_content_ids, 'IN');
|
Chris@17
|
92 $query->execute();
|
Chris@17
|
93 }
|
Chris@17
|
94 }
|
Chris@17
|
95
|
Chris@17
|
96 /**
|
Chris@17
|
97 * Gets usage record for inline block by ID.
|
Chris@17
|
98 *
|
Chris@17
|
99 * @param int $block_content_id
|
Chris@17
|
100 * The block content entity ID.
|
Chris@17
|
101 *
|
Chris@17
|
102 * @return object
|
Chris@17
|
103 * The usage record with properties layout_entity_id and layout_entity_type.
|
Chris@17
|
104 */
|
Chris@17
|
105 public function getUsage($block_content_id) {
|
Chris@17
|
106 $query = $this->database->select('inline_block_usage');
|
Chris@17
|
107 $query->condition('block_content_id', $block_content_id);
|
Chris@17
|
108 $query->fields('inline_block_usage', ['layout_entity_id', 'layout_entity_type']);
|
Chris@17
|
109 $query->range(0, 1);
|
Chris@17
|
110 return $query->execute()->fetchObject();
|
Chris@17
|
111 }
|
Chris@17
|
112
|
Chris@17
|
113 }
|