PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.3.21
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.3.21
1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 All 49 releases
fluent-cart / app / Modules / Templating / Bricks / Elements / ProductStock.php

ProductStock.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.3.21, at app/Modules/Templating/Bricks/Elements/ProductStock.php

217 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Modules\Templating\Bricks\Elements;
4
5 use Bricks\Element;
6 use FluentCart\App\Modules\Data\ProductDataSetup;
7 use FluentCart\App\Services\Renderer\ProductRenderer;
8 use FluentCart\Framework\Support\Arr;
9
10 if (!defined('ABSPATH')) exit; // Exit if accessed directly
11
12 class ProductStock extends Element
13 {
14 public $category = 'fluent_cart_product';
15 public $name = 'fct-product-stock';
16 public $icon = 'ti-package';
17
18 public function get_label()
19 {
20 return esc_html__('Product stock', 'fluent-cart');
21 }
22
23 public function set_control_groups()
24 {
25 $this->control_groups['inStock'] = [
26 'title' => esc_html__('In stock', 'fluent-cart'),
27 'tab' => 'content',
28 ];
29
30 //
31 // $this->control_groups['lowStock'] = [
32 // 'title' => esc_html__('Low stock', 'fluent-cart') . '/' . esc_html__('On backorder', 'fluent-cart'),
33 // 'tab' => 'content',
34 // ];
35
36 $this->control_groups['outOfStock'] = [
37 'title' => esc_html__('Out of stock', 'fluent-cart'),
38 'tab' => 'content',
39 ];
40 }
41
42 public function set_controls()
43 {
44 // In Stock
45
46 $this->controls['inStockText'] = [
47 'tab' => 'content',
48 'group' => 'inStock',
49 'type' => 'text',
50 'hasDynamicData' => 'text',
51 'placeholder' => esc_html__('Custom text', 'fluent-cart'),
52 ];
53
54 $this->controls['inStockTypography'] = [
55 'tab' => 'content',
56 'group' => 'inStock',
57 'label' => esc_html__('Typography', 'fluent-cart'),
58 'type' => 'typography',
59 'css' => [
60 [
61 'property' => 'font',
62 'selector' => '.in-stock',
63 ],
64 ],
65 ];
66
67 $this->controls['inStockBackgroundColor'] = [
68 'tab' => 'style',
69 'group' => 'inStock',
70 'label' => esc_html__('Background color', 'fluent-cart'),
71 'type' => 'color',
72 'css' => [
73 [
74 'property' => 'background-color',
75 'selector' => '.in-stock',
76 ]
77 ],
78 ];
79
80 // Low Stock
81 if (false) {
82 $this->controls['lowStockText'] = [
83 'tab' => 'content',
84 'group' => 'lowStock',
85 'type' => 'text',
86 'hasDynamicData' => 'text',
87 'placeholder' => esc_html__('Custom text', 'fluent-cart'),
88 ];
89
90 $this->controls['lowStockTypography'] = [
91 'tab' => 'content',
92 'group' => 'lowStock',
93 'label' => esc_html__('Typography', 'fluent-cart'),
94 'type' => 'typography',
95 'css' => [
96 [
97 'property' => 'font',
98 'selector' => '.low-stock, .available-on-backorder',
99 ],
100 ],
101 ];
102
103 $this->controls['lowStockBackgroundColor'] = [
104 'tab' => 'style',
105 'group' => 'lowStock',
106 'label' => esc_html__('Background color', 'fluent-cart'),
107 'type' => 'color',
108 'css' => [
109 [
110 'property' => 'background-color',
111 'selector' => '.low-stock, .available-on-backorder',
112 ]
113 ],
114 ];
115 }
116
117 // Out of Stock
118 $this->controls['outOfStockText'] = [
119 'tab' => 'content',
120 'group' => 'outOfStock',
121 'type' => 'text',
122 'hasDynamicData' => 'text',
123 'placeholder' => esc_html__('Custom text', 'fluent-cart'),
124 ];
125
126 $this->controls['outOfStockTypography'] = [
127 'tab' => 'content',
128 'group' => 'outOfStock',
129 'label' => esc_html__('Typography', 'fluent-cart'),
130 'type' => 'typography',
131 'css' => [
132 [
133 'property' => 'font',
134 'selector' => '.out-of-stock',
135 ],
136 ],
137 ];
138
139 $this->controls['outOfStockBackgroundColor'] = [
140 'tab' => 'style',
141 'group' => 'outOfStock',
142 'label' => esc_html__('Background color', 'fluent-cart'),
143 'type' => 'color',
144 'css' => [
145 [
146 'property' => 'background-color',
147 'selector' => '.out-of-stock',
148 ]
149 ],
150 ];
151 }
152
153 public function render()
154 {
155
156 $product = ProductDataSetup::getProductModel($this->post_id);
157
158 if (empty($product)) {
159 return $this->render_element_placeholder(
160 [
161 'title' => esc_html__('For better preview select content to show.', 'fluent-cart'),
162 'description' => esc_html__('Go to: Settings > Template Settings > Populate Content', 'fluent-cart'),
163 ]
164 );
165 }
166
167 add_filter('fluent_cart/product_stock_availability', [$this, 'simulateAvailability'], 10, 2);
168
169 $productRender = new ProductRenderer($product);
170
171 ob_start();
172 $productRender->renderStockAvailability();
173 $stock_html = ob_get_clean();
174 remove_filter('fluent_cart/product_stock_availability', [$this, 'simulateAvailability'], 10, 2);
175
176 if (!$stock_html) {
177 return $this->render_element_placeholder(
178 [
179 'title' => esc_html__('Stock management not enabled for this product.', 'fluent-cart'),
180 ]
181 );
182 }
183
184 echo "<div {$this->render_attributes( '_root' )}>" . wp_kses_post($stock_html) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- render_attributes() handles escaping
185 }
186
187 public function simulateAvailability($availability, $data)
188 {
189 $settings = $this->settings;
190 $is_manage_stock = Arr::get($availability, 'manage_stock');
191 if (!$is_manage_stock) {
192 return $availability;
193 }
194
195 // Get stock via helper function if we don't manage stock on product level (to enable low stock for example)
196 // $stock_quantity = Arr::get($productDetail, 'available_quantity');
197
198 // Set availability text based on user input
199 switch ($availability['class']) {
200 case 'in-stock':
201 $availability['availability'] = !empty($settings['inStockText']) ? $settings['inStockText'] : $availability['availability'];
202 break;
203
204 case 'available-on-backorder':
205 case 'low-stock':
206 $availability['availability'] = !empty($settings['lowStockText']) ? $settings['lowStockText'] : $availability['availability'];
207 break;
208
209 case 'out-of-stock':
210 $availability['availability'] = !empty($settings['outOfStockText']) ? $settings['outOfStockText'] : $availability['availability'];
211 break;
212 }
213
214 return $availability;
215 }
216 }
217