PluginProbe
JetFormBuilder — Dynamic Blocks Form Builder / 3.6.0.1
JetFormBuilder — Dynamic Blocks Form Builder v3.6.0.1
3.6.6.1 3.6.6 3.6.5.4 3.6.5.3 3.6.5.2 3.6.5.1 3.6.5 3.6.4.2 3.6.4.1 3.6.4 3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 All 134 releases
jetformbuilder / includes / blocks / block-helper.php

block-helper.php in JetFormBuilder — Dynamic Blocks Form Builder 3.6.0.1, at includes/blocks/block-helper.php

293 lines 6.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3
4 namespace Jet_Form_Builder\Blocks;
5
6 use Jet_Form_Builder\Blocks\Types\Base;
7 use Jet_Form_Builder\Form_Manager;
8
9 // If this file is called directly, abort.
10 if ( ! defined( 'WPINC' ) ) {
11 die;
12 }
13
14 /**
15 * Class Helper
16 *
17 * @package Jet_Form_Builder\Blocks
18 */
19 class Block_Helper {
20
21 /**
22 * @since 3.1.1
23 *
24 * @param $parsed_block
25 *
26 * @return string
27 * @throws \Exception
28 */
29 public static function resolve_name( $parsed_block ): string {
30 $name = is_string( $parsed_block ) ? $parsed_block : $parsed_block['blockName'] ?? '';
31
32 // is has 'jet-forms/' namespace in 'blockName' property
33 if ( ! is_string( $name ) || ! self::is_field( $name ) ) {
34 throw new \Exception( 'empty_or_not_field' );
35 }
36
37 if ( ! \WP_Block_Type_Registry::get_instance()->is_registered( $name ) ) {
38 throw new \Exception( 'not_block_type' );
39 }
40
41 return self::delete_namespace( $name );
42 }
43
44 /**
45 * @param $value
46 * @param $blocks
47 *
48 * @return array
49 */
50 public static function find_block_by_name( $value, $blocks ): array {
51 return self::find_block_by_attr( $value, 'name', $blocks );
52 }
53
54 /**
55 * @param $value
56 * @param $attr_name
57 * @param $blocks
58 *
59 * @return array
60 */
61 public static function find_block_by_attr( $value, $attr_name, $blocks ): array {
62 return self::find_block(
63 function ( $block ) use ( $value, $attr_name ) {
64 if ( empty( $block['blockName'] ) || ! self::is_field( $block['blockName'] ) ) {
65 return false;
66 }
67 return ( ( $block['attrs'][ $attr_name ] ?? false ) === $value );
68 },
69 $blocks
70 );
71 }
72
73 public static function find_by_block_name( array $blocks, string $block_name ): array {
74 return self::find_block(
75 function ( $block ) use ( $block_name ) {
76 return ( ( $block['blockName'] ?? false ) === $block_name );
77 },
78 $blocks
79 );
80 }
81
82 public static function get_form_field_names( $blocks ): array {
83 $names = array();
84
85 self::find_block(
86 function ( $block ) use ( &$names ) {
87 if ( empty( $block['blockName'] ) || ! self::is_field( $block['blockName'] ) ) {
88 return false;
89 }
90 if ( ! empty( $block['attrs']['name'] ) ) {
91 $names[ $block['attrs']['name'] ] = 1;
92 }
93
94 return false;
95 },
96 $blocks
97 );
98
99 return $names;
100 }
101
102 public static function find_block( $callback, $blocks ): array {
103 if ( ! is_callable( $callback ) ) {
104 return array();
105 }
106 foreach ( $blocks as $block ) {
107 if ( ! isset( $block['blockName'] ) && ! isset( $block['attrs'] ) ) {
108 continue;
109 }
110 if ( call_user_func( $callback, $block ) ) {
111 return $block;
112 }
113
114 if ( 0 < count( $block['innerBlocks'] ?? array() ) ) {
115 $find = self::find_block( $callback, $block['innerBlocks'] );
116
117 if ( $find ) {
118 return $find;
119 }
120 }
121 }
122
123 return array();
124 }
125
126
127 /**
128 * @param $blocks
129 * @param string $scope
130 *
131 * @return array
132 */
133 public static function filter_blocks_by_namespace( $blocks, string $scope = Form_Manager::NAMESPACE_FIELDS ): array {
134 $fields = array();
135 $generator = self::generate_blocks_in_space( $blocks, $scope );
136
137 foreach ( $generator as $block ) {
138 $fields[] = $block;
139 }
140
141 return $fields;
142 }
143
144 /**
145 * @since 3.1.0
146 *
147 * @param array $blocks
148 * @param string $scope
149 *
150 * @return \Generator
151 */
152 public static function generate_blocks_in_space(
153 array $blocks,
154 string $scope = Form_Manager::NAMESPACE_FIELDS
155 ): \Generator {
156 return self::generate_blocks(
157 static function ( $block ) use ( $scope ) {
158 return ( false !== stripos( $block['blockName'], $scope ) );
159 },
160 $blocks
161 );
162 }
163
164 /**
165 * @param $callback
166 * @param array $source
167 *
168 * @return \Generator
169 * @since 3.1.0
170 */
171 public static function generate_blocks( $callback, array $source ): \Generator {
172 foreach ( $source as $index => $block ) {
173 if ( ! isset( $block['blockName'] ) ) {
174 continue;
175 }
176 if ( call_user_func( $callback, $block ) ) {
177 yield $block;
178 }
179
180 if ( ! empty( $block['innerBlocks'] ) ) {
181 yield from self::generate_blocks( $callback, $block['innerBlocks'] );
182 }
183 }
184 }
185
186 public static function get_blocks_by_post( $post_id ): array {
187 $post = get_post( $post_id );
188
189 if ( ! is_a( $post, \WP_Post::class ) ) {
190 return array();
191 }
192
193 return array_map(
194 function ( $block ) {
195 self::walk_by_reusable( $block );
196
197 return $block;
198 },
199 parse_blocks( $post->post_content )
200 );
201 }
202
203 private static function walk_by_reusable( array &$block ) {
204 if ( ! empty( $block['innerBlocks'] ) ) {
205 foreach ( $block['innerBlocks'] as &$current ) {
206 self::walk_by_reusable( $current );
207 }
208
209 return;
210 }
211
212 if ( 'core/block' !== $block['blockName'] ) {
213 return;
214 }
215
216 $reusable_id = $block['attrs']['ref'] ?? 0;
217 $block['innerBlocks'] = self::get_blocks_by_post( $reusable_id );
218 }
219
220 public static function delete_namespace( $block ): string {
221 if ( is_array( $block ) ) {
222 $block = $block['blockName'] ?? '';
223 }
224
225 if ( stripos( $block, '/' ) === false ) {
226 return $block;
227 }
228
229 return explode( '/', $block )[1] ?? '';
230 }
231
232 public static function is_field( string $block_name ): bool {
233 return ( stripos( $block_name, Form_Manager::NAMESPACE_FIELDS ) !== false );
234 }
235
236 public static function render_with_context( $block, $context ) {
237 return ( new \WP_Block( $block, $context ) )->render();
238 }
239
240 public static function pref( string $block_name ): string {
241 return Form_Manager::NAMESPACE_FIELDS . self::delete_namespace( $block_name );
242 }
243
244 public static function get_attrs_from_block( array $block, array $attrs_list ): array {
245 $source = $block['attrs'] ?? $block;
246 $attrs = array();
247
248 foreach ( $attrs_list as $attr_name ) {
249 if ( ! isset( $source[ $attr_name ] ) ) {
250 continue;
251 }
252 $attrs[ $attr_name ] = $source[ $attr_name ];
253 }
254
255 return $attrs;
256 }
257
258 /**
259 * @param $names
260 *
261 * @return array|string
262 */
263 public static function get_block_names( $names ) {
264 if ( ! is_array( $names ) ) {
265 $block = jet_form_builder()->blocks->get_field_by_name( $names );
266
267 return $block->get_name();
268 }
269
270 return array_map(
271 array( static::class, 'get_block_names' ),
272 $names
273 );
274 }
275
276 public static function current_block(): array {
277 return is_array( \WP_Block_Supports::$block_to_render )
278 ? \WP_Block_Supports::$block_to_render
279 : array();
280 }
281
282
283 /**
284 * @return \WP_Block_Type|null
285 */
286 public static function current_block_type() {
287 $name = self::current_block()['blockName'] ?? '';
288
289 return \WP_Block_Type_Registry::get_instance()->get_registered( $name );
290 }
291
292 }
293