PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.6.1
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.6.1
4.6.1 4.6.0 4.5.1 4.5.0 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 BlockCurrencyConversionSupportService.php 1 year ago BlockPatternsService.php 1 year ago BlockService.php 5 months ago BlockServiceProvider.php 5 months ago BlockStylesService.php 4 months ago BlockValidationService.php 2 years ago CartMenuIconMigrationService.php 1 year ago CartMigrationService.php 1 year ago FormModeSwitcherService.php 3 weeks ago ProductCollectionBadgesMigrationService.php 1 year ago ProductListFilterTagsMigrationService.php 1 year ago ProductListMigrationService.php 1 year ago ProductListService.php 1 year ago ProductPageBlocksMigrationService.php 1 year ago ProductPriceChoicesMigrationService.php 1 year ago ProductQuickViewService.php 10 months ago ProductReviewFormService.php 5 months ago ProductSelectedPriceMigrationService.php 1 year ago ProductVariantsMigrationService.php 1 year ago URLParamService.php 4 months ago
ProductListMigrationService.php
388 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 {"layout":{"type":"flex","orientation":"vertical"}} -->';
199 $this->block_html .= '<!-- wp:surecart/product-list-filter-tags-template -->';
200 $this->block_html .= '<!-- wp:surecart/product-list-filter-tag /-->';
201 $this->block_html .= '<!-- /wp:surecart/product-list-filter-tags -->';
202 $this->block_html .= '</div><!-- /wp:group -->';
203 }
204
205 /**
206 * Render the product title.
207 *
208 * @return void
209 */
210 public function renderTitle(): void {
211 $product_title_attrs = $this->getChildBlocksAttributes( 'surecart/product-item-title' );
212 if ( ! isset( $product_title_attrs['style'] ) ) {
213 $product_title_attrs['style'] = array();
214 }
215 if ( ! isset( $product_title_attrs['style']['spacing'] ) ) {
216 $product_title_attrs['style']['spacing'] = array();
217 }
218
219 // this is the default.
220 if ( isset( $product_title_attrs['style']['spacing']['padding']['top'] ) && $product_title_attrs['style']['spacing']['padding']['top'] === '10px' ) {
221 $product_title_attrs['style']['spacing']['margin'] = array_merge(
222 $product_title_attrs['style']['spacing']['margin'] ?? array(),
223 array(
224 'bottom' => $product_title_attrs['style']['spacing']['margin']['bottom'] ?? '0px',
225 'top' => '0px',
226 ),
227 );
228 }
229
230 $this->block_html .= '<!-- wp:surecart/product-title ' . wp_json_encode( $product_title_attrs, JSON_FORCE_OBJECT ) . ' /-->';
231 }
232
233 /**
234 * Render the product image.
235 *
236 * @return void
237 */
238 public function renderImage(): void {
239 $attributes = $this->getChildBlocksAttributes( 'surecart/product-item-image' );
240 $product_image_attrs = array(
241 'useFeaturedImage' => true,
242 'minHeight' => 0,
243 'dimRatio' => 0,
244 'isUserOverlayColor' => true,
245 'focalPoint' => array(
246 'x' => 0.5,
247 'y' => 0.5,
248 ),
249 'contentPosition' => 'top right',
250 'isDark' => false,
251 'style' => array(
252 'dimensions' => array( 'aspectRatio' => ! empty( $attributes['ratio'] ) ? $attributes['ratio'] : '3/4' ),
253 'layout' => array(
254 'selfStretch' => 'fit',
255 'flexSize' => null,
256 ),
257 'spacing' => array( 'margin' => array( 'bottom' => '15px' ) ),
258 'border' => array( 'radius' => '10px' ),
259 ),
260 );
261
262 $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"}} -->';
263 $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">';
264 $image .= '<!-- wp:cover ' . wp_json_encode( array_replace_recursive( $product_image_attrs, [] ) ) . ' -->';
265 $image .= '<div class="wp-block-cover is-light has-custom-content-position is-position-top-right" style="border-radius:10px;">';
266 $image .= '<span aria-hidden="true" class="wp-block-cover__background has-background-dim-0 has-background-dim"></span>';
267 $image .= '<div class="wp-block-cover__inner-container">';
268 $image .= '<!-- wp:surecart/product-sale-badge {"style":{"typography":{"fontSize":"12px"},"border":{"radius":"100px"}}} /-->';
269 $image .= '</div>';
270 $image .= '</div>';
271 $image .= '<!-- /wp:cover -->';
272 $image .= '</div>';
273 $image .= '<!-- /wp:group -->';
274
275 $this->block_html .= $image;
276 }
277
278 /**
279 * Render the product price.
280 *
281 * @return void
282 */
283 public function renderPrice(): void {
284 $product_price_attrs = wp_json_encode( $this->getChildBlocksAttributes( 'surecart/product-item-price' ), JSON_FORCE_OBJECT );
285 $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"}} -->';
286 $this->block_html .= '<div class="wp-block-group" style="margin-top:0;">';
287 $this->block_html .= '<!-- wp:surecart/product-list-price ' . $product_price_attrs . ' /-->';
288 $this->block_html .= '<!-- wp:surecart/product-scratch-price ' . $product_price_attrs . ' /-->';
289 $this->block_html .= '</div>';
290 $this->block_html .= '<!-- /wp:group -->';
291 }
292
293 /**
294 * Render the product template.
295 *
296 * @return void
297 */
298 public function renderProductTemplate(): void {
299 $product_template_attrs = array_merge(
300 array(
301 'style' => array(
302 'spacing' => array(
303 'blockGap' => '30px',
304 ),
305 ),
306 'layout' => array(
307 'type' => 'grid',
308 'columnCount' => $this->attributes['columns'] ?? 3,
309 ),
310 ),
311 $this->attributes ?? array(),
312 );
313
314 $this->block_html .= '<!-- wp:surecart/product-template ' . wp_json_encode( $product_template_attrs ) . ' -->';
315 $group_attrs = ! empty( $this->inner_blocks[0]['attrs'] ) ? wp_json_encode( $this->inner_blocks[0]['attrs'] ) : '{}';
316 $group_block = parse_blocks( '<!-- wp:group ' . $group_attrs . ' -->' )[0];
317 $group_styles = sc_get_block_styles( true, $group_block );
318 $group_classnames = ! empty( $group_styles['classnames'] ) ? $group_styles['classnames'] : '';
319 $group_css = ! empty( $group_styles['css'] ) ? $group_styles['css'] : '';
320 $this->block_html .= '<!-- wp:group {"style":{"spacing":{"blockGap":"5px"}} -->';
321 $this->block_html .= '<div class="wp-block-group ' . $group_classnames . '" style="' . $group_css . '">';
322 // Render according to the inner blocks order in old block.
323 if ( ! empty( $this->inner_blocks[0]['innerBlocks'] ) ) {
324 foreach ( $this->inner_blocks[0]['innerBlocks'] as $inner_block ) {
325 switch ( $inner_block['blockName'] ) {
326 case 'surecart/product-item-image':
327 $this->renderImage();
328 break;
329 case 'surecart/product-item-title':
330 $this->renderTitle();
331 break;
332 case 'surecart/product-item-price':
333 $this->renderPrice();
334 break;
335 }
336 }
337 }
338 $this->block_html .= '</div><!-- /wp:group -->';
339 $this->block_html .= '<!-- /wp:surecart/product-template -->';
340 }
341
342 /**
343 * Render the pagination.
344 *
345 * @return void
346 */
347 public function renderPagination(): void {
348 $pagination_enabled = wp_validate_boolean( $this->attributes['pagination_enabled'] ?? true );
349
350 if ( ! $pagination_enabled ) {
351 return;
352 }
353
354 $attributes = ! empty( $this->attributes['pagination_size'] ) ? [
355 'style' => [
356 'typography' => [
357 'fontSize' => $this->attributes['pagination_size'],
358 ],
359 ],
360 ] : null;
361
362 $this->block_html .= '<!-- wp:surecart/product-pagination ' . ( ! empty( $attributes ) ? wp_json_encode( $attributes ) : '' ) . ' -->';
363 $this->block_html .= '<!-- wp:surecart/product-pagination-previous /-->';
364 $this->block_html .= '<!-- wp:surecart/product-pagination-numbers /-->';
365 $this->block_html .= '<!-- wp:surecart/product-pagination-next /-->';
366 $this->block_html .= '<!-- /wp:surecart/product-pagination -->';
367 }
368
369 /**
370 * Render the blocks.
371 *
372 * @return string
373 */
374 public function doBlocks(): string {
375 return do_blocks( $this->block_html );
376 }
377
378 /**
379 * Render the new product list.
380 *
381 * @return string
382 */
383 public function render(): string {
384 $this->renderProductList();
385 return $this->doBlocks();
386 }
387 }
388