PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.8
GiveWP – Donation Plugin and Fundraising Platform v4.16.8
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 2.3.2 2.30.0 2.31.0 2.31.1 All 253 releases
give / src / Framework / Blocks / BlockCollection.php
BlockCollection.php
241 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 3.0.0
117 *
118 * @return BlockModel|BlockCollection|null
119 */
120 private function findByNameRecursive(string $blockName, int $blockIndex = 0, string $return = 'self', BlockCollection $blockCollection = null, int &$count = 0)
121 {
122 if (!$blockCollection) {
123 $blockCollection = $this;
124 }
125
126 foreach ($blockCollection->blocks as $block) {
127 if ($block->name === $blockName) {
128 $count++;
129
130 if ($count === $blockIndex + 1) {
131 if ($return === 'self') {
132 return $block;
133 } elseif ($return === 'parent') {
134 return $blockCollection;
135 }
136 }
137 } elseif ($block->innerBlocks) {
138 $result = $this->findByNameRecursive($blockName, $blockIndex, $return, $block->innerBlocks, $count);
139 if ($result) {
140 return $result;
141 }
142 }
143 }
144
145 return null;
146 }
147
148 /**
149 * @since 3.0.0
150 */
151 public function insertBefore(string $blockName, BlockModel $block, int $blockIndex = 0): BlockCollection
152 {
153 $blockCollection = $this->findByNameRecursive($blockName, $blockIndex, 'parent');
154
155 if (!$blockCollection) {
156 return $this;
157 }
158
159 $innerBlocks = $blockCollection->blocks;
160 $blockIndex = array_keys(
161 array_filter(array_column($innerBlocks, 'name'), function ($name) use ($blockName) {
162 return $name === $blockName;
163 })
164 )[$blockIndex];
165 array_splice($innerBlocks, $blockIndex, 0, [$block]);
166 $blockCollection->blocks = $innerBlocks;
167
168 return $this;
169 }
170
171 /**
172 * @since 3.0.0
173 */
174 public function insertAfter(string $blockName, BlockModel $block, int $blockIndex = 0): BlockCollection
175 {
176 $blockCollection = $this->findByNameRecursive($blockName, $blockIndex, 'parent');
177
178 if (!$blockCollection) {
179 return $this;
180 }
181
182 $innerBlocks = $blockCollection->blocks;
183 $blockIndex = array_keys(
184 array_filter(array_column($innerBlocks, 'name'), function ($name) use ($blockName) {
185 return $name === $blockName;
186 })
187 )[$blockIndex];
188 array_splice($innerBlocks, $blockIndex + 1, 0, [$block]);
189 $blockCollection->blocks = $innerBlocks;
190
191 return $this;
192 }
193
194 /**
195 * @since 3.0.0
196 */
197 public function prepend(BlockModel $block): BlockCollection
198 {
199 array_unshift($this->blocks, $block);
200 return $this;
201 }
202
203 /**
204 * @since 3.0.0
205 */
206 public function append(BlockModel $block): BlockCollection
207 {
208 $this->blocks[] = $block;
209 return $this;
210 }
211
212 /**
213 * @since 3.15.0 returns the block collection if block does not exist.
214 * @since 3.0.0
215 */
216 public function remove($blockName) {
217 $blockCollection = $this->findByNameRecursive($blockName, 0, 'parent');
218 $innerBlocks = $blockCollection->blocks;
219
220 if(!$innerBlocks){
221 return $this;
222 }
223
224 $blockIndex = array_search($blockName, array_column($innerBlocks, 'name'));
225 array_splice($innerBlocks, $blockIndex, 1);
226 $blockCollection->blocks = $innerBlocks;
227 return $this;
228 }
229
230 public function walk(callable $callback)
231 {
232 foreach ($this->blocks as $block) {
233 $callback($block);
234
235 if ($block->innerBlocks) {
236 $block->innerBlocks->walk($callback);
237 }
238 }
239 }
240 }
241