PluginProbe ʕ •ᴥ•ʔ
PiWeb Delivery & Pickup Date Time for WooCommerce / 3.0.49.20
PiWeb Delivery & Pickup Date Time for WooCommerce v3.0.49.20
3.0.63 3.0.62 3.0.61 3.0.60 3.0.49.49 3.0.49.6 3.0.49.60 3.0.49.61 3.0.49.62 3.0.49.63 3.0.49.64 3.0.49.66 3.0.49.67 3.0.49.69 3.0.49.7 3.0.49.70 3.0.49.72 3.0.49.73 3.0.49.74 3.0.49.76 3.0.49.77 3.0.49.79 3.0.49.9 3.0.49.90 3.0.49.91 3.0.49.92 3.0.49.93 3.0.49.94 3.0.49.96 3.0.49.97 3.0.49.99 trunk 1.0 1.1 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 2.9.17 3.0.47 3.0.49 3.0.49.1 3.0.49.10 3.0.49.11 3.0.49.12 3.0.49.13 3.0.49.16 3.0.49.17 3.0.49.19 3.0.49.2 3.0.49.20 3.0.49.21 3.0.49.22 3.0.49.23 3.0.49.24 3.0.49.26 3.0.49.27 3.0.49.29 3.0.49.3 3.0.49.30 3.0.49.31 3.0.49.32 3.0.49.33 3.0.49.34 3.0.49.36 3.0.49.37 3.0.49.39 3.0.49.4 3.0.49.40 3.0.49.41 3.0.49.42 3.0.49.43 3.0.49.44 3.0.49.46 3.0.49.47
pi-woocommerce-order-date-time-and-type / block / class-date-time-location-block.php
pi-woocommerce-order-date-time-and-type / block Last commit date
date-time-location 1 year ago class-date-time-location-block-integration.php 1 year ago class-date-time-location-block.php 1 year ago class-date-time-location-storage.php 1 year ago
class-date-time-location-block.php
331 lines
1 <?php
2 namespace PISOL\DTT\BLOCK;
3
4 use Automattic\WooCommerce\StoreApi\Schemas\V1\CartSchema;
5 use Automattic\WooCommerce\StoreApi\Schemas\V1\CheckoutSchema;
6
7 class DateTimeLocationBlock{
8
9 private $extend;
10
11 protected static $instance = null;
12
13 static $IDENTIFIER = 'pisol_dtt';
14
15 public static function get_instance( ) {
16 if ( is_null( self::$instance ) ) {
17 self::$instance = new self();
18 }
19 return self::$instance;
20 }
21
22 function __construct(){
23 add_action('init', [$this, 'register_date_time_location_block']);
24
25 add_action('woocommerce_blocks_loaded', [$this, 'register_block']);
26
27 add_action('woocommerce_blocks_loaded', [$this, 'add_data']);
28
29 add_action( 'woocommerce_blocks_loaded', [$this, 'type_change_callback']);
30 add_action( 'woocommerce_blocks_loaded', [$this, 'date_selected_callback']);
31 add_action( 'woocommerce_blocks_loaded', [$this, 'time_selected_callback']);
32 add_action( 'woocommerce_blocks_loaded', [$this, 'pickup_location_selected_callback']);
33
34 add_action('woocommerce_blocks_loaded', [$this, 'extension_data_declaration']);
35
36 add_filter('pisol_dtt_settings_filter', [$this, 'enableDateOnLoadingOfPage'],1);
37 }
38
39 /**
40 * This is needed else the block will not work in the Block based Wordpress themes
41 */
42 function register_block(){
43 require_once( 'class-date-time-location-block-integration.php' );
44 add_action(
45 'woocommerce_blocks_checkout_block_registration',
46 function( $integration_registry ) {
47 $integration_registry->register( new \Date_Time_Location_Block_Integration() );
48 }
49 );
50 }
51
52 function enableDateOnLoadingOfPage($settings){
53 /**
54 * this will make the date to be loaded when plugin is used with different date and time plugin
55 */
56 $checkout_page_id = wc_get_page_id('checkout');
57 if(has_block('woocommerce/checkout', $checkout_page_id)){
58 $settings['allowDatesOnLoad'] = true;
59 }
60
61 return $settings;
62 }
63
64 function register_date_time_location_block(){
65
66 register_block_type(__DIR__.'/date-time-location');
67 }
68
69 function add_data(){
70 woocommerce_store_api_register_endpoint_data(
71 array(
72 'endpoint' => CartSchema::IDENTIFIER,
73 'namespace' => self::$IDENTIFIER,
74 'data_callback' => [__CLASS__, 'data'],
75 'schema_type' => ARRAY_A,
76 )
77 );
78 }
79
80 static function data(){
81 include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
82
83 $data = \pi_dtt_js::dateOptions();
84
85 $data['available_types'] = self::get_available_types();
86
87 $data['selected_type'] = self::get_selected_type();
88
89 $data['disabled_types'] = [];
90
91 $data['selected_date'] = self::get_selected_date($data['allowedDates']);
92
93 if(empty($data['selected_date'])){
94 $data['allSlotsBooked'] = __('First select a date', 'pisol-dtt');
95 }
96
97 $data['available_time'] = self::get_time( $data['selected_date'], $data['selected_type']);
98
99 $data['selected_time'] = self::get_selected_time($data['available_time']);
100
101 $data['pickup_locations'] = self::get_pickup_locations();
102
103 $data['active_locations'] = count($data['pickup_locations']) > 1 ? true : false;
104
105 $data['show_pickup_location_as'] = 'radio';
106
107 $data['pickup_locations_for_radio'] = self::get_location_for_radio($data['pickup_locations']);
108
109 $data['selected_location'] = self::get_selected_location($data['pickup_locations'], $data['selected_type']);
110
111 $data['date_field_enabled'] = \pi_dtt_display_fields::showDateAndTime($data['selected_type']);
112 $data['time_field_enabled'] = \pi_dtt_display_fields::showDateAndTime($data['selected_type']) && \pi_dtt_display_fields::enableTimeField($data['selected_type']);
113
114 $data['section_title'] = __('Order delivery details', 'pisol-dtt');
115
116 $data['pickup_location_label'] = __("Select a pickup location",'pisol-dtt');
117
118
119 return apply_filters('pisol_dtt_block_content', $data);
120 }
121
122 static function get_available_types(){
123
124 $aloud_types = pisol_dtt_get_setting('pi_type', "Both");
125
126 $types = array(
127 'delivery' => pisol_dtt_get_setting('pi_delivery_label',__('Delivery','pisol-dtt')),
128 'pickup' => pisol_dtt_get_setting('pi_pickup_label',__('Pickup','pisol-dtt'))
129 );
130
131 if($aloud_types == 'Delivery'){
132 unset($types['pickup']);
133 }elseif($aloud_types == 'Pickup'){
134 unset($types['delivery']);
135 }
136
137 return $types;
138 }
139
140 static function get_selected_type(){
141 $delivery_type = \pi_dtt_delivery_type::getType();
142 return $delivery_type;
143 }
144
145
146 function type_change_callback(){
147 woocommerce_store_api_register_update_callback(
148 [
149 'namespace' => self::$IDENTIFIER.'_type_change',
150 'callback' => [$this, 'type_change']
151 ]
152 );
153 }
154
155 function date_selected_callback(){
156 woocommerce_store_api_register_update_callback(
157 [
158 'namespace' => self::$IDENTIFIER.'_date_selected',
159 'callback' => [$this, 'date_selected']
160 ]
161 );
162 }
163
164 function time_selected_callback(){
165 woocommerce_store_api_register_update_callback(
166 [
167 'namespace' => self::$IDENTIFIER.'_time_selected',
168 'callback' => [$this, 'time_selected']
169 ]
170 );
171 }
172
173 function pickup_location_selected_callback(){
174 woocommerce_store_api_register_update_callback(
175 [
176 'namespace' => self::$IDENTIFIER.'_pickup_location_selected',
177 'callback' => [$this, 'pickup_location_selected']
178 ]
179 );
180 }
181
182 function type_change($data){
183 $type = sanitize_text_field($data['type']);
184 $obj = new \pi_dtt_delivery_type();
185 $set_type = $obj->setDeliveryType($type);
186 }
187
188 function date_selected($data){
189 $date = sanitize_text_field($data['date']);
190 WC()->session->set('pi_selected_date', $date);
191 }
192
193 function time_selected($data){
194 $time = sanitize_text_field($data['time']);
195 WC()->session->set('pi_selected_time', $time);
196 }
197
198 function pickup_location_selected($data){
199 $pickup_location = sanitize_text_field($data['pickup_location_id']);
200 WC()->session->set('pickup_location', $pickup_location);
201 }
202
203 static function get_selected_date($available_dates){
204 $selected_date = WC()->session->get('pi_selected_date');
205
206 if(empty($selected_date)){
207 return '';
208 }
209
210 if(empty($available_dates) || !is_array($available_dates)){
211 return '';
212 }
213
214 return in_array($selected_date, $available_dates) ? $selected_date : '';
215 }
216
217 static function get_selected_location($available_locations, $type){
218 $selected_location = WC()->session->get('pickup_location');
219
220 if(empty($available_locations) || !is_array($available_locations)){
221 return '';
222 }
223
224 if(empty($type) || $type != 'pickup'){
225 return '';
226 }
227
228 $array_keys = array_keys($available_locations);
229
230 return in_array($selected_location, $array_keys) ? $selected_location : '';
231 }
232
233 static function get_selected_time($available_time){
234 $selected_time = WC()->session->get('pi_selected_time');
235
236 if(empty($selected_time)){
237 return '';
238 }
239
240 if(empty($available_time) || !is_array($available_time)){
241 return '';
242 }
243
244 $time_ids = array_column($available_time, 'id');
245
246 return in_array($selected_time, $time_ids) ? $selected_time : '';
247 }
248
249 static function get_time($date, $type){
250
251 if(empty($date)){
252 return [];
253 }
254
255 ob_start();
256 if(\pisol_dtt_time::useTimeSlot()){
257 \pisol_dtt_time_slot::getTimeSlotJson($date, $type);
258 }else{
259 \pisol_dtt_time_range::getTimeRangeJson($date, $type);
260 }
261
262 $content = ob_get_clean();
263 return json_decode($content, true);
264 }
265
266 static function get_pickup_locations(){
267 $location1 = get_option('pi_pickup_address_1', "");
268 $location2 = get_option('pi_pickup_address_2', "");
269 $locations = [];
270 if(!empty($location1)){
271 $locations['pi_pickup_address_1'] = strip_tags( $location1 );
272 }
273
274 if(!empty($location2)){
275 $locations['pi_pickup_address_2'] = strip_tags( $location2 );
276 }
277
278 return $locations;
279 }
280
281
282 static function get_location_for_radio(){
283 $locations = self::get_pickup_locations();
284 $data = [];
285 foreach($locations as $location => $title){
286 $content = '';
287 $image_id = '';
288 $map = '';
289 $image = '';
290
291 $data[] = ['value' => $location, 'label' => $title, 'content' => $content, 'image' => $image, 'map' => $map];
292 }
293 return $data;
294 }
295
296 function extension_data_declaration(){
297 woocommerce_store_api_register_endpoint_data(
298 array(
299 'endpoint' => CheckoutSchema::IDENTIFIER,
300 'namespace' => 'pisol-dtt/date-time-location',
301 'schema_type' => ARRAY_A,
302 'schema_callback' => [__CLASS__, 'data_structure']
303 )
304 );
305 }
306
307 static function data_structure(){
308 return array(
309 'pi_delivery_type' => array(
310 'type' => 'string',
311 'description' => __('Type of delivery selected by the customer.', 'pisol-dtt'),
312 'enum' => array('pickup', 'delivery'), // Example of predefined values
313 ),
314 'pi_system_delivery_date' => array(
315 'type' => 'string',
316 'description' => __('Date of delivery selected by the customer.', 'pisol-dtt'),
317 ),
318 'pi_delivery_time' => array(
319 'type' => 'string',
320 'description' => __('Delivery timing selected by customer.', 'pisol-dtt'),
321 ),
322 'pickup_location_id' => array(
323 'type' => ['string','null'],
324 'description' => __('Pickup location id', 'pisol-dtt'),
325 ),
326 );
327 }
328 }
329
330 DateTimeLocationBlock::get_instance();
331