PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / BlockLibrary / ProductListMigrationService.php
surecart / app / src / BlockLibrary Last commit date
BlockAnchorSupportService.php 1 year ago BlockPatternsService.php 1 year ago BlockService.php 1 year ago BlockServiceProvider.php 1 year ago BlockStylesService.php 1 year ago BlockValidationService.php 2 years ago CartMenuIconMigrationService.php 1 year ago CartMigrationService.php 1 year ago FormModeSwitcherService.php 1 year ago ProductCollectionBadgesMigrationService.php 1 year ago ProductListMigrationService.php 1 year ago ProductListService.php 1 year ago ProductPageBlocksMigrationService.php 1 year ago ProductPriceChoicesMigrationService.php 1 year ago ProductSelectedPriceMigrationService.php 1 year ago ProductVariantsMigrationService.php 1 year ago URLParamService.php 1 year ago
ProductListMigrationService.php
387 lines
1 <?php
2
3 namespace SureCart\BlockLibrary;
4
5 /**
6 * Provide product list migration functionality.
7 */
8 class ProductListMigrationService {
9 /**
10 * Attributes.
11 *
12 * @var array
13 */
14 public array $attributes = array();
15
16 /**
17 * Block.
18 *
19 * @var \WP_Block_Type;
20 */
21 public ?object $block;
22
23 /**
24 * Block HTML.
25 *
26 * @var string
27 */
28 public string $block_html = '';
29
30 /**
31 * Inner Blocks.
32 *
33 * @var array
34 */
35 public array $inner_blocks = array();
36
37 /**
38 * Set the initial variables.
39 *
40 * @param array $attributes Attributes.
41 * @param object $block Block.
42 */
43 public function __construct( $attributes = array(), $block = null ) {
44 $this->attributes = $attributes;
45 $this->block = $block;
46 $default_inner_blocks = array(
47 array(
48 'blockName' => 'surecart/product-item',
49 'attrs' => array(),
50 'innerBlocks' => array(
51 array(
52 'blockName' => 'surecart/product-item-image',
53 'attrs' => array(),
54 ),
55 array(
56 'blockName' => 'surecart/product-item-price',
57 'attrs' => array(),
58 ),
59 array(
60 'blockName' => 'surecart/product-item-title',
61 'attrs' => array(),
62 ),
63 ),
64 ),
65 ); // For Shortcodes.
66 $this->inner_blocks = $block->parsed_block['innerBlocks'] ?? $default_inner_blocks;
67 }
68
69 /**
70 * Get the Child Blocks Attributes.
71 *
72 * @param string $block_name Block Name.
73 * @return array Child Blocks Attributes.
74 */
75 public function getChildBlocksAttributes( $block_name ) {
76 if ( empty( $this->inner_blocks ) || empty( $this->inner_blocks[0]['innerBlocks'] ) ) {
77 return array();
78 }
79
80 foreach ( $this->inner_blocks[0]['innerBlocks'] as $block ) {
81 if ( $block['blockName'] === $block_name ) {
82 if ( 'surecart/product-item-title' === $block_name ) {
83 $block['attrs']['level'] = 0;
84 }
85 if ( 'surecart/product-item-price' === $block_name && isset( $block['attrs']['range'] ) ) {
86 $block['attrs']['show_range'] = $block['attrs']['range'];
87 }
88 return $block['attrs'];
89 }
90 }
91 return array();
92 }
93
94 /**
95 * Render the product list.
96 *
97 * @return void
98 */
99 public function renderProductList(): void {
100 if ( ! isset( $this->attributes['query'] ) ) {
101 $this->attributes['query'] = [];
102 }
103 $this->attributes['query']['perPage'] = $this->attributes['limit'] ?? 8;
104
105 $this->block_html .= '<!-- wp:surecart/product-list' . ( ! empty( $this->attributes ) ? ' ' . wp_json_encode( $this->attributes ) : '' ) . ' -->';
106
107 $this->renderSortFilterAndSearch();
108
109 $this->renderFilterTags();
110
111 $this->renderProductTemplate();
112
113 $this->renderPagination();
114
115 $this->block_html .= '<!-- /wp:surecart/product-list -->';
116 }
117
118 /**
119 * Render the sort, filter and search.
120 *
121 * @return void
122 */
123 public function renderSortFilterAndSearch(): void {
124 // we don't have any of these items enabled, so we don't need to render anything.
125 $sort_enabled = wp_validate_boolean( $this->attributes['sort_enabled'] ?? true );
126 $collection_enabled = wp_validate_boolean( $this->attributes['collection_enabled'] ?? true );
127 $search_enabled = wp_validate_boolean( $this->attributes['search_enabled'] ?? true );
128 if ( ! $sort_enabled && ! $collection_enabled && ! $search_enabled ) {
129 return;
130 }
131
132 $this->block_html .= '<!-- wp:group {"style":{"spacing":{"margin":{"bottom":"10px"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->';
133 $this->block_html .= '<div class="wp-block-group" style="margin-bottom:10px">';
134
135 $this->renderSortAndFilter();
136
137 $this->renderSearch();
138
139 $this->block_html .= '</div><!-- /wp:group -->';
140 }
141
142 /**
143 * Render the sort and filter.
144 *
145 * @return void
146 */
147 public function renderSortAndFilter(): void {
148 $sort_enabled = wp_validate_boolean( $this->attributes['sort_enabled'] ?? true );
149 $collection_enabled = wp_validate_boolean( $this->attributes['collection_enabled'] ?? true );
150
151 if ( ! $sort_enabled && ! $collection_enabled ) {
152 return;
153 }
154
155 $this->block_html .= '<!-- wp:group {"layout":{"type":"flex","flexWrap":"nowrap"}} -->';
156 $this->block_html .= '<div class="wp-block-group">';
157
158 if ( $sort_enabled ) {
159 $this->block_html .= '<!-- wp:surecart/product-list-sort /-->';
160 }
161
162 if ( $collection_enabled ) {
163 $this->block_html .= '<!-- wp:surecart/product-list-filter /-->';
164 }
165
166 $this->block_html .= '</div><!-- /wp:group -->';
167 }
168
169 /**
170 * Render the search.
171 *
172 * @return void
173 */
174 public function renderSearch(): void {
175 $search_enabled = wp_validate_boolean( $this->attributes['search_enabled'] ?? true );
176
177 if ( ! $search_enabled ) {
178 return;
179 }
180
181 $this->block_html .= '<!-- wp:surecart/product-list-search {"style":{"layout":{"selfStretch":"fixed","flexSize":"250px"}}} /-->';
182 }
183
184 /**
185 * Render the filter tags.
186 *
187 * @return void
188 */
189 public function renderFilterTags(): void {
190 $collection_enabled = wp_validate_boolean( $this->attributes['collection_enabled'] ?? true );
191
192 if ( ! $collection_enabled ) {
193 return;
194 }
195
196 $this->block_html .= '<!-- wp:group {"style":{"spacing":{"margin":{"bottom":"10px"}}},"layout":{"type":"flex","flexWrap":"nowrap"}} -->';
197 $this->block_html .= '<div class="wp-block-group" style="margin-bottom:10px">';
198 $this->block_html .= '<!-- wp:surecart/product-list-filter-tags -->';
199 $this->block_html .= '<!-- wp:surecart/product-list-filter-tag /-->';
200 $this->block_html .= '</div><!-- /wp:group -->';
201 $this->block_html .= '</div><!-- /wp:group -->';
202 }
203
204 /**
205 * Render the product title.
206 *
207 * @return void
208 */
209 public function renderTitle(): void {
210 $product_title_attrs = $this->getChildBlocksAttributes( 'surecart/product-item-title' );
211 if ( ! isset( $product_title_attrs['style'] ) ) {
212 $product_title_attrs['style'] = array();
213 }
214 if ( ! isset( $product_title_attrs['style']['spacing'] ) ) {
215 $product_title_attrs['style']['spacing'] = array();
216 }
217
218 // this is the default.
219 if ( isset( $product_title_attrs['style']['spacing']['padding']['top'] ) && $product_title_attrs['style']['spacing']['padding']['top'] === '10px' ) {
220 $product_title_attrs['style']['spacing']['margin'] = array_merge(
221 $product_title_attrs['style']['spacing']['margin'] ?? array(),
222 array(
223 'bottom' => $product_title_attrs['style']['spacing']['margin']['bottom'] ?? '0px',
224 'top' => '0px',
225 ),
226 );
227 }
228
229 $this->block_html .= '<!-- wp:surecart/product-title ' . wp_json_encode( $product_title_attrs, JSON_FORCE_OBJECT ) . ' /-->';
230 }
231
232 /**
233 * Render the product image.
234 *
235 * @return void
236 */
237 public function renderImage(): void {
238 $attributes = $this->getChildBlocksAttributes( 'surecart/product-item-image' );
239 $product_image_attrs = array(
240 'useFeaturedImage' => true,
241 'minHeight' => 0,
242 'dimRatio' => 0,
243 'isUserOverlayColor' => true,
244 'focalPoint' => array(
245 'x' => 0.5,
246 'y' => 0.5,
247 ),
248 'contentPosition' => 'top right',
249 'isDark' => false,
250 'style' => array(
251 'dimensions' => array( 'aspectRatio' => ! empty( $attributes['ratio'] ) ? $attributes['ratio'] : '3/4' ),
252 'layout' => array(
253 'selfStretch' => 'fit',
254 'flexSize' => null,
255 ),
256 'spacing' => array( 'margin' => array( 'bottom' => '15px' ) ),
257 'border' => array( 'radius' => '10px' ),
258 ),
259 );
260
261 $image = '<!-- wp:group {"style":{"color":{"background":"#0000000d"},"border":{"radius":"10px"},"spacing":{"padding":{"top":"0px","bottom":"0px","left":"0px","right":"0px"},"margin":{"top":"0px","bottom":"0px"}}},"layout":{"type":"constrained"}} -->';
262 $image .= '<div class="wp-block-group has-background" style="border-radius:10px;background-color:#0000000d;margin-top:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px">';
263 $image .= '<!-- wp:cover ' . wp_json_encode( array_replace_recursive( $product_image_attrs, [] ) ) . ' -->';
264 $image .= '<div class="wp-block-cover is-light has-custom-content-position is-position-top-right" style="border-radius:10px;">';
265 $image .= '<span aria-hidden="true" class="wp-block-cover__background has-background-dim-0 has-background-dim"></span>';
266 $image .= '<div class="wp-block-cover__inner-container">';
267 $image .= '<!-- wp:surecart/product-sale-badge {"style":{"typography":{"fontSize":"12px"},"border":{"radius":"100px"}}} /-->';
268 $image .= '</div>';
269 $image .= '</div>';
270 $image .= '<!-- /wp:cover -->';
271 $image .= '</div>';
272 $image .= '<!-- /wp:group -->';
273
274 $this->block_html .= $image;
275 }
276
277 /**
278 * Render the product price.
279 *
280 * @return void
281 */
282 public function renderPrice(): void {
283 $product_price_attrs = wp_json_encode( $this->getChildBlocksAttributes( 'surecart/product-item-price' ), JSON_FORCE_OBJECT );
284 $this->block_html .= '<!-- wp:group {"style":{"spacing":{"blockGap":"0.5em","margin":{"top":"0px","bottom":"0px"}},"margin":{"top":"0px","bottom":"0px"}},"layout":{"type":"flex","flexWrap":"nowrap"}} -->';
285 $this->block_html .= '<div class="wp-block-group" style="margin-top:0;">';
286 $this->block_html .= '<!-- wp:surecart/product-list-price ' . $product_price_attrs . ' /-->';
287 $this->block_html .= '<!-- wp:surecart/product-scratch-price ' . $product_price_attrs . ' /-->';
288 $this->block_html .= '</div>';
289 $this->block_html .= '<!-- /wp:group -->';
290 }
291
292 /**
293 * Render the product template.
294 *
295 * @return void
296 */
297 public function renderProductTemplate(): void {
298 $product_template_attrs = array_merge(
299 array(
300 'style' => array(
301 'spacing' => array(
302 'blockGap' => '30px',
303 ),
304 ),
305 'layout' => array(
306 'type' => 'grid',
307 'columnCount' => $this->attributes['columns'] ?? 3,
308 ),
309 ),
310 $this->attributes ?? array(),
311 );
312
313 $this->block_html .= '<!-- wp:surecart/product-template ' . wp_json_encode( $product_template_attrs ) . ' -->';
314 $group_attrs = ! empty( $this->inner_blocks[0]['attrs'] ) ? wp_json_encode( $this->inner_blocks[0]['attrs'] ) : '{}';
315 $group_block = parse_blocks( '<!-- wp:group ' . $group_attrs . ' -->' )[0];
316 $group_styles = sc_get_block_styles( true, $group_block );
317 $group_classnames = ! empty( $group_styles['classnames'] ) ? $group_styles['classnames'] : '';
318 $group_css = ! empty( $group_styles['css'] ) ? $group_styles['css'] : '';
319 $this->block_html .= '<!-- wp:group {"style":{"spacing":{"blockGap":"5px"}} -->';
320 $this->block_html .= '<div class="wp-block-group ' . $group_classnames . '" style="' . $group_css . '">';
321 // Render according to the inner blocks order in old block.
322 if ( ! empty( $this->inner_blocks[0]['innerBlocks'] ) ) {
323 foreach ( $this->inner_blocks[0]['innerBlocks'] as $inner_block ) {
324 switch ( $inner_block['blockName'] ) {
325 case 'surecart/product-item-image':
326 $this->renderImage();
327 break;
328 case 'surecart/product-item-title':
329 $this->renderTitle();
330 break;
331 case 'surecart/product-item-price':
332 $this->renderPrice();
333 break;
334 }
335 }
336 }
337 $this->block_html .= '</div><!-- /wp:group -->';
338 $this->block_html .= '<!-- /wp:surecart/product-template -->';
339 }
340
341 /**
342 * Render the pagination.
343 *
344 * @return void
345 */
346 public function renderPagination(): void {
347 $pagination_enabled = wp_validate_boolean( $this->attributes['pagination_enabled'] ?? true );
348
349 if ( ! $pagination_enabled ) {
350 return;
351 }
352
353 $attributes = $this->attributes['pagination_size'] ? [
354 'style' => [
355 'typography' => [
356 'fontSize' => $this->attributes['pagination_size'],
357 ],
358 ],
359 ] : null;
360
361 $this->block_html .= '<!-- wp:surecart/product-pagination ' . ( ! empty( $attributes ) ? wp_json_encode( $attributes ) : '' ) . ' -->';
362 $this->block_html .= '<!-- wp:surecart/product-pagination-previous /-->';
363 $this->block_html .= '<!-- wp:surecart/product-pagination-numbers /-->';
364 $this->block_html .= '<!-- wp:surecart/product-pagination-next /-->';
365 $this->block_html .= '<!-- /wp:surecart/product-pagination -->';
366 }
367
368 /**
369 * Render the blocks.
370 *
371 * @return string
372 */
373 public function doBlocks(): string {
374 return do_blocks( $this->block_html );
375 }
376
377 /**
378 * Render the new product list.
379 *
380 * @return string
381 */
382 public function render(): string {
383 $this->renderProductList();
384 return $this->doBlocks();
385 }
386 }
387