PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.18.0
GiveWP – Donation Plugin and Fundraising Platform v4.18.0
4.18.0 4.17.0 4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 All 257 releases
give / src / Framework / Blocks / BlockCollection.php

BlockCollection.php in GiveWP – Donation Plugin and Fundraising Platform 4.18.0, at src/Framework/Blocks/BlockCollection.php

242 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\Framework\Blocks;
4
5 use Give\Framework\Support\Contracts\Arrayable;
6
7 class BlockCollection implements Arrayable
8 {
9 /**
10 * @var BlockModel[]
11 */
12 protected $blocks;
13
14 /**
15 * @since 3.0.0
16 *
17 * @param BlockModel[] $blocks
18 */
19 public function __construct(array $blocks)
20 {
21 $this->blocks = $blocks;
22 }
23
24 /**
25 * @since 3.0.0
26 *
27 * @param BlockModel[] $blocks
28 */
29 public static function make($blocks): self
30 {
31 return new self($blocks);
32 }
33
34 /**
35 * @since 3.0.0
36 */
37 public static function fromJson($blocksJson): self
38 {
39 $blocksJson = json_decode($blocksJson, true, JSON_UNESCAPED_SLASHES);
40
41 $blocks = [];
42 foreach ($blocksJson as $block) {
43 $blocks[] = BlockModel::make($block);
44 }
45
46 return new self($blocks);
47 }
48
49 /**
50 * @since 3.0.0
51 *
52 * @return false|string
53 */
54 public function toJson()
55 {
56 return json_encode($this->toArray(), JSON_UNESCAPED_SLASHES);
57 }
58
59 /**
60 * @since 3.0.0
61 */
62 public function toArray(): array
63 {
64 return array_map(static function (BlockModel $block) {
65 return $block->toArray();
66 }, $this->blocks);
67 }
68
69 /**
70 * @return BlockModel[]
71 * @since 3.0.0
72 *
73 */
74 public function getBlocks(): array
75 {
76 return $this->blocks;
77 }
78
79 /**
80 * @since 3.0.0
81 *
82 * @return BlockModel|null
83 */
84 public function findByName(string $blockName, int $blockIndex = 0)
85 {
86 return $this->findByNameRecursive($blockName, $blockIndex);
87 }
88
89 public function findParentByChildName($blockName, int $blockIndex = 0)
90 {
91 foreach($this->blocks as $block) {
92 if($block->innerBlocks->findByName($blockName)) {
93 return $block;
94 }
95 }
96
97 // @todo Throw exception if not found.
98 }
99
100 /**
101 * @since 3.0.0
102 *
103 * @return array{0: BlockModel, 1: int}|void
104 */
105 public function findParentByBlockCollection(BlockCollection $blockCollection)
106 {
107 foreach ($this->blocks as $index => $block) {
108 if ($block->innerBlocks === $blockCollection) {
109 return [$block, $index];
110 }
111 }
112 // @todo Throw exception if not found.
113 }
114
115 /**
116 * @since 4.17.0 Declare the nullable parameter explicitly.
117 * @since 3.0.0
118 *
119 * @return BlockModel|BlockCollection|null
120 */
121 private function findByNameRecursive(string $blockName, int $blockIndex = 0, string $return = 'self', ?BlockCollection $blockCollection = null, int &$count = 0)
122 {
123 if (!$blockCollection) {
124 $blockCollection = $this;
125 }
126
127 foreach ($blockCollection->blocks as $block) {
128 if ($block->name === $blockName) {
129 $count++;
130
131 if ($count === $blockIndex + 1) {
132 if ($return === 'self') {
133 return $block;
134 } elseif ($return === 'parent') {
135 return $blockCollection;
136 }
137 }
138 } elseif ($block->innerBlocks) {
139 $result = $this->findByNameRecursive($blockName, $blockIndex, $return, $block->innerBlocks, $count);
140 if ($result) {
141 return $result;
142 }
143 }
144 }
145
146 return null;
147 }
148
149 /**
150 * @since 3.0.0
151 */
152 public function insertBefore(string $blockName, BlockModel $block, int $blockIndex = 0): BlockCollection
153 {
154 $blockCollection = $this->findByNameRecursive($blockName, $blockIndex, 'parent');
155
156 if (!$blockCollection) {
157 return $this;
158 }
159
160 $innerBlocks = $blockCollection->blocks;
161 $blockIndex = array_keys(
162 array_filter(array_column($innerBlocks, 'name'), function ($name) use ($blockName) {
163 return $name === $blockName;
164 })
165 )[$blockIndex];
166 array_splice($innerBlocks, $blockIndex, 0, [$block]);
167 $blockCollection->blocks = $innerBlocks;
168
169 return $this;
170 }
171
172 /**
173 * @since 3.0.0
174 */
175 public function insertAfter(string $blockName, BlockModel $block, int $blockIndex = 0): BlockCollection
176 {
177 $blockCollection = $this->findByNameRecursive($blockName, $blockIndex, 'parent');
178
179 if (!$blockCollection) {
180 return $this;
181 }
182
183 $innerBlocks = $blockCollection->blocks;
184 $blockIndex = array_keys(
185 array_filter(array_column($innerBlocks, 'name'), function ($name) use ($blockName) {
186 return $name === $blockName;
187 })
188 )[$blockIndex];
189 array_splice($innerBlocks, $blockIndex + 1, 0, [$block]);
190 $blockCollection->blocks = $innerBlocks;
191
192 return $this;
193 }
194
195 /**
196 * @since 3.0.0
197 */
198 public function prepend(BlockModel $block): BlockCollection
199 {
200 array_unshift($this->blocks, $block);
201 return $this;
202 }
203
204 /**
205 * @since 3.0.0
206 */
207 public function append(BlockModel $block): BlockCollection
208 {
209 $this->blocks[] = $block;
210 return $this;
211 }
212
213 /**
214 * @since 3.15.0 returns the block collection if block does not exist.
215 * @since 3.0.0
216 */
217 public function remove($blockName) {
218 $blockCollection = $this->findByNameRecursive($blockName, 0, 'parent');
219 $innerBlocks = $blockCollection->blocks;
220
221 if(!$innerBlocks){
222 return $this;
223 }
224
225 $blockIndex = array_search($blockName, array_column($innerBlocks, 'name'));
226 array_splice($innerBlocks, $blockIndex, 1);
227 $blockCollection->blocks = $innerBlocks;
228 return $this;
229 }
230
231 public function walk(callable $callback)
232 {
233 foreach ($this->blocks as $block) {
234 $callback($block);
235
236 if ($block->innerBlocks) {
237 $block->innerBlocks->walk($callback);
238 }
239 }
240 }
241 }
242