PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 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 / packages / blocks-next / build / blocks / product-variant-pills / bundle.php
surecart / packages / blocks-next / build / blocks / product-variant-pills Last commit date
block.json 4 months ago bundle.php 1 week ago controller.php 1 month ago index.asset.php 1 week ago index.js 1 week ago radio.php 1 month ago select.php 1 month ago style-index-rtl.css 1 month ago style-index.css 1 month ago view.php 4 months ago
bundle.php
105 lines
1 <?php
2 $page_block = new \SureCart\Models\Blocks\ProductPageBlock();
3
4 ob_start();
5
6 // Order components by their `position` (the order set in the bundle).
7 $bundle_items = $product->bundle_items->data ?? array();
8 usort( $bundle_items, fn( $a, $b ) => ( $a->position ?? 0 ) <=> ( $b->position ?? 0 ) );
9
10 foreach ( $bundle_items as $bundle_item ) :
11 // Resolve the component (live associations on the buy page, else the
12 // component's own synced cache) so variant stock is always current.
13 $component = $product->resolveBundleComponent( $bundle_item );
14 if ( empty( $component->id ) ) {
15 continue;
16 }
17
18 $variant_options = $component->variant_options->data ?? array();
19
20 // Skip components with no selectable variants — nothing to interact with.
21 if ( empty( $variant_options ) ) {
22 continue;
23 }
24
25 $variants = $component->variants->data ?? array();
26
27 $variants_payload = array_map(
28 fn( $variant ) => array(
29 'id' => $variant->id,
30 'option_1' => $variant->option_1 ?? null,
31 'option_2' => $variant->option_2 ?? null,
32 'option_3' => $variant->option_3 ?? null,
33 'available_stock' => $variant->available_stock ?? 0,
34 'has_unlimited_stock' => $variant->has_unlimited_stock,
35 ),
36 $variants
37 );
38
39 $initial_variant = $page_block->findInitialBundleComponentVariant( $component );
40
41 $initial_option_values = $initial_variant
42 ? (object) array_filter(
43 array(
44 'option_1' => $initial_variant->option_1 ?? null,
45 'option_2' => $initial_variant->option_2 ?? null,
46 'option_3' => $initial_variant->option_3 ?? null,
47 ),
48 fn( $value ) => null !== $value && '' !== $value
49 )
50 : (object) array();
51
52 $component_context = wp_interactivity_data_wp_context(
53 array(
54 'componentProductId' => $component->id ?? null,
55 'componentProductSlug' => ! empty( $component->slug ) ? $component->slug : ( $component->id ?? null ),
56 'componentVariants' => $variants_payload,
57 'componentHasUnlimitedStock' => ! empty( $component->has_unlimited_stock ),
58 'componentOptionValues' => $initial_option_values,
59 )
60 );
61
62 $component_name = $component->name ?? '';
63 $quantity = max( 1, (int) ( $bundle_item->quantity ?? 1 ) );
64 ?>
65 <div class="sc-bundle-item" <?php echo wp_kses_data( $component_context ); ?>>
66 <?php
67 foreach ( $variant_options as $key => $option ) :
68 // Label folds the component name (and quantity, once per component)
69 // into the option label — the single visual difference for bundles.
70 $pill_group_label = trim( $component_name . '' . $option->name );
71 if ( 0 === $key && $quantity > 1 ) {
72 $pill_group_label .= ' × ' . $quantity;
73 }
74 ?>
75 <div
76 class="sc-bundle-item__option"
77 <?php echo wp_kses_data( wp_interactivity_data_wp_context( array( 'optionNumber' => (int) $key + 1 ) ) ); ?>
78 data-wp-interactive='{ "namespace": "surecart/product-page" }'
79 >
80 <?php
81 if ( 'dropdown' === $option->display_type ) :
82 include 'select.php';
83 else :
84 include 'radio.php';
85 endif;
86 ?>
87 </div>
88 <?php
89 endforeach;
90 ?>
91 </div>
92 <?php
93 endforeach;
94
95 $bundle_pickers = trim( ob_get_clean() );
96
97 // No variable components — render nothing.
98 if ( '' === $bundle_pickers ) {
99 return;
100 }
101 ?>
102 <div <?php echo wp_kses_data( get_block_wrapper_attributes( array( 'class' => 'sc-bundle-picker' ) ) ); ?>>
103 <?php echo $bundle_pickers; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
104 </div>
105