Passed
Push — master ( 5a5a47...c0eaca )
by Brian
04:37
created
includes/gateways/class-getpaid-bank-transfer-gateway.php 1 patch
Indentation   +175 added lines, -175 removed lines patch added patch discarded remove patch
@@ -13,30 +13,30 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Bank_Transfer_Gateway extends GetPaid_Payment_Gateway {
14 14
 
15 15
     /**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20 20
     public $id = 'bank_transfer';
21 21
 
22
-	/**
23
-	 * An array of features that this gateway supports.
24
-	 *
25
-	 * @var array
26
-	 */
27
-	protected $supports = array( 'addons' );
22
+    /**
23
+     * An array of features that this gateway supports.
24
+     *
25
+     * @var array
26
+     */
27
+    protected $supports = array( 'addons' );
28 28
 
29 29
     /**
30
-	 * Payment method order.
31
-	 *
32
-	 * @var int
33
-	 */
34
-	public $order = 8;
30
+     * Payment method order.
31
+     *
32
+     * @var int
33
+     */
34
+    public $order = 8;
35 35
 
36 36
     /**
37
-	 * Class constructor.
38
-	 */
39
-	public function __construct() {
37
+     * Class constructor.
38
+     */
39
+    public function __construct() {
40 40
         parent::__construct();
41 41
 
42 42
         $this->title                = __( 'Direct bank transfer', 'invoicing' );
@@ -44,23 +44,23 @@  discard block
 block discarded – undo
44 44
         $this->checkout_button_text = __( 'Proceed', 'invoicing' );
45 45
         $this->instructions         = apply_filters( 'wpinv_bank_instructions', $this->get_option( 'info' ) );
46 46
 
47
-		add_action( 'wpinv_receipt_end', array( $this, 'thankyou_page' ) );
48
-		add_action( 'getpaid_invoice_line_items', array( $this, 'thankyou_page' ), 40 );
49
-		add_action( 'wpinv_pdf_content_billing', array( $this, 'thankyou_page' ), 11 );
50
-		add_action( 'wpinv_email_invoice_details', array( $this, 'email_instructions' ), 10, 3 );
47
+        add_action( 'wpinv_receipt_end', array( $this, 'thankyou_page' ) );
48
+        add_action( 'getpaid_invoice_line_items', array( $this, 'thankyou_page' ), 40 );
49
+        add_action( 'wpinv_pdf_content_billing', array( $this, 'thankyou_page' ), 11 );
50
+        add_action( 'wpinv_email_invoice_details', array( $this, 'email_instructions' ), 10, 3 );
51 51
 
52 52
     }
53 53
 
54 54
     /**
55
-	 * Process Payment.
56
-	 *
57
-	 *
58
-	 * @param WPInv_Invoice $invoice Invoice.
59
-	 * @param array $submission_data Posted checkout fields.
60
-	 * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
61
-	 * @return array
62
-	 */
63
-	public function process_payment( $invoice, $submission_data, $submission ) {
55
+     * Process Payment.
56
+     *
57
+     *
58
+     * @param WPInv_Invoice $invoice Invoice.
59
+     * @param array $submission_data Posted checkout fields.
60
+     * @param GetPaid_Payment_Form_Submission $submission Checkout submission.
61
+     * @return array
62
+     */
63
+    public function process_payment( $invoice, $submission_data, $submission ) {
64 64
 
65 65
         // Add a transaction id.
66 66
         $invoice->set_transaction_id( $invoice->generate_key('trans_') );
@@ -81,66 +81,66 @@  discard block
 block discarded – undo
81 81
     }
82 82
 
83 83
     /**
84
-	 * Output for the order received page.
85
-	 *
86
-	 * @param WPInv_Invoice $invoice Invoice.
87
-	 */
88
-	public function thankyou_page( $invoice ) {
84
+     * Output for the order received page.
85
+     *
86
+     * @param WPInv_Invoice $invoice Invoice.
87
+     */
88
+    public function thankyou_page( $invoice ) {
89 89
 
90 90
         if ( 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) {
91 91
 
92
-			echo '<div class="mt-4 mb-2 getpaid-bank-transfer-details">' . PHP_EOL;
92
+            echo '<div class="mt-4 mb-2 getpaid-bank-transfer-details">' . PHP_EOL;
93 93
 
94 94
             if ( ! empty( $this->instructions ) ) {
95 95
                 echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) );
96
-			}
96
+            }
97 97
 
98
-			$this->bank_details( $invoice );
98
+            $this->bank_details( $invoice );
99 99
 
100
-			echo '</div>';
100
+            echo '</div>';
101 101
 
102 102
         }
103 103
 
104
-	}
104
+    }
105 105
 
106 106
     /**
107
-	 * Add content to the WPI emails.
108
-	 *
109
-	 * @param WPInv_Invoice $invoice Invoice.
110
-	 * @param string     $email_type Email format: plain text or HTML.
111
-	 * @param bool     $sent_to_admin Sent to admin.
112
-	 */
113
-	public function email_instructions( $invoice, $email_type, $sent_to_admin ) {
107
+     * Add content to the WPI emails.
108
+     *
109
+     * @param WPInv_Invoice $invoice Invoice.
110
+     * @param string     $email_type Email format: plain text or HTML.
111
+     * @param bool     $sent_to_admin Sent to admin.
112
+     */
113
+    public function email_instructions( $invoice, $email_type, $sent_to_admin ) {
114 114
 
115
-		if ( ! $sent_to_admin && 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) {
115
+        if ( ! $sent_to_admin && 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) {
116 116
 
117
-			echo '<div class="wpi-email-row getpaid-bank-transfer-details">';
117
+            echo '<div class="wpi-email-row getpaid-bank-transfer-details">';
118 118
 
119
-			if ( $this->instructions ) {
120
-				echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) . PHP_EOL );
119
+            if ( $this->instructions ) {
120
+                echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) . PHP_EOL );
121 121
             }
122 122
 
123
-			$this->bank_details( $invoice );
123
+            $this->bank_details( $invoice );
124 124
 			
125
-			echo '</div>';
125
+            echo '</div>';
126 126
 
127
-		}
127
+        }
128 128
 
129 129
     }
130 130
     
131 131
     /**
132
-	 * Get bank details and place into a list format.
133
-	 *
134
-	 * @param WPInv_Invoice $invoice Invoice.
135
-	 */
136
-	protected function bank_details( $invoice ) {
132
+     * Get bank details and place into a list format.
133
+     *
134
+     * @param WPInv_Invoice $invoice Invoice.
135
+     */
136
+    protected function bank_details( $invoice ) {
137 137
 
138
-		// Get the invoice country and country $locale.
139
-		$country = $invoice->get_country();
140
-		$locale  = $this->get_country_locale();
138
+        // Get the invoice country and country $locale.
139
+        $country = $invoice->get_country();
140
+        $locale  = $this->get_country_locale();
141 141
 
142
-		// Get sortcode label in the $locale array and use appropriate one.
143
-		$sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' );
142
+        // Get sortcode label in the $locale array and use appropriate one.
143
+        $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' );
144 144
 
145 145
         $bank_fields = array(
146 146
             'ac_name'     => __( 'Account Name', 'invoicing' ),
@@ -169,144 +169,144 @@  discard block
 block discarded – undo
169 169
             return;
170 170
         }
171 171
 
172
-		echo '<h3 class="getpaid-bank-transfer-title"> ' . apply_filters( 'wpinv_receipt_bank_details_title', __( 'Bank Details', 'invoicing' ) ) . '</h3>' . PHP_EOL;
172
+        echo '<h3 class="getpaid-bank-transfer-title"> ' . apply_filters( 'wpinv_receipt_bank_details_title', __( 'Bank Details', 'invoicing' ) ) . '</h3>' . PHP_EOL;
173 173
 
174
-		echo '<table class="table table-bordered getpaid-bank-transfer-details">' . PHP_EOL;
174
+        echo '<table class="table table-bordered getpaid-bank-transfer-details">' . PHP_EOL;
175 175
 
176
-		foreach ( $bank_info as $key => $data ) {
176
+        foreach ( $bank_info as $key => $data ) {
177 177
 
178
-			$key   = sanitize_html_class( $key );
179
-			$label = wp_kses_post( $data['label'] );
180
-			$value = wp_kses_post( wptexturize( $data['value'] ) );
178
+            $key   = sanitize_html_class( $key );
179
+            $label = wp_kses_post( $data['label'] );
180
+            $value = wp_kses_post( wptexturize( $data['value'] ) );
181 181
 
182
-			echo "<tr class='getpaid-bank-transfer-$key'><th class='font-weight-bold'>$label</th><td class='w-75'>$value</td></tr>" . PHP_EOL;
183
-		}
182
+            echo "<tr class='getpaid-bank-transfer-$key'><th class='font-weight-bold'>$label</th><td class='w-75'>$value</td></tr>" . PHP_EOL;
183
+        }
184 184
 
185
-		echo '</table>';
185
+        echo '</table>';
186 186
 
187 187
     }
188 188
     
189 189
     /**
190
-	 * Get country locale if localized.
191
-	 *
192
-	 * @return array
193
-	 */
194
-	public function get_country_locale() {
195
-
196
-		if ( empty( $this->locale ) ) {
197
-
198
-			// Locale information to be used - only those that are not 'Sort Code'.
199
-			$this->locale = apply_filters(
200
-				'getpaid_get_bank_transfer_locale',
201
-				array(
202
-					'AU' => array(
203
-						'sortcode' => array(
204
-							'label' => __( 'BSB', 'invoicing' ),
205
-						),
206
-					),
207
-					'CA' => array(
208
-						'sortcode' => array(
209
-							'label' => __( 'Bank transit number', 'invoicing' ),
210
-						),
211
-					),
212
-					'IN' => array(
213
-						'sortcode' => array(
214
-							'label' => __( 'IFSC', 'invoicing' ),
215
-						),
216
-					),
217
-					'IT' => array(
218
-						'sortcode' => array(
219
-							'label' => __( 'Branch sort', 'invoicing' ),
220
-						),
221
-					),
222
-					'NZ' => array(
223
-						'sortcode' => array(
224
-							'label' => __( 'Bank code', 'invoicing' ),
225
-						),
226
-					),
227
-					'SE' => array(
228
-						'sortcode' => array(
229
-							'label' => __( 'Bank code', 'invoicing' ),
230
-						),
231
-					),
232
-					'US' => array(
233
-						'sortcode' => array(
234
-							'label' => __( 'Routing number', 'invoicing' ),
235
-						),
236
-					),
237
-					'ZA' => array(
238
-						'sortcode' => array(
239
-							'label' => __( 'Branch code', 'invoicing' ),
240
-						),
241
-					),
242
-				)
243
-			);
244
-
245
-		}
246
-
247
-		return $this->locale;
248
-
249
-	}
250
-
251
-	/**
252
-	 * Filters the gateway settings.
253
-	 * 
254
-	 * @param array $admin_settings
255
-	 */
256
-	public function admin_settings( $admin_settings ) {
190
+     * Get country locale if localized.
191
+     *
192
+     * @return array
193
+     */
194
+    public function get_country_locale() {
195
+
196
+        if ( empty( $this->locale ) ) {
197
+
198
+            // Locale information to be used - only those that are not 'Sort Code'.
199
+            $this->locale = apply_filters(
200
+                'getpaid_get_bank_transfer_locale',
201
+                array(
202
+                    'AU' => array(
203
+                        'sortcode' => array(
204
+                            'label' => __( 'BSB', 'invoicing' ),
205
+                        ),
206
+                    ),
207
+                    'CA' => array(
208
+                        'sortcode' => array(
209
+                            'label' => __( 'Bank transit number', 'invoicing' ),
210
+                        ),
211
+                    ),
212
+                    'IN' => array(
213
+                        'sortcode' => array(
214
+                            'label' => __( 'IFSC', 'invoicing' ),
215
+                        ),
216
+                    ),
217
+                    'IT' => array(
218
+                        'sortcode' => array(
219
+                            'label' => __( 'Branch sort', 'invoicing' ),
220
+                        ),
221
+                    ),
222
+                    'NZ' => array(
223
+                        'sortcode' => array(
224
+                            'label' => __( 'Bank code', 'invoicing' ),
225
+                        ),
226
+                    ),
227
+                    'SE' => array(
228
+                        'sortcode' => array(
229
+                            'label' => __( 'Bank code', 'invoicing' ),
230
+                        ),
231
+                    ),
232
+                    'US' => array(
233
+                        'sortcode' => array(
234
+                            'label' => __( 'Routing number', 'invoicing' ),
235
+                        ),
236
+                    ),
237
+                    'ZA' => array(
238
+                        'sortcode' => array(
239
+                            'label' => __( 'Branch code', 'invoicing' ),
240
+                        ),
241
+                    ),
242
+                )
243
+            );
244
+
245
+        }
246
+
247
+        return $this->locale;
248
+
249
+    }
250
+
251
+    /**
252
+     * Filters the gateway settings.
253
+     * 
254
+     * @param array $admin_settings
255
+     */
256
+    public function admin_settings( $admin_settings ) {
257 257
 
258 258
         $admin_settings['bank_transfer_desc']['std']    = __( "Make your payment directly into our bank account. Please use your Invoice Number as the payment reference. Your invoice won't be processed until the funds have cleared in our account.", 'invoicing' );
259
-		$admin_settings['bank_transfer_active']['desc'] = __( 'Enable bank transfer', 'invoicing' );
259
+        $admin_settings['bank_transfer_active']['desc'] = __( 'Enable bank transfer', 'invoicing' );
260 260
 
261
-		$locale  = $this->get_country_locale();
261
+        $locale  = $this->get_country_locale();
262 262
 
263
-		// Get sortcode label in the $locale array and use appropriate one.
264
-		$country  = wpinv_default_billing_country();
265
-		$sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' );
263
+        // Get sortcode label in the $locale array and use appropriate one.
264
+        $country  = wpinv_default_billing_country();
265
+        $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' );
266 266
 
267
-		$admin_settings['bank_transfer_ac_name'] = array(
267
+        $admin_settings['bank_transfer_ac_name'] = array(
268 268
             'type' => 'text',
269 269
             'id'   => 'bank_transfer_ac_name',
270 270
             'name' => __( 'Account Name', 'invoicing' ),
271
-		);
271
+        );
272 272
 		
273
-		$admin_settings['bank_transfer_ac_no'] = array(
273
+        $admin_settings['bank_transfer_ac_no'] = array(
274 274
             'type' => 'text',
275 275
             'id'   => 'bank_transfer_ac_no',
276 276
             'name' => __( 'Account Number', 'invoicing' ),
277
-		);
277
+        );
278 278
 		
279
-		$admin_settings['bank_transfer_bank_name'] = array(
279
+        $admin_settings['bank_transfer_bank_name'] = array(
280 280
             'type' => 'text',
281 281
             'id'   => 'bank_transfer_bank_name',
282 282
             'name' => __( 'Bank Name', 'invoicing' ),
283
-		);
283
+        );
284 284
 
285
-		$admin_settings['bank_transfer_ifsc'] = array(
285
+        $admin_settings['bank_transfer_ifsc'] = array(
286 286
             'type' => 'text',
287 287
             'id'   => 'bank_transfer_ifsc',
288 288
             'name' => __( 'IFSC Code', 'invoicing' ),
289
-		);
289
+        );
290 290
 
291
-		$admin_settings['bank_transfer_iban'] = array(
291
+        $admin_settings['bank_transfer_iban'] = array(
292 292
             'type' => 'text',
293 293
             'id'   => 'bank_transfer_iban',
294 294
             'name' => __( 'IBAN', 'invoicing' ),
295
-		);
295
+        );
296 296
 
297
-		$admin_settings['bank_transfer_bic'] = array(
297
+        $admin_settings['bank_transfer_bic'] = array(
298 298
             'type' => 'text',
299 299
             'id'   => 'bank_transfer_bic',
300 300
             'name' => __( 'BIC/Swift Code', 'invoicing' ),
301
-		);
301
+        );
302 302
 		
303
-		$admin_settings['bank_transfer_sort_code'] = array(
304
-			'type' => 'text',
305
-			'id'   => 'bank_transfer_sort_code',
306
-			'name' => $sortcode,
307
-		);
303
+        $admin_settings['bank_transfer_sort_code'] = array(
304
+            'type' => 'text',
305
+            'id'   => 'bank_transfer_sort_code',
306
+            'name' => $sortcode,
307
+        );
308 308
 
309
-		$admin_settings['bank_transfer_info'] = array(
309
+        $admin_settings['bank_transfer_info'] = array(
310 310
             'id'   => 'bank_transfer_info',
311 311
             'name' => __( 'Instructions', 'invoicing' ),
312 312
             'desc' => __( 'Instructions that will be added to the thank you page and emails.', 'invoicing' ),
@@ -316,17 +316,17 @@  discard block
 block discarded – undo
316 316
             'rows' => 5
317 317
         );
318 318
 
319
-		return $admin_settings;
320
-	}
319
+        return $admin_settings;
320
+    }
321 321
 
322
-	/**
323
-	 * Processes invoice addons.
324
-	 *
325
-	 * @param WPInv_Invoice $invoice
326
-	 * @param GetPaid_Form_Item[] $items
327
-	 * @return WPInv_Invoice
328
-	 */
329
-	public function process_addons( $invoice, $items ) {
322
+    /**
323
+     * Processes invoice addons.
324
+     *
325
+     * @param WPInv_Invoice $invoice
326
+     * @param GetPaid_Form_Item[] $items
327
+     * @return WPInv_Invoice
328
+     */
329
+    public function process_addons( $invoice, $items ) {
330 330
 
331 331
         foreach ( $items as $item ) {
332 332
             $invoice->add_item( $item );
@@ -334,6 +334,6 @@  discard block
 block discarded – undo
334 334
 
335 335
         $invoice->recalculate_total();
336 336
         $invoice->save();
337
-	}
337
+    }
338 338
 
339 339
 }
Please login to merge, or discard this patch.
templates/payment-forms/cart-item.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -24,64 +24,64 @@  discard block
 block discarded – undo
24 24
 
25 25
 				<?php
26 26
 
27
-					// Fires before printing a line item column.
28
-					do_action( "getpaid_form_cart_item_before_$key", $item, $form );
27
+                    // Fires before printing a line item column.
28
+                    do_action( "getpaid_form_cart_item_before_$key", $item, $form );
29 29
 
30
-					// Item name.
31
-					if ( 'name' == $key ) {
30
+                    // Item name.
31
+                    if ( 'name' == $key ) {
32 32
 
33
-						// Display the name.
34
-						echo '<div class="mb-1">' . sanitize_text_field( $item->get_name() ) . '</div>';
33
+                        // Display the name.
34
+                        echo '<div class="mb-1">' . sanitize_text_field( $item->get_name() ) . '</div>';
35 35
 
36
-						// And an optional description.
36
+                        // And an optional description.
37 37
                         $description = $item->get_description();
38 38
 
39 39
                         if ( ! empty( $description ) ) {
40 40
                             $description = wp_kses_post( $description );
41 41
                             echo "<small class='form-text text-muted pr-2 m-0'>$description</small>";
42
-						}
42
+                        }
43 43
 
44
-						// Price help text.
44
+                        // Price help text.
45 45
                         $description = getpaid_item_recurring_price_help_text( $item, $currency );
46 46
                         if ( $description ) {
47 47
                             echo "<small class='getpaid-form-item-price-desc form-text text-muted pr-2 m-0'>$description</small>";
48
-						}
48
+                        }
49 49
 
50
-					}
50
+                    }
51 51
 
52
-					// Item price.
53
-					if ( 'price' == $key ) {
52
+                    // Item price.
53
+                    if ( 'price' == $key ) {
54 54
 
55
-						// Set the currency position.
56
-						$position = wpinv_currency_position();
55
+                        // Set the currency position.
56
+                        $position = wpinv_currency_position();
57 57
 
58
-						if ( $position == 'left_space' ) {
59
-							$position = 'left';
60
-						}
58
+                        if ( $position == 'left_space' ) {
59
+                            $position = 'left';
60
+                        }
61 61
 
62
-						if ( $position == 'right_space' ) {
63
-							$position = 'right';
64
-						}
62
+                        if ( $position == 'right_space' ) {
63
+                            $position = 'right';
64
+                        }
65 65
 
66
-						if ( $item->user_can_set_their_price() ) {
67
-							$price            = max( (float) $item->get_price(), (float) $item->get_minimum_price() );
68
-							$minimum          = (float) $item->get_minimum_price();
69
-							$validate_minimum = '';
70
-							$class            = '';
71
-							$data_minimum     = '';
66
+                        if ( $item->user_can_set_their_price() ) {
67
+                            $price            = max( (float) $item->get_price(), (float) $item->get_minimum_price() );
68
+                            $minimum          = (float) $item->get_minimum_price();
69
+                            $validate_minimum = '';
70
+                            $class            = '';
71
+                            $data_minimum     = '';
72 72
 
73
-							if ( $minimum > 0 ) {
74
-								$validate_minimum = sprintf(
75
-									esc_attr__( 'The minimum allowed amount is %s', 'invoicing' ),
76
-									sanitize_text_field( wpinv_price( $minimum, $currency ) )
77
-								);
73
+                            if ( $minimum > 0 ) {
74
+                                $validate_minimum = sprintf(
75
+                                    esc_attr__( 'The minimum allowed amount is %s', 'invoicing' ),
76
+                                    sanitize_text_field( wpinv_price( $minimum, $currency ) )
77
+                                );
78 78
 
79
-								$class = 'getpaid-validate-minimum-amount';
79
+                                $class = 'getpaid-validate-minimum-amount';
80 80
 
81
-								$data_minimum     = "data-minimum-amount='$minimum'";
82
-							}
81
+                                $data_minimum     = "data-minimum-amount='$minimum'";
82
+                            }
83 83
 
84
-							?>
84
+                            ?>
85 85
 								<div class="input-group input-group-sm">
86 86
 									<?php if( 'left' == $position ) : ?>
87 87
 										<div class="input-group-prepend">
@@ -105,37 +105,37 @@  discard block
 block discarded – undo
105 105
 								</div>
106 106
 
107 107
 							<?php
108
-						} else {
109
-							echo wpinv_price( $item->get_price(), $currency );
110
-							?>
108
+                        } else {
109
+                            echo wpinv_price( $item->get_price(), $currency );
110
+                            ?>
111 111
 								<input name='getpaid-items[<?php echo (int) $item->get_id(); ?>][price]' type='hidden' class='getpaid-item-price-input' value='<?php echo esc_attr( $item->get_price() ); ?>'>
112 112
 							<?php
113
-						}
114
-					}
113
+                        }
114
+                    }
115 115
 
116
-					// Item quantity.
117
-					if ( 'quantity' == $key ) {
116
+                    // Item quantity.
117
+                    if ( 'quantity' == $key ) {
118 118
 
119
-						if ( $item->allows_quantities() ) {
120
-							?>
119
+                        if ( $item->allows_quantities() ) {
120
+                            ?>
121 121
 								<input name='getpaid-items[<?php echo (int) $item->get_id(); ?>][quantity]' type='text' style='width: 64px; line-height: 1; min-height: 35px;' class='getpaid-item-quantity-input p-1 align-middle font-weight-normal shadow-none m-0 rounded-0 text-center border' value='<?php echo (float) $item->get_quantity(); ?>' min='1' required>
122 122
 							<?php
123
-						} else {
124
-							echo (float) $item->get_quantity();
125
-							echo '&nbsp;&nbsp;&nbsp;';
126
-							?>
123
+                        } else {
124
+                            echo (float) $item->get_quantity();
125
+                            echo '&nbsp;&nbsp;&nbsp;';
126
+                            ?>
127 127
 								<input type='hidden' name='getpaid-items[<?php echo (int) $item->get_id(); ?>][quantity]' class='getpaid-item-quantity-input' value='<?php echo (float) $item->get_quantity(); ?>'>
128 128
 							<?php
129
-						}
130
-					}
129
+                        }
130
+                    }
131 131
 
132
-					// Item sub total.
133
-					if ( 'subtotal' == $key ) {
134
-						echo wpinv_price( $item->get_sub_total(), $currency );
135
-					}
132
+                    // Item sub total.
133
+                    if ( 'subtotal' == $key ) {
134
+                        echo wpinv_price( $item->get_sub_total(), $currency );
135
+                    }
136 136
 
137
-					do_action( "getpaid_payment_form_cart_item_$key", $item, $form );
138
-				?>
137
+                    do_action( "getpaid_payment_form_cart_item_$key", $item, $form );
138
+                ?>
139 139
 
140 140
 			</div>
141 141
 
Please login to merge, or discard this patch.
vendor/ayecode/wp-super-duper/wp-super-duper.php 1 patch
Indentation   +1930 added lines, -1930 removed lines patch added patch discarded remove patch
@@ -1,262 +1,262 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined( 'ABSPATH' ) ) {
3
-	exit;
3
+    exit;
4 4
 }
5 5
 
6 6
 if ( ! class_exists( 'WP_Super_Duper' ) ) {
7 7
 
8 8
 
9
-	/**
10
-	 * A Class to be able to create a Widget, Shortcode or Block to be able to output content for WordPress.
11
-	 *
12
-	 * Should not be called direct but extended instead.
13
-	 *
14
-	 * Class WP_Super_Duper
15
-	 * @since 1.0.16 change log moved to file change-log.txt - CHANGED
16
-	 * @ver 1.0.19
17
-	 */
18
-	class WP_Super_Duper extends WP_Widget {
19
-
20
-		public $version = "1.0.24";
21
-		public $font_awesome_icon_version = "5.11.2";
22
-		public $block_code;
23
-		public $options;
24
-		public $base_id;
25
-		public $settings_hash;
26
-		public $arguments = array();
27
-		public $instance = array();
28
-		private $class_name;
29
-
30
-		/**
31
-		 * The relative url to the current folder.
32
-		 *
33
-		 * @var string
34
-		 */
35
-		public $url = '';
36
-
37
-		/**
38
-		 * Take the array options and use them to build.
39
-		 */
40
-		public function __construct( $options ) {
41
-			global $sd_widgets;
42
-
43
-			$sd_widgets[ $options['base_id'] ] = array(
44
-				'name'       => $options['name'],
45
-				'class_name' => $options['class_name']
46
-			);
47
-			$this->base_id                     = $options['base_id'];
48
-			// lets filter the options before we do anything
49
-			$options       = apply_filters( "wp_super_duper_options", $options );
50
-			$options       = apply_filters( "wp_super_duper_options_{$this->base_id}", $options );
51
-			$options       = $this->add_name_from_key( $options );
52
-			$this->options = $options;
53
-
54
-			$this->base_id   = $options['base_id'];
55
-			$this->arguments = isset( $options['arguments'] ) ? $options['arguments'] : array();
56
-
57
-			// init parent
58
-			parent::__construct( $options['base_id'], $options['name'], $options['widget_ops'] );
59
-
60
-			if ( isset( $options['class_name'] ) ) {
61
-				// register widget
62
-				$this->class_name = $options['class_name'];
63
-
64
-				// register shortcode
65
-				$this->register_shortcode();
66
-
67
-				// Fusion Builder (avada) support
68
-				if ( function_exists( 'fusion_builder_map' ) ) {
69
-					add_action( 'init', array( $this, 'register_fusion_element' ) );
70
-				}
71
-
72
-				// register block
73
-				add_action( 'admin_enqueue_scripts', array( $this, 'register_block' ) );
74
-			}
75
-
76
-			// add the CSS and JS we need ONCE
77
-			global $sd_widget_scripts;
78
-
79
-			if ( ! $sd_widget_scripts ) {
80
-				wp_add_inline_script( 'admin-widgets', $this->widget_js() );
81
-				wp_add_inline_script( 'customize-controls', $this->widget_js() );
82
-				wp_add_inline_style( 'widgets', $this->widget_css() );
83
-
84
-				// maybe add elementor editor styles
85
-				add_action( 'elementor/editor/after_enqueue_styles', array( $this, 'elementor_editor_styles' ) );
86
-
87
-				$sd_widget_scripts = true;
88
-
89
-				// add shortcode insert button once
90
-				add_action( 'media_buttons', array( $this, 'shortcode_insert_button' ) );
91
-				// generatepress theme sections compatibility
92
-				if ( function_exists( 'generate_sections_sections_metabox' ) ) {
93
-					add_action( 'generate_sections_metabox', array( $this, 'shortcode_insert_button_script' ) );
94
-				}
95
-				if ( $this->is_preview() ) {
96
-					add_action( 'wp_footer', array( $this, 'shortcode_insert_button_script' ) );
97
-					// this makes the insert button work for elementor
98
-					add_action( 'elementor/editor/after_enqueue_scripts', array(
99
-						$this,
100
-						'shortcode_insert_button_script'
101
-					) ); // for elementor
102
-				}
103
-				// this makes the insert button work for cornerstone
104
-				add_action( 'wp_print_footer_scripts', array( __CLASS__, 'maybe_cornerstone_builder' ) );
105
-
106
-				add_action( 'wp_ajax_super_duper_get_widget_settings', array( __CLASS__, 'get_widget_settings' ) );
107
-				add_action( 'wp_ajax_super_duper_get_picker', array( __CLASS__, 'get_picker' ) );
108
-
109
-				// add generator text to admin head
110
-				add_action( 'admin_head', array( $this, 'generator' ) );
111
-			}
112
-
113
-			do_action( 'wp_super_duper_widget_init', $options, $this );
114
-		}
115
-
116
-		/**
117
-		 * Add our widget CSS to elementor editor.
118
-		 */
119
-		public function elementor_editor_styles() {
120
-			wp_add_inline_style( 'elementor-editor', $this->widget_css( false ) );
121
-		}
122
-
123
-		public function register_fusion_element() {
124
-
125
-			$options = $this->options;
126
-
127
-			if ( $this->base_id ) {
128
-
129
-				$params = $this->get_fusion_params();
130
-
131
-				$args = array(
132
-					'name'            => $options['name'],
133
-					'shortcode'       => $this->base_id,
134
-					'icon'            => $options['block-icon'] ? $options['block-icon'] : 'far fa-square',
135
-					'allow_generator' => true,
136
-				);
137
-
138
-				if ( ! empty( $params ) ) {
139
-					$args['params'] = $params;
140
-				}
141
-
142
-				fusion_builder_map( $args );
143
-			}
144
-
145
-		}
146
-
147
-		public function get_fusion_params() {
148
-			$params    = array();
149
-			$arguments = $this->get_arguments();
150
-
151
-			if ( ! empty( $arguments ) ) {
152
-				foreach ( $arguments as $key => $val ) {
153
-					$param = array();
154
-					// type
155
-					$param['type'] = str_replace(
156
-						array(
157
-							"text",
158
-							"number",
159
-							"email",
160
-							"color",
161
-							"checkbox"
162
-						),
163
-						array(
164
-							"textfield",
165
-							"textfield",
166
-							"textfield",
167
-							"colorpicker",
168
-							"select",
169
-
170
-						),
171
-						$val['type'] );
172
-
173
-					// multiselect
174
-					if ( $val['type'] == 'multiselect' || ( ( $param['type'] == 'select' || $val['type'] == 'select' ) && ! empty( $val['multiple'] ) ) ) {
175
-						$param['type']     = 'multiple_select';
176
-						$param['multiple'] = true;
177
-					}
178
-
179
-					// heading
180
-					$param['heading'] = $val['title'];
181
-
182
-					// description
183
-					$param['description'] = isset( $val['desc'] ) ? $val['desc'] : '';
184
-
185
-					// param_name
186
-					$param['param_name'] = $key;
187
-
188
-					// Default
189
-					$param['default'] = isset( $val['default'] ) ? $val['default'] : '';
190
-
191
-					// Group
192
-					if ( isset( $val['group'] ) ) {
193
-						$param['group'] = $val['group'];
194
-					}
195
-
196
-					// value
197
-					if ( $val['type'] == 'checkbox' ) {
198
-						if ( isset( $val['default'] ) && $val['default'] == '0' ) {
199
-							unset( $param['default'] );
200
-						}
201
-						$param['value'] = array( '' => __( "No" ), '1' => __( "Yes" ) );
202
-					} elseif ( $param['type'] == 'select' || $param['type'] == 'multiple_select' ) {
203
-						$param['value'] = isset( $val['options'] ) ? $val['options'] : array();
204
-					} else {
205
-						$param['value'] = isset( $val['default'] ) ? $val['default'] : '';
206
-					}
207
-
208
-					// setup the param
209
-					$params[] = $param;
210
-
211
-				}
212
-			}
213
-
214
-
215
-			return $params;
216
-		}
217
-
218
-		/**
219
-		 * Maybe insert the shortcode inserter button in the footer if we are in the cornerstone builder
220
-		 */
221
-		public static function maybe_cornerstone_builder() {
222
-			if ( did_action( 'cornerstone_before_boot_app' ) ) {
223
-				self::shortcode_insert_button_script();
224
-			}
225
-		}
226
-
227
-		/**
228
-		 * A function to ge the shortcode builder picker html.
229
-		 *
230
-		 * @param string $editor_id
231
-		 *
232
-		 * @return string
233
-		 */
234
-		public static function get_picker( $editor_id = '' ) {
235
-
236
-			ob_start();
237
-			if ( isset( $_POST['editor_id'] ) ) {
238
-				$editor_id = esc_attr( $_POST['editor_id'] );
239
-			} elseif ( isset( $_REQUEST['et_fb'] ) ) {
240
-				$editor_id = 'main_content_content_vb_tiny_mce';
241
-			}
242
-
243
-			global $sd_widgets;
244
-			?>
9
+    /**
10
+     * A Class to be able to create a Widget, Shortcode or Block to be able to output content for WordPress.
11
+     *
12
+     * Should not be called direct but extended instead.
13
+     *
14
+     * Class WP_Super_Duper
15
+     * @since 1.0.16 change log moved to file change-log.txt - CHANGED
16
+     * @ver 1.0.19
17
+     */
18
+    class WP_Super_Duper extends WP_Widget {
19
+
20
+        public $version = "1.0.24";
21
+        public $font_awesome_icon_version = "5.11.2";
22
+        public $block_code;
23
+        public $options;
24
+        public $base_id;
25
+        public $settings_hash;
26
+        public $arguments = array();
27
+        public $instance = array();
28
+        private $class_name;
29
+
30
+        /**
31
+         * The relative url to the current folder.
32
+         *
33
+         * @var string
34
+         */
35
+        public $url = '';
36
+
37
+        /**
38
+         * Take the array options and use them to build.
39
+         */
40
+        public function __construct( $options ) {
41
+            global $sd_widgets;
42
+
43
+            $sd_widgets[ $options['base_id'] ] = array(
44
+                'name'       => $options['name'],
45
+                'class_name' => $options['class_name']
46
+            );
47
+            $this->base_id                     = $options['base_id'];
48
+            // lets filter the options before we do anything
49
+            $options       = apply_filters( "wp_super_duper_options", $options );
50
+            $options       = apply_filters( "wp_super_duper_options_{$this->base_id}", $options );
51
+            $options       = $this->add_name_from_key( $options );
52
+            $this->options = $options;
53
+
54
+            $this->base_id   = $options['base_id'];
55
+            $this->arguments = isset( $options['arguments'] ) ? $options['arguments'] : array();
56
+
57
+            // init parent
58
+            parent::__construct( $options['base_id'], $options['name'], $options['widget_ops'] );
59
+
60
+            if ( isset( $options['class_name'] ) ) {
61
+                // register widget
62
+                $this->class_name = $options['class_name'];
63
+
64
+                // register shortcode
65
+                $this->register_shortcode();
66
+
67
+                // Fusion Builder (avada) support
68
+                if ( function_exists( 'fusion_builder_map' ) ) {
69
+                    add_action( 'init', array( $this, 'register_fusion_element' ) );
70
+                }
71
+
72
+                // register block
73
+                add_action( 'admin_enqueue_scripts', array( $this, 'register_block' ) );
74
+            }
75
+
76
+            // add the CSS and JS we need ONCE
77
+            global $sd_widget_scripts;
78
+
79
+            if ( ! $sd_widget_scripts ) {
80
+                wp_add_inline_script( 'admin-widgets', $this->widget_js() );
81
+                wp_add_inline_script( 'customize-controls', $this->widget_js() );
82
+                wp_add_inline_style( 'widgets', $this->widget_css() );
83
+
84
+                // maybe add elementor editor styles
85
+                add_action( 'elementor/editor/after_enqueue_styles', array( $this, 'elementor_editor_styles' ) );
86
+
87
+                $sd_widget_scripts = true;
88
+
89
+                // add shortcode insert button once
90
+                add_action( 'media_buttons', array( $this, 'shortcode_insert_button' ) );
91
+                // generatepress theme sections compatibility
92
+                if ( function_exists( 'generate_sections_sections_metabox' ) ) {
93
+                    add_action( 'generate_sections_metabox', array( $this, 'shortcode_insert_button_script' ) );
94
+                }
95
+                if ( $this->is_preview() ) {
96
+                    add_action( 'wp_footer', array( $this, 'shortcode_insert_button_script' ) );
97
+                    // this makes the insert button work for elementor
98
+                    add_action( 'elementor/editor/after_enqueue_scripts', array(
99
+                        $this,
100
+                        'shortcode_insert_button_script'
101
+                    ) ); // for elementor
102
+                }
103
+                // this makes the insert button work for cornerstone
104
+                add_action( 'wp_print_footer_scripts', array( __CLASS__, 'maybe_cornerstone_builder' ) );
105
+
106
+                add_action( 'wp_ajax_super_duper_get_widget_settings', array( __CLASS__, 'get_widget_settings' ) );
107
+                add_action( 'wp_ajax_super_duper_get_picker', array( __CLASS__, 'get_picker' ) );
108
+
109
+                // add generator text to admin head
110
+                add_action( 'admin_head', array( $this, 'generator' ) );
111
+            }
112
+
113
+            do_action( 'wp_super_duper_widget_init', $options, $this );
114
+        }
115
+
116
+        /**
117
+         * Add our widget CSS to elementor editor.
118
+         */
119
+        public function elementor_editor_styles() {
120
+            wp_add_inline_style( 'elementor-editor', $this->widget_css( false ) );
121
+        }
122
+
123
+        public function register_fusion_element() {
124
+
125
+            $options = $this->options;
126
+
127
+            if ( $this->base_id ) {
128
+
129
+                $params = $this->get_fusion_params();
130
+
131
+                $args = array(
132
+                    'name'            => $options['name'],
133
+                    'shortcode'       => $this->base_id,
134
+                    'icon'            => $options['block-icon'] ? $options['block-icon'] : 'far fa-square',
135
+                    'allow_generator' => true,
136
+                );
137
+
138
+                if ( ! empty( $params ) ) {
139
+                    $args['params'] = $params;
140
+                }
141
+
142
+                fusion_builder_map( $args );
143
+            }
144
+
145
+        }
146
+
147
+        public function get_fusion_params() {
148
+            $params    = array();
149
+            $arguments = $this->get_arguments();
150
+
151
+            if ( ! empty( $arguments ) ) {
152
+                foreach ( $arguments as $key => $val ) {
153
+                    $param = array();
154
+                    // type
155
+                    $param['type'] = str_replace(
156
+                        array(
157
+                            "text",
158
+                            "number",
159
+                            "email",
160
+                            "color",
161
+                            "checkbox"
162
+                        ),
163
+                        array(
164
+                            "textfield",
165
+                            "textfield",
166
+                            "textfield",
167
+                            "colorpicker",
168
+                            "select",
169
+
170
+                        ),
171
+                        $val['type'] );
172
+
173
+                    // multiselect
174
+                    if ( $val['type'] == 'multiselect' || ( ( $param['type'] == 'select' || $val['type'] == 'select' ) && ! empty( $val['multiple'] ) ) ) {
175
+                        $param['type']     = 'multiple_select';
176
+                        $param['multiple'] = true;
177
+                    }
178
+
179
+                    // heading
180
+                    $param['heading'] = $val['title'];
181
+
182
+                    // description
183
+                    $param['description'] = isset( $val['desc'] ) ? $val['desc'] : '';
184
+
185
+                    // param_name
186
+                    $param['param_name'] = $key;
187
+
188
+                    // Default
189
+                    $param['default'] = isset( $val['default'] ) ? $val['default'] : '';
190
+
191
+                    // Group
192
+                    if ( isset( $val['group'] ) ) {
193
+                        $param['group'] = $val['group'];
194
+                    }
195
+
196
+                    // value
197
+                    if ( $val['type'] == 'checkbox' ) {
198
+                        if ( isset( $val['default'] ) && $val['default'] == '0' ) {
199
+                            unset( $param['default'] );
200
+                        }
201
+                        $param['value'] = array( '' => __( "No" ), '1' => __( "Yes" ) );
202
+                    } elseif ( $param['type'] == 'select' || $param['type'] == 'multiple_select' ) {
203
+                        $param['value'] = isset( $val['options'] ) ? $val['options'] : array();
204
+                    } else {
205
+                        $param['value'] = isset( $val['default'] ) ? $val['default'] : '';
206
+                    }
207
+
208
+                    // setup the param
209
+                    $params[] = $param;
210
+
211
+                }
212
+            }
213
+
214
+
215
+            return $params;
216
+        }
217
+
218
+        /**
219
+         * Maybe insert the shortcode inserter button in the footer if we are in the cornerstone builder
220
+         */
221
+        public static function maybe_cornerstone_builder() {
222
+            if ( did_action( 'cornerstone_before_boot_app' ) ) {
223
+                self::shortcode_insert_button_script();
224
+            }
225
+        }
226
+
227
+        /**
228
+         * A function to ge the shortcode builder picker html.
229
+         *
230
+         * @param string $editor_id
231
+         *
232
+         * @return string
233
+         */
234
+        public static function get_picker( $editor_id = '' ) {
235
+
236
+            ob_start();
237
+            if ( isset( $_POST['editor_id'] ) ) {
238
+                $editor_id = esc_attr( $_POST['editor_id'] );
239
+            } elseif ( isset( $_REQUEST['et_fb'] ) ) {
240
+                $editor_id = 'main_content_content_vb_tiny_mce';
241
+            }
242
+
243
+            global $sd_widgets;
244
+            ?>
245 245
 
246 246
 			<div class="sd-shortcode-left-wrap">
247 247
 				<?php
248
-				ksort( $sd_widgets );
249
-				//				print_r($sd_widgets);exit;
250
-				if ( ! empty( $sd_widgets ) ) {
251
-					echo '<select class="widefat" onchange="sd_get_shortcode_options(this);">';
252
-					echo "<option>" . __( 'Select shortcode' ) . "</option>";
253
-					foreach ( $sd_widgets as $shortcode => $class ) {
254
-						echo "<option value='" . esc_attr( $shortcode ) . "'>" . esc_attr( $shortcode ) . " (" . esc_attr( $class['name'] ) . ")</option>";
255
-					}
256
-					echo "</select>";
257
-
258
-				}
259
-				?>
248
+                ksort( $sd_widgets );
249
+                //				print_r($sd_widgets);exit;
250
+                if ( ! empty( $sd_widgets ) ) {
251
+                    echo '<select class="widefat" onchange="sd_get_shortcode_options(this);">';
252
+                    echo "<option>" . __( 'Select shortcode' ) . "</option>";
253
+                    foreach ( $sd_widgets as $shortcode => $class ) {
254
+                        echo "<option value='" . esc_attr( $shortcode ) . "'>" . esc_attr( $shortcode ) . " (" . esc_attr( $class['name'] ) . ")</option>";
255
+                    }
256
+                    echo "</select>";
257
+
258
+                }
259
+                ?>
260 260
 				<div class="sd-shortcode-settings"></div>
261 261
 
262 262
 			</div>
@@ -267,8 +267,8 @@  discard block
 block discarded – undo
267 267
 					<?php if ( $editor_id != '' ) { ?>
268 268
 						<button class="button sd-insert-shortcode-button"
269 269
 						        onclick="sd_insert_shortcode(<?php if ( ! empty( $editor_id ) ) {
270
-							        echo "'" . $editor_id . "'";
271
-						        } ?>)"><?php _e( 'Insert shortcode' ); ?></button>
270
+                                    echo "'" . $editor_id . "'";
271
+                                } ?>)"><?php _e( 'Insert shortcode' ); ?></button>
272 272
 					<?php } ?>
273 273
 					<button class="button"
274 274
 					        onclick="sd_copy_to_clipboard()"><?php _e( 'Copy shortcode' ); ?></button>
@@ -276,134 +276,134 @@  discard block
 block discarded – undo
276 276
 			</div>
277 277
 			<?php
278 278
 
279
-			$html = ob_get_clean();
280
-
281
-			if ( wp_doing_ajax() ) {
282
-				echo $html;
283
-				$should_die = true;
284
-
285
-				// some builder get the editor via ajax so we should not die on those ocasions
286
-				$dont_die = array(
287
-					'parent_tag',// WP Bakery
288
-					'avia_request' // enfold
289
-				);
290
-
291
-				foreach ( $dont_die as $request ) {
292
-					if ( isset( $_REQUEST[ $request ] ) ) {
293
-						$should_die = false;
294
-					}
295
-				}
296
-
297
-				if ( $should_die ) {
298
-					wp_die();
299
-				}
300
-
301
-			} else {
302
-				return $html;
303
-			}
304
-
305
-			return '';
306
-
307
-		}
308
-
309
-		/**
310
-		 * Output the version in the admin header.
311
-		 */
312
-		public function generator() {
313
-			echo '<meta name="generator" content="WP Super Duper v' . $this->version . '" />';
314
-		}
315
-
316
-		/**
317
-		 * Get widget settings.
318
-		 *
319
-		 * @since 1.0.0
320
-		 */
321
-		public static function get_widget_settings() {
322
-			global $sd_widgets;
323
-
324
-			$shortcode = isset( $_REQUEST['shortcode'] ) && $_REQUEST['shortcode'] ? sanitize_title_with_dashes( $_REQUEST['shortcode'] ) : '';
325
-			if ( ! $shortcode ) {
326
-				wp_die();
327
-			}
328
-			$widget_args = isset( $sd_widgets[ $shortcode ] ) ? $sd_widgets[ $shortcode ] : '';
329
-			if ( ! $widget_args ) {
330
-				wp_die();
331
-			}
332
-			$class_name = isset( $widget_args['class_name'] ) && $widget_args['class_name'] ? $widget_args['class_name'] : '';
333
-			if ( ! $class_name ) {
334
-				wp_die();
335
-			}
336
-
337
-			// invoke an instance method
338
-			$widget = new $class_name;
339
-
340
-			ob_start();
341
-			$widget->form( array() );
342
-			$form = ob_get_clean();
343
-			echo "<form id='$shortcode'>" . $form . "<div class=\"widget-control-save\"></div></form>";
344
-			echo "<style>" . $widget->widget_css() . "</style>";
345
-			echo "<script>" . $widget->widget_js() . "</script>";
346
-			?>
279
+            $html = ob_get_clean();
280
+
281
+            if ( wp_doing_ajax() ) {
282
+                echo $html;
283
+                $should_die = true;
284
+
285
+                // some builder get the editor via ajax so we should not die on those ocasions
286
+                $dont_die = array(
287
+                    'parent_tag',// WP Bakery
288
+                    'avia_request' // enfold
289
+                );
290
+
291
+                foreach ( $dont_die as $request ) {
292
+                    if ( isset( $_REQUEST[ $request ] ) ) {
293
+                        $should_die = false;
294
+                    }
295
+                }
296
+
297
+                if ( $should_die ) {
298
+                    wp_die();
299
+                }
300
+
301
+            } else {
302
+                return $html;
303
+            }
304
+
305
+            return '';
306
+
307
+        }
308
+
309
+        /**
310
+         * Output the version in the admin header.
311
+         */
312
+        public function generator() {
313
+            echo '<meta name="generator" content="WP Super Duper v' . $this->version . '" />';
314
+        }
315
+
316
+        /**
317
+         * Get widget settings.
318
+         *
319
+         * @since 1.0.0
320
+         */
321
+        public static function get_widget_settings() {
322
+            global $sd_widgets;
323
+
324
+            $shortcode = isset( $_REQUEST['shortcode'] ) && $_REQUEST['shortcode'] ? sanitize_title_with_dashes( $_REQUEST['shortcode'] ) : '';
325
+            if ( ! $shortcode ) {
326
+                wp_die();
327
+            }
328
+            $widget_args = isset( $sd_widgets[ $shortcode ] ) ? $sd_widgets[ $shortcode ] : '';
329
+            if ( ! $widget_args ) {
330
+                wp_die();
331
+            }
332
+            $class_name = isset( $widget_args['class_name'] ) && $widget_args['class_name'] ? $widget_args['class_name'] : '';
333
+            if ( ! $class_name ) {
334
+                wp_die();
335
+            }
336
+
337
+            // invoke an instance method
338
+            $widget = new $class_name;
339
+
340
+            ob_start();
341
+            $widget->form( array() );
342
+            $form = ob_get_clean();
343
+            echo "<form id='$shortcode'>" . $form . "<div class=\"widget-control-save\"></div></form>";
344
+            echo "<style>" . $widget->widget_css() . "</style>";
345
+            echo "<script>" . $widget->widget_js() . "</script>";
346
+            ?>
347 347
 			<?php
348
-			wp_die();
349
-		}
350
-
351
-		/**
352
-		 * Insert shortcode builder button to classic editor (not inside Gutenberg, not needed).
353
-		 *
354
-		 * @since 1.0.0
355
-		 *
356
-		 * @param string $editor_id Optional. Shortcode editor id. Default null.
357
-		 * @param string $insert_shortcode_function Optional. Insert shotcode function. Default null.
358
-		 */
359
-		public static function shortcode_insert_button( $editor_id = '', $insert_shortcode_function = '' ) {
360
-			global $sd_widgets, $shortcode_insert_button_once;
361
-			if ( $shortcode_insert_button_once ) {
362
-				return;
363
-			}
364
-			add_thickbox();
365
-
366
-
367
-			/**
368
-			 * Cornerstone makes us play dirty tricks :/
369
-			 * All media_buttons are removed via JS unless they are two specific id's so we wrap our content in this ID so it is not removed.
370
-			 */
371
-			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
372
-				echo '<span id="insert-media-button">';
373
-			}
374
-
375
-			echo self::shortcode_button( 'this', 'true' );
376
-
377
-			// see opening note
378
-			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
379
-				echo '</span>'; // end #insert-media-button
380
-			}
381
-
382
-			// Add separate script for generatepress theme sections
383
-			if ( function_exists( 'generate_sections_sections_metabox' ) && did_action( 'generate_sections_metabox' ) ) {
384
-			} else {
385
-				self::shortcode_insert_button_script( $editor_id, $insert_shortcode_function );
386
-			}
387
-
388
-			$shortcode_insert_button_once = true;
389
-		}
390
-
391
-		/**
392
-		 * Gets the shortcode insert button html.
393
-		 *
394
-		 * @param string $id
395
-		 * @param string $search_for_id
396
-		 *
397
-		 * @return mixed
398
-		 */
399
-		public static function shortcode_button( $id = '', $search_for_id = '' ) {
400
-			ob_start();
401
-			?>
348
+            wp_die();
349
+        }
350
+
351
+        /**
352
+         * Insert shortcode builder button to classic editor (not inside Gutenberg, not needed).
353
+         *
354
+         * @since 1.0.0
355
+         *
356
+         * @param string $editor_id Optional. Shortcode editor id. Default null.
357
+         * @param string $insert_shortcode_function Optional. Insert shotcode function. Default null.
358
+         */
359
+        public static function shortcode_insert_button( $editor_id = '', $insert_shortcode_function = '' ) {
360
+            global $sd_widgets, $shortcode_insert_button_once;
361
+            if ( $shortcode_insert_button_once ) {
362
+                return;
363
+            }
364
+            add_thickbox();
365
+
366
+
367
+            /**
368
+             * Cornerstone makes us play dirty tricks :/
369
+             * All media_buttons are removed via JS unless they are two specific id's so we wrap our content in this ID so it is not removed.
370
+             */
371
+            if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
372
+                echo '<span id="insert-media-button">';
373
+            }
374
+
375
+            echo self::shortcode_button( 'this', 'true' );
376
+
377
+            // see opening note
378
+            if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
379
+                echo '</span>'; // end #insert-media-button
380
+            }
381
+
382
+            // Add separate script for generatepress theme sections
383
+            if ( function_exists( 'generate_sections_sections_metabox' ) && did_action( 'generate_sections_metabox' ) ) {
384
+            } else {
385
+                self::shortcode_insert_button_script( $editor_id, $insert_shortcode_function );
386
+            }
387
+
388
+            $shortcode_insert_button_once = true;
389
+        }
390
+
391
+        /**
392
+         * Gets the shortcode insert button html.
393
+         *
394
+         * @param string $id
395
+         * @param string $search_for_id
396
+         *
397
+         * @return mixed
398
+         */
399
+        public static function shortcode_button( $id = '', $search_for_id = '' ) {
400
+            ob_start();
401
+            ?>
402 402
 			<span class="sd-lable-shortcode-inserter">
403 403
 				<a onclick="sd_ajax_get_picker(<?php echo $id;
404
-				if ( $search_for_id ) {
405
-					echo "," . $search_for_id;
406
-				} ?>);" href="#TB_inline?width=100%&height=550&inlineId=super-duper-content-ajaxed"
404
+                if ( $search_for_id ) {
405
+                    echo "," . $search_for_id;
406
+                } ?>);" href="#TB_inline?width=100%&height=550&inlineId=super-duper-content-ajaxed"
407 407
 				   class="thickbox button super-duper-content-open" title="Add Shortcode">
408 408
 					<span style="vertical-align: middle;line-height: 18px;font-size: 20px;"
409 409
 					      class="dashicons dashicons-screenoptions"></span>
@@ -414,21 +414,21 @@  discard block
 block discarded – undo
414 414
 			</span>
415 415
 
416 416
 			<?php
417
-			$html = ob_get_clean();
418
-
419
-			// remove line breaks so we can use it in js
420
-			return preg_replace( "/\r|\n/", "", trim( $html ) );
421
-		}
422
-
423
-		/**
424
-		 * Makes SD work with the siteOrigin page builder.
425
-		 *
426
-		 * @since 1.0.6
427
-		 * @return mixed
428
-		 */
429
-		public static function siteorigin_js() {
430
-			ob_start();
431
-			?>
417
+            $html = ob_get_clean();
418
+
419
+            // remove line breaks so we can use it in js
420
+            return preg_replace( "/\r|\n/", "", trim( $html ) );
421
+        }
422
+
423
+        /**
424
+         * Makes SD work with the siteOrigin page builder.
425
+         *
426
+         * @since 1.0.6
427
+         * @return mixed
428
+         */
429
+        public static function siteorigin_js() {
430
+            ob_start();
431
+            ?>
432 432
 			<script>
433 433
 				/**
434 434
 				 * Check a form to see what items shoudl be shown or hidden.
@@ -506,28 +506,28 @@  discard block
 block discarded – undo
506 506
 				});
507 507
 			</script>
508 508
 			<?php
509
-			$output = ob_get_clean();
509
+            $output = ob_get_clean();
510 510
 
511
-			/*
511
+            /*
512 512
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
513 513
 			 */
514 514
 
515
-			return str_replace( array(
516
-				'<script>',
517
-				'</script>'
518
-			), '', $output );
519
-		}
520
-
521
-		/**
522
-		 * Output the JS and CSS for the shortcode insert button.
523
-		 *
524
-		 * @since 1.0.6
525
-		 *
526
-		 * @param string $editor_id
527
-		 * @param string $insert_shortcode_function
528
-		 */
529
-		public static function shortcode_insert_button_script( $editor_id = '', $insert_shortcode_function = '' ) {
530
-			?>
515
+            return str_replace( array(
516
+                '<script>',
517
+                '</script>'
518
+            ), '', $output );
519
+        }
520
+
521
+        /**
522
+         * Output the JS and CSS for the shortcode insert button.
523
+         *
524
+         * @since 1.0.6
525
+         *
526
+         * @param string $editor_id
527
+         * @param string $insert_shortcode_function
528
+         */
529
+        public static function shortcode_insert_button_script( $editor_id = '', $insert_shortcode_function = '' ) {
530
+            ?>
531 531
 			<style>
532 532
 				.sd-shortcode-left-wrap {
533 533
 					float: left;
@@ -653,35 +653,35 @@  discard block
 block discarded – undo
653 653
 				<?php } ?>
654 654
 			</style>
655 655
 			<?php
656
-			if ( class_exists( 'SiteOrigin_Panels' ) ) {
657
-				echo "<script>" . self::siteorigin_js() . "</script>";
658
-			}
659
-			?>
656
+            if ( class_exists( 'SiteOrigin_Panels' ) ) {
657
+                echo "<script>" . self::siteorigin_js() . "</script>";
658
+            }
659
+            ?>
660 660
 			<script>
661 661
 				<?php
662
-				if(! empty( $insert_shortcode_function )){
663
-					echo $insert_shortcode_function;
664
-				}else{
665
-
666
-				/**
667
-				 * Function for super duper insert shortcode.
668
-				 *
669
-				 * @since 1.0.0
670
-				 */
671
-				?>
662
+                if(! empty( $insert_shortcode_function )){
663
+                    echo $insert_shortcode_function;
664
+                }else{
665
+
666
+                /**
667
+                 * Function for super duper insert shortcode.
668
+                 *
669
+                 * @since 1.0.0
670
+                 */
671
+                ?>
672 672
 				function sd_insert_shortcode($editor_id) {
673 673
 					$shortcode = jQuery('#TB_ajaxContent #sd-shortcode-output').val();
674 674
 					if ($shortcode) {
675 675
 						if (!$editor_id) {
676 676
 							<?php
677
-							if ( isset( $_REQUEST['et_fb'] ) ) {
678
-								echo '$editor_id = "#main_content_content_vb_tiny_mce";';
679
-							} elseif ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) {
680
-								echo '$editor_id = "#elementor-controls .wp-editor-container textarea";';
681
-							} else {
682
-								echo '$editor_id = "#wp-content-editor-container textarea";';
683
-							}
684
-							?>
677
+                            if ( isset( $_REQUEST['et_fb'] ) ) {
678
+                                echo '$editor_id = "#main_content_content_vb_tiny_mce";';
679
+                            } elseif ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) {
680
+                                echo '$editor_id = "#elementor-controls .wp-editor-container textarea";';
681
+                            } else {
682
+                                echo '$editor_id = "#wp-content-editor-container textarea";';
683
+                            }
684
+                            ?>
685 685
 						} else {
686 686
 							$editor_id = '#' + $editor_id;
687 687
 						}
@@ -1007,18 +1007,18 @@  discard block
 block discarded – undo
1007 1007
 
1008 1008
 			</script>
1009 1009
 			<?php
1010
-		}
1011
-
1012
-		/**
1013
-		 * Gets some CSS for the widgets screen.
1014
-		 *
1015
-		 * @param bool $advanced If we should include advanced CSS.
1016
-		 *
1017
-		 * @return mixed
1018
-		 */
1019
-		public function widget_css( $advanced = true ) {
1020
-			ob_start();
1021
-			?>
1010
+        }
1011
+
1012
+        /**
1013
+         * Gets some CSS for the widgets screen.
1014
+         *
1015
+         * @param bool $advanced If we should include advanced CSS.
1016
+         *
1017
+         * @return mixed
1018
+         */
1019
+        public function widget_css( $advanced = true ) {
1020
+            ob_start();
1021
+            ?>
1022 1022
 			<style>
1023 1023
 				<?php if( $advanced ){ ?>
1024 1024
 				.sd-advanced-setting {
@@ -1056,26 +1056,26 @@  discard block
 block discarded – undo
1056 1056
 				}
1057 1057
 			</style>
1058 1058
 			<?php
1059
-			$output = ob_get_clean();
1059
+            $output = ob_get_clean();
1060 1060
 
1061
-			/*
1061
+            /*
1062 1062
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1063 1063
 			 */
1064 1064
 
1065
-			return str_replace( array(
1066
-				'<style>',
1067
-				'</style>'
1068
-			), '', $output );
1069
-		}
1070
-
1071
-		/**
1072
-		 * Gets some JS for the widgets screen.
1073
-		 *
1074
-		 * @return mixed
1075
-		 */
1076
-		public function widget_js() {
1077
-			ob_start();
1078
-			?>
1065
+            return str_replace( array(
1066
+                '<style>',
1067
+                '</style>'
1068
+            ), '', $output );
1069
+        }
1070
+
1071
+        /**
1072
+         * Gets some JS for the widgets screen.
1073
+         *
1074
+         * @return mixed
1075
+         */
1076
+        public function widget_js() {
1077
+            ob_start();
1078
+            ?>
1079 1079
 			<script>
1080 1080
 
1081 1081
 				/**
@@ -1233,402 +1233,402 @@  discard block
 block discarded – undo
1233 1233
 				<?php do_action( 'wp_super_duper_widget_js', $this ); ?>
1234 1234
 			</script>
1235 1235
 			<?php
1236
-			$output = ob_get_clean();
1236
+            $output = ob_get_clean();
1237 1237
 
1238
-			/*
1238
+            /*
1239 1239
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1240 1240
 			 */
1241 1241
 
1242
-			return str_replace( array(
1243
-				'<script>',
1244
-				'</script>'
1245
-			), '', $output );
1246
-		}
1247
-
1248
-
1249
-		/**
1250
-		 * Set the name from the argument key.
1251
-		 *
1252
-		 * @param $options
1253
-		 *
1254
-		 * @return mixed
1255
-		 */
1256
-		private function add_name_from_key( $options, $arguments = false ) {
1257
-			if ( ! empty( $options['arguments'] ) ) {
1258
-				foreach ( $options['arguments'] as $key => $val ) {
1259
-					$options['arguments'][ $key ]['name'] = $key;
1260
-				}
1261
-			} elseif ( $arguments && is_array( $options ) && ! empty( $options ) ) {
1262
-				foreach ( $options as $key => $val ) {
1263
-					$options[ $key ]['name'] = $key;
1264
-				}
1265
-			}
1266
-
1267
-			return $options;
1268
-		}
1269
-
1270
-		/**
1271
-		 * Register the parent shortcode.
1272
-		 *
1273
-		 * @since 1.0.0
1274
-		 */
1275
-		public function register_shortcode() {
1276
-			add_shortcode( $this->base_id, array( $this, 'shortcode_output' ) );
1277
-			add_action( 'wp_ajax_super_duper_output_shortcode', array( __CLASS__, 'render_shortcode' ) );
1278
-		}
1279
-
1280
-		/**
1281
-		 * Render the shortcode via ajax so we can return it to Gutenberg.
1282
-		 *
1283
-		 * @since 1.0.0
1284
-		 */
1285
-		public static function render_shortcode() {
1286
-
1287
-			check_ajax_referer( 'super_duper_output_shortcode', '_ajax_nonce', true );
1288
-			if ( ! current_user_can( 'manage_options' ) ) {
1289
-				wp_die();
1290
-			}
1291
-
1292
-			// we might need the $post value here so lets set it.
1293
-			if ( isset( $_POST['post_id'] ) && $_POST['post_id'] ) {
1294
-				$post_obj = get_post( absint( $_POST['post_id'] ) );
1295
-				if ( ! empty( $post_obj ) && empty( $post ) ) {
1296
-					global $post;
1297
-					$post = $post_obj;
1298
-				}
1299
-			}
1300
-
1301
-			if ( isset( $_POST['shortcode'] ) && $_POST['shortcode'] ) {
1302
-				$shortcode_name   = sanitize_title_with_dashes( $_POST['shortcode'] );
1303
-				$attributes_array = isset( $_POST['attributes'] ) && $_POST['attributes'] ? $_POST['attributes'] : array();
1304
-				$attributes       = '';
1305
-				if ( ! empty( $attributes_array ) ) {
1306
-					foreach ( $attributes_array as $key => $value ) {
1307
-						$attributes .= " " . sanitize_title_with_dashes( $key ) . "='" . wp_slash( $value ) . "' ";
1308
-					}
1309
-				}
1310
-
1311
-				$shortcode = "[" . $shortcode_name . " " . $attributes . "]";
1312
-
1313
-				echo do_shortcode( $shortcode );
1314
-
1315
-			}
1316
-			wp_die();
1317
-		}
1318
-
1319
-		/**
1320
-		 * Output the shortcode.
1321
-		 *
1322
-		 * @param array $args
1323
-		 * @param string $content
1324
-		 *
1325
-		 * @return string
1326
-		 */
1327
-		public function shortcode_output( $args = array(), $content = '' ) {
1328
-			$args = $this->argument_values( $args );
1329
-
1330
-			// add extra argument so we know its a output to gutenberg
1331
-			//$args
1332
-			$args = $this->string_to_bool( $args );
1333
-
1334
-			// if we have a enclosed shortcode we add it to the special `html` argument
1335
-			if ( ! empty( $content ) ) {
1336
-				$args['html'] = $content;
1337
-			}
1338
-
1339
-			$class = isset( $this->options['widget_ops']['classname'] ) ? esc_attr( $this->options['widget_ops']['classname'] ) : '';
1340
-			$class .= " sdel-".$this->get_instance_hash();
1341
-
1342
-			$class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
1343
-			$class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
1344
-
1345
-			$attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
1346
-			$attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this ); //@todo this does not seem right @kiran?
1347
-
1348
-			$shortcode_args = array();
1349
-			$output         = '';
1350
-			$no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1351
-			if ( isset( $args['no_wrap'] ) && $args['no_wrap'] ) {
1352
-				$no_wrap = true;
1353
-			}
1354
-			$main_content = $this->output( $args, $shortcode_args, $content );
1355
-			if ( $main_content && ! $no_wrap ) {
1356
-				// wrap the shortcode in a div with the same class as the widget
1357
-				$output .= '<div class="' . $class . '" ' . $attrs . '>';
1358
-				if ( ! empty( $args['title'] ) ) {
1359
-					// if its a shortcode and there is a title try to grab the title wrappers
1360
-					$shortcode_args = array( 'before_title' => '', 'after_title' => '' );
1361
-					if ( empty( $instance ) ) {
1362
-						global $wp_registered_sidebars;
1363
-						if ( ! empty( $wp_registered_sidebars ) ) {
1364
-							foreach ( $wp_registered_sidebars as $sidebar ) {
1365
-								if ( ! empty( $sidebar['before_title'] ) ) {
1366
-									$shortcode_args['before_title'] = $sidebar['before_title'];
1367
-									$shortcode_args['after_title']  = $sidebar['after_title'];
1368
-									break;
1369
-								}
1370
-							}
1371
-						}
1372
-					}
1373
-					$output .= $this->output_title( $shortcode_args, $args );
1374
-				}
1375
-				$output .= $main_content;
1376
-				$output .= '</div>';
1377
-			} elseif ( $main_content && $no_wrap ) {
1378
-				$output .= $main_content;
1379
-			}
1380
-
1381
-			// if preview show a placeholder if empty
1382
-			if ( $this->is_preview() && $output == '' ) {
1383
-				$output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
1384
-			}
1385
-
1386
-			return apply_filters( 'wp_super_duper_widget_output', $output, $args, $shortcode_args, $this );
1387
-		}
1388
-
1389
-		/**
1390
-		 * Placeholder text to show if output is empty and we are on a preview/builder page.
1391
-		 *
1392
-		 * @param string $name
1393
-		 *
1394
-		 * @return string
1395
-		 */
1396
-		public function preview_placeholder_text( $name = '' ) {
1397
-			return "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" . sprintf( __( 'Placeholder for: %s' ), $name ) . "</div>";
1398
-		}
1399
-
1400
-		/**
1401
-		 * Sometimes booleans values can be turned to strings, so we fix that.
1402
-		 *
1403
-		 * @param $options
1404
-		 *
1405
-		 * @return mixed
1406
-		 */
1407
-		public function string_to_bool( $options ) {
1408
-			// convert bool strings to booleans
1409
-			foreach ( $options as $key => $val ) {
1410
-				if ( $val == 'false' ) {
1411
-					$options[ $key ] = false;
1412
-				} elseif ( $val == 'true' ) {
1413
-					$options[ $key ] = true;
1414
-				}
1415
-			}
1416
-
1417
-			return $options;
1418
-		}
1419
-
1420
-		/**
1421
-		 * Get the argument values that are also filterable.
1422
-		 *
1423
-		 * @param $instance
1424
-		 *
1425
-		 * @since 1.0.12 Don't set checkbox default value if the value is empty.
1426
-		 *
1427
-		 * @return array
1428
-		 */
1429
-		public function argument_values( $instance ) {
1430
-			$argument_values = array();
1431
-
1432
-			// set widget instance
1433
-			$this->instance = $instance;
1434
-
1435
-			if ( empty( $this->arguments ) ) {
1436
-				$this->arguments = $this->get_arguments();
1437
-			}
1438
-
1439
-			if ( ! empty( $this->arguments ) ) {
1440
-				foreach ( $this->arguments as $key => $args ) {
1441
-					// set the input name from the key
1442
-					$args['name'] = $key;
1443
-					//
1444
-					$argument_values[ $key ] = isset( $instance[ $key ] ) ? $instance[ $key ] : '';
1445
-					if ( $args['type'] == 'checkbox' && $argument_values[ $key ] == '' ) {
1446
-						// don't set default for an empty checkbox
1447
-					} elseif ( $argument_values[ $key ] == '' && isset( $args['default'] ) ) {
1448
-						$argument_values[ $key ] = $args['default'];
1449
-					}
1450
-				}
1451
-			}
1452
-
1453
-			return $argument_values;
1454
-		}
1455
-
1456
-		/**
1457
-		 * Set arguments in super duper.
1458
-		 *
1459
-		 * @since 1.0.0
1460
-		 *
1461
-		 * @return array Set arguments.
1462
-		 */
1463
-		public function set_arguments() {
1464
-			return $this->arguments;
1465
-		}
1466
-
1467
-		/**
1468
-		 * Get arguments in super duper.
1469
-		 *
1470
-		 * @since 1.0.0
1471
-		 *
1472
-		 * @return array Get arguments.
1473
-		 */
1474
-		public function get_arguments() {
1475
-			if ( empty( $this->arguments ) ) {
1476
-				$this->arguments = $this->set_arguments();
1477
-			}
1478
-
1479
-			$this->arguments = apply_filters( 'wp_super_duper_arguments', $this->arguments, $this->options, $this->instance );
1480
-			$this->arguments = $this->add_name_from_key( $this->arguments, true );
1481
-
1482
-			return $this->arguments;
1483
-		}
1484
-
1485
-		/**
1486
-		 * This is the main output class for all 3 items, widget, shortcode and block, it is extended in the calling class.
1487
-		 *
1488
-		 * @param array $args
1489
-		 * @param array $widget_args
1490
-		 * @param string $content
1491
-		 */
1492
-		public function output( $args = array(), $widget_args = array(), $content = '' ) {
1493
-
1494
-		}
1495
-
1496
-		/**
1497
-		 * Add the dynamic block code inline when the wp-block in enqueued.
1498
-		 */
1499
-		public function register_block() {
1500
-			wp_add_inline_script( 'wp-blocks', $this->block() );
1501
-			if ( class_exists( 'SiteOrigin_Panels' ) ) {
1502
-				wp_add_inline_script( 'wp-blocks', $this->siteorigin_js() );
1503
-			}
1504
-		}
1505
-
1506
-		/**
1507
-		 * Check if we need to show advanced options.
1508
-		 *
1509
-		 * @return bool
1510
-		 */
1511
-		public function block_show_advanced() {
1512
-
1513
-			$show      = false;
1514
-			$arguments = $this->arguments;
1515
-
1516
-			if ( empty( $arguments ) ) {
1517
-				$arguments = $this->get_arguments();
1518
-			}
1519
-
1520
-			if ( ! empty( $arguments ) ) {
1521
-				foreach ( $arguments as $argument ) {
1522
-					if ( isset( $argument['advanced'] ) && $argument['advanced'] ) {
1523
-						$show = true;
1524
-						break; // no need to continue if we know we have it
1525
-					}
1526
-				}
1527
-			}
1528
-
1529
-			return $show;
1530
-		}
1531
-
1532
-		/**
1533
-		 * Get the url path to the current folder.
1534
-		 *
1535
-		 * @return string
1536
-		 */
1537
-		public function get_url() {
1538
-
1539
-			$url = $this->url;
1540
-
1541
-			if ( ! $url ) {
1542
-				// check if we are inside a plugin
1543
-				$file_dir = str_replace( "/includes", "", dirname( __FILE__ ) );
1544
-
1545
-				$dir_parts = explode( "/wp-content/", $file_dir );
1546
-				$url_parts = explode( "/wp-content/", plugins_url() );
1547
-
1548
-				if ( ! empty( $url_parts[0] ) && ! empty( $dir_parts[1] ) ) {
1549
-					$url       = trailingslashit( $url_parts[0] . "/wp-content/" . $dir_parts[1] );
1550
-					$this->url = $url;
1551
-				}
1552
-			}
1553
-
1554
-
1555
-			return $url;
1556
-		}
1557
-
1558
-		/**
1559
-		 * Generate the block icon.
1560
-		 *
1561
-		 * Enables the use of Font Awesome icons.
1562
-		 *
1563
-		 * @note xlink:href is actually deprecated but href is not supported by all so we use both.
1564
-		 *
1565
-		 * @param $icon
1566
-		 *
1567
-		 * @since 1.1.0
1568
-		 * @return string
1569
-		 */
1570
-		public function get_block_icon( $icon ) {
1571
-
1572
-			// check if we have a Font Awesome icon
1573
-			$fa_type = '';
1574
-			if ( substr( $icon, 0, 7 ) === "fas fa-" ) {
1575
-				$fa_type = 'solid';
1576
-			} elseif ( substr( $icon, 0, 7 ) === "far fa-" ) {
1577
-				$fa_type = 'regular';
1578
-			} elseif ( substr( $icon, 0, 7 ) === "fab fa-" ) {
1579
-				$fa_type = 'brands';
1580
-			} else {
1581
-				$icon = "'" . $icon . "'";
1582
-			}
1583
-
1584
-			// set the icon if we found one
1585
-			if ( $fa_type ) {
1586
-				$fa_icon = str_replace( array( "fas fa-", "far fa-", "fab fa-" ), "", $icon );
1587
-				$icon    = "el('svg',{width: 20, height: 20, viewBox: '0 0 20 20'},el('use', {'xlink:href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "','href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "'}))";
1588
-			}
1589
-
1590
-			return $icon;
1591
-		}
1592
-
1593
-		public function group_arguments( $arguments ) {
1242
+            return str_replace( array(
1243
+                '<script>',
1244
+                '</script>'
1245
+            ), '', $output );
1246
+        }
1247
+
1248
+
1249
+        /**
1250
+         * Set the name from the argument key.
1251
+         *
1252
+         * @param $options
1253
+         *
1254
+         * @return mixed
1255
+         */
1256
+        private function add_name_from_key( $options, $arguments = false ) {
1257
+            if ( ! empty( $options['arguments'] ) ) {
1258
+                foreach ( $options['arguments'] as $key => $val ) {
1259
+                    $options['arguments'][ $key ]['name'] = $key;
1260
+                }
1261
+            } elseif ( $arguments && is_array( $options ) && ! empty( $options ) ) {
1262
+                foreach ( $options as $key => $val ) {
1263
+                    $options[ $key ]['name'] = $key;
1264
+                }
1265
+            }
1266
+
1267
+            return $options;
1268
+        }
1269
+
1270
+        /**
1271
+         * Register the parent shortcode.
1272
+         *
1273
+         * @since 1.0.0
1274
+         */
1275
+        public function register_shortcode() {
1276
+            add_shortcode( $this->base_id, array( $this, 'shortcode_output' ) );
1277
+            add_action( 'wp_ajax_super_duper_output_shortcode', array( __CLASS__, 'render_shortcode' ) );
1278
+        }
1279
+
1280
+        /**
1281
+         * Render the shortcode via ajax so we can return it to Gutenberg.
1282
+         *
1283
+         * @since 1.0.0
1284
+         */
1285
+        public static function render_shortcode() {
1286
+
1287
+            check_ajax_referer( 'super_duper_output_shortcode', '_ajax_nonce', true );
1288
+            if ( ! current_user_can( 'manage_options' ) ) {
1289
+                wp_die();
1290
+            }
1291
+
1292
+            // we might need the $post value here so lets set it.
1293
+            if ( isset( $_POST['post_id'] ) && $_POST['post_id'] ) {
1294
+                $post_obj = get_post( absint( $_POST['post_id'] ) );
1295
+                if ( ! empty( $post_obj ) && empty( $post ) ) {
1296
+                    global $post;
1297
+                    $post = $post_obj;
1298
+                }
1299
+            }
1300
+
1301
+            if ( isset( $_POST['shortcode'] ) && $_POST['shortcode'] ) {
1302
+                $shortcode_name   = sanitize_title_with_dashes( $_POST['shortcode'] );
1303
+                $attributes_array = isset( $_POST['attributes'] ) && $_POST['attributes'] ? $_POST['attributes'] : array();
1304
+                $attributes       = '';
1305
+                if ( ! empty( $attributes_array ) ) {
1306
+                    foreach ( $attributes_array as $key => $value ) {
1307
+                        $attributes .= " " . sanitize_title_with_dashes( $key ) . "='" . wp_slash( $value ) . "' ";
1308
+                    }
1309
+                }
1310
+
1311
+                $shortcode = "[" . $shortcode_name . " " . $attributes . "]";
1312
+
1313
+                echo do_shortcode( $shortcode );
1314
+
1315
+            }
1316
+            wp_die();
1317
+        }
1318
+
1319
+        /**
1320
+         * Output the shortcode.
1321
+         *
1322
+         * @param array $args
1323
+         * @param string $content
1324
+         *
1325
+         * @return string
1326
+         */
1327
+        public function shortcode_output( $args = array(), $content = '' ) {
1328
+            $args = $this->argument_values( $args );
1329
+
1330
+            // add extra argument so we know its a output to gutenberg
1331
+            //$args
1332
+            $args = $this->string_to_bool( $args );
1333
+
1334
+            // if we have a enclosed shortcode we add it to the special `html` argument
1335
+            if ( ! empty( $content ) ) {
1336
+                $args['html'] = $content;
1337
+            }
1338
+
1339
+            $class = isset( $this->options['widget_ops']['classname'] ) ? esc_attr( $this->options['widget_ops']['classname'] ) : '';
1340
+            $class .= " sdel-".$this->get_instance_hash();
1341
+
1342
+            $class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
1343
+            $class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
1344
+
1345
+            $attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
1346
+            $attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this ); //@todo this does not seem right @kiran?
1347
+
1348
+            $shortcode_args = array();
1349
+            $output         = '';
1350
+            $no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1351
+            if ( isset( $args['no_wrap'] ) && $args['no_wrap'] ) {
1352
+                $no_wrap = true;
1353
+            }
1354
+            $main_content = $this->output( $args, $shortcode_args, $content );
1355
+            if ( $main_content && ! $no_wrap ) {
1356
+                // wrap the shortcode in a div with the same class as the widget
1357
+                $output .= '<div class="' . $class . '" ' . $attrs . '>';
1358
+                if ( ! empty( $args['title'] ) ) {
1359
+                    // if its a shortcode and there is a title try to grab the title wrappers
1360
+                    $shortcode_args = array( 'before_title' => '', 'after_title' => '' );
1361
+                    if ( empty( $instance ) ) {
1362
+                        global $wp_registered_sidebars;
1363
+                        if ( ! empty( $wp_registered_sidebars ) ) {
1364
+                            foreach ( $wp_registered_sidebars as $sidebar ) {
1365
+                                if ( ! empty( $sidebar['before_title'] ) ) {
1366
+                                    $shortcode_args['before_title'] = $sidebar['before_title'];
1367
+                                    $shortcode_args['after_title']  = $sidebar['after_title'];
1368
+                                    break;
1369
+                                }
1370
+                            }
1371
+                        }
1372
+                    }
1373
+                    $output .= $this->output_title( $shortcode_args, $args );
1374
+                }
1375
+                $output .= $main_content;
1376
+                $output .= '</div>';
1377
+            } elseif ( $main_content && $no_wrap ) {
1378
+                $output .= $main_content;
1379
+            }
1380
+
1381
+            // if preview show a placeholder if empty
1382
+            if ( $this->is_preview() && $output == '' ) {
1383
+                $output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
1384
+            }
1385
+
1386
+            return apply_filters( 'wp_super_duper_widget_output', $output, $args, $shortcode_args, $this );
1387
+        }
1388
+
1389
+        /**
1390
+         * Placeholder text to show if output is empty and we are on a preview/builder page.
1391
+         *
1392
+         * @param string $name
1393
+         *
1394
+         * @return string
1395
+         */
1396
+        public function preview_placeholder_text( $name = '' ) {
1397
+            return "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" . sprintf( __( 'Placeholder for: %s' ), $name ) . "</div>";
1398
+        }
1399
+
1400
+        /**
1401
+         * Sometimes booleans values can be turned to strings, so we fix that.
1402
+         *
1403
+         * @param $options
1404
+         *
1405
+         * @return mixed
1406
+         */
1407
+        public function string_to_bool( $options ) {
1408
+            // convert bool strings to booleans
1409
+            foreach ( $options as $key => $val ) {
1410
+                if ( $val == 'false' ) {
1411
+                    $options[ $key ] = false;
1412
+                } elseif ( $val == 'true' ) {
1413
+                    $options[ $key ] = true;
1414
+                }
1415
+            }
1416
+
1417
+            return $options;
1418
+        }
1419
+
1420
+        /**
1421
+         * Get the argument values that are also filterable.
1422
+         *
1423
+         * @param $instance
1424
+         *
1425
+         * @since 1.0.12 Don't set checkbox default value if the value is empty.
1426
+         *
1427
+         * @return array
1428
+         */
1429
+        public function argument_values( $instance ) {
1430
+            $argument_values = array();
1431
+
1432
+            // set widget instance
1433
+            $this->instance = $instance;
1434
+
1435
+            if ( empty( $this->arguments ) ) {
1436
+                $this->arguments = $this->get_arguments();
1437
+            }
1438
+
1439
+            if ( ! empty( $this->arguments ) ) {
1440
+                foreach ( $this->arguments as $key => $args ) {
1441
+                    // set the input name from the key
1442
+                    $args['name'] = $key;
1443
+                    //
1444
+                    $argument_values[ $key ] = isset( $instance[ $key ] ) ? $instance[ $key ] : '';
1445
+                    if ( $args['type'] == 'checkbox' && $argument_values[ $key ] == '' ) {
1446
+                        // don't set default for an empty checkbox
1447
+                    } elseif ( $argument_values[ $key ] == '' && isset( $args['default'] ) ) {
1448
+                        $argument_values[ $key ] = $args['default'];
1449
+                    }
1450
+                }
1451
+            }
1452
+
1453
+            return $argument_values;
1454
+        }
1455
+
1456
+        /**
1457
+         * Set arguments in super duper.
1458
+         *
1459
+         * @since 1.0.0
1460
+         *
1461
+         * @return array Set arguments.
1462
+         */
1463
+        public function set_arguments() {
1464
+            return $this->arguments;
1465
+        }
1466
+
1467
+        /**
1468
+         * Get arguments in super duper.
1469
+         *
1470
+         * @since 1.0.0
1471
+         *
1472
+         * @return array Get arguments.
1473
+         */
1474
+        public function get_arguments() {
1475
+            if ( empty( $this->arguments ) ) {
1476
+                $this->arguments = $this->set_arguments();
1477
+            }
1478
+
1479
+            $this->arguments = apply_filters( 'wp_super_duper_arguments', $this->arguments, $this->options, $this->instance );
1480
+            $this->arguments = $this->add_name_from_key( $this->arguments, true );
1481
+
1482
+            return $this->arguments;
1483
+        }
1484
+
1485
+        /**
1486
+         * This is the main output class for all 3 items, widget, shortcode and block, it is extended in the calling class.
1487
+         *
1488
+         * @param array $args
1489
+         * @param array $widget_args
1490
+         * @param string $content
1491
+         */
1492
+        public function output( $args = array(), $widget_args = array(), $content = '' ) {
1493
+
1494
+        }
1495
+
1496
+        /**
1497
+         * Add the dynamic block code inline when the wp-block in enqueued.
1498
+         */
1499
+        public function register_block() {
1500
+            wp_add_inline_script( 'wp-blocks', $this->block() );
1501
+            if ( class_exists( 'SiteOrigin_Panels' ) ) {
1502
+                wp_add_inline_script( 'wp-blocks', $this->siteorigin_js() );
1503
+            }
1504
+        }
1505
+
1506
+        /**
1507
+         * Check if we need to show advanced options.
1508
+         *
1509
+         * @return bool
1510
+         */
1511
+        public function block_show_advanced() {
1512
+
1513
+            $show      = false;
1514
+            $arguments = $this->arguments;
1515
+
1516
+            if ( empty( $arguments ) ) {
1517
+                $arguments = $this->get_arguments();
1518
+            }
1519
+
1520
+            if ( ! empty( $arguments ) ) {
1521
+                foreach ( $arguments as $argument ) {
1522
+                    if ( isset( $argument['advanced'] ) && $argument['advanced'] ) {
1523
+                        $show = true;
1524
+                        break; // no need to continue if we know we have it
1525
+                    }
1526
+                }
1527
+            }
1528
+
1529
+            return $show;
1530
+        }
1531
+
1532
+        /**
1533
+         * Get the url path to the current folder.
1534
+         *
1535
+         * @return string
1536
+         */
1537
+        public function get_url() {
1538
+
1539
+            $url = $this->url;
1540
+
1541
+            if ( ! $url ) {
1542
+                // check if we are inside a plugin
1543
+                $file_dir = str_replace( "/includes", "", dirname( __FILE__ ) );
1544
+
1545
+                $dir_parts = explode( "/wp-content/", $file_dir );
1546
+                $url_parts = explode( "/wp-content/", plugins_url() );
1547
+
1548
+                if ( ! empty( $url_parts[0] ) && ! empty( $dir_parts[1] ) ) {
1549
+                    $url       = trailingslashit( $url_parts[0] . "/wp-content/" . $dir_parts[1] );
1550
+                    $this->url = $url;
1551
+                }
1552
+            }
1553
+
1554
+
1555
+            return $url;
1556
+        }
1557
+
1558
+        /**
1559
+         * Generate the block icon.
1560
+         *
1561
+         * Enables the use of Font Awesome icons.
1562
+         *
1563
+         * @note xlink:href is actually deprecated but href is not supported by all so we use both.
1564
+         *
1565
+         * @param $icon
1566
+         *
1567
+         * @since 1.1.0
1568
+         * @return string
1569
+         */
1570
+        public function get_block_icon( $icon ) {
1571
+
1572
+            // check if we have a Font Awesome icon
1573
+            $fa_type = '';
1574
+            if ( substr( $icon, 0, 7 ) === "fas fa-" ) {
1575
+                $fa_type = 'solid';
1576
+            } elseif ( substr( $icon, 0, 7 ) === "far fa-" ) {
1577
+                $fa_type = 'regular';
1578
+            } elseif ( substr( $icon, 0, 7 ) === "fab fa-" ) {
1579
+                $fa_type = 'brands';
1580
+            } else {
1581
+                $icon = "'" . $icon . "'";
1582
+            }
1583
+
1584
+            // set the icon if we found one
1585
+            if ( $fa_type ) {
1586
+                $fa_icon = str_replace( array( "fas fa-", "far fa-", "fab fa-" ), "", $icon );
1587
+                $icon    = "el('svg',{width: 20, height: 20, viewBox: '0 0 20 20'},el('use', {'xlink:href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "','href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "'}))";
1588
+            }
1589
+
1590
+            return $icon;
1591
+        }
1592
+
1593
+        public function group_arguments( $arguments ) {
1594 1594
 //			echo '###';print_r($arguments);
1595
-			if ( ! empty( $arguments ) ) {
1596
-				$temp_arguments = array();
1597
-				$general        = __( "General" );
1598
-				$add_sections   = false;
1599
-				foreach ( $arguments as $key => $args ) {
1600
-					if ( isset( $args['group'] ) ) {
1601
-						$temp_arguments[ $args['group'] ][ $key ] = $args;
1602
-						$add_sections                             = true;
1603
-					} else {
1604
-						$temp_arguments[ $general ][ $key ] = $args;
1605
-					}
1606
-				}
1607
-
1608
-				// only add sections if more than one
1609
-				if ( $add_sections ) {
1610
-					$arguments = $temp_arguments;
1611
-				}
1612
-			}
1595
+            if ( ! empty( $arguments ) ) {
1596
+                $temp_arguments = array();
1597
+                $general        = __( "General" );
1598
+                $add_sections   = false;
1599
+                foreach ( $arguments as $key => $args ) {
1600
+                    if ( isset( $args['group'] ) ) {
1601
+                        $temp_arguments[ $args['group'] ][ $key ] = $args;
1602
+                        $add_sections                             = true;
1603
+                    } else {
1604
+                        $temp_arguments[ $general ][ $key ] = $args;
1605
+                    }
1606
+                }
1607
+
1608
+                // only add sections if more than one
1609
+                if ( $add_sections ) {
1610
+                    $arguments = $temp_arguments;
1611
+                }
1612
+            }
1613 1613
 
1614 1614
 //			echo '###';print_r($arguments);
1615
-			return $arguments;
1616
-		}
1617
-
1618
-
1619
-		/**
1620
-		 * Output the JS for building the dynamic Guntenberg block.
1621
-		 *
1622
-		 * @since 1.0.4 Added block_wrap property which will set the block wrapping output element ie: div, span, p or empty for no wrap.
1623
-		 * @since 1.0.9 Save numbers as numbers and not strings.
1624
-		 * @since 1.1.0 Font Awesome classes can be used for icons.
1625
-		 * @return mixed
1626
-		 */
1627
-		public function block() {
1628
-			ob_start();
1629
-
1630
-			$show_advanced = $this->block_show_advanced();
1631
-			?>
1615
+            return $arguments;
1616
+        }
1617
+
1618
+
1619
+        /**
1620
+         * Output the JS for building the dynamic Guntenberg block.
1621
+         *
1622
+         * @since 1.0.4 Added block_wrap property which will set the block wrapping output element ie: div, span, p or empty for no wrap.
1623
+         * @since 1.0.9 Save numbers as numbers and not strings.
1624
+         * @since 1.1.0 Font Awesome classes can be used for icons.
1625
+         * @return mixed
1626
+         */
1627
+        public function block() {
1628
+            ob_start();
1629
+
1630
+            $show_advanced = $this->block_show_advanced();
1631
+            ?>
1632 1632
 			<script>
1633 1633
 				/**
1634 1634
 				 * BLOCK: Basic
@@ -1672,97 +1672,97 @@  discard block
 block discarded – undo
1672 1672
 						icon: <?php echo $this->get_block_icon( $this->options['block-icon'] );?>,//'<?php echo isset( $this->options['block-icon'] ) ? esc_attr( $this->options['block-icon'] ) : 'shield-alt';?>', // Block icon from Dashicons → https://developer.wordpress.org/resource/dashicons/.
1673 1673
 						supports: {
1674 1674
 							<?php
1675
-							if ( isset( $this->options['block-supports'] ) ) {
1676
-								echo $this->array_to_attributes( $this->options['block-supports'] );
1677
-							}
1678
-							?>
1675
+                            if ( isset( $this->options['block-supports'] ) ) {
1676
+                                echo $this->array_to_attributes( $this->options['block-supports'] );
1677
+                            }
1678
+                            ?>
1679 1679
 						},
1680 1680
 						category: '<?php echo isset( $this->options['block-category'] ) ? esc_attr( $this->options['block-category'] ) : 'common';?>', // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed.
1681 1681
 						<?php if ( isset( $this->options['block-keywords'] ) ) {
1682
-						echo "keywords : " . $this->options['block-keywords'] . ",";
1683
-					}?>
1682
+                        echo "keywords : " . $this->options['block-keywords'] . ",";
1683
+                    }?>
1684 1684
 
1685 1685
 						<?php
1686 1686
 
1687
-						// maybe set no_wrap
1688
-						$no_wrap = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1689
-						if ( isset( $this->arguments['no_wrap'] ) && $this->arguments['no_wrap'] ) {
1690
-							$no_wrap = true;
1691
-						}
1692
-						if ( $no_wrap ) {
1693
-							$this->options['block-wrap'] = '';
1694
-						}
1687
+                        // maybe set no_wrap
1688
+                        $no_wrap = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1689
+                        if ( isset( $this->arguments['no_wrap'] ) && $this->arguments['no_wrap'] ) {
1690
+                            $no_wrap = true;
1691
+                        }
1692
+                        if ( $no_wrap ) {
1693
+                            $this->options['block-wrap'] = '';
1694
+                        }
1695 1695
 
1696 1696
 
1697 1697
 
1698
-						$show_alignment = false;
1699
-						// align feature
1700
-						/*echo "supports: {";
1698
+                        $show_alignment = false;
1699
+                        // align feature
1700
+                        /*echo "supports: {";
1701 1701
 						echo "	align: true,";
1702 1702
 						echo "  html: false";
1703 1703
 						echo "},";*/
1704 1704
 
1705
-						if ( ! empty( $this->arguments ) ) {
1706
-							echo "attributes : {";
1707
-
1708
-							if ( $show_advanced ) {
1709
-								echo "show_advanced: {";
1710
-								echo "	type: 'boolean',";
1711
-								echo "  default: false,";
1712
-								echo "},";
1713
-							}
1714
-
1715
-							// block wrap element
1716
-							if ( ! empty( $this->options['block-wrap'] ) ) { //@todo we should validate this?
1717
-								echo "block_wrap: {";
1718
-								echo "	type: 'string',";
1719
-								echo "  default: '" . esc_attr( $this->options['block-wrap'] ) . "',";
1720
-								echo "},";
1721
-							}
1722
-
1723
-							foreach ( $this->arguments as $key => $args ) {
1724
-
1725
-								// set if we should show alignment
1726
-								if ( $key == 'alignment' ) {
1727
-									$show_alignment = true;
1728
-								}
1729
-
1730
-								$extra = '';
1731
-
1732
-								if ( $args['type'] == 'checkbox' ) {
1733
-									$type    = 'boolean';
1734
-									$default = isset( $args['default'] ) && $args['default'] ? 'true' : 'false';
1735
-								} elseif ( $args['type'] == 'number' ) {
1736
-									$type    = 'number';
1737
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1738
-								} elseif ( $args['type'] == 'select' && ! empty( $args['multiple'] ) ) {
1739
-									$type = 'array';
1740
-									if ( is_array( $args['default'] ) ) {
1741
-										$default = isset( $args['default'] ) ? "['" . implode( "','", $args['default'] ) . "']" : "[]";
1742
-									} else {
1743
-										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1744
-									}
1745
-								} elseif ( $args['type'] == 'multiselect' ) {
1746
-									$type    = 'array';
1747
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1748
-								} else {
1749
-									$type    = 'string';
1750
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1751
-								}
1752
-								echo $key . " : {";
1753
-								echo "type : '$type',";
1754
-								echo "default : $default,";
1755
-								echo "},";
1756
-							}
1757
-
1758
-							echo "content : {type : 'string',default: 'Please select the attributes in the block settings'},";
1759
-							echo "className: { type: 'string', default: '' },";
1760
-
1761
-							echo "},";
1762
-
1763
-						}
1764
-
1765
-						?>
1705
+                        if ( ! empty( $this->arguments ) ) {
1706
+                            echo "attributes : {";
1707
+
1708
+                            if ( $show_advanced ) {
1709
+                                echo "show_advanced: {";
1710
+                                echo "	type: 'boolean',";
1711
+                                echo "  default: false,";
1712
+                                echo "},";
1713
+                            }
1714
+
1715
+                            // block wrap element
1716
+                            if ( ! empty( $this->options['block-wrap'] ) ) { //@todo we should validate this?
1717
+                                echo "block_wrap: {";
1718
+                                echo "	type: 'string',";
1719
+                                echo "  default: '" . esc_attr( $this->options['block-wrap'] ) . "',";
1720
+                                echo "},";
1721
+                            }
1722
+
1723
+                            foreach ( $this->arguments as $key => $args ) {
1724
+
1725
+                                // set if we should show alignment
1726
+                                if ( $key == 'alignment' ) {
1727
+                                    $show_alignment = true;
1728
+                                }
1729
+
1730
+                                $extra = '';
1731
+
1732
+                                if ( $args['type'] == 'checkbox' ) {
1733
+                                    $type    = 'boolean';
1734
+                                    $default = isset( $args['default'] ) && $args['default'] ? 'true' : 'false';
1735
+                                } elseif ( $args['type'] == 'number' ) {
1736
+                                    $type    = 'number';
1737
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1738
+                                } elseif ( $args['type'] == 'select' && ! empty( $args['multiple'] ) ) {
1739
+                                    $type = 'array';
1740
+                                    if ( is_array( $args['default'] ) ) {
1741
+                                        $default = isset( $args['default'] ) ? "['" . implode( "','", $args['default'] ) . "']" : "[]";
1742
+                                    } else {
1743
+                                        $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1744
+                                    }
1745
+                                } elseif ( $args['type'] == 'multiselect' ) {
1746
+                                    $type    = 'array';
1747
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1748
+                                } else {
1749
+                                    $type    = 'string';
1750
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1751
+                                }
1752
+                                echo $key . " : {";
1753
+                                echo "type : '$type',";
1754
+                                echo "default : $default,";
1755
+                                echo "},";
1756
+                            }
1757
+
1758
+                            echo "content : {type : 'string',default: 'Please select the attributes in the block settings'},";
1759
+                            echo "className: { type: 'string', default: '' },";
1760
+
1761
+                            echo "},";
1762
+
1763
+                        }
1764
+
1765
+                        ?>
1766 1766
 
1767 1767
 						// The "edit" property must be a valid function.
1768 1768
 						edit: function (props) {
@@ -1770,9 +1770,9 @@  discard block
 block discarded – undo
1770 1770
 
1771 1771
 							var $value = '';
1772 1772
 							<?php
1773
-							// if we have a post_type and a category then link them
1774
-							if( isset($this->arguments['post_type']) && isset($this->arguments['category']) && !empty($this->arguments['category']['post_type_linked']) ){
1775
-							?>
1773
+                            // if we have a post_type and a category then link them
1774
+                            if( isset($this->arguments['post_type']) && isset($this->arguments['category']) && !empty($this->arguments['category']['post_type_linked']) ){
1775
+                            ?>
1776 1776
 							if(typeof(prev_attributes[props.id]) != 'undefined' ){
1777 1777
 								$pt = props.attributes.post_type;
1778 1778
 								if(post_type_rest_slugs.length){
@@ -1856,8 +1856,8 @@  discard block
 block discarded – undo
1856 1856
 										'shortcode': '<?php echo $this->options['base_id'];?>',
1857 1857
 										'attributes': props.attributes,
1858 1858
 										'post_id': <?php global $post; if ( isset( $post->ID ) ) {
1859
-										echo $post->ID;
1860
-									}else{echo '0';}?>,
1859
+                                        echo $post->ID;
1860
+                                    }else{echo '0';}?>,
1861 1861
 										'_ajax_nonce': '<?php echo wp_create_nonce( 'super_duper_output_shortcode' );?>'
1862 1862
 									};
1863 1863
 
@@ -1909,10 +1909,10 @@  discard block
 block discarded – undo
1909 1909
 
1910 1910
 									<?php
1911 1911
 
1912
-									if(! empty( $this->arguments )){
1912
+                                    if(! empty( $this->arguments )){
1913 1913
 
1914
-									if ( $show_advanced ) {
1915
-									?>
1914
+                                    if ( $show_advanced ) {
1915
+                                    ?>
1916 1916
 									el('div', {
1917 1917
 											style: {'padding-left': '16px','padding-right': '16px'}
1918 1918
 										},
@@ -1930,79 +1930,79 @@  discard block
 block discarded – undo
1930 1930
 									,
1931 1931
 									<?php
1932 1932
 
1933
-									}
1933
+                                    }
1934 1934
 
1935
-									$arguments = $this->group_arguments( $this->arguments );
1935
+                                    $arguments = $this->group_arguments( $this->arguments );
1936 1936
 
1937
-									// Do we have sections?
1938
-									$has_sections = $arguments == $this->arguments ? false : true;
1937
+                                    // Do we have sections?
1938
+                                    $has_sections = $arguments == $this->arguments ? false : true;
1939 1939
 
1940 1940
 
1941
-									if($has_sections){
1942
-									$panel_count = 0;
1943
-									foreach($arguments as $key => $args){
1944
-									?>
1941
+                                    if($has_sections){
1942
+                                    $panel_count = 0;
1943
+                                    foreach($arguments as $key => $args){
1944
+                                    ?>
1945 1945
 									el(wp.components.PanelBody, {
1946 1946
 											title: '<?php esc_attr_e( $key ); ?>',
1947 1947
 											initialOpen: <?php if ( $panel_count ) {
1948
-											echo "false";
1949
-										} else {
1950
-											echo "true";
1951
-										}?>
1948
+                                            echo "false";
1949
+                                        } else {
1950
+                                            echo "true";
1951
+                                        }?>
1952 1952
 										},
1953 1953
 										<?php
1954 1954
 
1955 1955
 
1956 1956
 
1957
-										foreach ( $args as $k => $a ) {
1957
+                                        foreach ( $args as $k => $a ) {
1958 1958
 
1959
-											$this->block_row_start( $k, $a );
1960
-											$this->build_block_arguments( $k, $a );
1961
-											$this->block_row_end( $k, $a );
1962
-										}
1963
-										?>
1959
+                                            $this->block_row_start( $k, $a );
1960
+                                            $this->build_block_arguments( $k, $a );
1961
+                                            $this->block_row_end( $k, $a );
1962
+                                        }
1963
+                                        ?>
1964 1964
 									),
1965 1965
 									<?php
1966
-									$panel_count ++;
1966
+                                    $panel_count ++;
1967 1967
 
1968
-									}
1969
-									}else {
1970
-									?>
1968
+                                    }
1969
+                                    }else {
1970
+                                    ?>
1971 1971
 									el(wp.components.PanelBody, {
1972 1972
 											title: '<?php esc_attr_e( "Settings" ); ?>',
1973 1973
 											initialOpen: true
1974 1974
 										},
1975 1975
 										<?php
1976
-										foreach ( $this->arguments as $key => $args ) {
1977
-											$this->block_row_start( $key, $args );
1978
-											$this->build_block_arguments( $key, $args );
1979
-											$this->block_row_end( $key, $args );
1980
-										}
1981
-										?>
1976
+                                        foreach ( $this->arguments as $key => $args ) {
1977
+                                            $this->block_row_start( $key, $args );
1978
+                                            $this->build_block_arguments( $key, $args );
1979
+                                            $this->block_row_end( $key, $args );
1980
+                                        }
1981
+                                        ?>
1982 1982
 									),
1983 1983
 									<?php
1984
-									}
1984
+                                    }
1985 1985
 
1986
-									}
1987
-									?>
1986
+                                    }
1987
+                                    ?>
1988 1988
 
1989 1989
 								),
1990 1990
 
1991 1991
 								<?php
1992
-								// If the user sets block-output array then build it
1993
-								if ( ! empty( $this->options['block-output'] ) ) {
1994
-								$this->block_element( $this->options['block-output'] );
1995
-							}else{
1996
-								// if no block-output is set then we try and get the shortcode html output via ajax.
1997
-								?>
1992
+                                // If the user sets block-output array then build it
1993
+                                if ( ! empty( $this->options['block-output'] ) ) {
1994
+                                $this->block_element( $this->options['block-output'] );
1995
+                            }else{
1996
+                                // if no block-output is set then we try and get the shortcode html output via ajax.
1997
+                                ?>
1998 1998
 								el('div', {
1999 1999
 									dangerouslySetInnerHTML: {__html: onChangeContent()},
2000 2000
 									className: props.className,
2001 2001
 									style: {'minHeight': '30px'}
2002 2002
 								})
2003 2003
 								<?php
2004
-								}
2005
-								?>
2004
+                                }
2005
+                                ?>
2006 2006
 							]; // end return
2007 2007
 						},
2008 2008
 
@@ -2020,10 +2020,10 @@  discard block
 block discarded – undo
2020 2020
 							$html = '';
2021 2021
 							<?php
2022 2022
 
2023
-							if(! empty( $this->arguments )){
2023
+                            if(! empty( $this->arguments )){
2024 2024
 
2025
-							foreach($this->arguments as $key => $args){
2026
-							?>
2025
+                            foreach($this->arguments as $key => $args){
2026
+                            ?>
2027 2027
 							if (attr.hasOwnProperty("<?php echo esc_attr( $key );?>")) {
2028 2028
 								if ('<?php echo esc_attr( $key );?>' == 'html') {
2029 2029
 									$html = attr.<?php echo esc_attr( $key );?>;
@@ -2032,10 +2032,10 @@  discard block
 block discarded – undo
2032 2032
 								}
2033 2033
 							}
2034 2034
 							<?php
2035
-							}
2036
-							}
2035
+                            }
2036
+                            }
2037 2037
 
2038
-							?>
2038
+                            ?>
2039 2039
 							content += "]";
2040 2040
 
2041 2041
 							// if has html element
@@ -2058,20 +2058,20 @@  discard block
 block discarded – undo
2058 2058
 							}
2059 2059
 
2060 2060
 							<?php
2061
-							if(isset( $this->options['block-wrap'] ) && $this->options['block-wrap'] == ''){
2062
-							?>
2061
+                            if(isset( $this->options['block-wrap'] ) && $this->options['block-wrap'] == ''){
2062
+                            ?>
2063 2063
 							return content;
2064 2064
 							<?php
2065
-							}else{
2066
-							?>
2065
+                            }else{
2066
+                            ?>
2067 2067
 							var block_wrap = 'div';
2068 2068
 							if (attr.hasOwnProperty("block_wrap")) {
2069 2069
 								block_wrap = attr.block_wrap;
2070 2070
 							}
2071 2071
 							return el(block_wrap, {dangerouslySetInnerHTML: {__html: content}, className: align});
2072 2072
 							<?php
2073
-							}
2074
-							?>
2073
+                            }
2074
+                            ?>
2075 2075
 
2076 2076
 
2077 2077
 						}
@@ -2079,30 +2079,30 @@  discard block
 block discarded – undo
2079 2079
 				})();
2080 2080
 			</script>
2081 2081
 			<?php
2082
-			$output = ob_get_clean();
2082
+            $output = ob_get_clean();
2083 2083
 
2084
-			/*
2084
+            /*
2085 2085
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
2086 2086
 			 */
2087 2087
 
2088
-			return str_replace( array(
2089
-				'<script>',
2090
-				'</script>'
2091
-			), '', $output );
2092
-		}
2088
+            return str_replace( array(
2089
+                '<script>',
2090
+                '</script>'
2091
+            ), '', $output );
2092
+        }
2093 2093
 
2094
-		public function block_row_start($key, $args){
2094
+        public function block_row_start($key, $args){
2095 2095
 
2096
-			// check for row
2097
-			if(!empty($args['row'])){
2096
+            // check for row
2097
+            if(!empty($args['row'])){
2098 2098
 
2099
-				if(!empty($args['row']['open'])){
2099
+                if(!empty($args['row']['open'])){
2100 2100
 
2101
-				// element require
2102
-				$element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
2103
-				echo $element_require;
2101
+                // element require
2102
+                $element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
2103
+                echo $element_require;
2104 2104
 
2105
-					if(false){?><script><?php }?>
2105
+                    if(false){?><script><?php }?>
2106 2106
 						el('div', {
2107 2107
 								className: 'bsui components-base-control',
2108 2108
 							},
@@ -2132,87 +2132,87 @@  discard block
 block discarded – undo
2132 2132
 									},
2133 2133
 
2134 2134
 					<?php
2135
-					if(false){?></script><?php }
2136
-				}elseif(!empty($args['row']['close'])){
2137
-					if(false){?><script><?php }?>
2135
+                    if(false){?></script><?php }
2136
+                }elseif(!empty($args['row']['close'])){
2137
+                    if(false){?><script><?php }?>
2138 2138
 						el(
2139 2139
 							'div',
2140 2140
 							{
2141 2141
 								className: 'col pl-0',
2142 2142
 							},
2143 2143
 					<?php
2144
-					if(false){?></script><?php }
2145
-				}else{
2146
-					if(false){?><script><?php }?>
2144
+                    if(false){?></script><?php }
2145
+                }else{
2146
+                    if(false){?><script><?php }?>
2147 2147
 						el(
2148 2148
 							'div',
2149 2149
 							{
2150 2150
 								className: 'col pl-0 pr-2',
2151 2151
 							},
2152 2152
 					<?php
2153
-					if(false){?></script><?php }
2154
-				}
2155
-
2156
-			}
2157
-
2158
-		}
2159
-
2160
-		public function block_row_end($key, $args){
2161
-
2162
-			if(!empty($args['row'])){
2163
-				// maybe close
2164
-				if(!empty($args['row']['close'])){
2165
-					echo "))";
2166
-				}
2167
-
2168
-				echo "),";
2169
-			}
2170
-		}
2171
-
2172
-		public function build_block_arguments( $key, $args ) {
2173
-			$custom_attributes = ! empty( $args['custom_attributes'] ) ? $this->array_to_attributes( $args['custom_attributes'] ) : '';
2174
-			$options           = '';
2175
-			$extra             = '';
2176
-			$require           = '';
2177
-
2178
-			// `content` is a protected and special argument
2179
-			if ( $key == 'content' ) {
2180
-				return;
2181
-			}
2182
-
2183
-
2184
-			// icon
2185
-			$icon = '';
2186
-			if( !empty( $args['icon'] ) ){
2187
-				$icon .= "el('div', {";
2188
-									$icon .= "dangerouslySetInnerHTML: {__html: '".self::get_widget_icon( esc_attr($args['icon']))."'},";
2189
-									$icon .= "className: 'text-center',";
2190
-									$icon .= "title: '".addslashes( $args['title'] )."',";
2191
-								$icon .= "}),";
2192
-
2193
-				// blank title as its added to the icon.
2194
-				$args['title'] = '';
2195
-			}
2196
-
2197
-			// require advanced
2198
-			$require_advanced = ! empty( $args['advanced'] ) ? "props.attributes.show_advanced && " : "";
2199
-
2200
-			// element require
2201
-			$element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
2202
-
2203
-
2204
-			$onchange  = "props.setAttributes({ $key: $key } )";
2205
-			$onchangecomplete  = "";
2206
-			$value     = "props.attributes.$key";
2207
-			$text_type = array( 'text', 'password', 'number', 'email', 'tel', 'url', 'colorx' );
2208
-			if ( in_array( $args['type'], $text_type ) ) {
2209
-				$type = 'TextControl';
2210
-				// Save numbers as numbers and not strings
2211
-				if ( $args['type'] == 'number' ) {
2212
-					$onchange = "props.setAttributes({ $key: Number($key) } )";
2213
-				}
2214
-			}
2215
-			/*
2153
+                    if(false){?></script><?php }
2154
+                }
2155
+
2156
+            }
2157
+
2158
+        }
2159
+
2160
+        public function block_row_end($key, $args){
2161
+
2162
+            if(!empty($args['row'])){
2163
+                // maybe close
2164
+                if(!empty($args['row']['close'])){
2165
+                    echo "))";
2166
+                }
2167
+
2168
+                echo "),";
2169
+            }
2170
+        }
2171
+
2172
+        public function build_block_arguments( $key, $args ) {
2173
+            $custom_attributes = ! empty( $args['custom_attributes'] ) ? $this->array_to_attributes( $args['custom_attributes'] ) : '';
2174
+            $options           = '';
2175
+            $extra             = '';
2176
+            $require           = '';
2177
+
2178
+            // `content` is a protected and special argument
2179
+            if ( $key == 'content' ) {
2180
+                return;
2181
+            }
2182
+
2183
+
2184
+            // icon
2185
+            $icon = '';
2186
+            if( !empty( $args['icon'] ) ){
2187
+                $icon .= "el('div', {";
2188
+                                    $icon .= "dangerouslySetInnerHTML: {__html: '".self::get_widget_icon( esc_attr($args['icon']))."'},";
2189
+                                    $icon .= "className: 'text-center',";
2190
+                                    $icon .= "title: '".addslashes( $args['title'] )."',";
2191
+                                $icon .= "}),";
2192
+
2193
+                // blank title as its added to the icon.
2194
+                $args['title'] = '';
2195
+            }
2196
+
2197
+            // require advanced
2198
+            $require_advanced = ! empty( $args['advanced'] ) ? "props.attributes.show_advanced && " : "";
2199
+
2200
+            // element require
2201
+            $element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
2202
+
2203
+
2204
+            $onchange  = "props.setAttributes({ $key: $key } )";
2205
+            $onchangecomplete  = "";
2206
+            $value     = "props.attributes.$key";
2207
+            $text_type = array( 'text', 'password', 'number', 'email', 'tel', 'url', 'colorx' );
2208
+            if ( in_array( $args['type'], $text_type ) ) {
2209
+                $type = 'TextControl';
2210
+                // Save numbers as numbers and not strings
2211
+                if ( $args['type'] == 'number' ) {
2212
+                    $onchange = "props.setAttributes({ $key: Number($key) } )";
2213
+                }
2214
+            }
2215
+            /*
2216 2216
 			 * https://www.wptricks.com/question/set-current-tab-on-a-gutenberg-tabpanel-component-from-outside-that-component/ es5 layout
2217 2217
 						elseif($args['type']=='tabs'){
2218 2218
 							?>
@@ -2246,85 +2246,85 @@  discard block
 block discarded – undo
2246 2246
 							return;
2247 2247
 						}
2248 2248
 			*/
2249
-			elseif ( $args['type'] == 'color' ) {
2250
-				$type = 'ColorPicker';
2251
-				$onchange = "";
2252
-				$extra = "color: $value,";
2253
-				if(!empty($args['disable_alpha'])){
2254
-					$extra .= "disableAlpha: true,";
2255
-				}
2256
-				$onchangecomplete = "onChangeComplete: function($key) {
2249
+            elseif ( $args['type'] == 'color' ) {
2250
+                $type = 'ColorPicker';
2251
+                $onchange = "";
2252
+                $extra = "color: $value,";
2253
+                if(!empty($args['disable_alpha'])){
2254
+                    $extra .= "disableAlpha: true,";
2255
+                }
2256
+                $onchangecomplete = "onChangeComplete: function($key) {
2257 2257
 				value =  $key.rgb.a && $key.rgb.a < 1 ? \"rgba(\"+$key.rgb.r+\",\"+$key.rgb.g+\",\"+$key.rgb.b+\",\"+$key.rgb.a+\")\" : $key.hex;
2258 2258
                         props.setAttributes({
2259 2259
                             $key: value
2260 2260
                         });
2261 2261
                     },";
2262
-			}
2263
-			elseif ( $args['type'] == 'checkbox' ) {
2264
-				$type = 'CheckboxControl';
2265
-				$extra .= "checked: props.attributes.$key,";
2266
-				$onchange = "props.setAttributes({ $key: ! props.attributes.$key } )";
2267
-			} elseif ( $args['type'] == 'textarea' ) {
2268
-				$type = 'TextareaControl';
2269
-			} elseif ( $args['type'] == 'select' || $args['type'] == 'multiselect' ) {
2270
-				$type = 'SelectControl';
2271
-
2272
-				if($args['name'] == 'category' && !empty($args['post_type_linked'])){
2273
-					$options .= "options: taxonomies_".str_replace("-","_", $this->id).",";
2274
-				}elseif($args['name'] == 'sort_by' && !empty($args['post_type_linked'])){
2275
-					$options .= "options: sort_by_".str_replace("-","_", $this->id).",";
2276
-				}else {
2277
-
2278
-					if ( ! empty( $args['options'] ) ) {
2279
-						$options .= "options: [";
2280
-						foreach ( $args['options'] as $option_val => $option_label ) {
2281
-							$options .= "{ value: '" . esc_attr( $option_val ) . "', label: '" . addslashes( $option_label ) . "' },";
2282
-						}
2283
-						$options .= "],";
2284
-					}
2285
-				}
2286
-				if ( isset( $args['multiple'] ) && $args['multiple'] ) { //@todo multiselect does not work at the moment: https://github.com/WordPress/gutenberg/issues/5550
2287
-					$extra .= ' multiple: true, ';
2288
-				}
2289
-			} elseif ( $args['type'] == 'alignment' ) {
2290
-				$type = 'AlignmentToolbar'; // @todo this does not seem to work but cant find a example
2291
-			}elseif ( $args['type'] == 'margins' ) {
2292
-
2293
-			} else {
2294
-				return;// if we have not implemented the control then don't break the JS.
2295
-			}
2296
-
2297
-
2298
-
2299
-			// color input does not show the labels so we add them
2300
-			if($args['type']=='color'){
2301
-				// add show only if advanced
2302
-				echo $require_advanced;
2303
-				// add setting require if defined
2304
-				echo $element_require;
2305
-				echo "el('div', {style: {'marginBottom': '8px'}}, '".addslashes( $args['title'] )."'),";
2306
-			}
2307
-
2308
-			// add show only if advanced
2309
-			echo $require_advanced;
2310
-			// add setting require if defined
2311
-			echo $element_require;
2312
-
2313
-			// icon
2314
-			echo $icon;
2315
-			?>
2262
+            }
2263
+            elseif ( $args['type'] == 'checkbox' ) {
2264
+                $type = 'CheckboxControl';
2265
+                $extra .= "checked: props.attributes.$key,";
2266
+                $onchange = "props.setAttributes({ $key: ! props.attributes.$key } )";
2267
+            } elseif ( $args['type'] == 'textarea' ) {
2268
+                $type = 'TextareaControl';
2269
+            } elseif ( $args['type'] == 'select' || $args['type'] == 'multiselect' ) {
2270
+                $type = 'SelectControl';
2271
+
2272
+                if($args['name'] == 'category' && !empty($args['post_type_linked'])){
2273
+                    $options .= "options: taxonomies_".str_replace("-","_", $this->id).",";
2274
+                }elseif($args['name'] == 'sort_by' && !empty($args['post_type_linked'])){
2275
+                    $options .= "options: sort_by_".str_replace("-","_", $this->id).",";
2276
+                }else {
2277
+
2278
+                    if ( ! empty( $args['options'] ) ) {
2279
+                        $options .= "options: [";
2280
+                        foreach ( $args['options'] as $option_val => $option_label ) {
2281
+                            $options .= "{ value: '" . esc_attr( $option_val ) . "', label: '" . addslashes( $option_label ) . "' },";
2282
+                        }
2283
+                        $options .= "],";
2284
+                    }
2285
+                }
2286
+                if ( isset( $args['multiple'] ) && $args['multiple'] ) { //@todo multiselect does not work at the moment: https://github.com/WordPress/gutenberg/issues/5550
2287
+                    $extra .= ' multiple: true, ';
2288
+                }
2289
+            } elseif ( $args['type'] == 'alignment' ) {
2290
+                $type = 'AlignmentToolbar'; // @todo this does not seem to work but cant find a example
2291
+            }elseif ( $args['type'] == 'margins' ) {
2292
+
2293
+            } else {
2294
+                return;// if we have not implemented the control then don't break the JS.
2295
+            }
2296
+
2297
+
2298
+
2299
+            // color input does not show the labels so we add them
2300
+            if($args['type']=='color'){
2301
+                // add show only if advanced
2302
+                echo $require_advanced;
2303
+                // add setting require if defined
2304
+                echo $element_require;
2305
+                echo "el('div', {style: {'marginBottom': '8px'}}, '".addslashes( $args['title'] )."'),";
2306
+            }
2307
+
2308
+            // add show only if advanced
2309
+            echo $require_advanced;
2310
+            // add setting require if defined
2311
+            echo $element_require;
2312
+
2313
+            // icon
2314
+            echo $icon;
2315
+            ?>
2316 2316
 			el( wp.components.<?php echo $type; ?>, {
2317 2317
 			label: '<?php echo addslashes( $args['title'] ); ?>',
2318 2318
 			help: '<?php if ( isset( $args['desc'] ) ) {
2319
-				echo addslashes( $args['desc'] );
2320
-			} ?>',
2319
+                echo addslashes( $args['desc'] );
2320
+            } ?>',
2321 2321
 			value: <?php echo $value; ?>,
2322 2322
 			<?php if ( $type == 'TextControl' && $args['type'] != 'text' ) {
2323
-				echo "type: '" . addslashes( $args['type'] ) . "',";
2324
-			} ?>
2323
+                echo "type: '" . addslashes( $args['type'] ) . "',";
2324
+            } ?>
2325 2325
 			<?php if ( ! empty( $args['placeholder'] ) ) {
2326
-				echo "placeholder: '" . addslashes( $args['placeholder'] ) . "',";
2327
-			} ?>
2326
+                echo "placeholder: '" . addslashes( $args['placeholder'] ) . "',";
2327
+            } ?>
2328 2328
 			<?php echo $options; ?>
2329 2329
 			<?php echo $extra; ?>
2330 2330
 			<?php echo $custom_attributes; ?>
@@ -2336,601 +2336,601 @@  discard block
 block discarded – undo
2336 2336
 			<?php
2337 2337
 
2338 2338
 
2339
-		}
2340
-
2341
-		/**
2342
-		 * Convert an array of attributes to block string.
2343
-		 *
2344
-		 * @todo there is prob a faster way to do this, also we could add some validation here.
2345
-		 *
2346
-		 * @param $custom_attributes
2347
-		 *
2348
-		 * @return string
2349
-		 */
2350
-		public function array_to_attributes( $custom_attributes, $html = false ) {
2351
-			$attributes = '';
2352
-			if ( ! empty( $custom_attributes ) ) {
2353
-
2354
-				if ( $html ) {
2355
-					foreach ( $custom_attributes as $key => $val ) {
2356
-						$attributes .= " $key='$val' ";
2357
-					}
2358
-				} else {
2359
-					foreach ( $custom_attributes as $key => $val ) {
2360
-						$attributes .= "'$key': '$val',";
2361
-					}
2362
-				}
2363
-			}
2364
-
2365
-			return $attributes;
2366
-		}
2367
-
2368
-		/**
2369
-		 * A self looping function to create the output for JS block elements.
2370
-		 *
2371
-		 * This is what is output in the WP Editor visual view.
2372
-		 *
2373
-		 * @param $args
2374
-		 */
2375
-		public function block_element( $args ) {
2376
-
2377
-
2378
-			if ( ! empty( $args ) ) {
2379
-				foreach ( $args as $element => $new_args ) {
2380
-
2381
-					if ( is_array( $new_args ) ) { // its an element
2382
-
2383
-
2384
-						if ( isset( $new_args['element'] ) ) {
2385
-
2386
-							if ( isset( $new_args['element_require'] ) ) {
2387
-								echo str_replace( array(
2388
-										"'+",
2389
-										"+'"
2390
-									), '', $this->block_props_replace( $new_args['element_require'] ) ) . " &&  ";
2391
-								unset( $new_args['element_require'] );
2392
-							}
2393
-
2394
-							echo "\n el( '" . $new_args['element'] . "', {";
2395
-
2396
-							// get the attributes
2397
-							foreach ( $new_args as $new_key => $new_value ) {
2398
-
2399
-
2400
-								if ( $new_key == 'element' || $new_key == 'content' || $new_key == 'element_require' || $new_key == 'element_repeat' || is_array( $new_value ) ) {
2401
-									// do nothing
2402
-								} else {
2403
-									echo $this->block_element( array( $new_key => $new_value ) );
2404
-								}
2405
-							}
2406
-
2407
-							echo "},";// end attributes
2408
-
2409
-							// get the content
2410
-							$first_item = 0;
2411
-							foreach ( $new_args as $new_key => $new_value ) {
2412
-								if ( $new_key === 'content' || is_array( $new_value ) ) {
2413
-
2414
-									if ( $new_key === 'content' ) {
2415
-										echo "'" . $this->block_props_replace( wp_slash( $new_value ) ) . "'";
2416
-									}
2417
-
2418
-									if ( is_array( $new_value ) ) {
2419
-
2420
-										if ( isset( $new_value['element_require'] ) ) {
2421
-											echo str_replace( array(
2422
-													"'+",
2423
-													"+'"
2424
-												), '', $this->block_props_replace( $new_value['element_require'] ) ) . " &&  ";
2425
-											unset( $new_value['element_require'] );
2426
-										}
2427
-
2428
-										if ( isset( $new_value['element_repeat'] ) ) {
2429
-											$x = 1;
2430
-											while ( $x <= absint( $new_value['element_repeat'] ) ) {
2431
-												$this->block_element( array( '' => $new_value ) );
2432
-												$x ++;
2433
-											}
2434
-										} else {
2435
-											$this->block_element( array( '' => $new_value ) );
2436
-										}
2437
-									}
2438
-									$first_item ++;
2439
-								}
2440
-							}
2441
-
2442
-							echo ")";// end content
2443
-
2444
-							echo ", \n";
2445
-
2446
-						}
2447
-					} else {
2448
-
2449
-						if ( substr( $element, 0, 3 ) === "if_" ) {
2450
-							echo str_replace( "if_", "", $element ) . ": " . $this->block_props_replace( $new_args, true ) . ",";
2451
-						} elseif ( $element == 'style' ) {
2452
-							echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
2453
-						} else {
2454
-							echo $element . ": '" . $this->block_props_replace( $new_args ) . "',";
2455
-						}
2456
-
2457
-					}
2458
-				}
2459
-			}
2460
-		}
2461
-
2462
-		/**
2463
-		 * Replace block attributes placeholders with the proper naming.
2464
-		 *
2465
-		 * @param $string
2466
-		 *
2467
-		 * @return mixed
2468
-		 */
2469
-		public function block_props_replace( $string, $no_wrap = false ) {
2470
-
2471
-			if ( $no_wrap ) {
2472
-				$string = str_replace( array( "[%", "%]" ), array( "props.attributes.", "" ), $string );
2473
-			} else {
2474
-				$string = str_replace( array( "[%", "%]" ), array( "'+props.attributes.", "+'" ), $string );
2475
-			}
2476
-
2477
-			return $string;
2478
-		}
2479
-
2480
-		/**
2481
-		 * Outputs the content of the widget
2482
-		 *
2483
-		 * @param array $args
2484
-		 * @param array $instance
2485
-		 */
2486
-		public function widget( $args, $instance ) {
2487
-
2488
-			// get the filtered values
2489
-			$argument_values = $this->argument_values( $instance );
2490
-			$argument_values = $this->string_to_bool( $argument_values );
2491
-			$output          = $this->output( $argument_values, $args );
2492
-
2493
-			$no_wrap = false;
2494
-			if ( isset( $argument_values['no_wrap'] ) && $argument_values['no_wrap'] ) {
2495
-				$no_wrap = true;
2496
-			}
2497
-
2498
-			ob_start();
2499
-			if ( $output && ! $no_wrap ) {
2500
-
2501
-				$class_original = $this->options['widget_ops']['classname'];
2502
-				$class = $this->options['widget_ops']['classname']." sdel-".$this->get_instance_hash();
2503
-
2504
-				// Before widget
2505
-				$before_widget = $args['before_widget'];
2506
-				$before_widget = str_replace($class_original,$class,$before_widget);
2507
-				$before_widget = apply_filters( 'wp_super_duper_before_widget', $before_widget, $args, $instance, $this );
2508
-				$before_widget = apply_filters( 'wp_super_duper_before_widget_' . $this->base_id, $before_widget, $args, $instance, $this );
2509
-
2510
-				// After widget
2511
-				$after_widget = $args['after_widget'];
2512
-				$after_widget = apply_filters( 'wp_super_duper_after_widget', $after_widget, $args, $instance, $this );
2513
-				$after_widget = apply_filters( 'wp_super_duper_after_widget_' . $this->base_id, $after_widget, $args, $instance, $this );
2514
-
2515
-				echo $before_widget;
2516
-				// elementor strips the widget wrapping div so we check for and add it back if needed
2517
-				if ( $this->is_elementor_widget_output() ) {
2518
-					echo ! empty( $this->options['widget_ops']['classname'] ) ? "<span class='" . esc_attr( $class  ) . "'>" : '';
2519
-				}
2520
-				echo $this->output_title( $args, $instance );
2521
-				echo $output;
2522
-				if ( $this->is_elementor_widget_output() ) {
2523
-					echo ! empty( $this->options['widget_ops']['classname'] ) ? "</span>" : '';
2524
-				}
2525
-				echo $after_widget;
2526
-			} elseif ( $this->is_preview() && $output == '' ) {// if preview show a placeholder if empty
2527
-				$output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
2528
-				echo $output;
2529
-			} elseif ( $output && $no_wrap ) {
2530
-				echo $output;
2531
-			}
2532
-			$output = ob_get_clean();
2533
-
2534
-			$output = apply_filters( 'wp_super_duper_widget_output', $output, $instance, $args, $this );
2535
-
2536
-			echo $output;
2537
-		}
2538
-
2539
-		/**
2540
-		 * Tests if the current output is inside a elementor container.
2541
-		 *
2542
-		 * @since 1.0.4
2543
-		 * @return bool
2544
-		 */
2545
-		public function is_elementor_widget_output() {
2546
-			$result = false;
2547
-			if ( defined( 'ELEMENTOR_VERSION' ) && isset( $this->number ) && $this->number == 'REPLACE_TO_ID' ) {
2548
-				$result = true;
2549
-			}
2550
-
2551
-			return $result;
2552
-		}
2553
-
2554
-		/**
2555
-		 * Tests if the current output is inside a elementor preview.
2556
-		 *
2557
-		 * @since 1.0.4
2558
-		 * @return bool
2559
-		 */
2560
-		public function is_elementor_preview() {
2561
-			$result = false;
2562
-			if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
2563
-				$result = true;
2564
-			}
2565
-
2566
-			return $result;
2567
-		}
2568
-
2569
-		/**
2570
-		 * Tests if the current output is inside a Divi preview.
2571
-		 *
2572
-		 * @since 1.0.6
2573
-		 * @return bool
2574
-		 */
2575
-		public function is_divi_preview() {
2576
-			$result = false;
2577
-			if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
2578
-				$result = true;
2579
-			}
2580
-
2581
-			return $result;
2582
-		}
2583
-
2584
-		/**
2585
-		 * Tests if the current output is inside a Beaver builder preview.
2586
-		 *
2587
-		 * @since 1.0.6
2588
-		 * @return bool
2589
-		 */
2590
-		public function is_beaver_preview() {
2591
-			$result = false;
2592
-			if ( isset( $_REQUEST['fl_builder'] ) ) {
2593
-				$result = true;
2594
-			}
2595
-
2596
-			return $result;
2597
-		}
2598
-
2599
-		/**
2600
-		 * Tests if the current output is inside a siteorigin builder preview.
2601
-		 *
2602
-		 * @since 1.0.6
2603
-		 * @return bool
2604
-		 */
2605
-		public function is_siteorigin_preview() {
2606
-			$result = false;
2607
-			if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
2608
-				$result = true;
2609
-			}
2610
-
2611
-			return $result;
2612
-		}
2613
-
2614
-		/**
2615
-		 * Tests if the current output is inside a cornerstone builder preview.
2616
-		 *
2617
-		 * @since 1.0.8
2618
-		 * @return bool
2619
-		 */
2620
-		public function is_cornerstone_preview() {
2621
-			$result = false;
2622
-			if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
2623
-				$result = true;
2624
-			}
2625
-
2626
-			return $result;
2627
-		}
2628
-
2629
-		/**
2630
-		 * Tests if the current output is inside a fusion builder preview.
2631
-		 *
2632
-		 * @since 1.1.0
2633
-		 * @return bool
2634
-		 */
2635
-		public function is_fusion_preview() {
2636
-			$result = false;
2637
-			if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
2638
-				$result = true;
2639
-			}
2640
-
2641
-			return $result;
2642
-		}
2643
-
2644
-		/**
2645
-		 * Tests if the current output is inside a Oxygen builder preview.
2646
-		 *
2647
-		 * @since 1.0.18
2648
-		 * @return bool
2649
-		 */
2650
-		public function is_oxygen_preview() {
2651
-			$result = false;
2652
-			if ( ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) ) {
2653
-				$result = true;
2654
-			}
2655
-
2656
-			return $result;
2657
-		}
2658
-
2659
-		/**
2660
-		 * General function to check if we are in a preview situation.
2661
-		 *
2662
-		 * @since 1.0.6
2663
-		 * @return bool
2664
-		 */
2665
-		public function is_preview() {
2666
-			$preview = false;
2667
-			if ( $this->is_divi_preview() ) {
2668
-				$preview = true;
2669
-			} elseif ( $this->is_elementor_preview() ) {
2670
-				$preview = true;
2671
-			} elseif ( $this->is_beaver_preview() ) {
2672
-				$preview = true;
2673
-			} elseif ( $this->is_siteorigin_preview() ) {
2674
-				$preview = true;
2675
-			} elseif ( $this->is_cornerstone_preview() ) {
2676
-				$preview = true;
2677
-			} elseif ( $this->is_fusion_preview() ) {
2678
-				$preview = true;
2679
-			} elseif ( $this->is_oxygen_preview() ) {
2680
-				$preview = true;
2681
-			} elseif( $this->is_block_content_call() ) {
2682
-				$preview = true;
2683
-			}
2684
-
2685
-			return $preview;
2686
-		}
2687
-
2688
-		/**
2689
-		 * Output the super title.
2690
-		 *
2691
-		 * @param $args
2692
-		 * @param array $instance
2693
-		 *
2694
-		 * @return string
2695
-		 */
2696
-		public function output_title( $args, $instance = array() ) {
2697
-			$output = '';
2698
-			if ( ! empty( $instance['title'] ) ) {
2699
-				/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
2700
-				$title  = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
2701
-
2702
-				if(empty($instance['widget_title_tag'])){
2703
-					$output = $args['before_title'] . $title . $args['after_title'];
2704
-				}else{
2705
-					$title_tag = esc_attr( $instance['widget_title_tag'] );
2706
-
2707
-					// classes
2708
-					$title_classes = array();
2709
-					$title_classes[] = !empty( $instance['widget_title_size_class'] ) ? sanitize_html_class( $instance['widget_title_size_class'] ) : '';
2710
-					$title_classes[] = !empty( $instance['widget_title_align_class'] ) ? sanitize_html_class( $instance['widget_title_align_class'] ) : '';
2711
-					$title_classes[] = !empty( $instance['widget_title_color_class'] ) ? "text-".sanitize_html_class( $instance['widget_title_color_class'] ) : '';
2712
-					$title_classes[] = !empty( $instance['widget_title_border_class'] ) ? sanitize_html_class( $instance['widget_title_border_class'] ) : '';
2713
-					$title_classes[] = !empty( $instance['widget_title_border_color_class'] ) ? "border-".sanitize_html_class( $instance['widget_title_border_color_class'] ) : '';
2714
-					$title_classes[] = !empty( $instance['widget_title_mt_class'] ) ? "mt-".absint( $instance['widget_title_mt_class'] ) : '';
2715
-					$title_classes[] = !empty( $instance['widget_title_mr_class'] ) ? "mr-".absint( $instance['widget_title_mr_class'] ) : '';
2716
-					$title_classes[] = !empty( $instance['widget_title_mb_class'] ) ? "mb-".absint( $instance['widget_title_mb_class'] ) : '';
2717
-					$title_classes[] = !empty( $instance['widget_title_ml_class'] ) ? "ml-".absint( $instance['widget_title_ml_class'] ) : '';
2718
-					$title_classes[] = !empty( $instance['widget_title_pt_class'] ) ? "pt-".absint( $instance['widget_title_pt_class'] ) : '';
2719
-					$title_classes[] = !empty( $instance['widget_title_pr_class'] ) ? "pr-".absint( $instance['widget_title_pr_class'] ) : '';
2720
-					$title_classes[] = !empty( $instance['widget_title_pb_class'] ) ? "pb-".absint( $instance['widget_title_pb_class'] ) : '';
2721
-					$title_classes[] = !empty( $instance['widget_title_pl_class'] ) ? "pl-".absint( $instance['widget_title_pl_class'] ) : '';
2722
-
2723
-					$class = !empty( $title_classes ) ? implode(" ",$title_classes) : '';
2724
-					$output = "<$title_tag class='$class' >$title</$title_tag>";
2725
-				}
2726
-
2727
-			}
2728
-
2729
-			return $output;
2730
-		}
2731
-
2732
-		/**
2733
-		 * Outputs the options form inputs for the widget.
2734
-		 *
2735
-		 * @param array $instance The widget options.
2736
-		 */
2737
-		public function form( $instance ) {
2738
-
2739
-			// set widget instance
2740
-			$this->instance = $instance;
2741
-
2742
-			// set it as a SD widget
2743
-			echo $this->widget_advanced_toggle();
2744
-
2745
-			echo "<p>" . esc_attr( $this->options['widget_ops']['description'] ) . "</p>";
2746
-			$arguments_raw = $this->get_arguments();
2747
-
2748
-			if ( is_array( $arguments_raw ) ) {
2749
-
2750
-				$arguments = $this->group_arguments( $arguments_raw );
2751
-
2752
-				// Do we have sections?
2753
-				$has_sections = $arguments == $arguments_raw ? false : true;
2754
-
2755
-
2756
-				if ( $has_sections ) {
2757
-					$panel_count = 0;
2758
-					foreach ( $arguments as $key => $args ) {
2759
-
2760
-						?>
2339
+        }
2340
+
2341
+        /**
2342
+         * Convert an array of attributes to block string.
2343
+         *
2344
+         * @todo there is prob a faster way to do this, also we could add some validation here.
2345
+         *
2346
+         * @param $custom_attributes
2347
+         *
2348
+         * @return string
2349
+         */
2350
+        public function array_to_attributes( $custom_attributes, $html = false ) {
2351
+            $attributes = '';
2352
+            if ( ! empty( $custom_attributes ) ) {
2353
+
2354
+                if ( $html ) {
2355
+                    foreach ( $custom_attributes as $key => $val ) {
2356
+                        $attributes .= " $key='$val' ";
2357
+                    }
2358
+                } else {
2359
+                    foreach ( $custom_attributes as $key => $val ) {
2360
+                        $attributes .= "'$key': '$val',";
2361
+                    }
2362
+                }
2363
+            }
2364
+
2365
+            return $attributes;
2366
+        }
2367
+
2368
+        /**
2369
+         * A self looping function to create the output for JS block elements.
2370
+         *
2371
+         * This is what is output in the WP Editor visual view.
2372
+         *
2373
+         * @param $args
2374
+         */
2375
+        public function block_element( $args ) {
2376
+
2377
+
2378
+            if ( ! empty( $args ) ) {
2379
+                foreach ( $args as $element => $new_args ) {
2380
+
2381
+                    if ( is_array( $new_args ) ) { // its an element
2382
+
2383
+
2384
+                        if ( isset( $new_args['element'] ) ) {
2385
+
2386
+                            if ( isset( $new_args['element_require'] ) ) {
2387
+                                echo str_replace( array(
2388
+                                        "'+",
2389
+                                        "+'"
2390
+                                    ), '', $this->block_props_replace( $new_args['element_require'] ) ) . " &&  ";
2391
+                                unset( $new_args['element_require'] );
2392
+                            }
2393
+
2394
+                            echo "\n el( '" . $new_args['element'] . "', {";
2395
+
2396
+                            // get the attributes
2397
+                            foreach ( $new_args as $new_key => $new_value ) {
2398
+
2399
+
2400
+                                if ( $new_key == 'element' || $new_key == 'content' || $new_key == 'element_require' || $new_key == 'element_repeat' || is_array( $new_value ) ) {
2401
+                                    // do nothing
2402
+                                } else {
2403
+                                    echo $this->block_element( array( $new_key => $new_value ) );
2404
+                                }
2405
+                            }
2406
+
2407
+                            echo "},";// end attributes
2408
+
2409
+                            // get the content
2410
+                            $first_item = 0;
2411
+                            foreach ( $new_args as $new_key => $new_value ) {
2412
+                                if ( $new_key === 'content' || is_array( $new_value ) ) {
2413
+
2414
+                                    if ( $new_key === 'content' ) {
2415
+                                        echo "'" . $this->block_props_replace( wp_slash( $new_value ) ) . "'";
2416
+                                    }
2417
+
2418
+                                    if ( is_array( $new_value ) ) {
2419
+
2420
+                                        if ( isset( $new_value['element_require'] ) ) {
2421
+                                            echo str_replace( array(
2422
+                                                    "'+",
2423
+                                                    "+'"
2424
+                                                ), '', $this->block_props_replace( $new_value['element_require'] ) ) . " &&  ";
2425
+                                            unset( $new_value['element_require'] );
2426
+                                        }
2427
+
2428
+                                        if ( isset( $new_value['element_repeat'] ) ) {
2429
+                                            $x = 1;
2430
+                                            while ( $x <= absint( $new_value['element_repeat'] ) ) {
2431
+                                                $this->block_element( array( '' => $new_value ) );
2432
+                                                $x ++;
2433
+                                            }
2434
+                                        } else {
2435
+                                            $this->block_element( array( '' => $new_value ) );
2436
+                                        }
2437
+                                    }
2438
+                                    $first_item ++;
2439
+                                }
2440
+                            }
2441
+
2442
+                            echo ")";// end content
2443
+
2444
+                            echo ", \n";
2445
+
2446
+                        }
2447
+                    } else {
2448
+
2449
+                        if ( substr( $element, 0, 3 ) === "if_" ) {
2450
+                            echo str_replace( "if_", "", $element ) . ": " . $this->block_props_replace( $new_args, true ) . ",";
2451
+                        } elseif ( $element == 'style' ) {
2452
+                            echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
2453
+                        } else {
2454
+                            echo $element . ": '" . $this->block_props_replace( $new_args ) . "',";
2455
+                        }
2456
+
2457
+                    }
2458
+                }
2459
+            }
2460
+        }
2461
+
2462
+        /**
2463
+         * Replace block attributes placeholders with the proper naming.
2464
+         *
2465
+         * @param $string
2466
+         *
2467
+         * @return mixed
2468
+         */
2469
+        public function block_props_replace( $string, $no_wrap = false ) {
2470
+
2471
+            if ( $no_wrap ) {
2472
+                $string = str_replace( array( "[%", "%]" ), array( "props.attributes.", "" ), $string );
2473
+            } else {
2474
+                $string = str_replace( array( "[%", "%]" ), array( "'+props.attributes.", "+'" ), $string );
2475
+            }
2476
+
2477
+            return $string;
2478
+        }
2479
+
2480
+        /**
2481
+         * Outputs the content of the widget
2482
+         *
2483
+         * @param array $args
2484
+         * @param array $instance
2485
+         */
2486
+        public function widget( $args, $instance ) {
2487
+
2488
+            // get the filtered values
2489
+            $argument_values = $this->argument_values( $instance );
2490
+            $argument_values = $this->string_to_bool( $argument_values );
2491
+            $output          = $this->output( $argument_values, $args );
2492
+
2493
+            $no_wrap = false;
2494
+            if ( isset( $argument_values['no_wrap'] ) && $argument_values['no_wrap'] ) {
2495
+                $no_wrap = true;
2496
+            }
2497
+
2498
+            ob_start();
2499
+            if ( $output && ! $no_wrap ) {
2500
+
2501
+                $class_original = $this->options['widget_ops']['classname'];
2502
+                $class = $this->options['widget_ops']['classname']." sdel-".$this->get_instance_hash();
2503
+
2504
+                // Before widget
2505
+                $before_widget = $args['before_widget'];
2506
+                $before_widget = str_replace($class_original,$class,$before_widget);
2507
+                $before_widget = apply_filters( 'wp_super_duper_before_widget', $before_widget, $args, $instance, $this );
2508
+                $before_widget = apply_filters( 'wp_super_duper_before_widget_' . $this->base_id, $before_widget, $args, $instance, $this );
2509
+
2510
+                // After widget
2511
+                $after_widget = $args['after_widget'];
2512
+                $after_widget = apply_filters( 'wp_super_duper_after_widget', $after_widget, $args, $instance, $this );
2513
+                $after_widget = apply_filters( 'wp_super_duper_after_widget_' . $this->base_id, $after_widget, $args, $instance, $this );
2514
+
2515
+                echo $before_widget;
2516
+                // elementor strips the widget wrapping div so we check for and add it back if needed
2517
+                if ( $this->is_elementor_widget_output() ) {
2518
+                    echo ! empty( $this->options['widget_ops']['classname'] ) ? "<span class='" . esc_attr( $class  ) . "'>" : '';
2519
+                }
2520
+                echo $this->output_title( $args, $instance );
2521
+                echo $output;
2522
+                if ( $this->is_elementor_widget_output() ) {
2523
+                    echo ! empty( $this->options['widget_ops']['classname'] ) ? "</span>" : '';
2524
+                }
2525
+                echo $after_widget;
2526
+            } elseif ( $this->is_preview() && $output == '' ) {// if preview show a placeholder if empty
2527
+                $output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
2528
+                echo $output;
2529
+            } elseif ( $output && $no_wrap ) {
2530
+                echo $output;
2531
+            }
2532
+            $output = ob_get_clean();
2533
+
2534
+            $output = apply_filters( 'wp_super_duper_widget_output', $output, $instance, $args, $this );
2535
+
2536
+            echo $output;
2537
+        }
2538
+
2539
+        /**
2540
+         * Tests if the current output is inside a elementor container.
2541
+         *
2542
+         * @since 1.0.4
2543
+         * @return bool
2544
+         */
2545
+        public function is_elementor_widget_output() {
2546
+            $result = false;
2547
+            if ( defined( 'ELEMENTOR_VERSION' ) && isset( $this->number ) && $this->number == 'REPLACE_TO_ID' ) {
2548
+                $result = true;
2549
+            }
2550
+
2551
+            return $result;
2552
+        }
2553
+
2554
+        /**
2555
+         * Tests if the current output is inside a elementor preview.
2556
+         *
2557
+         * @since 1.0.4
2558
+         * @return bool
2559
+         */
2560
+        public function is_elementor_preview() {
2561
+            $result = false;
2562
+            if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
2563
+                $result = true;
2564
+            }
2565
+
2566
+            return $result;
2567
+        }
2568
+
2569
+        /**
2570
+         * Tests if the current output is inside a Divi preview.
2571
+         *
2572
+         * @since 1.0.6
2573
+         * @return bool
2574
+         */
2575
+        public function is_divi_preview() {
2576
+            $result = false;
2577
+            if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
2578
+                $result = true;
2579
+            }
2580
+
2581
+            return $result;
2582
+        }
2583
+
2584
+        /**
2585
+         * Tests if the current output is inside a Beaver builder preview.
2586
+         *
2587
+         * @since 1.0.6
2588
+         * @return bool
2589
+         */
2590
+        public function is_beaver_preview() {
2591
+            $result = false;
2592
+            if ( isset( $_REQUEST['fl_builder'] ) ) {
2593
+                $result = true;
2594
+            }
2595
+
2596
+            return $result;
2597
+        }
2598
+
2599
+        /**
2600
+         * Tests if the current output is inside a siteorigin builder preview.
2601
+         *
2602
+         * @since 1.0.6
2603
+         * @return bool
2604
+         */
2605
+        public function is_siteorigin_preview() {
2606
+            $result = false;
2607
+            if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
2608
+                $result = true;
2609
+            }
2610
+
2611
+            return $result;
2612
+        }
2613
+
2614
+        /**
2615
+         * Tests if the current output is inside a cornerstone builder preview.
2616
+         *
2617
+         * @since 1.0.8
2618
+         * @return bool
2619
+         */
2620
+        public function is_cornerstone_preview() {
2621
+            $result = false;
2622
+            if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
2623
+                $result = true;
2624
+            }
2625
+
2626
+            return $result;
2627
+        }
2628
+
2629
+        /**
2630
+         * Tests if the current output is inside a fusion builder preview.
2631
+         *
2632
+         * @since 1.1.0
2633
+         * @return bool
2634
+         */
2635
+        public function is_fusion_preview() {
2636
+            $result = false;
2637
+            if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
2638
+                $result = true;
2639
+            }
2640
+
2641
+            return $result;
2642
+        }
2643
+
2644
+        /**
2645
+         * Tests if the current output is inside a Oxygen builder preview.
2646
+         *
2647
+         * @since 1.0.18
2648
+         * @return bool
2649
+         */
2650
+        public function is_oxygen_preview() {
2651
+            $result = false;
2652
+            if ( ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) ) {
2653
+                $result = true;
2654
+            }
2655
+
2656
+            return $result;
2657
+        }
2658
+
2659
+        /**
2660
+         * General function to check if we are in a preview situation.
2661
+         *
2662
+         * @since 1.0.6
2663
+         * @return bool
2664
+         */
2665
+        public function is_preview() {
2666
+            $preview = false;
2667
+            if ( $this->is_divi_preview() ) {
2668
+                $preview = true;
2669
+            } elseif ( $this->is_elementor_preview() ) {
2670
+                $preview = true;
2671
+            } elseif ( $this->is_beaver_preview() ) {
2672
+                $preview = true;
2673
+            } elseif ( $this->is_siteorigin_preview() ) {
2674
+                $preview = true;
2675
+            } elseif ( $this->is_cornerstone_preview() ) {
2676
+                $preview = true;
2677
+            } elseif ( $this->is_fusion_preview() ) {
2678
+                $preview = true;
2679
+            } elseif ( $this->is_oxygen_preview() ) {
2680
+                $preview = true;
2681
+            } elseif( $this->is_block_content_call() ) {
2682
+                $preview = true;
2683
+            }
2684
+
2685
+            return $preview;
2686
+        }
2687
+
2688
+        /**
2689
+         * Output the super title.
2690
+         *
2691
+         * @param $args
2692
+         * @param array $instance
2693
+         *
2694
+         * @return string
2695
+         */
2696
+        public function output_title( $args, $instance = array() ) {
2697
+            $output = '';
2698
+            if ( ! empty( $instance['title'] ) ) {
2699
+                /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
2700
+                $title  = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
2701
+
2702
+                if(empty($instance['widget_title_tag'])){
2703
+                    $output = $args['before_title'] . $title . $args['after_title'];
2704
+                }else{
2705
+                    $title_tag = esc_attr( $instance['widget_title_tag'] );
2706
+
2707
+                    // classes
2708
+                    $title_classes = array();
2709
+                    $title_classes[] = !empty( $instance['widget_title_size_class'] ) ? sanitize_html_class( $instance['widget_title_size_class'] ) : '';
2710
+                    $title_classes[] = !empty( $instance['widget_title_align_class'] ) ? sanitize_html_class( $instance['widget_title_align_class'] ) : '';
2711
+                    $title_classes[] = !empty( $instance['widget_title_color_class'] ) ? "text-".sanitize_html_class( $instance['widget_title_color_class'] ) : '';
2712
+                    $title_classes[] = !empty( $instance['widget_title_border_class'] ) ? sanitize_html_class( $instance['widget_title_border_class'] ) : '';
2713
+                    $title_classes[] = !empty( $instance['widget_title_border_color_class'] ) ? "border-".sanitize_html_class( $instance['widget_title_border_color_class'] ) : '';
2714
+                    $title_classes[] = !empty( $instance['widget_title_mt_class'] ) ? "mt-".absint( $instance['widget_title_mt_class'] ) : '';
2715
+                    $title_classes[] = !empty( $instance['widget_title_mr_class'] ) ? "mr-".absint( $instance['widget_title_mr_class'] ) : '';
2716
+                    $title_classes[] = !empty( $instance['widget_title_mb_class'] ) ? "mb-".absint( $instance['widget_title_mb_class'] ) : '';
2717
+                    $title_classes[] = !empty( $instance['widget_title_ml_class'] ) ? "ml-".absint( $instance['widget_title_ml_class'] ) : '';
2718
+                    $title_classes[] = !empty( $instance['widget_title_pt_class'] ) ? "pt-".absint( $instance['widget_title_pt_class'] ) : '';
2719
+                    $title_classes[] = !empty( $instance['widget_title_pr_class'] ) ? "pr-".absint( $instance['widget_title_pr_class'] ) : '';
2720
+                    $title_classes[] = !empty( $instance['widget_title_pb_class'] ) ? "pb-".absint( $instance['widget_title_pb_class'] ) : '';
2721
+                    $title_classes[] = !empty( $instance['widget_title_pl_class'] ) ? "pl-".absint( $instance['widget_title_pl_class'] ) : '';
2722
+
2723
+                    $class = !empty( $title_classes ) ? implode(" ",$title_classes) : '';
2724
+                    $output = "<$title_tag class='$class' >$title</$title_tag>";
2725
+                }
2726
+
2727
+            }
2728
+
2729
+            return $output;
2730
+        }
2731
+
2732
+        /**
2733
+         * Outputs the options form inputs for the widget.
2734
+         *
2735
+         * @param array $instance The widget options.
2736
+         */
2737
+        public function form( $instance ) {
2738
+
2739
+            // set widget instance
2740
+            $this->instance = $instance;
2741
+
2742
+            // set it as a SD widget
2743
+            echo $this->widget_advanced_toggle();
2744
+
2745
+            echo "<p>" . esc_attr( $this->options['widget_ops']['description'] ) . "</p>";
2746
+            $arguments_raw = $this->get_arguments();
2747
+
2748
+            if ( is_array( $arguments_raw ) ) {
2749
+
2750
+                $arguments = $this->group_arguments( $arguments_raw );
2751
+
2752
+                // Do we have sections?
2753
+                $has_sections = $arguments == $arguments_raw ? false : true;
2754
+
2755
+
2756
+                if ( $has_sections ) {
2757
+                    $panel_count = 0;
2758
+                    foreach ( $arguments as $key => $args ) {
2759
+
2760
+                        ?>
2761 2761
 						<script>
2762 2762
 							//							jQuery(this).find("i").toggleClass("fas fa-chevron-up fas fa-chevron-down");jQuery(this).next().toggle();
2763 2763
 						</script>
2764 2764
 						<?php
2765 2765
 
2766
-						$hide       = $panel_count ? ' style="display:none;" ' : '';
2767
-						$icon_class = $panel_count ? 'fas fa-chevron-up' : 'fas fa-chevron-down';
2768
-						echo "<button onclick='jQuery(this).find(\"i\").toggleClass(\"fas fa-chevron-up fas fa-chevron-down\");jQuery(this).next().slideToggle();' type='button' class='sd-toggle-group-button sd-input-group-toggle" . sanitize_title_with_dashes( $key ) . "'>" . esc_attr( $key ) . " <i style='float:right;' class='" . $icon_class . "'></i></button>";
2769
-						echo "<div class='sd-toggle-group sd-input-group-" . sanitize_title_with_dashes( $key ) . "' $hide>";
2766
+                        $hide       = $panel_count ? ' style="display:none;" ' : '';
2767
+                        $icon_class = $panel_count ? 'fas fa-chevron-up' : 'fas fa-chevron-down';
2768
+                        echo "<button onclick='jQuery(this).find(\"i\").toggleClass(\"fas fa-chevron-up fas fa-chevron-down\");jQuery(this).next().slideToggle();' type='button' class='sd-toggle-group-button sd-input-group-toggle" . sanitize_title_with_dashes( $key ) . "'>" . esc_attr( $key ) . " <i style='float:right;' class='" . $icon_class . "'></i></button>";
2769
+                        echo "<div class='sd-toggle-group sd-input-group-" . sanitize_title_with_dashes( $key ) . "' $hide>";
2770 2770
 
2771
-						foreach ( $args as $k => $a ) {
2771
+                        foreach ( $args as $k => $a ) {
2772 2772
 
2773
-							$this->widget_inputs_row_start($k, $a);
2774
-							$this->widget_inputs( $a, $instance );
2775
-							$this->widget_inputs_row_end($k, $a);
2773
+                            $this->widget_inputs_row_start($k, $a);
2774
+                            $this->widget_inputs( $a, $instance );
2775
+                            $this->widget_inputs_row_end($k, $a);
2776 2776
 
2777
-						}
2777
+                        }
2778 2778
 
2779
-						echo "</div>";
2779
+                        echo "</div>";
2780 2780
 
2781
-						$panel_count ++;
2781
+                        $panel_count ++;
2782 2782
 
2783
-					}
2784
-				} else {
2785
-					foreach ( $arguments as $key => $args ) {
2786
-						$this->widget_inputs_row_start($key, $args);
2787
-						$this->widget_inputs( $args, $instance );
2788
-						$this->widget_inputs_row_end($key, $args);
2789
-					}
2790
-				}
2783
+                    }
2784
+                } else {
2785
+                    foreach ( $arguments as $key => $args ) {
2786
+                        $this->widget_inputs_row_start($key, $args);
2787
+                        $this->widget_inputs( $args, $instance );
2788
+                        $this->widget_inputs_row_end($key, $args);
2789
+                    }
2790
+                }
2791 2791
 
2792
-			}
2793
-		}
2792
+            }
2793
+        }
2794 2794
 
2795
-		public function widget_inputs_row_start($key, $args){
2796
-			if(!empty($args['row'])){
2797
-				// maybe open
2798
-				if(!empty($args['row']['open'])){
2799
-					?>
2795
+        public function widget_inputs_row_start($key, $args){
2796
+            if(!empty($args['row'])){
2797
+                // maybe open
2798
+                if(!empty($args['row']['open'])){
2799
+                    ?>
2800 2800
 					<div class='bsui sd-argument ' data-argument='<?php echo esc_attr( $args['row']['key'] ); ?>' data-element_require='<?php if ( !empty($args['row']['element_require'])) {
2801
-						echo $this->convert_element_require( $args['row']['element_require'] );
2802
-					} ?>'>
2801
+                        echo $this->convert_element_require( $args['row']['element_require'] );
2802
+                    } ?>'>
2803 2803
 					<?php if(!empty($args['row']['title'])){ ?>
2804 2804
 					<label class="mb-0 "><?php echo esc_attr( $args['row']['title'] ); ?><?php echo $this->widget_field_desc( $args['row'] ); ?></label>
2805 2805
 					<?php }?>
2806 2806
 					<div class='row <?php if(!empty($args['row']['class'])){ echo esc_attr($args['row']['class']);} ?>'>
2807 2807
 					<div class='col pr-2'>
2808 2808
 					<?php
2809
-				}elseif(!empty($args['row']['close'])){
2810
-					echo "<div class='col pl-0'>";
2811
-				}else{
2812
-					echo "<div class='col pl-0 pr-2'>";
2813
-				}
2814
-			}
2815
-		}
2816
-
2817
-		public function widget_inputs_row_end($key, $args){
2818
-
2819
-			if(!empty($args['row'])){
2820
-				// maybe close
2821
-				if(!empty($args['row']['close'])){
2822
-					echo "</div></div>";
2823
-				}
2824
-
2825
-				echo "</div>";
2826
-			}
2827
-		}
2828
-
2829
-		/**
2830
-		 * Get the hidden input that when added makes the advanced button show on widget settings.
2831
-		 *
2832
-		 * @return string
2833
-		 */
2834
-		public function widget_advanced_toggle() {
2835
-
2836
-			$output = '';
2837
-			if ( $this->block_show_advanced() ) {
2838
-				$val = 1;
2839
-			} else {
2840
-				$val = 0;
2841
-			}
2842
-
2843
-			$output .= "<input type='hidden'  class='sd-show-advanced' value='$val' />";
2844
-
2845
-			return $output;
2846
-		}
2847
-
2848
-		/**
2849
-		 * Convert require element.
2850
-		 *
2851
-		 * @since 1.0.0
2852
-		 *
2853
-		 * @param string $input Input element.
2854
-		 *
2855
-		 * @return string $output
2856
-		 */
2857
-		public function convert_element_require( $input ) {
2858
-
2859
-			$input = str_replace( "'", '"', $input );// we only want double quotes
2860
-
2861
-			$output = esc_attr( str_replace( array( "[%", "%]" ), array(
2862
-				"jQuery(form).find('[data-argument=\"",
2863
-				"\"]').find('input,select,textarea').val()"
2864
-			), $input ) );
2865
-
2866
-			return $output;
2867
-		}
2868
-
2869
-		/**
2870
-		 * Builds the inputs for the widget options.
2871
-		 *
2872
-		 * @param $args
2873
-		 * @param $instance
2874
-		 */
2875
-		public function widget_inputs( $args, $instance ) {
2876
-
2877
-			$class             = "";
2878
-			$element_require   = "";
2879
-			$custom_attributes = "";
2880
-
2881
-			// get value
2882
-			if ( isset( $instance[ $args['name'] ] ) ) {
2883
-				$value = $instance[ $args['name'] ];
2884
-			} elseif ( ! isset( $instance[ $args['name'] ] ) && ! empty( $args['default'] ) ) {
2885
-				$value = is_array( $args['default'] ) ? array_map( "esc_html", $args['default'] ) : esc_html( $args['default'] );
2886
-			} else {
2887
-				$value = '';
2888
-			}
2889
-
2890
-			// get placeholder
2891
-			if ( ! empty( $args['placeholder'] ) ) {
2892
-				$placeholder = "placeholder='" . esc_html( $args['placeholder'] ) . "'";
2893
-			} else {
2894
-				$placeholder = '';
2895
-			}
2896
-
2897
-			// get if advanced
2898
-			if ( isset( $args['advanced'] ) && $args['advanced'] ) {
2899
-				$class .= " sd-advanced-setting ";
2900
-			}
2901
-
2902
-			// element_require
2903
-			if ( isset( $args['element_require'] ) && $args['element_require'] ) {
2904
-				$element_require = $args['element_require'];
2905
-			}
2906
-
2907
-			// custom_attributes
2908
-			if ( isset( $args['custom_attributes'] ) && $args['custom_attributes'] ) {
2909
-				$custom_attributes = $this->array_to_attributes( $args['custom_attributes'], true );
2910
-			}
2911
-
2912
-
2913
-			// before wrapper
2914
-			?>
2809
+                }elseif(!empty($args['row']['close'])){
2810
+                    echo "<div class='col pl-0'>";
2811
+                }else{
2812
+                    echo "<div class='col pl-0 pr-2'>";
2813
+                }
2814
+            }
2815
+        }
2816
+
2817
+        public function widget_inputs_row_end($key, $args){
2818
+
2819
+            if(!empty($args['row'])){
2820
+                // maybe close
2821
+                if(!empty($args['row']['close'])){
2822
+                    echo "</div></div>";
2823
+                }
2824
+
2825
+                echo "</div>";
2826
+            }
2827
+        }
2828
+
2829
+        /**
2830
+         * Get the hidden input that when added makes the advanced button show on widget settings.
2831
+         *
2832
+         * @return string
2833
+         */
2834
+        public function widget_advanced_toggle() {
2835
+
2836
+            $output = '';
2837
+            if ( $this->block_show_advanced() ) {
2838
+                $val = 1;
2839
+            } else {
2840
+                $val = 0;
2841
+            }
2842
+
2843
+            $output .= "<input type='hidden'  class='sd-show-advanced' value='$val' />";
2844
+
2845
+            return $output;
2846
+        }
2847
+
2848
+        /**
2849
+         * Convert require element.
2850
+         *
2851
+         * @since 1.0.0
2852
+         *
2853
+         * @param string $input Input element.
2854
+         *
2855
+         * @return string $output
2856
+         */
2857
+        public function convert_element_require( $input ) {
2858
+
2859
+            $input = str_replace( "'", '"', $input );// we only want double quotes
2860
+
2861
+            $output = esc_attr( str_replace( array( "[%", "%]" ), array(
2862
+                "jQuery(form).find('[data-argument=\"",
2863
+                "\"]').find('input,select,textarea').val()"
2864
+            ), $input ) );
2865
+
2866
+            return $output;
2867
+        }
2868
+
2869
+        /**
2870
+         * Builds the inputs for the widget options.
2871
+         *
2872
+         * @param $args
2873
+         * @param $instance
2874
+         */
2875
+        public function widget_inputs( $args, $instance ) {
2876
+
2877
+            $class             = "";
2878
+            $element_require   = "";
2879
+            $custom_attributes = "";
2880
+
2881
+            // get value
2882
+            if ( isset( $instance[ $args['name'] ] ) ) {
2883
+                $value = $instance[ $args['name'] ];
2884
+            } elseif ( ! isset( $instance[ $args['name'] ] ) && ! empty( $args['default'] ) ) {
2885
+                $value = is_array( $args['default'] ) ? array_map( "esc_html", $args['default'] ) : esc_html( $args['default'] );
2886
+            } else {
2887
+                $value = '';
2888
+            }
2889
+
2890
+            // get placeholder
2891
+            if ( ! empty( $args['placeholder'] ) ) {
2892
+                $placeholder = "placeholder='" . esc_html( $args['placeholder'] ) . "'";
2893
+            } else {
2894
+                $placeholder = '';
2895
+            }
2896
+
2897
+            // get if advanced
2898
+            if ( isset( $args['advanced'] ) && $args['advanced'] ) {
2899
+                $class .= " sd-advanced-setting ";
2900
+            }
2901
+
2902
+            // element_require
2903
+            if ( isset( $args['element_require'] ) && $args['element_require'] ) {
2904
+                $element_require = $args['element_require'];
2905
+            }
2906
+
2907
+            // custom_attributes
2908
+            if ( isset( $args['custom_attributes'] ) && $args['custom_attributes'] ) {
2909
+                $custom_attributes = $this->array_to_attributes( $args['custom_attributes'], true );
2910
+            }
2911
+
2912
+
2913
+            // before wrapper
2914
+            ?>
2915 2915
 			<p class="sd-argument <?php echo esc_attr( $class ); ?>"
2916 2916
 			data-argument='<?php echo esc_attr( $args['name'] ); ?>'
2917 2917
 			data-element_require='<?php if ( $element_require ) {
2918
-				echo $this->convert_element_require( $element_require );
2919
-			} ?>'
2918
+                echo $this->convert_element_require( $element_require );
2919
+            } ?>'
2920 2920
 			>
2921 2921
 			<?php
2922 2922
 
2923 2923
 
2924
-			switch ( $args['type'] ) {
2925
-				//array('text','password','number','email','tel','url','color')
2926
-				case "text":
2927
-				case "password":
2928
-				case "number":
2929
-				case "email":
2930
-				case "tel":
2931
-				case "url":
2932
-				case "color":
2933
-					?>
2924
+            switch ( $args['type'] ) {
2925
+                //array('text','password','number','email','tel','url','color')
2926
+                case "text":
2927
+                case "password":
2928
+                case "number":
2929
+                case "email":
2930
+                case "tel":
2931
+                case "url":
2932
+                case "color":
2933
+                    ?>
2934 2934
 					<label
2935 2935
 						for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args );?><?php echo $this->widget_field_desc( $args ); ?></label>
2936 2936
 					<input <?php echo $placeholder; ?> class="widefat"
@@ -2941,47 +2941,47 @@  discard block
 block discarded – undo
2941 2941
 						                               value="<?php echo esc_attr( $value ); ?>">
2942 2942
 					<?php
2943 2943
 
2944
-					break;
2945
-				case "select":
2946
-					$multiple = isset( $args['multiple'] ) && $args['multiple'] ? true : false;
2947
-					if ( $multiple ) {
2948
-						if ( empty( $value ) ) {
2949
-							$value = array();
2950
-						}
2951
-					}
2952
-					?>
2944
+                    break;
2945
+                case "select":
2946
+                    $multiple = isset( $args['multiple'] ) && $args['multiple'] ? true : false;
2947
+                    if ( $multiple ) {
2948
+                        if ( empty( $value ) ) {
2949
+                            $value = array();
2950
+                        }
2951
+                    }
2952
+                    ?>
2953 2953
 					<label
2954 2954
 						for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2955 2955
 					<select <?php echo $placeholder; ?> class="widefat"
2956 2956
 						<?php echo $custom_attributes; ?>
2957 2957
 						                                id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"
2958 2958
 						                                name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) );
2959
-						                                if ( $multiple ) {
2960
-							                                echo "[]";
2961
-						                                } ?>"
2959
+                                                        if ( $multiple ) {
2960
+                                                            echo "[]";
2961
+                                                        } ?>"
2962 2962
 						<?php if ( $multiple ) {
2963
-							echo "multiple";
2964
-						} //@todo not implemented yet due to gutenberg not supporting it
2965
-						?>
2963
+                            echo "multiple";
2964
+                        } //@todo not implemented yet due to gutenberg not supporting it
2965
+                        ?>
2966 2966
 					>
2967 2967
 						<?php
2968 2968
 
2969
-						if ( ! empty( $args['options'] ) ) {
2970
-							foreach ( $args['options'] as $val => $label ) {
2971
-								if ( $multiple ) {
2972
-									$selected = in_array( $val, $value ) ? 'selected="selected"' : '';
2973
-								} else {
2974
-									$selected = selected( $value, $val, false );
2975
-								}
2976
-								echo "<option value='$val' " . $selected . ">$label</option>";
2977
-							}
2978
-						}
2979
-						?>
2969
+                        if ( ! empty( $args['options'] ) ) {
2970
+                            foreach ( $args['options'] as $val => $label ) {
2971
+                                if ( $multiple ) {
2972
+                                    $selected = in_array( $val, $value ) ? 'selected="selected"' : '';
2973
+                                } else {
2974
+                                    $selected = selected( $value, $val, false );
2975
+                                }
2976
+                                echo "<option value='$val' " . $selected . ">$label</option>";
2977
+                            }
2978
+                        }
2979
+                        ?>
2980 2980
 					</select>
2981 2981
 					<?php
2982
-					break;
2983
-				case "checkbox":
2984
-					?>
2982
+                    break;
2983
+                case "checkbox":
2984
+                    ?>
2985 2985
 					<input <?php echo $placeholder; ?>
2986 2986
 						<?php checked( 1, $value, true ) ?>
2987 2987
 						<?php echo $custom_attributes; ?>
@@ -2991,9 +2991,9 @@  discard block
 block discarded – undo
2991 2991
 					<label
2992 2992
 						for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args );?><?php echo $this->widget_field_desc( $args ); ?></label>
2993 2993
 					<?php
2994
-					break;
2995
-				case "textarea":
2996
-					?>
2994
+                    break;
2995
+                case "textarea":
2996
+                    ?>
2997 2997
 					<label
2998 2998
 						for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2999 2999
 					<textarea <?php echo $placeholder; ?> class="widefat"
@@ -3003,207 +3003,207 @@  discard block
 block discarded – undo
3003 3003
 					><?php echo esc_attr( $value ); ?></textarea>
3004 3004
 					<?php
3005 3005
 
3006
-					break;
3007
-				case "hidden":
3008
-					?>
3006
+                    break;
3007
+                case "hidden":
3008
+                    ?>
3009 3009
 					<input id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"
3010 3010
 					       name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>" type="hidden"
3011 3011
 					       value="<?php echo esc_attr( $value ); ?>">
3012 3012
 					<?php
3013
-					break;
3014
-				default:
3015
-					echo "No input type found!"; // @todo we need to add more input types.
3016
-			}
3013
+                    break;
3014
+                default:
3015
+                    echo "No input type found!"; // @todo we need to add more input types.
3016
+            }
3017 3017
 
3018
-			// after wrapper
3019
-			?>
3018
+            // after wrapper
3019
+            ?>
3020 3020
 			</p>
3021 3021
 			<?php
3022 3022
 
3023 3023
 
3024
-		}
3025
-
3026
-		public function get_widget_icon($icon = 'box-top', $title = ''){
3027
-			if($icon=='box-top'){
3028
-				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.048" height="9.017" fill="#555D66"></rect><rect x="16.265" y="5.498" width="1.023" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.186" width="8.964" height="2.482" fill="#272B2F"></rect><rect x="5.487" y="16.261" width="9.026" height="1.037" fill="#555D66"></rect></svg>';
3029
-			}elseif($icon=='box-right'){
3030
-				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.046" height="9.017" fill="#555D66"></rect><rect x="15.244" y="5.498" width="2.518" height="9.003" fill="#272B2F"></rect><rect x="5.518" y="2.719" width="8.964" height="0.954" fill="#555D66"></rect><rect x="5.487" y="16.308" width="9.026" height="0.99" fill="#555D66"></rect></svg>';
3031
-			}elseif($icon=='box-bottom'){
3032
-				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1" height="9.017" fill="#555D66"></rect><rect x="16.261" y="5.498" width="1.027" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.968" fill="#555D66"></rect><rect x="5.487" y="15.28" width="9.026" height="2.499" fill="#272B2F"></rect></svg>';
3033
-			}elseif($icon=='box-left'){
3034
-				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.202" y="5.492" width="2.503" height="9.017" fill="#272B2F"></rect><rect x="16.276" y="5.498" width="1.012" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.966" fill="#555D66"></rect><rect x="5.487" y="16.303" width="9.026" height="0.995" fill="#555D66"></rect></svg>';
3035
-			}
3036
-		}
3037
-
3038
-		/**
3039
-		 * Get the widget input description html.
3040
-		 *
3041
-		 * @param $args
3042
-		 *
3043
-		 * @return string
3044
-		 * @todo, need to make its own tooltip script
3045
-		 */
3046
-		public function widget_field_desc( $args ) {
3047
-
3048
-			$description = '';
3049
-			if ( isset( $args['desc'] ) && $args['desc'] ) {
3050
-				if ( isset( $args['desc_tip'] ) && $args['desc_tip'] ) {
3051
-					$description = $this->desc_tip( $args['desc'] );
3052
-				} else {
3053
-					$description = '<span class="description">' . wp_kses_post( $args['desc'] ) . '</span>';
3054
-				}
3055
-			}
3056
-
3057
-			return $description;
3058
-		}
3059
-
3060
-		/**
3061
-		 * Get the widget input title html.
3062
-		 *
3063
-		 * @param $args
3064
-		 *
3065
-		 * @return string
3066
-		 */
3067
-		public function widget_field_title( $args ) {
3068
-
3069
-			$title = '';
3070
-			if ( isset( $args['title'] ) && $args['title'] ) {
3071
-				if ( isset( $args['icon'] ) && $args['icon'] ) {
3072
-					$title = self::get_widget_icon( $args['icon'], $args['title']  );
3073
-				} else {
3074
-					$title = esc_attr($args['title']);
3075
-				}
3076
-			}
3077
-
3078
-			return $title;
3079
-		}
3080
-
3081
-		/**
3082
-		 * Get the tool tip html.
3083
-		 *
3084
-		 * @param $tip
3085
-		 * @param bool $allow_html
3086
-		 *
3087
-		 * @return string
3088
-		 */
3089
-		function desc_tip( $tip, $allow_html = false ) {
3090
-			if ( $allow_html ) {
3091
-				$tip = $this->sanitize_tooltip( $tip );
3092
-			} else {
3093
-				$tip = esc_attr( $tip );
3094
-			}
3095
-
3096
-			return '<span class="gd-help-tip dashicons dashicons-editor-help" title="' . $tip . '"></span>';
3097
-		}
3098
-
3099
-		/**
3100
-		 * Sanitize a string destined to be a tooltip.
3101
-		 *
3102
-		 * @param string $var
3103
-		 *
3104
-		 * @return string
3105
-		 */
3106
-		public function sanitize_tooltip( $var ) {
3107
-			return htmlspecialchars( wp_kses( html_entity_decode( $var ), array(
3108
-				'br'     => array(),
3109
-				'em'     => array(),
3110
-				'strong' => array(),
3111
-				'small'  => array(),
3112
-				'span'   => array(),
3113
-				'ul'     => array(),
3114
-				'li'     => array(),
3115
-				'ol'     => array(),
3116
-				'p'      => array(),
3117
-			) ) );
3118
-		}
3119
-
3120
-		/**
3121
-		 * Processing widget options on save
3122
-		 *
3123
-		 * @param array $new_instance The new options
3124
-		 * @param array $old_instance The previous options
3125
-		 *
3126
-		 * @return array
3127
-		 * @todo we should add some sanitation here.
3128
-		 */
3129
-		public function update( $new_instance, $old_instance ) {
3130
-
3131
-			//save the widget
3132
-			$instance = array_merge( (array) $old_instance, (array) $new_instance );
3133
-
3134
-			// set widget instance
3135
-			$this->instance = $instance;
3136
-
3137
-			if ( empty( $this->arguments ) ) {
3138
-				$this->get_arguments();
3139
-			}
3140
-
3141
-			// check for checkboxes
3142
-			if ( ! empty( $this->arguments ) ) {
3143
-				foreach ( $this->arguments as $argument ) {
3144
-					if ( isset( $argument['type'] ) && $argument['type'] == 'checkbox' && ! isset( $new_instance[ $argument['name'] ] ) ) {
3145
-						$instance[ $argument['name'] ] = '0';
3146
-					}
3147
-				}
3148
-			}
3149
-
3150
-			return $instance;
3151
-		}
3152
-
3153
-		/**
3154
-		 * Checks if the current call is a ajax call to get the block content.
3155
-		 *
3156
-		 * This can be used in your widget to return different content as the block content.
3157
-		 *
3158
-		 * @since 1.0.3
3159
-		 * @return bool
3160
-		 */
3161
-		public function is_block_content_call() {
3162
-			$result = false;
3163
-			if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
3164
-				$result = true;
3165
-			}
3166
-
3167
-			return $result;
3168
-		}
3169
-
3170
-		/**
3171
-		 * Get an instance hash that will be unique to the type and settings.
3172
-		 *
3173
-		 * @since 1.0.20
3174
-		 * @return string
3175
-		 */
3176
-		public function get_instance_hash(){
3177
-			$instance_string = $this->base_id.serialize($this->instance);
3178
-			return hash('crc32b',$instance_string);
3179
-		}
3180
-
3181
-		/**
3182
-		 * Generate and return inline styles from CSS rules that will match the unique class of the instance.
3183
-		 *
3184
-		 * @param array $rules
3185
-		 *
3186
-		 * @since 1.0.20
3187
-		 * @return string
3188
-		 */
3189
-		public function get_instance_style($rules = array()){
3190
-			$css = '';
3191
-
3192
-			if(!empty($rules)){
3193
-				$rules = array_unique($rules);
3194
-				$instance_hash = $this->get_instance_hash();
3195
-				$css .= "<style>";
3196
-				foreach($rules as $rule){
3197
-					$css .= ".sdel-$instance_hash $rule";
3198
-				}
3199
-				$css .= "</style>";
3200
-			}
3201
-
3202
-
3203
-			return $css;
3204
-
3205
-		}
3206
-
3207
-	}
3024
+        }
3025
+
3026
+        public function get_widget_icon($icon = 'box-top', $title = ''){
3027
+            if($icon=='box-top'){
3028
+                return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.048" height="9.017" fill="#555D66"></rect><rect x="16.265" y="5.498" width="1.023" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.186" width="8.964" height="2.482" fill="#272B2F"></rect><rect x="5.487" y="16.261" width="9.026" height="1.037" fill="#555D66"></rect></svg>';
3029
+            }elseif($icon=='box-right'){
3030
+                return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.046" height="9.017" fill="#555D66"></rect><rect x="15.244" y="5.498" width="2.518" height="9.003" fill="#272B2F"></rect><rect x="5.518" y="2.719" width="8.964" height="0.954" fill="#555D66"></rect><rect x="5.487" y="16.308" width="9.026" height="0.99" fill="#555D66"></rect></svg>';
3031
+            }elseif($icon=='box-bottom'){
3032
+                return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1" height="9.017" fill="#555D66"></rect><rect x="16.261" y="5.498" width="1.027" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.968" fill="#555D66"></rect><rect x="5.487" y="15.28" width="9.026" height="2.499" fill="#272B2F"></rect></svg>';
3033
+            }elseif($icon=='box-left'){
3034
+                return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.202" y="5.492" width="2.503" height="9.017" fill="#272B2F"></rect><rect x="16.276" y="5.498" width="1.012" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.966" fill="#555D66"></rect><rect x="5.487" y="16.303" width="9.026" height="0.995" fill="#555D66"></rect></svg>';
3035
+            }
3036
+        }
3037
+
3038
+        /**
3039
+         * Get the widget input description html.
3040
+         *
3041
+         * @param $args
3042
+         *
3043
+         * @return string
3044
+         * @todo, need to make its own tooltip script
3045
+         */
3046
+        public function widget_field_desc( $args ) {
3047
+
3048
+            $description = '';
3049
+            if ( isset( $args['desc'] ) && $args['desc'] ) {
3050
+                if ( isset( $args['desc_tip'] ) && $args['desc_tip'] ) {
3051
+                    $description = $this->desc_tip( $args['desc'] );
3052
+                } else {
3053
+                    $description = '<span class="description">' . wp_kses_post( $args['desc'] ) . '</span>';
3054
+                }
3055
+            }
3056
+
3057
+            return $description;
3058
+        }
3059
+
3060
+        /**
3061
+         * Get the widget input title html.
3062
+         *
3063
+         * @param $args
3064
+         *
3065
+         * @return string
3066
+         */
3067
+        public function widget_field_title( $args ) {
3068
+
3069
+            $title = '';
3070
+            if ( isset( $args['title'] ) && $args['title'] ) {
3071
+                if ( isset( $args['icon'] ) && $args['icon'] ) {
3072
+                    $title = self::get_widget_icon( $args['icon'], $args['title']  );
3073
+                } else {
3074
+                    $title = esc_attr($args['title']);
3075
+                }
3076
+            }
3077
+
3078
+            return $title;
3079
+        }
3080
+
3081
+        /**
3082
+         * Get the tool tip html.
3083
+         *
3084
+         * @param $tip
3085
+         * @param bool $allow_html
3086
+         *
3087
+         * @return string
3088
+         */
3089
+        function desc_tip( $tip, $allow_html = false ) {
3090
+            if ( $allow_html ) {
3091
+                $tip = $this->sanitize_tooltip( $tip );
3092
+            } else {
3093
+                $tip = esc_attr( $tip );
3094
+            }
3095
+
3096
+            return '<span class="gd-help-tip dashicons dashicons-editor-help" title="' . $tip . '"></span>';
3097
+        }
3098
+
3099
+        /**
3100
+         * Sanitize a string destined to be a tooltip.
3101
+         *
3102
+         * @param string $var
3103
+         *
3104
+         * @return string
3105
+         */
3106
+        public function sanitize_tooltip( $var ) {
3107
+            return htmlspecialchars( wp_kses( html_entity_decode( $var ), array(
3108
+                'br'     => array(),
3109
+                'em'     => array(),
3110
+                'strong' => array(),
3111
+                'small'  => array(),
3112
+                'span'   => array(),
3113
+                'ul'     => array(),
3114
+                'li'     => array(),
3115
+                'ol'     => array(),
3116
+                'p'      => array(),
3117
+            ) ) );
3118
+        }
3119
+
3120
+        /**
3121
+         * Processing widget options on save
3122
+         *
3123
+         * @param array $new_instance The new options
3124
+         * @param array $old_instance The previous options
3125
+         *
3126
+         * @return array
3127
+         * @todo we should add some sanitation here.
3128
+         */
3129
+        public function update( $new_instance, $old_instance ) {
3130
+
3131
+            //save the widget
3132
+            $instance = array_merge( (array) $old_instance, (array) $new_instance );
3133
+
3134
+            // set widget instance
3135
+            $this->instance = $instance;
3136
+
3137
+            if ( empty( $this->arguments ) ) {
3138
+                $this->get_arguments();
3139
+            }
3140
+
3141
+            // check for checkboxes
3142
+            if ( ! empty( $this->arguments ) ) {
3143
+                foreach ( $this->arguments as $argument ) {
3144
+                    if ( isset( $argument['type'] ) && $argument['type'] == 'checkbox' && ! isset( $new_instance[ $argument['name'] ] ) ) {
3145
+                        $instance[ $argument['name'] ] = '0';
3146
+                    }
3147
+                }
3148
+            }
3149
+
3150
+            return $instance;
3151
+        }
3152
+
3153
+        /**
3154
+         * Checks if the current call is a ajax call to get the block content.
3155
+         *
3156
+         * This can be used in your widget to return different content as the block content.
3157
+         *
3158
+         * @since 1.0.3
3159
+         * @return bool
3160
+         */
3161
+        public function is_block_content_call() {
3162
+            $result = false;
3163
+            if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
3164
+                $result = true;
3165
+            }
3166
+
3167
+            return $result;
3168
+        }
3169
+
3170
+        /**
3171
+         * Get an instance hash that will be unique to the type and settings.
3172
+         *
3173
+         * @since 1.0.20
3174
+         * @return string
3175
+         */
3176
+        public function get_instance_hash(){
3177
+            $instance_string = $this->base_id.serialize($this->instance);
3178
+            return hash('crc32b',$instance_string);
3179
+        }
3180
+
3181
+        /**
3182
+         * Generate and return inline styles from CSS rules that will match the unique class of the instance.
3183
+         *
3184
+         * @param array $rules
3185
+         *
3186
+         * @since 1.0.20
3187
+         * @return string
3188
+         */
3189
+        public function get_instance_style($rules = array()){
3190
+            $css = '';
3191
+
3192
+            if(!empty($rules)){
3193
+                $rules = array_unique($rules);
3194
+                $instance_hash = $this->get_instance_hash();
3195
+                $css .= "<style>";
3196
+                foreach($rules as $rule){
3197
+                    $css .= ".sdel-$instance_hash $rule";
3198
+                }
3199
+                $css .= "</style>";
3200
+            }
3201
+
3202
+
3203
+            return $css;
3204
+
3205
+        }
3206
+
3207
+    }
3208 3208
 
3209 3209
 }
Please login to merge, or discard this patch.
includes/class-bp-getpaid-component.php 1 patch
Indentation   +129 added lines, -129 removed lines patch added patch discarded remove patch
@@ -17,45 +17,45 @@  discard block
 block discarded – undo
17 17
  */
18 18
 class BP_GetPaid_Component extends BP_Component {
19 19
 
20
-	/**
21
-	 * Start the component setup process.
22
-	 *
23
-	 * @since 2.1.5
24
-	 */
25
-	public function __construct() {
26
-		parent::start(
27
-			'getpaid',
28
-			'GetPaid',
29
-			buddypress()->plugin_dir,
30
-			array(
31
-				'adminbar_myaccount_order' => 30,
32
-			)
33
-		);
34
-	}
20
+    /**
21
+     * Start the component setup process.
22
+     *
23
+     * @since 2.1.5
24
+     */
25
+    public function __construct() {
26
+        parent::start(
27
+            'getpaid',
28
+            'GetPaid',
29
+            buddypress()->plugin_dir,
30
+            array(
31
+                'adminbar_myaccount_order' => 30,
32
+            )
33
+        );
34
+    }
35 35
 
36 36
     /**
37
-	 * Set up component global variables.
38
-	 *
39
-	 * @since 2.1.5
40
-	 *
41
-	 *
42
-	 * @param array $args {
43
-	 *     All values are optional.
44
-	 *     @type string   $slug                  The component slug. Used to construct certain URLs, such as 'friends' in
45
-	 *                                           http://example.com/members/joe/friends/. Default: the value of $this->id.
46
-	 *     @type string   $root_slug             The component root slug. Note that this value is generally unused if the
47
-	 *                                           component has a root directory (the slug will be overridden by the
48
-	 *                                           post_name of the directory page). Default: the slug of the directory page
49
-	 *                                           if one is found, otherwise an empty string.
50
-	 *     @type bool     $has_directory         Set to true if the component requires an associated WordPress page.
51
-	 *     @type callable $notification_callback Optional. The callable function that formats the component's notifications.
52
-	 *     @type string   $search_term           Optional. The placeholder text in the component directory search box. Eg,
53
-	 *                                           'Search Groups...'.
54
-	 *     @type array    $global_tables         Optional. An array of database table names.
55
-	 *     @type array    $meta_tables           Optional. An array of metadata table names.
56
-	 * }
57
-	 */
58
-	public function setup_globals( $args = array() ) {
37
+     * Set up component global variables.
38
+     *
39
+     * @since 2.1.5
40
+     *
41
+     *
42
+     * @param array $args {
43
+     *     All values are optional.
44
+     *     @type string   $slug                  The component slug. Used to construct certain URLs, such as 'friends' in
45
+     *                                           http://example.com/members/joe/friends/. Default: the value of $this->id.
46
+     *     @type string   $root_slug             The component root slug. Note that this value is generally unused if the
47
+     *                                           component has a root directory (the slug will be overridden by the
48
+     *                                           post_name of the directory page). Default: the slug of the directory page
49
+     *                                           if one is found, otherwise an empty string.
50
+     *     @type bool     $has_directory         Set to true if the component requires an associated WordPress page.
51
+     *     @type callable $notification_callback Optional. The callable function that formats the component's notifications.
52
+     *     @type string   $search_term           Optional. The placeholder text in the component directory search box. Eg,
53
+     *                                           'Search Groups...'.
54
+     *     @type array    $global_tables         Optional. An array of database table names.
55
+     *     @type array    $meta_tables           Optional. An array of metadata table names.
56
+     * }
57
+     */
58
+    public function setup_globals( $args = array() ) {
59 59
         parent::setup_globals(
60 60
             array(
61 61
                 'id'            => 'getpaid',
@@ -64,21 +64,21 @@  discard block
 block discarded – undo
64 64
                 'has_directory' => false
65 65
             )
66 66
         );
67
-	}
68
-
69
-	/**
70
-	 * Set up component navigation.
71
-	 *
72
-	 * @since 2.1.5
73
-	 *
74
-	 * @see BP_Component::setup_nav() for a description of arguments.
75
-	 *
76
-	 * @param array $main_nav Optional. See BP_Component::setup_nav() for description.
77
-	 * @param array $sub_nav  Optional. See BP_Component::setup_nav() for description.
78
-	 */
79
-	public function setup_nav( $main_nav = array(), $sub_nav = array() ) {
80
-
81
-		// Abort if the integration is inactive.
67
+    }
68
+
69
+    /**
70
+     * Set up component navigation.
71
+     *
72
+     * @since 2.1.5
73
+     *
74
+     * @see BP_Component::setup_nav() for a description of arguments.
75
+     *
76
+     * @param array $main_nav Optional. See BP_Component::setup_nav() for description.
77
+     * @param array $sub_nav  Optional. See BP_Component::setup_nav() for description.
78
+     */
79
+    public function setup_nav( $main_nav = array(), $sub_nav = array() ) {
80
+
81
+        // Abort if the integration is inactive.
82 82
         if ( ! getpaid_is_buddypress_integration_active() || ! is_user_logged_in() ) {
83 83
             return;
84 84
         }
@@ -88,25 +88,25 @@  discard block
 block discarded – undo
88 88
             return;
89 89
         }
90 90
 
91
-		// Determine user to use.
92
-		$user_domain   = bp_loggedin_user_domain();
93
-		$slug          = 'getpaid';
94
-		$payments_link = trailingslashit( $user_domain . $slug );
95
-
96
-		// Add 'Payments' to the main navigation.
97
-		$main_nav = array(
98
-			'name'                => _x( 'Billing', 'BuddyPress profile payments screen nav', 'invoicing' ),
99
-			'slug'                => $slug,
100
-			'position'            => apply_filters( 'wpinv_bp_nav_position', wpinv_get_option( 'wpinv_menu_position', 91 ), $slug ),
101
-			'screen_function'     => array( $this, 'display_current_tab' ),
102
-			'default_subnav_slug' => 'gp-edit-address',
91
+        // Determine user to use.
92
+        $user_domain   = bp_loggedin_user_domain();
93
+        $slug          = 'getpaid';
94
+        $payments_link = trailingslashit( $user_domain . $slug );
95
+
96
+        // Add 'Payments' to the main navigation.
97
+        $main_nav = array(
98
+            'name'                => _x( 'Billing', 'BuddyPress profile payments screen nav', 'invoicing' ),
99
+            'slug'                => $slug,
100
+            'position'            => apply_filters( 'wpinv_bp_nav_position', wpinv_get_option( 'wpinv_menu_position', 91 ), $slug ),
101
+            'screen_function'     => array( $this, 'display_current_tab' ),
102
+            'default_subnav_slug' => 'gp-edit-address',
103 103
             'show_for_displayed_user' => false,
104
-			'item_css_id'         => $this->id,
105
-			'parent_url'          => $user_domain,
106
-			'parent_slug'         => buddypress()->slug,
107
-		);
104
+            'item_css_id'         => $this->id,
105
+            'parent_url'          => $user_domain,
106
+            'parent_slug'         => buddypress()->slug,
107
+        );
108 108
 
109
-		// Add the subnav items to the payments nav item if we are using a theme that supports this.
109
+        // Add the subnav items to the payments nav item if we are using a theme that supports this.
110 110
         foreach ( getpaid_get_user_content_tabs() as $_slug => $tab ) {
111 111
 
112 112
             $sub_nav[] = array(
@@ -116,8 +116,8 @@  discard block
 block discarded – undo
116 116
                 'parent_slug'     => $slug,
117 117
                 'position' => 10,
118 118
                 'screen_function'        => function() use ( $tab ) {
119
-					$GLOBALS['getpaid_bp_current_tab'] = $tab;
120
-					$this->display_current_tab();
119
+                    $GLOBALS['getpaid_bp_current_tab'] = $tab;
120
+                    $this->display_current_tab();
121 121
                 },
122 122
                 'show_for_displayed_user' => false,
123 123
                 'item_css_id'             => "getpaid-bp-$_slug",
@@ -125,27 +125,27 @@  discard block
 block discarded – undo
125 125
 
126 126
         }
127 127
 
128
-		parent::setup_nav( $main_nav, $sub_nav );
129
-	}
130
-
131
-	/**
132
-	 * Set up the component entries in the WordPress Admin Bar.
133
-	 *
134
-	 * @since 2.1.5
135
-	 *
136
-	 * @see BP_Component::setup_nav() for a description of the $wp_admin_nav
137
-	 *      parameter array.
138
-	 *
139
-	 * @param array $wp_admin_nav See BP_Component::setup_admin_bar() for a
140
-	 *                            description.
141
-	 */
142
-	public function setup_admin_bar( $wp_admin_nav = array() ) {
143
-
144
-		// Menus for logged in user.
145
-		if ( is_user_logged_in() ) {
128
+        parent::setup_nav( $main_nav, $sub_nav );
129
+    }
146 130
 
147
-			// Setup the logged in user variables.
148
-			$payments_link = trailingslashit( bp_loggedin_user_domain() . 'getpaid/' );
131
+    /**
132
+     * Set up the component entries in the WordPress Admin Bar.
133
+     *
134
+     * @since 2.1.5
135
+     *
136
+     * @see BP_Component::setup_nav() for a description of the $wp_admin_nav
137
+     *      parameter array.
138
+     *
139
+     * @param array $wp_admin_nav See BP_Component::setup_admin_bar() for a
140
+     *                            description.
141
+     */
142
+    public function setup_admin_bar( $wp_admin_nav = array() ) {
143
+
144
+        // Menus for logged in user.
145
+        if ( is_user_logged_in() ) {
146
+
147
+            // Setup the logged in user variables.
148
+            $payments_link = trailingslashit( bp_loggedin_user_domain() . 'getpaid/' );
149 149
 
150 150
             // Add the "Payments" sub menu.
151 151
             $wp_admin_nav[] = array(
@@ -167,50 +167,50 @@  discard block
 block discarded – undo
167 167
 
168 168
             }
169 169
 
170
-		}
171
-
172
-		parent::setup_admin_bar( $wp_admin_nav );
173
-	}
170
+        }
174 171
 
175
-	/**
176
-	 * Retrieves the current tab.
177
-	 *
178
-	 * @since 2.1.5
179
-	 */
180
-	public function get_current_tab() {
181
-		global $getpaid_bp_current_tab;
172
+        parent::setup_admin_bar( $wp_admin_nav );
173
+    }
182 174
 
183
-		if ( empty( $getpaid_bp_current_tab ) ) {
184
-			return array(
185
-				'label'     => __( 'Invoices', 'invoicing' ),
186
-				'content'   => '[wpinv_history]',
187
-				'icon'      => 'fas fa-file-invoice',
188
-			);
189
-		}
175
+    /**
176
+     * Retrieves the current tab.
177
+     *
178
+     * @since 2.1.5
179
+     */
180
+    public function get_current_tab() {
181
+        global $getpaid_bp_current_tab;
182
+
183
+        if ( empty( $getpaid_bp_current_tab ) ) {
184
+            return array(
185
+                'label'     => __( 'Invoices', 'invoicing' ),
186
+                'content'   => '[wpinv_history]',
187
+                'icon'      => 'fas fa-file-invoice',
188
+            );
189
+        }
190 190
 
191
-		return $getpaid_bp_current_tab;
192
-	}
191
+        return $getpaid_bp_current_tab;
192
+    }
193 193
 
194
-	/**
195
-	 * Displays the current tab.
196
-	 *
197
-	 * @since 2.1.5
198
-	 */
199
-	public function display_current_tab() {
194
+    /**
195
+     * Displays the current tab.
196
+     *
197
+     * @since 2.1.5
198
+     */
199
+    public function display_current_tab() {
200 200
 
201
-		add_action( 'bp_template_content', array( $this, 'handle_display_current_tab' ) );
202
-		$template = apply_filters( 'bp_core_template_plugin', 'members/single/plugins' );
201
+        add_action( 'bp_template_content', array( $this, 'handle_display_current_tab' ) );
202
+        $template = apply_filters( 'bp_core_template_plugin', 'members/single/plugins' );
203 203
 
204 204
         bp_core_load_template( apply_filters( 'wpinv_bp_core_template_plugin', $template ) );
205
-	}
206
-
207
-	/**
208
-	 * Handles the actual display of the current tab.
209
-	 *
210
-	 * @since 2.1.5
211
-	 */
212
-	public function handle_display_current_tab() {
213
-		echo getpaid_prepare_user_content_tab( $this->get_current_tab() );
214
-	}
205
+    }
206
+
207
+    /**
208
+     * Handles the actual display of the current tab.
209
+     *
210
+     * @since 2.1.5
211
+     */
212
+    public function handle_display_current_tab() {
213
+        echo getpaid_prepare_user_content_tab( $this->get_current_tab() );
214
+    }
215 215
 
216 216
 }
Please login to merge, or discard this patch.
includes/admin/class-wpinv-subscriptions-list-table.php 1 patch
Indentation   +383 added lines, -383 removed lines patch added patch discarded remove patch
@@ -6,7 +6,7 @@  discard block
 block discarded – undo
6 6
 if ( ! defined( 'ABSPATH' ) ) exit;
7 7
 
8 8
 if ( ! class_exists( 'WP_List_Table' ) ) {
9
-	include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
9
+    include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
10 10
 }
11 11
 
12 12
 /**
@@ -14,387 +14,387 @@  discard block
 block discarded – undo
14 14
  */
15 15
 class WPInv_Subscriptions_List_Table extends WP_List_Table {
16 16
 
17
-	/**
18
-	 * URL of this page
19
-	 *
20
-	 * @var   string
21
-	 * @since 1.0.19
22
-	 */
23
-	public $base_url;
24
-
25
-	/**
26
-	 * Query
27
-	 *
28
-	 * @var   GetPaid_Subscriptions_Query
29
-	 * @since 1.0.19
30
-	 */
31
-	public $query;
32
-
33
-	/**
34
-	 * Total subscriptions
35
-	 *
36
-	 * @var   string
37
-	 * @since 1.0.0
38
-	 */
39
-	public $total_count;
40
-
41
-	/**
42
-	 * Current status subscriptions
43
-	 *
44
-	 * @var   string
45
-	 * @since 1.0.0
46
-	 */
47
-	public $current_total_count;
48
-
49
-	/**
50
-	 * Status counts
51
-	 *
52
-	 * @var   array
53
-	 * @since 1.0.19
54
-	 */
55
-	public $status_counts;
56
-
57
-	/**
58
-	 * Number of results to show per page
59
-	 *
60
-	 * @var   int
61
-	 * @since 1.0.0
62
-	 */
63
-	public $per_page = 10;
64
-
65
-	/**
66
-	 *  Constructor function.
67
-	 */
68
-	public function __construct() {
69
-
70
-		parent::__construct(
71
-			array(
72
-				'singular' => 'subscription',
73
-				'plural'   => 'subscriptions',
74
-			)
75
-		);
76
-
77
-		$this->process_bulk_action();
78
-
79
-		$this->prepare_query();
80
-
81
-		$this->base_url = remove_query_arg( 'status' );
82
-
83
-	}
84
-
85
-	/**
86
-	 *  Prepares the display query
87
-	 */
88
-	public function prepare_query() {
89
-
90
-		// Prepare query args.
91
-		$query = array(
92
-			'number'  => $this->per_page,
93
-			'paged'   => $this->get_paged(),
94
-			'status'  => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? $_GET['status'] : 'all',
95
-			'orderby' => ( isset( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'id',
96
-			'order'   => ( isset( $_GET['order'] ) ) ? $_GET['order'] : 'DESC',
97
-		);
98
-
99
-		// Prepare class properties.
100
-		$this->query               = new GetPaid_Subscriptions_Query( $query );
101
-		$this->total_count         = $this->query->get_total();
102
-		$this->current_total_count = $this->query->get_total();
103
-		$this->items               = $this->query->get_results();
104
-		$this->status_counts       = getpaid_get_subscription_status_counts( $query );
105
-
106
-		if ( 'all' != $query['status'] ) {
107
-			unset( $query['status'] );
108
-			$this->total_count   = getpaid_get_subscriptions( $query, 'count' );
109
-		}
110
-
111
-	}
112
-
113
-	/**
114
-	 * Gets the list of views available on this table.
115
-	 *
116
-	 * The format is an associative array:
117
-	 * - `'id' => 'link'`
118
-	 *
119
-	 * @since 1.0.0
120
-	 *
121
-	 * @return array
122
-	 */
123
-	public function get_views() {
124
-
125
-		$current  = isset( $_GET['status'] ) ? $_GET['status'] : 'all';
126
-		$views    = array(
127
-
128
-			'all' => sprintf(
129
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
130
-				esc_url( add_query_arg( 'status', false, $this->base_url ) ),
131
-				$current === 'all' ? ' class="current"' : '',
132
-				__('All','invoicing' ),
133
-				$this->total_count
134
-			)
135
-
136
-		);
137
-
138
-		foreach ( array_filter( $this->status_counts ) as $status => $count ) {
139
-
140
-			$views[ $status ] = sprintf(
141
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
142
-				esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
143
-				$current === $status ? ' class="current"' : '',
144
-				sanitize_text_field( getpaid_get_subscription_status_label( $status ) ),
145
-				$count
146
-			);
147
-
148
-		}
149
-
150
-		return $views;
151
-
152
-	}
153
-
154
-	/**
155
-	 * Render most columns
156
-	 *
157
-	 * @access      private
158
-	 * @since       1.0.0
159
-	 * @return      string
160
-	 */
161
-	public function column_default( $item, $column_name ) {
162
-		return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
163
-	}
164
-
165
-	/**
166
-	 * This is how checkbox column renders.
167
-	 *
168
-	 * @param WPInv_Subscription $item
169
-	 * @return string
170
-	 */
171
-	public function column_cb( $item ) {
172
-		return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
173
-	}
174
-
175
-	/**
176
-	 * Status column
177
-	 *
178
-	 * @param WPInv_Subscription $item
179
-	 * @since       1.0.0
180
-	 * @return      string
181
-	 */
182
-	public function column_status( $item ) {
183
-		return $item->get_status_label_html();
184
-	}
185
-
186
-	/**
187
-	 * Subscription column
188
-	 *
189
-	 * @param WPInv_Subscription $item
190
-	 * @since       1.0.0
191
-	 * @return      string
192
-	 */
193
-	public function column_subscription( $item ) {
194
-
195
-		$username = __( '(Missing User)', 'invoicing' );
196
-
197
-		$user = get_userdata( $item->get_customer_id() );
198
-		if ( $user ) {
199
-
200
-			$username = sprintf(
201
-				'<a href="user-edit.php?user_id=%s">%s</a>',
202
-				absint( $user->ID ),
203
-				! empty( $user->display_name ) ? sanitize_text_field( $user->display_name ) : sanitize_email( $user->user_email )
204
-			);
205
-
206
-		}
207
-
208
-		// translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
209
-		$column_content = sprintf(
210
-			_x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
211
-			'<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
212
-			'<strong>' . esc_attr( $item->get_id() ) . '</strong>', '</a>',
213
-			$username
214
-		);
215
-
216
-		$row_actions = array();
217
-
218
-		// View subscription.
219
-		$view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ));
220
-		$row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
221
-
222
-		// View invoice.
223
-		$invoice = get_post( $item->get_parent_invoice_id() );
224
-
225
-		if ( ! empty( $invoice ) ) {
226
-			$invoice_url            = get_edit_post_link( $invoice );
227
-			$row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
228
-		}
229
-
230
-		$delete_url            = esc_url(
231
-			wp_nonce_url(
232
-				add_query_arg(
233
-					array(
234
-						'getpaid-admin-action' => 'subscription_manual_delete',
235
-						'id'                   => $item->get_id(),
236
-					)
237
-				),
238
-				'getpaid-nonce',
239
-				'getpaid-nonce'
240
-			)
241
-		);
242
-		$row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
243
-
244
-		$row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
245
-
246
-		return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
247
-	}
248
-
249
-	/**
250
-	 * Renewal date column
251
-	 *
252
-	 * @param WPInv_Subscription $item
253
-	 * @since       1.0.0
254
-	 * @return      string
255
-	 */
256
-	public function column_renewal_date( $item ) {
257
-		return getpaid_format_date_value( $item->get_expiration() );
258
-	}
259
-
260
-	/**
261
-	 * Start date column
262
-	 *
263
-	 * @param WPInv_Subscription $item
264
-	 * @since       1.0.0
265
-	 * @return      string
266
-	 */
267
-	public function column_start_date( $item ) {
268
-		return getpaid_format_date_value( $item->get_date_created() );
269
-	}
270
-
271
-	/**
272
-	 * Amount column
273
-	 *
274
-	 * @param WPInv_Subscription $item
275
-	 * @since       1.0.19
276
-	 * @return      string
277
-	 */
278
-	public function column_amount( $item ) {
279
-		$amount = getpaid_get_formatted_subscription_amount( $item );
280
-		return "<span class='text-muted form-text mt-2 mb-2'>$amount</span>";
281
-	}
282
-
283
-	/**
284
-	 * Billing Times column
285
-	 *
286
-	 * @param WPInv_Subscription $item
287
-	 * @since       1.0.0
288
-	 * @return      string
289
-	 */
290
-	public function column_renewals( $item ) {
291
-		$max_bills = $item->get_bill_times();
292
-		return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? "&infin;" : $max_bills );
293
-	}
294
-
295
-	/**
296
-	 * Product ID column
297
-	 *
298
-	 * @param WPInv_Subscription $item
299
-	 * @since       1.0.0
300
-	 * @return      string
301
-	 */
302
-	public function column_item( $item ) {
303
-		$_item = get_post( $item->get_product_id() );
304
-
305
-		if ( ! empty( $_item ) ) {
306
-			$link = get_edit_post_link( $_item );
307
-			$link = esc_url( $link );
308
-			$name = esc_html( get_the_title( $_item ) );
309
-			return "<a href='$link'>$name</a>";
310
-		} else {
311
-			return sprintf( __( 'Item #%s', 'invoicing' ), $item->get_product_id() );
312
-		}
313
-
314
-	}
315
-
316
-	/**
317
-	 * Retrieve the current page number
318
-	 *
319
-	 * @return      int
320
-	 */
321
-	public function get_paged() {
322
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
323
-	}
324
-
325
-	/**
326
-	 * Setup the final data for the table
327
-	 *
328
-	 */
329
-	public function prepare_items() {
330
-
331
-		$columns  = $this->get_columns();
332
-		$hidden   = array();
333
-		$sortable = $this->get_sortable_columns();
334
-
335
-		$this->_column_headers = array( $columns, $hidden, $sortable );
336
-
337
-		$this->set_pagination_args(
338
-			array(
339
-			'total_items' => $this->current_total_count,
340
-			'per_page'    => $this->per_page,
341
-			'total_pages' => ceil( $this->current_total_count / $this->per_page )
342
-			)
343
-		);
344
-	}
345
-
346
-	/**
347
-	 * Table columns
348
-	 *
349
-	 * @return array
350
-	 */
351
-	public function get_columns(){
352
-		$columns = array(
353
-			'cb'                => '<input type="checkbox" />',
354
-			'subscription'      => __( 'Subscription', 'invoicing' ),
355
-			'start_date'        => __( 'Start Date', 'invoicing' ),
356
-			'renewal_date'      => __( 'Next Payment', 'invoicing' ),
357
-			'renewals'          => __( 'Payments', 'invoicing' ),
358
-			'item'              => __( 'Item', 'invoicing' ),
359
-			'status'            => __( 'Status', 'invoicing' ),
360
-		);
361
-
362
-		return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
363
-	}
364
-
365
-	/**
366
-	 * Sortable table columns.
367
-	 *
368
-	 * @return array
369
-	 */
370
-	public function get_sortable_columns() {
371
-		$sortable = array(
372
-			'subscription' => array( 'id', true ),
373
-			'start_date'   => array( 'created', true ),
374
-			'renewal_date' => array( 'expiration', true ),
375
-			'renewals'     => array( 'bill_times', true ),
376
-			'item'         => array( 'product_id', true ),
377
-			'status'       => array( 'status', true ),
378
-		);
379
-
380
-		return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
381
-	}
382
-
383
-	/**
384
-	 * Whether the table has items to display or not
385
-	 *
386
-	 * @return bool
387
-	 */
388
-	public function has_items() {
389
-		return ! empty( $this->current_total_count );
390
-	}
391
-
392
-	/**
393
-	 * Processes bulk actions.
394
-	 *
395
-	 */
396
-	public function process_bulk_action() {
397
-
398
-	}
17
+    /**
18
+     * URL of this page
19
+     *
20
+     * @var   string
21
+     * @since 1.0.19
22
+     */
23
+    public $base_url;
24
+
25
+    /**
26
+     * Query
27
+     *
28
+     * @var   GetPaid_Subscriptions_Query
29
+     * @since 1.0.19
30
+     */
31
+    public $query;
32
+
33
+    /**
34
+     * Total subscriptions
35
+     *
36
+     * @var   string
37
+     * @since 1.0.0
38
+     */
39
+    public $total_count;
40
+
41
+    /**
42
+     * Current status subscriptions
43
+     *
44
+     * @var   string
45
+     * @since 1.0.0
46
+     */
47
+    public $current_total_count;
48
+
49
+    /**
50
+     * Status counts
51
+     *
52
+     * @var   array
53
+     * @since 1.0.19
54
+     */
55
+    public $status_counts;
56
+
57
+    /**
58
+     * Number of results to show per page
59
+     *
60
+     * @var   int
61
+     * @since 1.0.0
62
+     */
63
+    public $per_page = 10;
64
+
65
+    /**
66
+     *  Constructor function.
67
+     */
68
+    public function __construct() {
69
+
70
+        parent::__construct(
71
+            array(
72
+                'singular' => 'subscription',
73
+                'plural'   => 'subscriptions',
74
+            )
75
+        );
76
+
77
+        $this->process_bulk_action();
78
+
79
+        $this->prepare_query();
80
+
81
+        $this->base_url = remove_query_arg( 'status' );
82
+
83
+    }
84
+
85
+    /**
86
+     *  Prepares the display query
87
+     */
88
+    public function prepare_query() {
89
+
90
+        // Prepare query args.
91
+        $query = array(
92
+            'number'  => $this->per_page,
93
+            'paged'   => $this->get_paged(),
94
+            'status'  => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? $_GET['status'] : 'all',
95
+            'orderby' => ( isset( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'id',
96
+            'order'   => ( isset( $_GET['order'] ) ) ? $_GET['order'] : 'DESC',
97
+        );
98
+
99
+        // Prepare class properties.
100
+        $this->query               = new GetPaid_Subscriptions_Query( $query );
101
+        $this->total_count         = $this->query->get_total();
102
+        $this->current_total_count = $this->query->get_total();
103
+        $this->items               = $this->query->get_results();
104
+        $this->status_counts       = getpaid_get_subscription_status_counts( $query );
105
+
106
+        if ( 'all' != $query['status'] ) {
107
+            unset( $query['status'] );
108
+            $this->total_count   = getpaid_get_subscriptions( $query, 'count' );
109
+        }
110
+
111
+    }
112
+
113
+    /**
114
+     * Gets the list of views available on this table.
115
+     *
116
+     * The format is an associative array:
117
+     * - `'id' => 'link'`
118
+     *
119
+     * @since 1.0.0
120
+     *
121
+     * @return array
122
+     */
123
+    public function get_views() {
124
+
125
+        $current  = isset( $_GET['status'] ) ? $_GET['status'] : 'all';
126
+        $views    = array(
127
+
128
+            'all' => sprintf(
129
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
130
+                esc_url( add_query_arg( 'status', false, $this->base_url ) ),
131
+                $current === 'all' ? ' class="current"' : '',
132
+                __('All','invoicing' ),
133
+                $this->total_count
134
+            )
135
+
136
+        );
137
+
138
+        foreach ( array_filter( $this->status_counts ) as $status => $count ) {
139
+
140
+            $views[ $status ] = sprintf(
141
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
142
+                esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
143
+                $current === $status ? ' class="current"' : '',
144
+                sanitize_text_field( getpaid_get_subscription_status_label( $status ) ),
145
+                $count
146
+            );
147
+
148
+        }
149
+
150
+        return $views;
151
+
152
+    }
153
+
154
+    /**
155
+     * Render most columns
156
+     *
157
+     * @access      private
158
+     * @since       1.0.0
159
+     * @return      string
160
+     */
161
+    public function column_default( $item, $column_name ) {
162
+        return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
163
+    }
164
+
165
+    /**
166
+     * This is how checkbox column renders.
167
+     *
168
+     * @param WPInv_Subscription $item
169
+     * @return string
170
+     */
171
+    public function column_cb( $item ) {
172
+        return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
173
+    }
174
+
175
+    /**
176
+     * Status column
177
+     *
178
+     * @param WPInv_Subscription $item
179
+     * @since       1.0.0
180
+     * @return      string
181
+     */
182
+    public function column_status( $item ) {
183
+        return $item->get_status_label_html();
184
+    }
185
+
186
+    /**
187
+     * Subscription column
188
+     *
189
+     * @param WPInv_Subscription $item
190
+     * @since       1.0.0
191
+     * @return      string
192
+     */
193
+    public function column_subscription( $item ) {
194
+
195
+        $username = __( '(Missing User)', 'invoicing' );
196
+
197
+        $user = get_userdata( $item->get_customer_id() );
198
+        if ( $user ) {
199
+
200
+            $username = sprintf(
201
+                '<a href="user-edit.php?user_id=%s">%s</a>',
202
+                absint( $user->ID ),
203
+                ! empty( $user->display_name ) ? sanitize_text_field( $user->display_name ) : sanitize_email( $user->user_email )
204
+            );
205
+
206
+        }
207
+
208
+        // translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
209
+        $column_content = sprintf(
210
+            _x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
211
+            '<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
212
+            '<strong>' . esc_attr( $item->get_id() ) . '</strong>', '</a>',
213
+            $username
214
+        );
215
+
216
+        $row_actions = array();
217
+
218
+        // View subscription.
219
+        $view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ));
220
+        $row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
221
+
222
+        // View invoice.
223
+        $invoice = get_post( $item->get_parent_invoice_id() );
224
+
225
+        if ( ! empty( $invoice ) ) {
226
+            $invoice_url            = get_edit_post_link( $invoice );
227
+            $row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
228
+        }
229
+
230
+        $delete_url            = esc_url(
231
+            wp_nonce_url(
232
+                add_query_arg(
233
+                    array(
234
+                        'getpaid-admin-action' => 'subscription_manual_delete',
235
+                        'id'                   => $item->get_id(),
236
+                    )
237
+                ),
238
+                'getpaid-nonce',
239
+                'getpaid-nonce'
240
+            )
241
+        );
242
+        $row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
243
+
244
+        $row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
245
+
246
+        return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
247
+    }
248
+
249
+    /**
250
+     * Renewal date column
251
+     *
252
+     * @param WPInv_Subscription $item
253
+     * @since       1.0.0
254
+     * @return      string
255
+     */
256
+    public function column_renewal_date( $item ) {
257
+        return getpaid_format_date_value( $item->get_expiration() );
258
+    }
259
+
260
+    /**
261
+     * Start date column
262
+     *
263
+     * @param WPInv_Subscription $item
264
+     * @since       1.0.0
265
+     * @return      string
266
+     */
267
+    public function column_start_date( $item ) {
268
+        return getpaid_format_date_value( $item->get_date_created() );
269
+    }
270
+
271
+    /**
272
+     * Amount column
273
+     *
274
+     * @param WPInv_Subscription $item
275
+     * @since       1.0.19
276
+     * @return      string
277
+     */
278
+    public function column_amount( $item ) {
279
+        $amount = getpaid_get_formatted_subscription_amount( $item );
280
+        return "<span class='text-muted form-text mt-2 mb-2'>$amount</span>";
281
+    }
282
+
283
+    /**
284
+     * Billing Times column
285
+     *
286
+     * @param WPInv_Subscription $item
287
+     * @since       1.0.0
288
+     * @return      string
289
+     */
290
+    public function column_renewals( $item ) {
291
+        $max_bills = $item->get_bill_times();
292
+        return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? "&infin;" : $max_bills );
293
+    }
294
+
295
+    /**
296
+     * Product ID column
297
+     *
298
+     * @param WPInv_Subscription $item
299
+     * @since       1.0.0
300
+     * @return      string
301
+     */
302
+    public function column_item( $item ) {
303
+        $_item = get_post( $item->get_product_id() );
304
+
305
+        if ( ! empty( $_item ) ) {
306
+            $link = get_edit_post_link( $_item );
307
+            $link = esc_url( $link );
308
+            $name = esc_html( get_the_title( $_item ) );
309
+            return "<a href='$link'>$name</a>";
310
+        } else {
311
+            return sprintf( __( 'Item #%s', 'invoicing' ), $item->get_product_id() );
312
+        }
313
+
314
+    }
315
+
316
+    /**
317
+     * Retrieve the current page number
318
+     *
319
+     * @return      int
320
+     */
321
+    public function get_paged() {
322
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
323
+    }
324
+
325
+    /**
326
+     * Setup the final data for the table
327
+     *
328
+     */
329
+    public function prepare_items() {
330
+
331
+        $columns  = $this->get_columns();
332
+        $hidden   = array();
333
+        $sortable = $this->get_sortable_columns();
334
+
335
+        $this->_column_headers = array( $columns, $hidden, $sortable );
336
+
337
+        $this->set_pagination_args(
338
+            array(
339
+            'total_items' => $this->current_total_count,
340
+            'per_page'    => $this->per_page,
341
+            'total_pages' => ceil( $this->current_total_count / $this->per_page )
342
+            )
343
+        );
344
+    }
345
+
346
+    /**
347
+     * Table columns
348
+     *
349
+     * @return array
350
+     */
351
+    public function get_columns(){
352
+        $columns = array(
353
+            'cb'                => '<input type="checkbox" />',
354
+            'subscription'      => __( 'Subscription', 'invoicing' ),
355
+            'start_date'        => __( 'Start Date', 'invoicing' ),
356
+            'renewal_date'      => __( 'Next Payment', 'invoicing' ),
357
+            'renewals'          => __( 'Payments', 'invoicing' ),
358
+            'item'              => __( 'Item', 'invoicing' ),
359
+            'status'            => __( 'Status', 'invoicing' ),
360
+        );
361
+
362
+        return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
363
+    }
364
+
365
+    /**
366
+     * Sortable table columns.
367
+     *
368
+     * @return array
369
+     */
370
+    public function get_sortable_columns() {
371
+        $sortable = array(
372
+            'subscription' => array( 'id', true ),
373
+            'start_date'   => array( 'created', true ),
374
+            'renewal_date' => array( 'expiration', true ),
375
+            'renewals'     => array( 'bill_times', true ),
376
+            'item'         => array( 'product_id', true ),
377
+            'status'       => array( 'status', true ),
378
+        );
379
+
380
+        return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
381
+    }
382
+
383
+    /**
384
+     * Whether the table has items to display or not
385
+     *
386
+     * @return bool
387
+     */
388
+    public function has_items() {
389
+        return ! empty( $this->current_total_count );
390
+    }
391
+
392
+    /**
393
+     * Processes bulk actions.
394
+     *
395
+     */
396
+    public function process_bulk_action() {
397
+
398
+    }
399 399
 
400 400
 }
Please login to merge, or discard this patch.
includes/wpinv-subscription.php 1 patch
Indentation   +1023 added lines, -1023 removed lines patch added patch discarded remove patch
@@ -15,125 +15,125 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class WPInv_Subscription extends GetPaid_Data {
17 17
 
18
-	/**
19
-	 * Which data store to load.
20
-	 *
21
-	 * @var string
22
-	 */
23
-	protected $data_store_name = 'subscription';
24
-
25
-	/**
26
-	 * This is the name of this object type.
27
-	 *
28
-	 * @var string
29
-	 */
30
-	protected $object_type = 'subscription';
31
-
32
-	/**
33
-	 * Item Data array. This is the core item data exposed in APIs.
34
-	 *
35
-	 * @since 1.0.19
36
-	 * @var array
37
-	 */
38
-	protected $data = array(
39
-		'customer_id'       => 0,
40
-		'frequency'         => 1,
41
-		'period'            => 'D',
42
-		'initial_amount'    => null,
43
-		'recurring_amount'  => null,
44
-		'bill_times'        => 0,
45
-		'transaction_id'    => '',
46
-		'parent_payment_id' => null,
47
-		'product_id'        => 0,
48
-		'created'           => '0000-00-00 00:00:00',
49
-		'expiration'        => '0000-00-00 00:00:00',
50
-		'trial_period'      => '',
51
-		'status'            => 'pending',
52
-		'profile_id'        => '',
53
-		'gateway'           => '',
54
-		'customer'          => '',
55
-	);
56
-
57
-	/**
58
-	 * Stores the status transition information.
59
-	 *
60
-	 * @since 1.0.19
61
-	 * @var bool
62
-	 */
63
-	protected $status_transition = false;
64
-
65
-	/**
66
-	 * Get the subscription if ID is passed, otherwise the subscription is new and empty.
67
-	 *
68
-	 * @param  int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read.
69
-	 * @param  bool $deprecated
70
-	 */
71
-	function __construct( $subscription = 0, $deprecated = false ) {
72
-
73
-		parent::__construct( $subscription );
74
-
75
-		if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) {
76
-			$this->set_id( $subscription );
77
-		} elseif ( $subscription instanceof self ) {
78
-			$this->set_id( $subscription->get_id() );
79
-		} elseif ( ! empty( $subscription->id ) ) {
80
-			$this->set_id( $subscription->id );
81
-		} elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) {
82
-			$this->set_id( $subscription_id );
83
-		} else {
84
-			$this->set_object_read( true );
85
-		}
86
-
87
-		// Load the datastore.
88
-		$this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
89
-
90
-		if ( $this->get_id() > 0 ) {
91
-			$this->data_store->read( $this );
92
-		}
93
-
94
-	}
95
-
96
-	/**
97
-	 * Given an invoice id, profile id, transaction id, it returns the subscription's id.
98
-	 *
99
-	 *
100
-	 * @static
101
-	 * @param string $value
102
-	 * @param string $field Either invoice_id, transaction_id or profile_id.
103
-	 * @since 1.0.19
104
-	 * @return int
105
-	 */
106
-	public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) {
18
+    /**
19
+     * Which data store to load.
20
+     *
21
+     * @var string
22
+     */
23
+    protected $data_store_name = 'subscription';
24
+
25
+    /**
26
+     * This is the name of this object type.
27
+     *
28
+     * @var string
29
+     */
30
+    protected $object_type = 'subscription';
31
+
32
+    /**
33
+     * Item Data array. This is the core item data exposed in APIs.
34
+     *
35
+     * @since 1.0.19
36
+     * @var array
37
+     */
38
+    protected $data = array(
39
+        'customer_id'       => 0,
40
+        'frequency'         => 1,
41
+        'period'            => 'D',
42
+        'initial_amount'    => null,
43
+        'recurring_amount'  => null,
44
+        'bill_times'        => 0,
45
+        'transaction_id'    => '',
46
+        'parent_payment_id' => null,
47
+        'product_id'        => 0,
48
+        'created'           => '0000-00-00 00:00:00',
49
+        'expiration'        => '0000-00-00 00:00:00',
50
+        'trial_period'      => '',
51
+        'status'            => 'pending',
52
+        'profile_id'        => '',
53
+        'gateway'           => '',
54
+        'customer'          => '',
55
+    );
56
+
57
+    /**
58
+     * Stores the status transition information.
59
+     *
60
+     * @since 1.0.19
61
+     * @var bool
62
+     */
63
+    protected $status_transition = false;
64
+
65
+    /**
66
+     * Get the subscription if ID is passed, otherwise the subscription is new and empty.
67
+     *
68
+     * @param  int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read.
69
+     * @param  bool $deprecated
70
+     */
71
+    function __construct( $subscription = 0, $deprecated = false ) {
72
+
73
+        parent::__construct( $subscription );
74
+
75
+        if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) {
76
+            $this->set_id( $subscription );
77
+        } elseif ( $subscription instanceof self ) {
78
+            $this->set_id( $subscription->get_id() );
79
+        } elseif ( ! empty( $subscription->id ) ) {
80
+            $this->set_id( $subscription->id );
81
+        } elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) {
82
+            $this->set_id( $subscription_id );
83
+        } else {
84
+            $this->set_object_read( true );
85
+        }
86
+
87
+        // Load the datastore.
88
+        $this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
89
+
90
+        if ( $this->get_id() > 0 ) {
91
+            $this->data_store->read( $this );
92
+        }
93
+
94
+    }
95
+
96
+    /**
97
+     * Given an invoice id, profile id, transaction id, it returns the subscription's id.
98
+     *
99
+     *
100
+     * @static
101
+     * @param string $value
102
+     * @param string $field Either invoice_id, transaction_id or profile_id.
103
+     * @since 1.0.19
104
+     * @return int
105
+     */
106
+    public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) {
107 107
         global $wpdb;
108 108
 
109
-		// Trim the value.
110
-		$value = trim( $value );
109
+        // Trim the value.
110
+        $value = trim( $value );
111 111
 
112
-		if ( empty( $value ) ) {
113
-			return 0;
114
-		}
112
+        if ( empty( $value ) ) {
113
+            return 0;
114
+        }
115 115
 
116
-		if ( 'invoice_id' == $field ) {
117
-			$field = 'parent_payment_id';
118
-		}
116
+        if ( 'invoice_id' == $field ) {
117
+            $field = 'parent_payment_id';
118
+        }
119 119
 
120 120
         // Valid fields.
121 121
         $fields = array(
122
-			'parent_payment_id',
123
-			'transaction_id',
124
-			'profile_id'
125
-		);
126
-
127
-		// Ensure a field has been passed.
128
-		if ( empty( $field ) || ! in_array( $field, $fields ) ) {
129
-			return 0;
130
-		}
131
-
132
-		// Maybe retrieve from the cache.
133
-		$subscription_id   = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" );
134
-		if ( ! empty( $subscription_id ) ) {
135
-			return $subscription_id;
136
-		}
122
+            'parent_payment_id',
123
+            'transaction_id',
124
+            'profile_id'
125
+        );
126
+
127
+        // Ensure a field has been passed.
128
+        if ( empty( $field ) || ! in_array( $field, $fields ) ) {
129
+            return 0;
130
+        }
131
+
132
+        // Maybe retrieve from the cache.
133
+        $subscription_id   = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" );
134
+        if ( ! empty( $subscription_id ) ) {
135
+            return $subscription_id;
136
+        }
137 137
 
138 138
         // Fetch from the db.
139 139
         $table            = $wpdb->prefix . 'wpinv_subscriptions';
@@ -141,34 +141,34 @@  discard block
 block discarded – undo
141 141
             $wpdb->prepare( "SELECT `id` FROM $table WHERE `$field`=%s LIMIT 1", $value )
142 142
         );
143 143
 
144
-		if ( empty( $subscription_id ) ) {
145
-			return 0;
146
-		}
144
+        if ( empty( $subscription_id ) ) {
145
+            return 0;
146
+        }
147 147
 
148
-		// Update the cache with our data.
149
-		wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" );
148
+        // Update the cache with our data.
149
+        wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" );
150 150
 
151
-		return $subscription_id;
152
-	}
151
+        return $subscription_id;
152
+    }
153 153
 
154
-	/**
154
+    /**
155 155
      * Clears the subscription's cache.
156 156
      */
157 157
     public function clear_cache() {
158
-		wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' );
159
-		wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' );
160
-		wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' );
161
-		wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' );
162
-	}
158
+        wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' );
159
+        wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' );
160
+        wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' );
161
+        wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' );
162
+    }
163 163
 
164
-	/**
164
+    /**
165 165
      * Checks if a subscription key is set.
166 166
      */
167 167
     public function _isset( $key ) {
168 168
         return isset( $this->data[$key] ) || method_exists( $this, "get_$key" );
169
-	}
169
+    }
170 170
 
171
-	/*
171
+    /*
172 172
 	|--------------------------------------------------------------------------
173 173
 	| CRUD methods
174 174
 	|--------------------------------------------------------------------------
@@ -177,545 +177,545 @@  discard block
 block discarded – undo
177 177
 	|
178 178
     */
179 179
 
180
-	/*
181
-	|--------------------------------------------------------------------------
182
-	| Getters
183
-	|--------------------------------------------------------------------------
184
-	*/
180
+    /*
181
+	|--------------------------------------------------------------------------
182
+	| Getters
183
+	|--------------------------------------------------------------------------
184
+	*/
185
+
186
+    /**
187
+     * Get customer id.
188
+     *
189
+     * @since 1.0.19
190
+     * @param  string $context View or edit context.
191
+     * @return int
192
+     */
193
+    public function get_customer_id( $context = 'view' ) {
194
+        return (int) $this->get_prop( 'customer_id', $context );
195
+    }
196
+
197
+    /**
198
+     * Get customer information.
199
+     *
200
+     * @since 1.0.19
201
+     * @param  string $context View or edit context.
202
+     * @return WP_User|false WP_User object on success, false on failure.
203
+     */
204
+    public function get_customer( $context = 'view' ) {
205
+        return get_userdata( $this->get_customer_id( $context ) );
206
+    }
207
+
208
+    /**
209
+     * Get parent invoice id.
210
+     *
211
+     * @since 1.0.19
212
+     * @param  string $context View or edit context.
213
+     * @return int
214
+     */
215
+    public function get_parent_invoice_id( $context = 'view' ) {
216
+        return (int) $this->get_prop( 'parent_payment_id', $context );
217
+    }
218
+
219
+    /**
220
+     * Alias for self::get_parent_invoice_id().
221
+     *
222
+     * @since 1.0.19
223
+     * @param  string $context View or edit context.
224
+     * @return int
225
+     */
226
+    public function get_parent_payment_id( $context = 'view' ) {
227
+        return $this->get_parent_invoice_id( $context );
228
+    }
229
+
230
+    /**
231
+     * Alias for self::get_parent_invoice_id().
232
+     *
233
+     * @since  1.0.0
234
+     * @return int
235
+     */
236
+    public function get_original_payment_id( $context = 'view' ) {
237
+        return $this->get_parent_invoice_id( $context );
238
+    }
239
+
240
+    /**
241
+     * Get parent invoice.
242
+     *
243
+     * @since 1.0.19
244
+     * @param  string $context View or edit context.
245
+     * @return WPInv_Invoice
246
+     */
247
+    public function get_parent_invoice( $context = 'view' ) {
248
+        return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) );
249
+    }
250
+
251
+    /**
252
+     * Alias for self::get_parent_invoice().
253
+     *
254
+     * @since 1.0.19
255
+     * @param  string $context View or edit context.
256
+     * @return WPInv_Invoice
257
+     */
258
+    public function get_parent_payment( $context = 'view' ) {
259
+        return $this->get_parent_invoice( $context );
260
+    }
261
+
262
+    /**
263
+     * Get subscription's product id.
264
+     *
265
+     * @since 1.0.19
266
+     * @param  string $context View or edit context.
267
+     * @return int
268
+     */
269
+    public function get_product_id( $context = 'view' ) {
270
+        return (int) $this->get_prop( 'product_id', $context );
271
+    }
272
+
273
+    /**
274
+     * Get the subscription product.
275
+     *
276
+     * @since 1.0.19
277
+     * @param  string $context View or edit context.
278
+     * @return WPInv_Item
279
+     */
280
+    public function get_product( $context = 'view' ) {
281
+        return new WPInv_Item( $this->get_product_id( $context ) );
282
+    }
283
+
284
+    /**
285
+     * Get parent invoice's gateway.
286
+     *
287
+     * Here for backwards compatibility.
288
+     *
289
+     * @since 1.0.19
290
+     * @param  string $context View or edit context.
291
+     * @return string
292
+     */
293
+    public function get_gateway( $context = 'view' ) {
294
+        return $this->get_parent_invoice( $context )->get_gateway();
295
+    }
296
+
297
+    /**
298
+     * Get the period of a renewal.
299
+     *
300
+     * @since 1.0.19
301
+     * @param  string $context View or edit context.
302
+     * @return string
303
+     */
304
+    public function get_period( $context = 'view' ) {
305
+        return $this->get_prop( 'period', $context );
306
+    }
307
+
308
+    /**
309
+     * Get number of periods each renewal is valid for.
310
+     *
311
+     * @since 1.0.19
312
+     * @param  string $context View or edit context.
313
+     * @return int
314
+     */
315
+    public function get_frequency( $context = 'view' ) {
316
+        return (int) $this->get_prop( 'frequency', $context );
317
+    }
318
+
319
+    /**
320
+     * Get the initial amount for the subscription.
321
+     *
322
+     * @since 1.0.19
323
+     * @param  string $context View or edit context.
324
+     * @return float
325
+     */
326
+    public function get_initial_amount( $context = 'view' ) {
327
+        return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) );
328
+    }
329
+
330
+    /**
331
+     * Get the recurring amount for the subscription.
332
+     *
333
+     * @since 1.0.19
334
+     * @param  string $context View or edit context.
335
+     * @return float
336
+     */
337
+    public function get_recurring_amount( $context = 'view' ) {
338
+        return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) );
339
+    }
340
+
341
+    /**
342
+     * Get number of times that this subscription can be renewed.
343
+     *
344
+     * @since 1.0.19
345
+     * @param  string $context View or edit context.
346
+     * @return int
347
+     */
348
+    public function get_bill_times( $context = 'view' ) {
349
+        return (int) $this->get_prop( 'bill_times', $context );
350
+    }
351
+
352
+    /**
353
+     * Get transaction id of this subscription's parent invoice.
354
+     *
355
+     * @since 1.0.19
356
+     * @param  string $context View or edit context.
357
+     * @return string
358
+     */
359
+    public function get_transaction_id( $context = 'view' ) {
360
+        return $this->get_prop( 'transaction_id', $context );
361
+    }
362
+
363
+    /**
364
+     * Get the date that the subscription was created.
365
+     *
366
+     * @since 1.0.19
367
+     * @param  string $context View or edit context.
368
+     * @return string
369
+     */
370
+    public function get_created( $context = 'view' ) {
371
+        return $this->get_prop( 'created', $context );
372
+    }
373
+
374
+    /**
375
+     * Alias for self::get_created().
376
+     *
377
+     * @since 1.0.19
378
+     * @param  string $context View or edit context.
379
+     * @return string
380
+     */
381
+    public function get_date_created( $context = 'view' ) {
382
+        return $this->get_created( $context );
383
+    }
384
+
385
+    /**
386
+     * Retrieves the creation date in a timestamp
387
+     *
388
+     * @since  1.0.0
389
+     * @return int
390
+     */
391
+    public function get_time_created() {
392
+        $created = $this->get_date_created();
393
+        return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) );
394
+    }
395
+
396
+    /**
397
+     * Get GMT date when the subscription was created.
398
+     *
399
+     * @since 1.0.19
400
+     * @param  string $context View or edit context.
401
+     * @return string
402
+     */
403
+    public function get_date_created_gmt( $context = 'view' ) {
404
+        $date = $this->get_date_created( $context );
405
+
406
+        if ( $date ) {
407
+            $date = get_gmt_from_date( $date );
408
+        }
409
+        return $date;
410
+    }
411
+
412
+    /**
413
+     * Get the date that the subscription will renew.
414
+     *
415
+     * @since 1.0.19
416
+     * @param  string $context View or edit context.
417
+     * @return string
418
+     */
419
+    public function get_next_renewal_date( $context = 'view' ) {
420
+        return $this->get_prop( 'expiration', $context );
421
+    }
422
+
423
+    /**
424
+     * Alias for self::get_next_renewal_date().
425
+     *
426
+     * @since 1.0.19
427
+     * @param  string $context View or edit context.
428
+     * @return string
429
+     */
430
+    public function get_expiration( $context = 'view' ) {
431
+        return $this->get_next_renewal_date( $context );
432
+    }
433
+
434
+    /**
435
+     * Retrieves the expiration date in a timestamp
436
+     *
437
+     * @since  1.0.0
438
+     * @return int
439
+     */
440
+    public function get_expiration_time() {
441
+        $expiration = $this->get_expiration();
442
+
443
+        if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) {
444
+            return current_time( 'timestamp' );
445
+        }
446
+
447
+        $expiration = strtotime( $expiration, current_time( 'timestamp' ) );
448
+        return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration;
449
+    }
450
+
451
+    /**
452
+     * Get GMT date when the subscription will renew.
453
+     *
454
+     * @since 1.0.19
455
+     * @param  string $context View or edit context.
456
+     * @return string
457
+     */
458
+    public function get_next_renewal_date_gmt( $context = 'view' ) {
459
+        $date = $this->get_next_renewal_date( $context );
460
+
461
+        if ( $date ) {
462
+            $date = get_gmt_from_date( $date );
463
+        }
464
+        return $date;
465
+    }
466
+
467
+    /**
468
+     * Get the subscription's trial period.
469
+     *
470
+     * @since 1.0.19
471
+     * @param  string $context View or edit context.
472
+     * @return string
473
+     */
474
+    public function get_trial_period( $context = 'view' ) {
475
+        return $this->get_prop( 'trial_period', $context );
476
+    }
477
+
478
+    /**
479
+     * Get the subscription's status.
480
+     *
481
+     * @since 1.0.19
482
+     * @param  string $context View or edit context.
483
+     * @return string
484
+     */
485
+    public function get_status( $context = 'view' ) {
486
+        return $this->get_prop( 'status', $context );
487
+    }
488
+
489
+    /**
490
+     * Get the subscription's profile id.
491
+     *
492
+     * @since 1.0.19
493
+     * @param  string $context View or edit context.
494
+     * @return string
495
+     */
496
+    public function get_profile_id( $context = 'view' ) {
497
+        return $this->get_prop( 'profile_id', $context );
498
+    }
499
+
500
+    /*
501
+	|--------------------------------------------------------------------------
502
+	| Setters
503
+	|--------------------------------------------------------------------------
504
+	*/
505
+
506
+    /**
507
+     * Set customer id.
508
+     *
509
+     * @since 1.0.19
510
+     * @param  int $value The customer's id.
511
+     */
512
+    public function set_customer_id( $value ) {
513
+        $this->set_prop( 'customer_id', (int) $value );
514
+    }
515
+
516
+    /**
517
+     * Set parent invoice id.
518
+     *
519
+     * @since 1.0.19
520
+     * @param  int $value The parent invoice id.
521
+     */
522
+    public function set_parent_invoice_id( $value ) {
523
+        $this->set_prop( 'parent_payment_id', (int) $value );
524
+    }
525
+
526
+    /**
527
+     * Alias for self::set_parent_invoice_id().
528
+     *
529
+     * @since 1.0.19
530
+     * @param  int $value The parent invoice id.
531
+     */
532
+    public function set_parent_payment_id( $value ) {
533
+        $this->set_parent_invoice_id( $value );
534
+    }
535
+
536
+    /**
537
+     * Alias for self::set_parent_invoice_id().
538
+     *
539
+     * @since 1.0.19
540
+     * @param  int $value The parent invoice id.
541
+     */
542
+    public function set_original_payment_id( $value ) {
543
+        $this->set_parent_invoice_id( $value );
544
+    }
545
+
546
+    /**
547
+     * Set subscription's product id.
548
+     *
549
+     * @since 1.0.19
550
+     * @param  int $value The subscription product id.
551
+     */
552
+    public function set_product_id( $value ) {
553
+        $this->set_prop( 'product_id', (int) $value );
554
+    }
555
+
556
+    /**
557
+     * Set the period of a renewal.
558
+     *
559
+     * @since 1.0.19
560
+     * @param  string $value The renewal period.
561
+     */
562
+    public function set_period( $value ) {
563
+        $this->set_prop( 'period', $value );
564
+    }
565
+
566
+    /**
567
+     * Set number of periods each renewal is valid for.
568
+     *
569
+     * @since 1.0.19
570
+     * @param  int $value The subscription frequency.
571
+     */
572
+    public function set_frequency( $value ) {
573
+        $value = empty( $value ) ? 1 : (int) $value;
574
+        $this->set_prop( 'frequency', absint( $value ) );
575
+    }
576
+
577
+    /**
578
+     * Set the initial amount for the subscription.
579
+     *
580
+     * @since 1.0.19
581
+     * @param  float $value The initial subcription amount.
582
+     */
583
+    public function set_initial_amount( $value ) {
584
+        $this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) );
585
+    }
586
+
587
+    /**
588
+     * Set the recurring amount for the subscription.
589
+     *
590
+     * @since 1.0.19
591
+     * @param  float $value The recurring subcription amount.
592
+     */
593
+    public function set_recurring_amount( $value ) {
594
+        $this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) );
595
+    }
596
+
597
+    /**
598
+     * Set number of times that this subscription can be renewed.
599
+     *
600
+     * @since 1.0.19
601
+     * @param  int $value Bill times.
602
+     */
603
+    public function set_bill_times( $value ) {
604
+        $this->set_prop( 'bill_times', (int) $value );
605
+    }
606
+
607
+    /**
608
+     * Get transaction id of this subscription's parent invoice.
609
+     *
610
+     * @since 1.0.19
611
+     * @param string $value Bill times.
612
+     */
613
+    public function set_transaction_id( $value ) {
614
+        $this->set_prop( 'transaction_id', sanitize_text_field( $value ) );
615
+    }
616
+
617
+    /**
618
+     * Set date when this subscription started.
619
+     *
620
+     * @since 1.0.19
621
+     * @param string $value strtotime compliant date.
622
+     */
623
+    public function set_created( $value ) {
624
+        $date = strtotime( $value );
625
+
626
+        if ( $date && $value !== '0000-00-00 00:00:00' ) {
627
+            $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) );
628
+            return;
629
+        }
630
+
631
+        $this->set_prop( 'created', '' );
185 632
 
186
-	/**
187
-	 * Get customer id.
188
-	 *
189
-	 * @since 1.0.19
190
-	 * @param  string $context View or edit context.
191
-	 * @return int
192
-	 */
193
-	public function get_customer_id( $context = 'view' ) {
194
-		return (int) $this->get_prop( 'customer_id', $context );
195
-	}
196
-
197
-	/**
198
-	 * Get customer information.
199
-	 *
200
-	 * @since 1.0.19
201
-	 * @param  string $context View or edit context.
202
-	 * @return WP_User|false WP_User object on success, false on failure.
203
-	 */
204
-	public function get_customer( $context = 'view' ) {
205
-		return get_userdata( $this->get_customer_id( $context ) );
206
-	}
207
-
208
-	/**
209
-	 * Get parent invoice id.
210
-	 *
211
-	 * @since 1.0.19
212
-	 * @param  string $context View or edit context.
213
-	 * @return int
214
-	 */
215
-	public function get_parent_invoice_id( $context = 'view' ) {
216
-		return (int) $this->get_prop( 'parent_payment_id', $context );
217
-	}
218
-
219
-	/**
220
-	 * Alias for self::get_parent_invoice_id().
221
-	 *
222
-	 * @since 1.0.19
223
-	 * @param  string $context View or edit context.
224
-	 * @return int
225
-	 */
226
-    public function get_parent_payment_id( $context = 'view' ) {
227
-        return $this->get_parent_invoice_id( $context );
228
-	}
633
+    }
229 634
 
230
-	/**
231
-     * Alias for self::get_parent_invoice_id().
635
+    /**
636
+     * Alias for self::set_created().
232 637
      *
233
-     * @since  1.0.0
234
-     * @return int
638
+     * @since 1.0.19
639
+     * @param string $value strtotime compliant date.
235 640
      */
236
-    public function get_original_payment_id( $context = 'view' ) {
237
-        return $this->get_parent_invoice_id( $context );
641
+    public function set_date_created( $value ) {
642
+        $this->set_created( $value );
238 643
     }
239 644
 
240
-	/**
241
-	 * Get parent invoice.
242
-	 *
243
-	 * @since 1.0.19
244
-	 * @param  string $context View or edit context.
245
-	 * @return WPInv_Invoice
246
-	 */
247
-	public function get_parent_invoice( $context = 'view' ) {
248
-		return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) );
249
-	}
250
-
251
-	/**
252
-	 * Alias for self::get_parent_invoice().
253
-	 *
254
-	 * @since 1.0.19
255
-	 * @param  string $context View or edit context.
256
-	 * @return WPInv_Invoice
257
-	 */
258
-    public function get_parent_payment( $context = 'view' ) {
259
-        return $this->get_parent_invoice( $context );
260
-	}
261
-
262
-	/**
263
-	 * Get subscription's product id.
264
-	 *
265
-	 * @since 1.0.19
266
-	 * @param  string $context View or edit context.
267
-	 * @return int
268
-	 */
269
-	public function get_product_id( $context = 'view' ) {
270
-		return (int) $this->get_prop( 'product_id', $context );
271
-	}
272
-
273
-	/**
274
-	 * Get the subscription product.
275
-	 *
276
-	 * @since 1.0.19
277
-	 * @param  string $context View or edit context.
278
-	 * @return WPInv_Item
279
-	 */
280
-	public function get_product( $context = 'view' ) {
281
-		return new WPInv_Item( $this->get_product_id( $context ) );
282
-	}
283
-
284
-	/**
285
-	 * Get parent invoice's gateway.
286
-	 *
287
-	 * Here for backwards compatibility.
288
-	 *
289
-	 * @since 1.0.19
290
-	 * @param  string $context View or edit context.
291
-	 * @return string
292
-	 */
293
-	public function get_gateway( $context = 'view' ) {
294
-		return $this->get_parent_invoice( $context )->get_gateway();
295
-	}
296
-
297
-	/**
298
-	 * Get the period of a renewal.
299
-	 *
300
-	 * @since 1.0.19
301
-	 * @param  string $context View or edit context.
302
-	 * @return string
303
-	 */
304
-	public function get_period( $context = 'view' ) {
305
-		return $this->get_prop( 'period', $context );
306
-	}
307
-
308
-	/**
309
-	 * Get number of periods each renewal is valid for.
310
-	 *
311
-	 * @since 1.0.19
312
-	 * @param  string $context View or edit context.
313
-	 * @return int
314
-	 */
315
-	public function get_frequency( $context = 'view' ) {
316
-		return (int) $this->get_prop( 'frequency', $context );
317
-	}
318
-
319
-	/**
320
-	 * Get the initial amount for the subscription.
321
-	 *
322
-	 * @since 1.0.19
323
-	 * @param  string $context View or edit context.
324
-	 * @return float
325
-	 */
326
-	public function get_initial_amount( $context = 'view' ) {
327
-		return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) );
328
-	}
329
-
330
-	/**
331
-	 * Get the recurring amount for the subscription.
332
-	 *
333
-	 * @since 1.0.19
334
-	 * @param  string $context View or edit context.
335
-	 * @return float
336
-	 */
337
-	public function get_recurring_amount( $context = 'view' ) {
338
-		return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) );
339
-	}
340
-
341
-	/**
342
-	 * Get number of times that this subscription can be renewed.
343
-	 *
344
-	 * @since 1.0.19
345
-	 * @param  string $context View or edit context.
346
-	 * @return int
347
-	 */
348
-	public function get_bill_times( $context = 'view' ) {
349
-		return (int) $this->get_prop( 'bill_times', $context );
350
-	}
351
-
352
-	/**
353
-	 * Get transaction id of this subscription's parent invoice.
354
-	 *
355
-	 * @since 1.0.19
356
-	 * @param  string $context View or edit context.
357
-	 * @return string
358
-	 */
359
-	public function get_transaction_id( $context = 'view' ) {
360
-		return $this->get_prop( 'transaction_id', $context );
361
-	}
362
-
363
-	/**
364
-	 * Get the date that the subscription was created.
365
-	 *
366
-	 * @since 1.0.19
367
-	 * @param  string $context View or edit context.
368
-	 * @return string
369
-	 */
370
-	public function get_created( $context = 'view' ) {
371
-		return $this->get_prop( 'created', $context );
372
-	}
373
-
374
-	/**
375
-	 * Alias for self::get_created().
376
-	 *
377
-	 * @since 1.0.19
378
-	 * @param  string $context View or edit context.
379
-	 * @return string
380
-	 */
381
-	public function get_date_created( $context = 'view' ) {
382
-		return $this->get_created( $context );
383
-	}
384
-
385
-	/**
386
-	 * Retrieves the creation date in a timestamp
387
-	 *
388
-	 * @since  1.0.0
389
-	 * @return int
390
-	 */
391
-	public function get_time_created() {
392
-		$created = $this->get_date_created();
393
-		return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) );
394
-	}
395
-
396
-	/**
397
-	 * Get GMT date when the subscription was created.
398
-	 *
399
-	 * @since 1.0.19
400
-	 * @param  string $context View or edit context.
401
-	 * @return string
402
-	 */
403
-	public function get_date_created_gmt( $context = 'view' ) {
404
-        $date = $this->get_date_created( $context );
645
+    /**
646
+     * Set the date that the subscription will renew.
647
+     *
648
+     * @since 1.0.19
649
+     * @param string $value strtotime compliant date.
650
+     */
651
+    public function set_next_renewal_date( $value ) {
652
+        $date = strtotime( $value );
405 653
 
406
-        if ( $date ) {
407
-            $date = get_gmt_from_date( $date );
654
+        if ( $date && $value !== '0000-00-00 00:00:00' ) {
655
+            $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) );
656
+            return;
408 657
         }
409
-		return $date;
410
-	}
411
-
412
-	/**
413
-	 * Get the date that the subscription will renew.
414
-	 *
415
-	 * @since 1.0.19
416
-	 * @param  string $context View or edit context.
417
-	 * @return string
418
-	 */
419
-	public function get_next_renewal_date( $context = 'view' ) {
420
-		return $this->get_prop( 'expiration', $context );
421
-	}
422
-
423
-	/**
424
-	 * Alias for self::get_next_renewal_date().
425
-	 *
426
-	 * @since 1.0.19
427
-	 * @param  string $context View or edit context.
428
-	 * @return string
429
-	 */
430
-	public function get_expiration( $context = 'view' ) {
431
-		return $this->get_next_renewal_date( $context );
432
-	}
433
-
434
-	/**
435
-	 * Retrieves the expiration date in a timestamp
436
-	 *
437
-	 * @since  1.0.0
438
-	 * @return int
439
-	 */
440
-	public function get_expiration_time() {
441
-		$expiration = $this->get_expiration();
442
-
443
-		if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) {
444
-			return current_time( 'timestamp' );
445
-		}
446
-
447
-		$expiration = strtotime( $expiration, current_time( 'timestamp' ) );
448
-		return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration;
449
-	}
450
-
451
-	/**
452
-	 * Get GMT date when the subscription will renew.
453
-	 *
454
-	 * @since 1.0.19
455
-	 * @param  string $context View or edit context.
456
-	 * @return string
457
-	 */
458
-	public function get_next_renewal_date_gmt( $context = 'view' ) {
459
-        $date = $this->get_next_renewal_date( $context );
460 658
 
461
-        if ( $date ) {
462
-            $date = get_gmt_from_date( $date );
463
-        }
464
-		return $date;
465
-	}
466
-
467
-	/**
468
-	 * Get the subscription's trial period.
469
-	 *
470
-	 * @since 1.0.19
471
-	 * @param  string $context View or edit context.
472
-	 * @return string
473
-	 */
474
-	public function get_trial_period( $context = 'view' ) {
475
-		return $this->get_prop( 'trial_period', $context );
476
-	}
477
-
478
-	/**
479
-	 * Get the subscription's status.
480
-	 *
481
-	 * @since 1.0.19
482
-	 * @param  string $context View or edit context.
483
-	 * @return string
484
-	 */
485
-	public function get_status( $context = 'view' ) {
486
-		return $this->get_prop( 'status', $context );
487
-	}
488
-
489
-	/**
490
-	 * Get the subscription's profile id.
491
-	 *
492
-	 * @since 1.0.19
493
-	 * @param  string $context View or edit context.
494
-	 * @return string
495
-	 */
496
-	public function get_profile_id( $context = 'view' ) {
497
-		return $this->get_prop( 'profile_id', $context );
498
-	}
499
-
500
-	/*
501
-	|--------------------------------------------------------------------------
502
-	| Setters
503
-	|--------------------------------------------------------------------------
504
-	*/
659
+        $this->set_prop( 'expiration', '' );
505 660
 
506
-	/**
507
-	 * Set customer id.
508
-	 *
509
-	 * @since 1.0.19
510
-	 * @param  int $value The customer's id.
511
-	 */
512
-	public function set_customer_id( $value ) {
513
-		$this->set_prop( 'customer_id', (int) $value );
514
-	}
515
-
516
-	/**
517
-	 * Set parent invoice id.
518
-	 *
519
-	 * @since 1.0.19
520
-	 * @param  int $value The parent invoice id.
521
-	 */
522
-	public function set_parent_invoice_id( $value ) {
523
-		$this->set_prop( 'parent_payment_id', (int) $value );
524
-	}
525
-
526
-	/**
527
-	 * Alias for self::set_parent_invoice_id().
528
-	 *
529
-	 * @since 1.0.19
530
-	 * @param  int $value The parent invoice id.
531
-	 */
532
-    public function set_parent_payment_id( $value ) {
533
-        $this->set_parent_invoice_id( $value );
534
-	}
661
+    }
535 662
 
536
-	/**
537
-     * Alias for self::set_parent_invoice_id().
663
+    /**
664
+     * Alias for self::set_next_renewal_date().
538 665
      *
539 666
      * @since 1.0.19
540
-	 * @param  int $value The parent invoice id.
667
+     * @param string $value strtotime compliant date.
541 668
      */
542
-    public function set_original_payment_id( $value ) {
543
-        $this->set_parent_invoice_id( $value );
544
-	}
545
-
546
-	/**
547
-	 * Set subscription's product id.
548
-	 *
549
-	 * @since 1.0.19
550
-	 * @param  int $value The subscription product id.
551
-	 */
552
-	public function set_product_id( $value ) {
553
-		$this->set_prop( 'product_id', (int) $value );
554
-	}
555
-
556
-	/**
557
-	 * Set the period of a renewal.
558
-	 *
559
-	 * @since 1.0.19
560
-	 * @param  string $value The renewal period.
561
-	 */
562
-	public function set_period( $value ) {
563
-		$this->set_prop( 'period', $value );
564
-	}
565
-
566
-	/**
567
-	 * Set number of periods each renewal is valid for.
568
-	 *
569
-	 * @since 1.0.19
570
-	 * @param  int $value The subscription frequency.
571
-	 */
572
-	public function set_frequency( $value ) {
573
-		$value = empty( $value ) ? 1 : (int) $value;
574
-		$this->set_prop( 'frequency', absint( $value ) );
575
-	}
576
-
577
-	/**
578
-	 * Set the initial amount for the subscription.
579
-	 *
580
-	 * @since 1.0.19
581
-	 * @param  float $value The initial subcription amount.
582
-	 */
583
-	public function set_initial_amount( $value ) {
584
-		$this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) );
585
-	}
586
-
587
-	/**
588
-	 * Set the recurring amount for the subscription.
589
-	 *
590
-	 * @since 1.0.19
591
-	 * @param  float $value The recurring subcription amount.
592
-	 */
593
-	public function set_recurring_amount( $value ) {
594
-		$this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) );
595
-	}
596
-
597
-	/**
598
-	 * Set number of times that this subscription can be renewed.
599
-	 *
600
-	 * @since 1.0.19
601
-	 * @param  int $value Bill times.
602
-	 */
603
-	public function set_bill_times( $value ) {
604
-		$this->set_prop( 'bill_times', (int) $value );
605
-	}
606
-
607
-	/**
608
-	 * Get transaction id of this subscription's parent invoice.
609
-	 *
610
-	 * @since 1.0.19
611
-	 * @param string $value Bill times.
612
-	 */
613
-	public function set_transaction_id( $value ) {
614
-		$this->set_prop( 'transaction_id', sanitize_text_field( $value ) );
615
-	}
616
-
617
-	/**
618
-	 * Set date when this subscription started.
619
-	 *
620
-	 * @since 1.0.19
621
-	 * @param string $value strtotime compliant date.
622
-	 */
623
-	public function set_created( $value ) {
624
-        $date = strtotime( $value );
669
+    public function set_expiration( $value ) {
670
+        $this->set_next_renewal_date( $value );
671
+    }
625 672
 
626
-        if ( $date && $value !== '0000-00-00 00:00:00' ) {
627
-            $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) );
673
+    /**
674
+     * Set the subscription's trial period.
675
+     *
676
+     * @since 1.0.19
677
+     * @param string $value trial period e.g 1 year.
678
+     */
679
+    public function set_trial_period( $value ) {
680
+        $this->set_prop( 'trial_period', $value );
681
+    }
682
+
683
+    /**
684
+     * Set the subscription's status.
685
+     *
686
+     * @since 1.0.19
687
+     * @param string $new_status    New subscription status.
688
+     */
689
+    public function set_status( $new_status ) {
690
+
691
+        // Abort if this is not a valid status;
692
+        if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) {
628 693
             return;
629 694
         }
630 695
 
631
-		$this->set_prop( 'created', '' );
696
+        $old_status = $this->get_status();
697
+        $this->set_prop( 'status', $new_status );
632 698
 
633
-	}
699
+        if ( true === $this->object_read && $old_status !== $new_status ) {
700
+            $this->status_transition = array(
701
+                'from'   => ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $old_status,
702
+                'to'     => $new_status,
703
+            );
704
+        }
634 705
 
635
-	/**
636
-	 * Alias for self::set_created().
637
-	 *
638
-	 * @since 1.0.19
639
-	 * @param string $value strtotime compliant date.
640
-	 */
641
-	public function set_date_created( $value ) {
642
-		$this->set_created( $value );
643 706
     }
644 707
 
645
-	/**
646
-	 * Set the date that the subscription will renew.
647
-	 *
648
-	 * @since 1.0.19
649
-	 * @param string $value strtotime compliant date.
650
-	 */
651
-	public function set_next_renewal_date( $value ) {
652
-		$date = strtotime( $value );
708
+    /**
709
+     * Set the subscription's (remote) profile id.
710
+     *
711
+     * @since 1.0.19
712
+     * @param  string $value the remote profile id.
713
+     */
714
+    public function set_profile_id( $value ) {
715
+        $this->set_prop( 'profile_id', sanitize_text_field( $value ) );
716
+    }
653 717
 
654
-        if ( $date && $value !== '0000-00-00 00:00:00' ) {
655
-            $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) );
656
-            return;
657
-		}
658
-
659
-		$this->set_prop( 'expiration', '' );
660
-
661
-	}
662
-
663
-	/**
664
-	 * Alias for self::set_next_renewal_date().
665
-	 *
666
-	 * @since 1.0.19
667
-	 * @param string $value strtotime compliant date.
668
-	 */
669
-	public function set_expiration( $value ) {
670
-		$this->set_next_renewal_date( $value );
671
-    }
672
-
673
-	/**
674
-	 * Set the subscription's trial period.
675
-	 *
676
-	 * @since 1.0.19
677
-	 * @param string $value trial period e.g 1 year.
678
-	 */
679
-	public function set_trial_period( $value ) {
680
-		$this->set_prop( 'trial_period', $value );
681
-	}
682
-
683
-	/**
684
-	 * Set the subscription's status.
685
-	 *
686
-	 * @since 1.0.19
687
-	 * @param string $new_status    New subscription status.
688
-	 */
689
-	public function set_status( $new_status ) {
690
-
691
-		// Abort if this is not a valid status;
692
-		if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) {
693
-			return;
694
-		}
695
-
696
-		$old_status = $this->get_status();
697
-		$this->set_prop( 'status', $new_status );
698
-
699
-		if ( true === $this->object_read && $old_status !== $new_status ) {
700
-			$this->status_transition = array(
701
-				'from'   => ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $old_status,
702
-				'to'     => $new_status,
703
-			);
704
-		}
705
-
706
-	}
707
-
708
-	/**
709
-	 * Set the subscription's (remote) profile id.
710
-	 *
711
-	 * @since 1.0.19
712
-	 * @param  string $value the remote profile id.
713
-	 */
714
-	public function set_profile_id( $value ) {
715
-		$this->set_prop( 'profile_id', sanitize_text_field( $value ) );
716
-	}
717
-
718
-	/*
718
+    /*
719 719
 	|--------------------------------------------------------------------------
720 720
 	| Boolean methods
721 721
 	|--------------------------------------------------------------------------
@@ -724,55 +724,55 @@  discard block
 block discarded – undo
724 724
 	|
725 725
 	*/
726 726
 
727
-	/**
727
+    /**
728 728
      * Checks if the subscription has a given status.
729
-	 *
730
-	 * @param string|array String or array of strings to check for.
731
-	 * @return bool
729
+     *
730
+     * @param string|array String or array of strings to check for.
731
+     * @return bool
732 732
      */
733 733
     public function has_status( $status ) {
734 734
         return in_array( $this->get_status(), wpinv_clean( wpinv_parse_list( $status ) ) );
735
-	}
735
+    }
736 736
 
737
-	/**
737
+    /**
738 738
      * Checks if the subscription has a trial period.
739
-	 *
740
-	 * @return bool
739
+     *
740
+     * @return bool
741 741
      */
742 742
     public function has_trial_period() {
743
-		$period = $this->get_trial_period();
743
+        $period = $this->get_trial_period();
744 744
         return ! empty( $period );
745
-	}
746
-
747
-	/**
748
-	 * Is the subscription active?
749
-	 *
750
-	 * @return bool
751
-	 */
752
-	public function is_active() {
753
-		return $this->has_status( 'active trialling' ) && ! $this->is_expired();
754
-	}
755
-
756
-	/**
757
-	 * Is the subscription expired?
758
-	 *
759
-	 * @return bool
760
-	 */
761
-	public function is_expired() {
762
-		return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'mysql' ) );
763
-	}
764
-
765
-	/**
766
-	 * Is this the last renewals?
767
-	 *
768
-	 * @return bool
769
-	 */
770
-	public function is_last_renewal() {
771
-		$max_bills = $this->get_bill_times();
772
-		return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed();
773
-	}
774
-
775
-	/*
745
+    }
746
+
747
+    /**
748
+     * Is the subscription active?
749
+     *
750
+     * @return bool
751
+     */
752
+    public function is_active() {
753
+        return $this->has_status( 'active trialling' ) && ! $this->is_expired();
754
+    }
755
+
756
+    /**
757
+     * Is the subscription expired?
758
+     *
759
+     * @return bool
760
+     */
761
+    public function is_expired() {
762
+        return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'mysql' ) );
763
+    }
764
+
765
+    /**
766
+     * Is this the last renewals?
767
+     *
768
+     * @return bool
769
+     */
770
+    public function is_last_renewal() {
771
+        $max_bills = $this->get_bill_times();
772
+        return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed();
773
+    }
774
+
775
+    /*
776 776
 	|--------------------------------------------------------------------------
777 777
 	| Additional methods
778 778
 	|--------------------------------------------------------------------------
@@ -781,27 +781,27 @@  discard block
 block discarded – undo
781 781
 	|
782 782
 	*/
783 783
 
784
-	/**
785
-	 * Backwards compatibilty.
786
-	 */
787
-	public function create( $data = array() ) {
784
+    /**
785
+     * Backwards compatibilty.
786
+     */
787
+    public function create( $data = array() ) {
788 788
 
789
-		// Set the properties.
790
-		if ( is_array( $data ) ) {
791
-			$this->set_props( $data );
792
-		}
789
+        // Set the properties.
790
+        if ( is_array( $data ) ) {
791
+            $this->set_props( $data );
792
+        }
793 793
 
794
-		// Save the item.
795
-		return $this->save();
794
+        // Save the item.
795
+        return $this->save();
796 796
 
797
-	}
797
+    }
798 798
 
799
-	/**
800
-	 * Backwards compatibilty.
801
-	 */
802
-	public function update( $args = array() ) {
803
-		return $this->create( $args );
804
-	}
799
+    /**
800
+     * Backwards compatibilty.
801
+     */
802
+    public function update( $args = array() ) {
803
+        return $this->create( $args );
804
+    }
805 805
 
806 806
     /**
807 807
      * Retrieve renewal payments for a subscription
@@ -811,22 +811,22 @@  discard block
 block discarded – undo
811 811
      */
812 812
     public function get_child_payments( $hide_pending = true ) {
813 813
 
814
-		$statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' );
814
+        $statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' );
815 815
 
816
-		if ( ! $hide_pending ) {
817
-			$statuses = array_keys( wpinv_get_invoice_statuses() );
818
-		}
816
+        if ( ! $hide_pending ) {
817
+            $statuses = array_keys( wpinv_get_invoice_statuses() );
818
+        }
819 819
 
820 820
         return get_posts(
821
-			array(
822
-            	'post_parent'    => $this->get_parent_payment_id(),
823
-            	'numberposts'    => -1,
824
-            	'post_status'    => $statuses,
825
-            	'orderby'        => 'ID',
826
-            	'order'          => 'ASC',
827
-            	'post_type'      => 'wpi_invoice'
828
-			)
829
-		);
821
+            array(
822
+                'post_parent'    => $this->get_parent_payment_id(),
823
+                'numberposts'    => -1,
824
+                'post_status'    => $statuses,
825
+                'orderby'        => 'ID',
826
+                'order'          => 'ASC',
827
+                'post_type'      => 'wpi_invoice'
828
+            )
829
+        );
830 830
     }
831 831
 
832 832
     /**
@@ -836,16 +836,16 @@  discard block
 block discarded – undo
836 836
      * @return int
837 837
      */
838 838
     public function get_total_payments() {
839
-		global $wpdb;
839
+        global $wpdb;
840 840
 
841
-		$count = (int) $wpdb->get_var(
842
-			$wpdb->prepare(
843
-				"SELECT COUNT(ID) FROM $wpdb->posts WHERE post_parent=%d AND post_status IN ( 'publish', 'wpi-processing', 'wpi-renewal' )",
844
-				$this->get_parent_invoice_id()
845
-			)
846
-		);
841
+        $count = (int) $wpdb->get_var(
842
+            $wpdb->prepare(
843
+                "SELECT COUNT(ID) FROM $wpdb->posts WHERE post_parent=%d AND post_status IN ( 'publish', 'wpi-processing', 'wpi-renewal' )",
844
+                $this->get_parent_invoice_id()
845
+            )
846
+        );
847 847
 
848
-		// Maybe include parent invoice.
848
+        // Maybe include parent invoice.
849 849
         if ( $this->get_parent_payment()->is_paid() ) {
850 850
             $count++;
851 851
         }
@@ -874,57 +874,57 @@  discard block
 block discarded – undo
874 874
      *
875 875
      * @since  2.4
876 876
      * @param  array $args Array of values for the payment, including amount and transaction ID
877
-	 * @param  WPInv_Invoice $invoice If adding an existing invoice.
877
+     * @param  WPInv_Invoice $invoice If adding an existing invoice.
878 878
      * @return bool
879 879
      */
880 880
     public function add_payment( $args = array(), $invoice = false ) {
881 881
 
882
-		// Process each payment once.
882
+        // Process each payment once.
883 883
         if ( ! empty( $args['transaction_id'] ) && $this->payment_exists( $args['transaction_id'] ) ) {
884 884
             return false;
885 885
         }
886 886
 
887
-		// Are we creating a new invoice?
888
-		if ( empty( $invoice ) ) {
889
-			$invoice = $this->create_payment();
887
+        // Are we creating a new invoice?
888
+        if ( empty( $invoice ) ) {
889
+            $invoice = $this->create_payment();
890 890
 
891
-			if ( empty( $invoice ) ) {
892
-				return false;
893
-			}
891
+            if ( empty( $invoice ) ) {
892
+                return false;
893
+            }
894 894
 
895
-		}
895
+        }
896 896
 
897
-		$invoice->set_status( 'wpi-renewal' );
897
+        $invoice->set_status( 'wpi-renewal' );
898 898
 
899
-		// Maybe set a transaction id.
900
-		if ( ! empty( $args['transaction_id'] ) ) {
901
-			$invoice->set_transaction_id( $args['transaction_id'] );
902
-		}
899
+        // Maybe set a transaction id.
900
+        if ( ! empty( $args['transaction_id'] ) ) {
901
+            $invoice->set_transaction_id( $args['transaction_id'] );
902
+        }
903 903
 
904
-		// Set the completed date.
905
-		$invoice->set_completed_date( current_time( 'mysql' ) );
904
+        // Set the completed date.
905
+        $invoice->set_completed_date( current_time( 'mysql' ) );
906 906
 
907
-		// And the gateway.
908
-		if ( ! empty( $args['gateway'] ) ) {
909
-			$invoice->set_gateway( $args['gateway'] );
910
-		}
907
+        // And the gateway.
908
+        if ( ! empty( $args['gateway'] ) ) {
909
+            $invoice->set_gateway( $args['gateway'] );
910
+        }
911 911
 
912
-		$invoice->save();
912
+        $invoice->save();
913 913
 
914
-		if ( ! $invoice->exists() ) {
915
-			return false;
916
-		}
914
+        if ( ! $invoice->exists() ) {
915
+            return false;
916
+        }
917 917
 
918
-		do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this );
919
-		do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this );
918
+        do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this );
919
+        do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this );
920 920
         do_action( 'wpinv_recurring_record_payment', $invoice->get_id(), $this->get_parent_invoice_id(), $invoice->get_recurring_total(), $invoice->get_transaction_id() );
921 921
 
922 922
         update_post_meta( $invoice->get_id(), '_wpinv_subscription_id', $this->id );
923 923
 
924 924
         return $invoice->get_id();
925
-	}
925
+    }
926 926
 
927
-	/**
927
+    /**
928 928
      * Creates a new invoice and returns it.
929 929
      *
930 930
      * @since  1.0.19
@@ -932,105 +932,105 @@  discard block
 block discarded – undo
932 932
      */
933 933
     public function create_payment() {
934 934
 
935
-		$parent_invoice = $this->get_parent_payment();
936
-
937
-		if ( ! $parent_invoice->exists() ) {
938
-			return false;
939
-		}
940
-
941
-		// Duplicate the parent invoice.
942
-		$invoice = getpaid_duplicate_invoice( $parent_invoice );
943
-		$invoice->set_parent_id( $parent_invoice->get_id() );
944
-
945
-		// Maybe recalculate discount (Pre-GetPaid Fix).
946
-		$discount = new WPInv_Discount( $invoice->get_discount_code() );
947
-		if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) {
948
-			$invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
949
-		}
950
-
951
-		$invoice->recalculate_total();
952
-		$invoice->set_status( 'wpi-pending' );
953
-		$invoice->save();
954
-
955
-		return $invoice->exists() ? $invoice : false;
956
-    }
957
-
958
-	/**
959
-	 * Renews or completes a subscription
960
-	 *
961
-	 * @since  1.0.0
962
-	 * @return int The subscription's id
963
-	 */
964
-	public function renew() {
965
-
966
-		// Complete subscription if applicable
967
-		if ( $this->is_last_renewal() ) {
968
-			return $this->complete();
969
-		}
970
-
971
-		// Calculate new expiration
972
-		$frequency      = $this->get_frequency();
973
-		$period         = $this->get_period();
974
-		$new_expiration = strtotime( "+ $frequency $period", $this->get_expiration_time() );
975
-
976
-		$this->set_expiration( date( 'Y-m-d H:i:s',$new_expiration ) );
977
-		$this->set_status( 'active' );
978
-		$this->save();
979
-
980
-		do_action( 'getpaid_subscription_renewed', $this );
981
-
982
-		return $this->get_id();
983
-	}
984
-
985
-	/**
986
-	 * Marks a subscription as completed
987
-	 *
988
-	 * Subscription is completed when the number of payments matches the billing_times field
989
-	 *
990
-	 * @since  1.0.0
991
-	 * @return int|bool Subscription id or false if the subscription is cancelled.
992
-	 */
993
-	public function complete() {
994
-
995
-		// Only mark a subscription as complete if it's not already cancelled.
996
-		if ( $this->has_status( 'cancelled' ) ) {
997
-			return false;
998
-		}
999
-
1000
-		$this->set_status( 'completed' );
1001
-		return $this->save();
1002
-
1003
-	}
1004
-
1005
-	/**
1006
-	 * Marks a subscription as expired
1007
-	 *
1008
-	 * @since  1.0.0
1009
-	 * @param  bool $check_expiration
1010
-	 * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future.
1011
-	 */
1012
-	public function expire( $check_expiration = false ) {
1013
-
1014
-		if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) {
1015
-			// Do not mark as expired since real expiration date is in the future
1016
-			return false;
1017
-		}
1018
-
1019
-		$this->set_status( 'expired' );
1020
-		return $this->save();
1021
-
1022
-	}
1023
-
1024
-	/**
1025
-	 * Marks a subscription as failing
1026
-	 *
1027
-	 * @since  2.4.2
1028
-	 * @return int Subscription id.
1029
-	 */
1030
-	public function failing() {
1031
-		$this->set_status( 'failing' );
1032
-		return $this->save();
1033
-	}
935
+        $parent_invoice = $this->get_parent_payment();
936
+
937
+        if ( ! $parent_invoice->exists() ) {
938
+            return false;
939
+        }
940
+
941
+        // Duplicate the parent invoice.
942
+        $invoice = getpaid_duplicate_invoice( $parent_invoice );
943
+        $invoice->set_parent_id( $parent_invoice->get_id() );
944
+
945
+        // Maybe recalculate discount (Pre-GetPaid Fix).
946
+        $discount = new WPInv_Discount( $invoice->get_discount_code() );
947
+        if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) {
948
+            $invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
949
+        }
950
+
951
+        $invoice->recalculate_total();
952
+        $invoice->set_status( 'wpi-pending' );
953
+        $invoice->save();
954
+
955
+        return $invoice->exists() ? $invoice : false;
956
+    }
957
+
958
+    /**
959
+     * Renews or completes a subscription
960
+     *
961
+     * @since  1.0.0
962
+     * @return int The subscription's id
963
+     */
964
+    public function renew() {
965
+
966
+        // Complete subscription if applicable
967
+        if ( $this->is_last_renewal() ) {
968
+            return $this->complete();
969
+        }
970
+
971
+        // Calculate new expiration
972
+        $frequency      = $this->get_frequency();
973
+        $period         = $this->get_period();
974
+        $new_expiration = strtotime( "+ $frequency $period", $this->get_expiration_time() );
975
+
976
+        $this->set_expiration( date( 'Y-m-d H:i:s',$new_expiration ) );
977
+        $this->set_status( 'active' );
978
+        $this->save();
979
+
980
+        do_action( 'getpaid_subscription_renewed', $this );
981
+
982
+        return $this->get_id();
983
+    }
984
+
985
+    /**
986
+     * Marks a subscription as completed
987
+     *
988
+     * Subscription is completed when the number of payments matches the billing_times field
989
+     *
990
+     * @since  1.0.0
991
+     * @return int|bool Subscription id or false if the subscription is cancelled.
992
+     */
993
+    public function complete() {
994
+
995
+        // Only mark a subscription as complete if it's not already cancelled.
996
+        if ( $this->has_status( 'cancelled' ) ) {
997
+            return false;
998
+        }
999
+
1000
+        $this->set_status( 'completed' );
1001
+        return $this->save();
1002
+
1003
+    }
1004
+
1005
+    /**
1006
+     * Marks a subscription as expired
1007
+     *
1008
+     * @since  1.0.0
1009
+     * @param  bool $check_expiration
1010
+     * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future.
1011
+     */
1012
+    public function expire( $check_expiration = false ) {
1013
+
1014
+        if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) {
1015
+            // Do not mark as expired since real expiration date is in the future
1016
+            return false;
1017
+        }
1018
+
1019
+        $this->set_status( 'expired' );
1020
+        return $this->save();
1021
+
1022
+    }
1023
+
1024
+    /**
1025
+     * Marks a subscription as failing
1026
+     *
1027
+     * @since  2.4.2
1028
+     * @return int Subscription id.
1029
+     */
1030
+    public function failing() {
1031
+        $this->set_status( 'failing' );
1032
+        return $this->save();
1033
+    }
1034 1034
 
1035 1035
     /**
1036 1036
      * Marks a subscription as cancelled
@@ -1039,19 +1039,19 @@  discard block
 block discarded – undo
1039 1039
      * @return int Subscription id.
1040 1040
      */
1041 1041
     public function cancel() {
1042
-		$this->set_status( 'cancelled' );
1043
-		return $this->save();
1042
+        $this->set_status( 'cancelled' );
1043
+        return $this->save();
1044 1044
     }
1045 1045
 
1046
-	/**
1047
-	 * Determines if a subscription can be cancelled both locally and with a payment processor.
1048
-	 *
1049
-	 * @since  1.0.0
1050
-	 * @return bool
1051
-	 */
1052
-	public function can_cancel() {
1053
-		return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this );
1054
-	}
1046
+    /**
1047
+     * Determines if a subscription can be cancelled both locally and with a payment processor.
1048
+     *
1049
+     * @since  1.0.0
1050
+     * @return bool
1051
+     */
1052
+    public function can_cancel() {
1053
+        return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this );
1054
+    }
1055 1055
 
1056 1056
     /**
1057 1057
      * Returns an array of subscription statuses that can be cancelled
@@ -1064,96 +1064,96 @@  discard block
 block discarded – undo
1064 1064
         return apply_filters( 'wpinv_recurring_cancellable_statuses', array( 'active', 'trialling', 'failing' ) );
1065 1065
     }
1066 1066
 
1067
-	/**
1068
-	 * Retrieves the URL to cancel subscription
1069
-	 *
1070
-	 * @since  1.0.0
1071
-	 * @return string
1072
-	 */
1073
-	public function get_cancel_url() {
1074
-		$url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() );
1075
-		return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
1076
-	}
1077
-
1078
-	/**
1079
-	 * Retrieves the URL to view a subscription
1080
-	 *
1081
-	 * @since  1.0.19
1082
-	 * @return string
1083
-	 */
1084
-	public function get_view_url() {
1085
-
1086
-		$url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
1087
-		$url = add_query_arg( 'subscription', $this->get_id(), $url );
1088
-
1089
-		return apply_filters( 'getpaid_get_subscription_view_url', $url, $this );
1090
-	}
1091
-
1092
-	/**
1093
-	 * Determines if subscription can be manually renewed
1094
-	 *
1095
-	 * This method is filtered by payment gateways in order to return true on subscriptions
1096
-	 * that can be renewed manually
1097
-	 *
1098
-	 * @since  2.5
1099
-	 * @return bool
1100
-	 */
1101
-	public function can_renew() {
1102
-		return apply_filters( 'wpinv_subscription_can_renew', true, $this );
1103
-	}
1104
-
1105
-	/**
1106
-	 * Retrieves the URL to renew a subscription
1107
-	 *
1108
-	 * @since  2.5
1109
-	 * @return string
1110
-	 */
1111
-	public function get_renew_url() {
1112
-		$url = wp_nonce_url( add_query_arg( array( 'getpaid-action' => 'renew_subscription', 'sub_id' => $this->get_id ) ), 'getpaid-nonce' );
1113
-		return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
1114
-	}
1115
-
1116
-	/**
1117
-	 * Determines if subscription can have their payment method updated
1118
-	 *
1119
-	 * @since  1.0.0
1120
-	 * @return bool
1121
-	 */
1122
-	public function can_update() {
1123
-		return apply_filters( 'wpinv_subscription_can_update', false, $this );
1124
-	}
1125
-
1126
-	/**
1127
-	 * Retrieves the URL to update subscription
1128
-	 *
1129
-	 * @since  1.0.0
1130
-	 * @return string
1131
-	 */
1132
-	public function get_update_url() {
1133
-		$url = add_query_arg( array( 'action' => 'update', 'subscription_id' => $this->get_id() ) );
1134
-		return apply_filters( 'wpinv_subscription_update_url', $url, $this );
1135
-	}
1136
-
1137
-	/**
1138
-	 * Retrieves the subscription status label
1139
-	 *
1140
-	 * @since  1.0.0
1141
-	 * @return string
1142
-	 */
1143
-	public function get_status_label() {
1144
-		return getpaid_get_subscription_status_label( $this->get_status() );
1145
-	}
1146
-
1147
-	/**
1148
-	 * Retrieves the subscription status class
1149
-	 *
1150
-	 * @since  1.0.19
1151
-	 * @return string
1152
-	 */
1153
-	public function get_status_class() {
1154
-		$statuses = getpaid_get_subscription_status_classes();
1155
-		return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark';
1156
-	}
1067
+    /**
1068
+     * Retrieves the URL to cancel subscription
1069
+     *
1070
+     * @since  1.0.0
1071
+     * @return string
1072
+     */
1073
+    public function get_cancel_url() {
1074
+        $url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() );
1075
+        return apply_filters( 'wpinv_subscription_cancel_url', $url, $this );
1076
+    }
1077
+
1078
+    /**
1079
+     * Retrieves the URL to view a subscription
1080
+     *
1081
+     * @since  1.0.19
1082
+     * @return string
1083
+     */
1084
+    public function get_view_url() {
1085
+
1086
+        $url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
1087
+        $url = add_query_arg( 'subscription', $this->get_id(), $url );
1088
+
1089
+        return apply_filters( 'getpaid_get_subscription_view_url', $url, $this );
1090
+    }
1091
+
1092
+    /**
1093
+     * Determines if subscription can be manually renewed
1094
+     *
1095
+     * This method is filtered by payment gateways in order to return true on subscriptions
1096
+     * that can be renewed manually
1097
+     *
1098
+     * @since  2.5
1099
+     * @return bool
1100
+     */
1101
+    public function can_renew() {
1102
+        return apply_filters( 'wpinv_subscription_can_renew', true, $this );
1103
+    }
1104
+
1105
+    /**
1106
+     * Retrieves the URL to renew a subscription
1107
+     *
1108
+     * @since  2.5
1109
+     * @return string
1110
+     */
1111
+    public function get_renew_url() {
1112
+        $url = wp_nonce_url( add_query_arg( array( 'getpaid-action' => 'renew_subscription', 'sub_id' => $this->get_id ) ), 'getpaid-nonce' );
1113
+        return apply_filters( 'wpinv_subscription_renew_url', $url, $this );
1114
+    }
1115
+
1116
+    /**
1117
+     * Determines if subscription can have their payment method updated
1118
+     *
1119
+     * @since  1.0.0
1120
+     * @return bool
1121
+     */
1122
+    public function can_update() {
1123
+        return apply_filters( 'wpinv_subscription_can_update', false, $this );
1124
+    }
1125
+
1126
+    /**
1127
+     * Retrieves the URL to update subscription
1128
+     *
1129
+     * @since  1.0.0
1130
+     * @return string
1131
+     */
1132
+    public function get_update_url() {
1133
+        $url = add_query_arg( array( 'action' => 'update', 'subscription_id' => $this->get_id() ) );
1134
+        return apply_filters( 'wpinv_subscription_update_url', $url, $this );
1135
+    }
1136
+
1137
+    /**
1138
+     * Retrieves the subscription status label
1139
+     *
1140
+     * @since  1.0.0
1141
+     * @return string
1142
+     */
1143
+    public function get_status_label() {
1144
+        return getpaid_get_subscription_status_label( $this->get_status() );
1145
+    }
1146
+
1147
+    /**
1148
+     * Retrieves the subscription status class
1149
+     *
1150
+     * @since  1.0.19
1151
+     * @return string
1152
+     */
1153
+    public function get_status_class() {
1154
+        $statuses = getpaid_get_subscription_status_classes();
1155
+        return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark';
1156
+    }
1157 1157
 
1158 1158
     /**
1159 1159
      * Retrieves the subscription status label
@@ -1163,11 +1163,11 @@  discard block
 block discarded – undo
1163 1163
      */
1164 1164
     public function get_status_label_html() {
1165 1165
 
1166
-		$status_label = sanitize_text_field( $this->get_status_label() );
1167
-		$class        = esc_attr( $this->get_status_class() );
1168
-		$status       = sanitize_html_class( $this->get_status() );
1166
+        $status_label = sanitize_text_field( $this->get_status_label() );
1167
+        $class        = esc_attr( $this->get_status_class() );
1168
+        $status       = sanitize_html_class( $this->get_status() );
1169 1169
 
1170
-		return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>";
1170
+        return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>";
1171 1171
     }
1172 1172
 
1173 1173
     /**
@@ -1178,75 +1178,75 @@  discard block
 block discarded – undo
1178 1178
      * @return bool
1179 1179
      */
1180 1180
     public function payment_exists( $txn_id = '' ) {
1181
-		$invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' );
1181
+        $invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' );
1182 1182
         return ! empty( $invoice_id );
1183
-	}
1184
-
1185
-	/**
1186
-	 * Handle the status transition.
1187
-	 */
1188
-	protected function status_transition() {
1189
-		$status_transition = $this->status_transition;
1190
-
1191
-		// Reset status transition variable.
1192
-		$this->status_transition = false;
1193
-
1194
-		if ( $status_transition ) {
1195
-			try {
1196
-
1197
-				// Fire a hook for the status change.
1198
-				do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition );
1199
-				do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition );
1200
-
1201
-				if ( ! empty( $status_transition['from'] ) ) {
1202
-
1203
-					/* translators: 1: old subscription status 2: new subscription status */
1204
-					$transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1205
-
1206
-					// Note the transition occurred.
1207
-					$this->get_parent_payment()->add_note( $transition_note, false, false, true );
1208
-
1209
-					// Fire another hook.
1210
-					do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this );
1211
-					do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] );
1212
-
1213
-				} else {
1214
-					/* translators: %s: new invoice status */
1215
-					$transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1216
-
1217
-					// Note the transition occurred.
1218
-					$this->get_parent_payment()->add_note( $transition_note, false, false, true );
1219
-
1220
-				}
1221
-			} catch ( Exception $e ) {
1222
-				$this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
1223
-			}
1224
-		}
1225
-
1226
-	}
1227
-
1228
-	/**
1229
-	 * Save data to the database.
1230
-	 *
1231
-	 * @since 1.0.19
1232
-	 * @return int subscription ID
1233
-	 */
1234
-	public function save() {
1235
-		parent::save();
1236
-		$this->status_transition();
1237
-		return $this->get_id();
1238
-	}
1239
-
1240
-	/**
1241
-	 * Activates a subscription.
1242
-	 *
1243
-	 * @since 1.0.19
1244
-	 * @return int subscription ID
1245
-	 */
1246
-	public function activate() {
1247
-		$status = 'trialling' == $this->get_status() ? 'trialling' : 'active';
1248
-		$this->set_status( $status );
1249
-		return $this->save();
1250
-	}
1183
+    }
1184
+
1185
+    /**
1186
+     * Handle the status transition.
1187
+     */
1188
+    protected function status_transition() {
1189
+        $status_transition = $this->status_transition;
1190
+
1191
+        // Reset status transition variable.
1192
+        $this->status_transition = false;
1193
+
1194
+        if ( $status_transition ) {
1195
+            try {
1196
+
1197
+                // Fire a hook for the status change.
1198
+                do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition );
1199
+                do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition );
1200
+
1201
+                if ( ! empty( $status_transition['from'] ) ) {
1202
+
1203
+                    /* translators: 1: old subscription status 2: new subscription status */
1204
+                    $transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1205
+
1206
+                    // Note the transition occurred.
1207
+                    $this->get_parent_payment()->add_note( $transition_note, false, false, true );
1208
+
1209
+                    // Fire another hook.
1210
+                    do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this );
1211
+                    do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] );
1212
+
1213
+                } else {
1214
+                    /* translators: %s: new invoice status */
1215
+                    $transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) );
1216
+
1217
+                    // Note the transition occurred.
1218
+                    $this->get_parent_payment()->add_note( $transition_note, false, false, true );
1219
+
1220
+                }
1221
+            } catch ( Exception $e ) {
1222
+                $this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() );
1223
+            }
1224
+        }
1225
+
1226
+    }
1227
+
1228
+    /**
1229
+     * Save data to the database.
1230
+     *
1231
+     * @since 1.0.19
1232
+     * @return int subscription ID
1233
+     */
1234
+    public function save() {
1235
+        parent::save();
1236
+        $this->status_transition();
1237
+        return $this->get_id();
1238
+    }
1239
+
1240
+    /**
1241
+     * Activates a subscription.
1242
+     *
1243
+     * @since 1.0.19
1244
+     * @return int subscription ID
1245
+     */
1246
+    public function activate() {
1247
+        $status = 'trialling' == $this->get_status() ? 'trialling' : 'active';
1248
+        $this->set_status( $status );
1249
+        return $this->save();
1250
+    }
1251 1251
 
1252 1252
 }
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-invoice-address.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
  */
9 9
 
10 10
 if ( ! defined( 'ABSPATH' ) ) {
11
-	exit; // Exit if accessed directly
11
+    exit; // Exit if accessed directly
12 12
 }
13 13
 
14 14
 /**
@@ -17,10 +17,10 @@  discard block
 block discarded – undo
17 17
 class GetPaid_Meta_Box_Invoice_Address {
18 18
 
19 19
     /**
20
-	 * Output the metabox.
21
-	 *
22
-	 * @param WP_Post $post
23
-	 */
20
+     * Output the metabox.
21
+     *
22
+     * @param WP_Post $post
23
+     */
24 24
     public static function output( $post ) {
25 25
 
26 26
         // Prepare the invoice.
@@ -298,18 +298,18 @@  discard block
 block discarded – undo
298 298
     }
299 299
 
300 300
     /**
301
-	 * Save meta box data.
302
-	 *
303
-	 * @param int $post_id
304
-	 */
305
-	public static function save( $post_id ) {
301
+     * Save meta box data.
302
+     *
303
+     * @param int $post_id
304
+     */
305
+    public static function save( $post_id ) {
306 306
 
307 307
         // Prepare the invoice.
308 308
         $invoice = new WPInv_Invoice( $post_id );
309 309
 
310 310
         // Load new data.
311 311
         $invoice->set_props(
312
-			array(
312
+            array(
313 313
                 'template'             => isset( $_POST['wpinv_template'] ) ? wpinv_clean( $_POST['wpinv_template'] ) : null,
314 314
                 'email_cc'             => isset( $_POST['wpinv_cc'] ) ? wpinv_clean( $_POST['wpinv_cc'] ) : null,
315 315
                 'disable_taxes'        => isset( $_POST['disable_taxes'] ),
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
                 'due_date'             => isset( $_POST['wpinv_due_date'] ) ? wpinv_clean( $_POST['wpinv_due_date'] ) : null,
331 331
                 'number'               => isset( $_POST['wpinv_number'] ) ? wpinv_clean( $_POST['wpinv_number'] ) : null,
332 332
                 'status'               => isset( $_POST['wpinv_status'] ) ? wpinv_clean( $_POST['wpinv_status'] ) : null,
333
-			)
333
+            )
334 334
         );
335 335
 
336 336
         // Discount code.
@@ -376,6 +376,6 @@  discard block
 block discarded – undo
376 376
         }
377 377
 
378 378
         // Fires after an invoice is saved.
379
-		do_action( 'wpinv_invoice_metabox_saved', $invoice );
380
-	}
379
+        do_action( 'wpinv_invoice_metabox_saved', $invoice );
380
+    }
381 381
 }
Please login to merge, or discard this patch.
includes/data/countries.php 1 patch
Indentation   +252 added lines, -252 removed lines patch added patch discarded remove patch
@@ -12,256 +12,256 @@
 block discarded – undo
12 12
 defined( 'ABSPATH' ) || exit;
13 13
 
14 14
 return array(
15
-	'US' => __('United States', 'invoicing'),
16
-	'CA' => __('Canada', 'invoicing'),
17
-	'GB' => __('United Kingdom', 'invoicing'),
18
-	'AF' => __('Afghanistan', 'invoicing'),
19
-	'AX' => __('Aland Islands', 'invoicing'),
20
-	'AL' => __('Albania', 'invoicing'),
21
-	'DZ' => __('Algeria', 'invoicing'),
22
-	'AS' => __('American Samoa', 'invoicing'),
23
-	'AD' => __('Andorra', 'invoicing'),
24
-	'AO' => __('Angola', 'invoicing'),
25
-	'AI' => __('Anguilla', 'invoicing'),
26
-	'AQ' => __('Antarctica', 'invoicing'),
27
-	'AG' => __('Antigua and Barbuda', 'invoicing'),
28
-	'AR' => __('Argentina', 'invoicing'),
29
-	'AM' => __('Armenia', 'invoicing'),
30
-	'AW' => __('Aruba', 'invoicing'),
31
-	'AU' => __('Australia', 'invoicing'),
32
-	'AT' => __('Austria', 'invoicing'),
33
-	'AZ' => __('Azerbaijan', 'invoicing'),
34
-	'BS' => __('Bahamas', 'invoicing'),
35
-	'BH' => __('Bahrain', 'invoicing'),
36
-	'BD' => __('Bangladesh', 'invoicing'),
37
-	'BB' => __('Barbados', 'invoicing'),
38
-	'BY' => __('Belarus', 'invoicing'),
39
-	'BE' => __('Belgium', 'invoicing'),
40
-	'BZ' => __('Belize', 'invoicing'),
41
-	'BJ' => __('Benin', 'invoicing'),
42
-	'BM' => __('Bermuda', 'invoicing'),
43
-	'BT' => __('Bhutan', 'invoicing'),
44
-	'BO' => __('Bolivia', 'invoicing'),
45
-	'BQ' => __('Bonaire, Saint Eustatius and Saba', 'invoicing'),
46
-	'BA' => __('Bosnia and Herzegovina', 'invoicing'),
47
-	'BW' => __('Botswana', 'invoicing'),
48
-	'BV' => __('Bouvet Island', 'invoicing'),
49
-	'BR' => __('Brazil', 'invoicing'),
50
-	'IO' => __('British Indian Ocean Territory', 'invoicing'),
51
-	'BN' => __('Brunei Darrussalam', 'invoicing'),
52
-	'BG' => __('Bulgaria', 'invoicing'),
53
-	'BF' => __('Burkina Faso', 'invoicing'),
54
-	'BI' => __('Burundi', 'invoicing'),
55
-	'KH' => __('Cambodia', 'invoicing'),
56
-	'CM' => __('Cameroon', 'invoicing'),
57
-	'CV' => __('Cape Verde', 'invoicing'),
58
-	'KY' => __('Cayman Islands', 'invoicing'),
59
-	'CF' => __('Central African Republic', 'invoicing'),
60
-	'TD' => __('Chad', 'invoicing'),
61
-	'CL' => __('Chile', 'invoicing'),
62
-	'CN' => __('China', 'invoicing'),
63
-	'CX' => __('Christmas Island', 'invoicing'),
64
-	'CC' => __('Cocos Islands', 'invoicing'),
65
-	'CO' => __('Colombia', 'invoicing'),
66
-	'KM' => __('Comoros', 'invoicing'),
67
-	'CD' => __('Congo, Democratic People\'s Republic', 'invoicing'),
68
-	'CG' => __('Congo, Republic of', 'invoicing'),
69
-	'CK' => __('Cook Islands', 'invoicing'),
70
-	'CR' => __('Costa Rica', 'invoicing'),
71
-	'CI' => __('Cote d\'Ivoire', 'invoicing'),
72
-	'HR' => __('Croatia/Hrvatska', 'invoicing'),
73
-	'CU' => __('Cuba', 'invoicing'),
74
-	'CW' => __('Cura&Ccedil;ao', 'invoicing'),
75
-	'CY' => __('Cyprus', 'invoicing'),
76
-	'CZ' => __('Czech Republic', 'invoicing'),
77
-	'DK' => __('Denmark', 'invoicing'),
78
-	'DJ' => __('Djibouti', 'invoicing'),
79
-	'DM' => __('Dominica', 'invoicing'),
80
-	'DO' => __('Dominican Republic', 'invoicing'),
81
-	'TP' => __('East Timor', 'invoicing'),
82
-	'EC' => __('Ecuador', 'invoicing'),
83
-	'EG' => __('Egypt', 'invoicing'),
84
-	'GQ' => __('Equatorial Guinea', 'invoicing'),
85
-	'SV' => __('El Salvador', 'invoicing'),
86
-	'ER' => __('Eritrea', 'invoicing'),
87
-	'EE' => __('Estonia', 'invoicing'),
88
-	'ET' => __('Ethiopia', 'invoicing'),
89
-	'FK' => __('Falkland Islands', 'invoicing'),
90
-	'FO' => __('Faroe Islands', 'invoicing'),
91
-	'FJ' => __('Fiji', 'invoicing'),
92
-	'FI' => __('Finland', 'invoicing'),
93
-	'FR' => __('France', 'invoicing'),
94
-	'GF' => __('French Guiana', 'invoicing'),
95
-	'PF' => __('French Polynesia', 'invoicing'),
96
-	'TF' => __('French Southern Territories', 'invoicing'),
97
-	'GA' => __('Gabon', 'invoicing'),
98
-	'GM' => __('Gambia', 'invoicing'),
99
-	'GE' => __('Georgia', 'invoicing'),
100
-	'DE' => __('Germany', 'invoicing'),
101
-	'GR' => __('Greece', 'invoicing'),
102
-	'GH' => __('Ghana', 'invoicing'),
103
-	'GI' => __('Gibraltar', 'invoicing'),
104
-	'GL' => __('Greenland', 'invoicing'),
105
-	'GD' => __('Grenada', 'invoicing'),
106
-	'GP' => __('Guadeloupe', 'invoicing'),
107
-	'GU' => __('Guam', 'invoicing'),
108
-	'GT' => __('Guatemala', 'invoicing'),
109
-	'GG' => __('Guernsey', 'invoicing'),
110
-	'GN' => __('Guinea', 'invoicing'),
111
-	'GW' => __('Guinea-Bissau', 'invoicing'),
112
-	'GY' => __('Guyana', 'invoicing'),
113
-	'HT' => __('Haiti', 'invoicing'),
114
-	'HM' => __('Heard and McDonald Islands', 'invoicing'),
115
-	'VA' => __('Holy See (City Vatican State)', 'invoicing'),
116
-	'HN' => __('Honduras', 'invoicing'),
117
-	'HK' => __('Hong Kong', 'invoicing'),
118
-	'HU' => __('Hungary', 'invoicing'),
119
-	'IS' => __('Iceland', 'invoicing'),
120
-	'IN' => __('India', 'invoicing'),
121
-	'ID' => __('Indonesia', 'invoicing'),
122
-	'IR' => __('Iran', 'invoicing'),
123
-	'IQ' => __('Iraq', 'invoicing'),
124
-	'IE' => __('Ireland', 'invoicing'),
125
-	'IM' => __('Isle of Man', 'invoicing'),
126
-	'IL' => __('Israel', 'invoicing'),
127
-	'IT' => __('Italy', 'invoicing'),
128
-	'JM' => __('Jamaica', 'invoicing'),
129
-	'JP' => __('Japan', 'invoicing'),
130
-	'JE' => __('Jersey', 'invoicing'),
131
-	'JO' => __('Jordan', 'invoicing'),
132
-	'KZ' => __('Kazakhstan', 'invoicing'),
133
-	'KE' => __('Kenya', 'invoicing'),
134
-	'KI' => __('Kiribati', 'invoicing'),
135
-	'KW' => __('Kuwait', 'invoicing'),
136
-	'KG' => __('Kyrgyzstan', 'invoicing'),
137
-	'LA' => __('Lao People\'s Democratic Republic', 'invoicing'),
138
-	'LV' => __('Latvia', 'invoicing'),
139
-	'LB' => __('Lebanon', 'invoicing'),
140
-	'LS' => __('Lesotho', 'invoicing'),
141
-	'LR' => __('Liberia', 'invoicing'),
142
-	'LY' => __('Libyan Arab Jamahiriya', 'invoicing'),
143
-	'LI' => __('Liechtenstein', 'invoicing'),
144
-	'LT' => __('Lithuania', 'invoicing'),
145
-	'LU' => __('Luxembourg', 'invoicing'),
146
-	'MO' => __('Macau', 'invoicing'),
147
-	'MK' => __('Macedonia', 'invoicing'),
148
-	'MG' => __('Madagascar', 'invoicing'),
149
-	'MW' => __('Malawi', 'invoicing'),
150
-	'MY' => __('Malaysia', 'invoicing'),
151
-	'MV' => __('Maldives', 'invoicing'),
152
-	'ML' => __('Mali', 'invoicing'),
153
-	'MT' => __('Malta', 'invoicing'),
154
-	'MH' => __('Marshall Islands', 'invoicing'),
155
-	'MQ' => __('Martinique', 'invoicing'),
156
-	'MR' => __('Mauritania', 'invoicing'),
157
-	'MU' => __('Mauritius', 'invoicing'),
158
-	'YT' => __('Mayotte', 'invoicing'),
159
-	'MX' => __('Mexico', 'invoicing'),
160
-	'FM' => __('Micronesia', 'invoicing'),
161
-	'MD' => __('Moldova, Republic of', 'invoicing'),
162
-	'MC' => __('Monaco', 'invoicing'),
163
-	'MN' => __('Mongolia', 'invoicing'),
164
-	'ME' => __('Montenegro', 'invoicing'),
165
-	'MS' => __('Montserrat', 'invoicing'),
166
-	'MA' => __('Morocco', 'invoicing'),
167
-	'MZ' => __('Mozambique', 'invoicing'),
168
-	'MM' => __('Myanmar', 'invoicing'),
169
-	'NA' => __('Namibia', 'invoicing'),
170
-	'NR' => __('Nauru', 'invoicing'),
171
-	'NP' => __('Nepal', 'invoicing'),
172
-	'NL' => __('Netherlands', 'invoicing'),
173
-	'AN' => __('Netherlands Antilles', 'invoicing'),
174
-	'NC' => __('New Caledonia', 'invoicing'),
175
-	'NZ' => __('New Zealand', 'invoicing'),
176
-	'NI' => __('Nicaragua', 'invoicing'),
177
-	'NE' => __('Niger', 'invoicing'),
178
-	'NG' => __('Nigeria', 'invoicing'),
179
-	'NU' => __('Niue', 'invoicing'),
180
-	'NF' => __('Norfolk Island', 'invoicing'),
181
-	'KP' => __('North Korea', 'invoicing'),
182
-	'MP' => __('Northern Mariana Islands', 'invoicing'),
183
-	'NO' => __('Norway', 'invoicing'),
184
-	'OM' => __('Oman', 'invoicing'),
185
-	'PK' => __('Pakistan', 'invoicing'),
186
-	'PW' => __('Palau', 'invoicing'),
187
-	'PS' => __('Palestinian Territories', 'invoicing'),
188
-	'PA' => __('Panama', 'invoicing'),
189
-	'PG' => __('Papua New Guinea', 'invoicing'),
190
-	'PY' => __('Paraguay', 'invoicing'),
191
-	'PE' => __('Peru', 'invoicing'),
192
-	'PH' => __('Philippines', 'invoicing'),
193
-	'PN' => __('Pitcairn Island', 'invoicing'),
194
-	'PL' => __('Poland', 'invoicing'),
195
-	'PT' => __('Portugal', 'invoicing'),
196
-	'PR' => __('Puerto Rico', 'invoicing'),
197
-	'QA' => __('Qatar', 'invoicing'),
198
-	'XK' => __('Republic of Kosovo', 'invoicing'),
199
-	'RE' => __('Reunion Island', 'invoicing'),
200
-	'RO' => __('Romania', 'invoicing'),
201
-	'RU' => __('Russian Federation', 'invoicing'),
202
-	'RW' => __('Rwanda', 'invoicing'),
203
-	'BL' => __('Saint Barth&eacute;lemy', 'invoicing'),
204
-	'SH' => __('Saint Helena', 'invoicing'),
205
-	'KN' => __('Saint Kitts and Nevis', 'invoicing'),
206
-	'LC' => __('Saint Lucia', 'invoicing'),
207
-	'MF' => __('Saint Martin (French)', 'invoicing'),
208
-	'SX' => __('Saint Martin (Dutch)', 'invoicing'),
209
-	'PM' => __('Saint Pierre and Miquelon', 'invoicing'),
210
-	'VC' => __('Saint Vincent and the Grenadines', 'invoicing'),
211
-	'SM' => __('San Marino', 'invoicing'),
212
-	'ST' => __('S&atilde;o Tom&eacute; and Pr&iacute;ncipe', 'invoicing'),
213
-	'SA' => __('Saudi Arabia', 'invoicing'),
214
-	'SN' => __('Senegal', 'invoicing'),
215
-	'RS' => __('Serbia', 'invoicing'),
216
-	'SC' => __('Seychelles', 'invoicing'),
217
-	'SL' => __('Sierra Leone', 'invoicing'),
218
-	'SG' => __('Singapore', 'invoicing'),
219
-	'SK' => __('Slovak Republic', 'invoicing'),
220
-	'SI' => __('Slovenia', 'invoicing'),
221
-	'SB' => __('Solomon Islands', 'invoicing'),
222
-	'SO' => __('Somalia', 'invoicing'),
223
-	'ZA' => __('South Africa', 'invoicing'),
224
-	'GS' => __('South Georgia', 'invoicing'),
225
-	'KR' => __('South Korea', 'invoicing'),
226
-	'SS' => __('South Sudan', 'invoicing'),
227
-	'ES' => __('Spain', 'invoicing'),
228
-	'LK' => __('Sri Lanka', 'invoicing'),
229
-	'SD' => __('Sudan', 'invoicing'),
230
-	'SR' => __('Suriname', 'invoicing'),
231
-	'SJ' => __('Svalbard and Jan Mayen Islands', 'invoicing'),
232
-	'SZ' => __('Swaziland', 'invoicing'),
233
-	'SE' => __('Sweden', 'invoicing'),
234
-	'CH' => __('Switzerland', 'invoicing'),
235
-	'SY' => __('Syrian Arab Republic', 'invoicing'),
236
-	'TW' => __('Taiwan', 'invoicing'),
237
-	'TJ' => __('Tajikistan', 'invoicing'),
238
-	'TZ' => __('Tanzania', 'invoicing'),
239
-	'TH' => __('Thailand', 'invoicing'),
240
-	'TL' => __('Timor-Leste', 'invoicing'),
241
-	'TG' => __('Togo', 'invoicing'),
242
-	'TK' => __('Tokelau', 'invoicing'),
243
-	'TO' => __('Tonga', 'invoicing'),
244
-	'TT' => __('Trinidad and Tobago', 'invoicing'),
245
-	'TN' => __('Tunisia', 'invoicing'),
246
-	'TR' => __('Turkey', 'invoicing'),
247
-	'TM' => __('Turkmenistan', 'invoicing'),
248
-	'TC' => __('Turks and Caicos Islands', 'invoicing'),
249
-	'TV' => __('Tuvalu', 'invoicing'),
250
-	'UG' => __('Uganda', 'invoicing'),
251
-	'UA' => __('Ukraine', 'invoicing'),
252
-	'AE' => __('United Arab Emirates', 'invoicing'),
253
-	'UY' => __('Uruguay', 'invoicing'),
254
-	'UM' => __('US Minor Outlying Islands', 'invoicing'),
255
-	'UZ' => __('Uzbekistan', 'invoicing'),
256
-	'VU' => __('Vanuatu', 'invoicing'),
257
-	'VE' => __('Venezuela', 'invoicing'),
258
-	'VN' => __('Vietnam', 'invoicing'),
259
-	'VG' => __('Virgin Islands (British)', 'invoicing'),
260
-	'VI' => __('Virgin Islands (USA)', 'invoicing'),
261
-	'WF' => __('Wallis and Futuna Islands', 'invoicing'),
262
-	'EH' => __('Western Sahara', 'invoicing'),
263
-	'WS' => __('Western Samoa', 'invoicing'),
264
-	'YE' => __('Yemen', 'invoicing'),
265
-	'ZM' => __('Zambia', 'invoicing'),
266
-	'ZW' => __('Zimbabwe', 'invoicing'),
15
+    'US' => __('United States', 'invoicing'),
16
+    'CA' => __('Canada', 'invoicing'),
17
+    'GB' => __('United Kingdom', 'invoicing'),
18
+    'AF' => __('Afghanistan', 'invoicing'),
19
+    'AX' => __('Aland Islands', 'invoicing'),
20
+    'AL' => __('Albania', 'invoicing'),
21
+    'DZ' => __('Algeria', 'invoicing'),
22
+    'AS' => __('American Samoa', 'invoicing'),
23
+    'AD' => __('Andorra', 'invoicing'),
24
+    'AO' => __('Angola', 'invoicing'),
25
+    'AI' => __('Anguilla', 'invoicing'),
26
+    'AQ' => __('Antarctica', 'invoicing'),
27
+    'AG' => __('Antigua and Barbuda', 'invoicing'),
28
+    'AR' => __('Argentina', 'invoicing'),
29
+    'AM' => __('Armenia', 'invoicing'),
30
+    'AW' => __('Aruba', 'invoicing'),
31
+    'AU' => __('Australia', 'invoicing'),
32
+    'AT' => __('Austria', 'invoicing'),
33
+    'AZ' => __('Azerbaijan', 'invoicing'),
34
+    'BS' => __('Bahamas', 'invoicing'),
35
+    'BH' => __('Bahrain', 'invoicing'),
36
+    'BD' => __('Bangladesh', 'invoicing'),
37
+    'BB' => __('Barbados', 'invoicing'),
38
+    'BY' => __('Belarus', 'invoicing'),
39
+    'BE' => __('Belgium', 'invoicing'),
40
+    'BZ' => __('Belize', 'invoicing'),
41
+    'BJ' => __('Benin', 'invoicing'),
42
+    'BM' => __('Bermuda', 'invoicing'),
43
+    'BT' => __('Bhutan', 'invoicing'),
44
+    'BO' => __('Bolivia', 'invoicing'),
45
+    'BQ' => __('Bonaire, Saint Eustatius and Saba', 'invoicing'),
46
+    'BA' => __('Bosnia and Herzegovina', 'invoicing'),
47
+    'BW' => __('Botswana', 'invoicing'),
48
+    'BV' => __('Bouvet Island', 'invoicing'),
49
+    'BR' => __('Brazil', 'invoicing'),
50
+    'IO' => __('British Indian Ocean Territory', 'invoicing'),
51
+    'BN' => __('Brunei Darrussalam', 'invoicing'),
52
+    'BG' => __('Bulgaria', 'invoicing'),
53
+    'BF' => __('Burkina Faso', 'invoicing'),
54
+    'BI' => __('Burundi', 'invoicing'),
55
+    'KH' => __('Cambodia', 'invoicing'),
56
+    'CM' => __('Cameroon', 'invoicing'),
57
+    'CV' => __('Cape Verde', 'invoicing'),
58
+    'KY' => __('Cayman Islands', 'invoicing'),
59
+    'CF' => __('Central African Republic', 'invoicing'),
60
+    'TD' => __('Chad', 'invoicing'),
61
+    'CL' => __('Chile', 'invoicing'),
62
+    'CN' => __('China', 'invoicing'),
63
+    'CX' => __('Christmas Island', 'invoicing'),
64
+    'CC' => __('Cocos Islands', 'invoicing'),
65
+    'CO' => __('Colombia', 'invoicing'),
66
+    'KM' => __('Comoros', 'invoicing'),
67
+    'CD' => __('Congo, Democratic People\'s Republic', 'invoicing'),
68
+    'CG' => __('Congo, Republic of', 'invoicing'),
69
+    'CK' => __('Cook Islands', 'invoicing'),
70
+    'CR' => __('Costa Rica', 'invoicing'),
71
+    'CI' => __('Cote d\'Ivoire', 'invoicing'),
72
+    'HR' => __('Croatia/Hrvatska', 'invoicing'),
73
+    'CU' => __('Cuba', 'invoicing'),
74
+    'CW' => __('Cura&Ccedil;ao', 'invoicing'),
75
+    'CY' => __('Cyprus', 'invoicing'),
76
+    'CZ' => __('Czech Republic', 'invoicing'),
77
+    'DK' => __('Denmark', 'invoicing'),
78
+    'DJ' => __('Djibouti', 'invoicing'),
79
+    'DM' => __('Dominica', 'invoicing'),
80
+    'DO' => __('Dominican Republic', 'invoicing'),
81
+    'TP' => __('East Timor', 'invoicing'),
82
+    'EC' => __('Ecuador', 'invoicing'),
83
+    'EG' => __('Egypt', 'invoicing'),
84
+    'GQ' => __('Equatorial Guinea', 'invoicing'),
85
+    'SV' => __('El Salvador', 'invoicing'),
86
+    'ER' => __('Eritrea', 'invoicing'),
87
+    'EE' => __('Estonia', 'invoicing'),
88
+    'ET' => __('Ethiopia', 'invoicing'),
89
+    'FK' => __('Falkland Islands', 'invoicing'),
90
+    'FO' => __('Faroe Islands', 'invoicing'),
91
+    'FJ' => __('Fiji', 'invoicing'),
92
+    'FI' => __('Finland', 'invoicing'),
93
+    'FR' => __('France', 'invoicing'),
94
+    'GF' => __('French Guiana', 'invoicing'),
95
+    'PF' => __('French Polynesia', 'invoicing'),
96
+    'TF' => __('French Southern Territories', 'invoicing'),
97
+    'GA' => __('Gabon', 'invoicing'),
98
+    'GM' => __('Gambia', 'invoicing'),
99
+    'GE' => __('Georgia', 'invoicing'),
100
+    'DE' => __('Germany', 'invoicing'),
101
+    'GR' => __('Greece', 'invoicing'),
102
+    'GH' => __('Ghana', 'invoicing'),
103
+    'GI' => __('Gibraltar', 'invoicing'),
104
+    'GL' => __('Greenland', 'invoicing'),
105
+    'GD' => __('Grenada', 'invoicing'),
106
+    'GP' => __('Guadeloupe', 'invoicing'),
107
+    'GU' => __('Guam', 'invoicing'),
108
+    'GT' => __('Guatemala', 'invoicing'),
109
+    'GG' => __('Guernsey', 'invoicing'),
110
+    'GN' => __('Guinea', 'invoicing'),
111
+    'GW' => __('Guinea-Bissau', 'invoicing'),
112
+    'GY' => __('Guyana', 'invoicing'),
113
+    'HT' => __('Haiti', 'invoicing'),
114
+    'HM' => __('Heard and McDonald Islands', 'invoicing'),
115
+    'VA' => __('Holy See (City Vatican State)', 'invoicing'),
116
+    'HN' => __('Honduras', 'invoicing'),
117
+    'HK' => __('Hong Kong', 'invoicing'),
118
+    'HU' => __('Hungary', 'invoicing'),
119
+    'IS' => __('Iceland', 'invoicing'),
120
+    'IN' => __('India', 'invoicing'),
121
+    'ID' => __('Indonesia', 'invoicing'),
122
+    'IR' => __('Iran', 'invoicing'),
123
+    'IQ' => __('Iraq', 'invoicing'),
124
+    'IE' => __('Ireland', 'invoicing'),
125
+    'IM' => __('Isle of Man', 'invoicing'),
126
+    'IL' => __('Israel', 'invoicing'),
127
+    'IT' => __('Italy', 'invoicing'),
128
+    'JM' => __('Jamaica', 'invoicing'),
129
+    'JP' => __('Japan', 'invoicing'),
130
+    'JE' => __('Jersey', 'invoicing'),
131
+    'JO' => __('Jordan', 'invoicing'),
132
+    'KZ' => __('Kazakhstan', 'invoicing'),
133
+    'KE' => __('Kenya', 'invoicing'),
134
+    'KI' => __('Kiribati', 'invoicing'),
135
+    'KW' => __('Kuwait', 'invoicing'),
136
+    'KG' => __('Kyrgyzstan', 'invoicing'),
137
+    'LA' => __('Lao People\'s Democratic Republic', 'invoicing'),
138
+    'LV' => __('Latvia', 'invoicing'),
139
+    'LB' => __('Lebanon', 'invoicing'),
140
+    'LS' => __('Lesotho', 'invoicing'),
141
+    'LR' => __('Liberia', 'invoicing'),
142
+    'LY' => __('Libyan Arab Jamahiriya', 'invoicing'),
143
+    'LI' => __('Liechtenstein', 'invoicing'),
144
+    'LT' => __('Lithuania', 'invoicing'),
145
+    'LU' => __('Luxembourg', 'invoicing'),
146
+    'MO' => __('Macau', 'invoicing'),
147
+    'MK' => __('Macedonia', 'invoicing'),
148
+    'MG' => __('Madagascar', 'invoicing'),
149
+    'MW' => __('Malawi', 'invoicing'),
150
+    'MY' => __('Malaysia', 'invoicing'),
151
+    'MV' => __('Maldives', 'invoicing'),
152
+    'ML' => __('Mali', 'invoicing'),
153
+    'MT' => __('Malta', 'invoicing'),
154
+    'MH' => __('Marshall Islands', 'invoicing'),
155
+    'MQ' => __('Martinique', 'invoicing'),
156
+    'MR' => __('Mauritania', 'invoicing'),
157
+    'MU' => __('Mauritius', 'invoicing'),
158
+    'YT' => __('Mayotte', 'invoicing'),
159
+    'MX' => __('Mexico', 'invoicing'),
160
+    'FM' => __('Micronesia', 'invoicing'),
161
+    'MD' => __('Moldova, Republic of', 'invoicing'),
162
+    'MC' => __('Monaco', 'invoicing'),
163
+    'MN' => __('Mongolia', 'invoicing'),
164
+    'ME' => __('Montenegro', 'invoicing'),
165
+    'MS' => __('Montserrat', 'invoicing'),
166
+    'MA' => __('Morocco', 'invoicing'),
167
+    'MZ' => __('Mozambique', 'invoicing'),
168
+    'MM' => __('Myanmar', 'invoicing'),
169
+    'NA' => __('Namibia', 'invoicing'),
170
+    'NR' => __('Nauru', 'invoicing'),
171
+    'NP' => __('Nepal', 'invoicing'),
172
+    'NL' => __('Netherlands', 'invoicing'),
173
+    'AN' => __('Netherlands Antilles', 'invoicing'),
174
+    'NC' => __('New Caledonia', 'invoicing'),
175
+    'NZ' => __('New Zealand', 'invoicing'),
176
+    'NI' => __('Nicaragua', 'invoicing'),
177
+    'NE' => __('Niger', 'invoicing'),
178
+    'NG' => __('Nigeria', 'invoicing'),
179
+    'NU' => __('Niue', 'invoicing'),
180
+    'NF' => __('Norfolk Island', 'invoicing'),
181
+    'KP' => __('North Korea', 'invoicing'),
182
+    'MP' => __('Northern Mariana Islands', 'invoicing'),
183
+    'NO' => __('Norway', 'invoicing'),
184
+    'OM' => __('Oman', 'invoicing'),
185
+    'PK' => __('Pakistan', 'invoicing'),
186
+    'PW' => __('Palau', 'invoicing'),
187
+    'PS' => __('Palestinian Territories', 'invoicing'),
188
+    'PA' => __('Panama', 'invoicing'),
189
+    'PG' => __('Papua New Guinea', 'invoicing'),
190
+    'PY' => __('Paraguay', 'invoicing'),
191
+    'PE' => __('Peru', 'invoicing'),
192
+    'PH' => __('Philippines', 'invoicing'),
193
+    'PN' => __('Pitcairn Island', 'invoicing'),
194
+    'PL' => __('Poland', 'invoicing'),
195
+    'PT' => __('Portugal', 'invoicing'),
196
+    'PR' => __('Puerto Rico', 'invoicing'),
197
+    'QA' => __('Qatar', 'invoicing'),
198
+    'XK' => __('Republic of Kosovo', 'invoicing'),
199
+    'RE' => __('Reunion Island', 'invoicing'),
200
+    'RO' => __('Romania', 'invoicing'),
201
+    'RU' => __('Russian Federation', 'invoicing'),
202
+    'RW' => __('Rwanda', 'invoicing'),
203
+    'BL' => __('Saint Barth&eacute;lemy', 'invoicing'),
204
+    'SH' => __('Saint Helena', 'invoicing'),
205
+    'KN' => __('Saint Kitts and Nevis', 'invoicing'),
206
+    'LC' => __('Saint Lucia', 'invoicing'),
207
+    'MF' => __('Saint Martin (French)', 'invoicing'),
208
+    'SX' => __('Saint Martin (Dutch)', 'invoicing'),
209
+    'PM' => __('Saint Pierre and Miquelon', 'invoicing'),
210
+    'VC' => __('Saint Vincent and the Grenadines', 'invoicing'),
211
+    'SM' => __('San Marino', 'invoicing'),
212
+    'ST' => __('S&atilde;o Tom&eacute; and Pr&iacute;ncipe', 'invoicing'),
213
+    'SA' => __('Saudi Arabia', 'invoicing'),
214
+    'SN' => __('Senegal', 'invoicing'),
215
+    'RS' => __('Serbia', 'invoicing'),
216
+    'SC' => __('Seychelles', 'invoicing'),
217
+    'SL' => __('Sierra Leone', 'invoicing'),
218
+    'SG' => __('Singapore', 'invoicing'),
219
+    'SK' => __('Slovak Republic', 'invoicing'),
220
+    'SI' => __('Slovenia', 'invoicing'),
221
+    'SB' => __('Solomon Islands', 'invoicing'),
222
+    'SO' => __('Somalia', 'invoicing'),
223
+    'ZA' => __('South Africa', 'invoicing'),
224
+    'GS' => __('South Georgia', 'invoicing'),
225
+    'KR' => __('South Korea', 'invoicing'),
226
+    'SS' => __('South Sudan', 'invoicing'),
227
+    'ES' => __('Spain', 'invoicing'),
228
+    'LK' => __('Sri Lanka', 'invoicing'),
229
+    'SD' => __('Sudan', 'invoicing'),
230
+    'SR' => __('Suriname', 'invoicing'),
231
+    'SJ' => __('Svalbard and Jan Mayen Islands', 'invoicing'),
232
+    'SZ' => __('Swaziland', 'invoicing'),
233
+    'SE' => __('Sweden', 'invoicing'),
234
+    'CH' => __('Switzerland', 'invoicing'),
235
+    'SY' => __('Syrian Arab Republic', 'invoicing'),
236
+    'TW' => __('Taiwan', 'invoicing'),
237
+    'TJ' => __('Tajikistan', 'invoicing'),
238
+    'TZ' => __('Tanzania', 'invoicing'),
239
+    'TH' => __('Thailand', 'invoicing'),
240
+    'TL' => __('Timor-Leste', 'invoicing'),
241
+    'TG' => __('Togo', 'invoicing'),
242
+    'TK' => __('Tokelau', 'invoicing'),
243
+    'TO' => __('Tonga', 'invoicing'),
244
+    'TT' => __('Trinidad and Tobago', 'invoicing'),
245
+    'TN' => __('Tunisia', 'invoicing'),
246
+    'TR' => __('Turkey', 'invoicing'),
247
+    'TM' => __('Turkmenistan', 'invoicing'),
248
+    'TC' => __('Turks and Caicos Islands', 'invoicing'),
249
+    'TV' => __('Tuvalu', 'invoicing'),
250
+    'UG' => __('Uganda', 'invoicing'),
251
+    'UA' => __('Ukraine', 'invoicing'),
252
+    'AE' => __('United Arab Emirates', 'invoicing'),
253
+    'UY' => __('Uruguay', 'invoicing'),
254
+    'UM' => __('US Minor Outlying Islands', 'invoicing'),
255
+    'UZ' => __('Uzbekistan', 'invoicing'),
256
+    'VU' => __('Vanuatu', 'invoicing'),
257
+    'VE' => __('Venezuela', 'invoicing'),
258
+    'VN' => __('Vietnam', 'invoicing'),
259
+    'VG' => __('Virgin Islands (British)', 'invoicing'),
260
+    'VI' => __('Virgin Islands (USA)', 'invoicing'),
261
+    'WF' => __('Wallis and Futuna Islands', 'invoicing'),
262
+    'EH' => __('Western Sahara', 'invoicing'),
263
+    'WS' => __('Western Samoa', 'invoicing'),
264
+    'YE' => __('Yemen', 'invoicing'),
265
+    'ZM' => __('Zambia', 'invoicing'),
266
+    'ZW' => __('Zimbabwe', 'invoicing'),
267 267
 );
Please login to merge, or discard this patch.
includes/data-stores/class-getpaid-data.php 1 patch
Indentation   +860 added lines, -860 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
  */
10 10
 
11 11
 if ( ! defined( 'ABSPATH' ) ) {
12
-	exit;
12
+    exit;
13 13
 }
14 14
 
15 15
 /**
@@ -21,356 +21,356 @@  discard block
 block discarded – undo
21 21
  */
22 22
 abstract class GetPaid_Data {
23 23
 
24
-	/**
25
-	 * ID for this object.
26
-	 *
27
-	 * @since 1.0.19
28
-	 * @var int
29
-	 */
30
-	protected $id = 0;
31
-
32
-	/**
33
-	 * Core data for this object. Name value pairs (name + default value).
34
-	 *
35
-	 * @since 1.0.19
36
-	 * @var array
37
-	 */
38
-	protected $data = array();
39
-
40
-	/**
41
-	 * Core data changes for this object.
42
-	 *
43
-	 * @since 1.0.19
44
-	 * @var array
45
-	 */
46
-	protected $changes = array();
47
-
48
-	/**
49
-	 * This is false until the object is read from the DB.
50
-	 *
51
-	 * @since 1.0.19
52
-	 * @var bool
53
-	 */
54
-	protected $object_read = false;
55
-
56
-	/**
57
-	 * This is the name of this object type.
58
-	 *
59
-	 * @since 1.0.19
60
-	 * @var string
61
-	 */
62
-	protected $object_type = 'data';
63
-
64
-	/**
65
-	 * Extra data for this object. Name value pairs (name + default value).
66
-	 * Used as a standard way for sub classes (like item types) to add
67
-	 * additional information to an inherited class.
68
-	 *
69
-	 * @since 1.0.19
70
-	 * @var array
71
-	 */
72
-	protected $extra_data = array();
73
-
74
-	/**
75
-	 * Set to _data on construct so we can track and reset data if needed.
76
-	 *
77
-	 * @since 1.0.19
78
-	 * @var array
79
-	 */
80
-	protected $default_data = array();
81
-
82
-	/**
83
-	 * Contains a reference to the data store for this class.
84
-	 *
85
-	 * @since 1.0.19
86
-	 * @var GetPaid_Data_Store
87
-	 */
88
-	protected $data_store;
89
-
90
-	/**
91
-	 * Stores meta in cache for future reads.
92
-	 * A group must be set to to enable caching.
93
-	 *
94
-	 * @since 1.0.19
95
-	 * @var string
96
-	 */
97
-	protected $cache_group = '';
98
-
99
-	/**
100
-	 * Stores the last error.
101
-	 *
102
-	 * @since 1.0.19
103
-	 * @var string
104
-	 */
105
-	public $last_error = '';
106
-
107
-	/**
108
-	 * Stores additional meta data.
109
-	 *
110
-	 * @since 1.0.19
111
-	 * @var array
112
-	 */
113
-	protected $meta_data = null;
114
-
115
-	/**
116
-	 * Default constructor.
117
-	 *
118
-	 * @param int|object|array|string $read ID to load from the DB (optional) or already queried data.
119
-	 */
120
-	public function __construct( $read = 0 ) {
121
-		$this->data         = array_merge( $this->data, $this->extra_data );
122
-		$this->default_data = $this->data;
123
-	}
124
-
125
-	/**
126
-	 * Only store the object ID to avoid serializing the data object instance.
127
-	 *
128
-	 * @return array
129
-	 */
130
-	public function __sleep() {
131
-		return array( 'id' );
132
-	}
133
-
134
-	/**
135
-	 * Re-run the constructor with the object ID.
136
-	 *
137
-	 * If the object no longer exists, remove the ID.
138
-	 */
139
-	public function __wakeup() {
140
-		$this->__construct( absint( $this->id ) );
141
-
142
-		if ( ! empty( $this->last_error ) ) {
143
-			$this->set_id( 0 );
144
-		}
145
-
146
-	}
147
-
148
-	/**
149
-	 * When the object is cloned, make sure meta is duplicated correctly.
150
-	 *
151
-	 * @since 1.0.19
152
-	 */
153
-	public function __clone() {
154
-		$this->maybe_read_meta_data();
155
-		if ( ! empty( $this->meta_data ) ) {
156
-			foreach ( $this->meta_data as $array_key => $meta ) {
157
-				$this->meta_data[ $array_key ] = clone $meta;
158
-				if ( ! empty( $meta->id ) ) {
159
-					$this->meta_data[ $array_key ]->id = null;
160
-				}
161
-			}
162
-		}
163
-	}
164
-
165
-	/**
166
-	 * Get the data store.
167
-	 *
168
-	 * @since  1.0.19
169
-	 * @return object
170
-	 */
171
-	public function get_data_store() {
172
-		return $this->data_store;
173
-	}
174
-
175
-	/**
176
-	 * Get the object type.
177
-	 *
178
-	 * @since  1.0.19
179
-	 * @return string
180
-	 */
181
-	public function get_object_type() {
182
-		return $this->object_type;
183
-	}
184
-
185
-	/**
186
-	 * Returns the unique ID for this object.
187
-	 *
188
-	 * @since  1.0.19
189
-	 * @return int
190
-	 */
191
-	public function get_id() {
192
-		return $this->id;
193
-	}
194
-
195
-	/**
196
-	 * Get form status.
197
-	 *
198
-	 * @since 1.0.19
199
-	 * @param  string $context View or edit context.
200
-	 * @return string
201
-	 */
202
-	public function get_status( $context = 'view' ) {
203
-		return $this->get_prop( 'status', $context );
204
-    }
205
-
206
-	/**
207
-	 * Delete an object, set the ID to 0, and return result.
208
-	 *
209
-	 * @since  1.0.19
210
-	 * @param  bool $force_delete Should the data be deleted permanently.
211
-	 * @return bool result
212
-	 */
213
-	public function delete( $force_delete = false ) {
214
-		if ( $this->data_store && $this->exists() ) {
215
-			$this->data_store->delete( $this, array( 'force_delete' => $force_delete ) );
216
-			$this->set_id( 0 );
217
-			return true;
218
-		}
219
-		return false;
220
-	}
221
-
222
-	/**
223
-	 * Save should create or update based on object existence.
224
-	 *
225
-	 * @since  1.0.19
226
-	 * @return int
227
-	 */
228
-	public function save() {
229
-		if ( ! $this->data_store ) {
230
-			return $this->get_id();
231
-		}
232
-
233
-		/**
234
-		 * Trigger action before saving to the DB. Allows you to adjust object props before save.
235
-		 *
236
-		 * @param GetPaid_Data          $this The object being saved.
237
-		 * @param GetPaid_Data_Store_WP $data_store The data store persisting the data.
238
-		 */
239
-		do_action( 'getpaid_before_' . $this->object_type . '_object_save', $this, $this->data_store );
240
-
241
-		if ( $this->get_id() ) {
242
-			$this->data_store->update( $this );
243
-		} else {
244
-			$this->data_store->create( $this );
245
-		}
246
-
247
-		/**
248
-		 * Trigger action after saving to the DB.
249
-		 *
250
-		 * @param GetPaid_Data          $this The object being saved.
251
-		 * @param GetPaid_Data_Store_WP $data_store The data store persisting the data.
252
-		 */
253
-		do_action( 'getpaid_after_' . $this->object_type . '_object_save', $this, $this->data_store );
254
-
255
-		return $this->get_id();
256
-	}
257
-
258
-	/**
259
-	 * Change data to JSON format.
260
-	 *
261
-	 * @since  1.0.19
262
-	 * @return string Data in JSON format.
263
-	 */
264
-	public function __toString() {
265
-		return wp_json_encode( $this->get_data() );
266
-	}
267
-
268
-	/**
269
-	 * Returns all data for this object.
270
-	 *
271
-	 * @since  1.0.19
272
-	 * @return array
273
-	 */
274
-	public function get_data() {
275
-		return array_merge( array( 'id' => $this->get_id() ), $this->data, array( 'meta_data' => $this->get_meta_data() ) );
276
-	}
277
-
278
-	/**
279
-	 * Returns array of expected data keys for this object.
280
-	 *
281
-	 * @since   1.0.19
282
-	 * @return array
283
-	 */
284
-	public function get_data_keys() {
285
-		return array_keys( $this->data );
286
-	}
287
-
288
-	/**
289
-	 * Returns all "extra" data keys for an object (for sub objects like item types).
290
-	 *
291
-	 * @since  1.0.19
292
-	 * @return array
293
-	 */
294
-	public function get_extra_data_keys() {
295
-		return array_keys( $this->extra_data );
296
-	}
297
-
298
-	/**
299
-	 * Filter null meta values from array.
300
-	 *
301
-	 * @since  1.0.19
302
-	 * @param mixed $meta Meta value to check.
303
-	 * @return bool
304
-	 */
305
-	protected function filter_null_meta( $meta ) {
306
-		return ! is_null( $meta->value );
307
-	}
308
-
309
-	/**
310
-	 * Get All Meta Data.
311
-	 *
312
-	 * @since 1.0.19
313
-	 * @return array of objects.
314
-	 */
315
-	public function get_meta_data() {
316
-		$this->maybe_read_meta_data();
317
-		return array_values( array_filter( $this->meta_data, array( $this, 'filter_null_meta' ) ) );
318
-	}
319
-
320
-	/**
321
-	 * Check if the key is an internal one.
322
-	 *
323
-	 * @since  1.0.19
324
-	 * @param  string $key Key to check.
325
-	 * @return bool   true if it's an internal key, false otherwise
326
-	 */
327
-	protected function is_internal_meta_key( $key ) {
328
-		$internal_meta_key = ! empty( $key ) && $this->data_store && in_array( $key, $this->data_store->get_internal_meta_keys(), true );
329
-
330
-		if ( ! $internal_meta_key ) {
331
-			return false;
332
-		}
333
-
334
-		$has_setter_or_getter = is_callable( array( $this, 'set_' . $key ) ) || is_callable( array( $this, 'get_' . $key ) );
335
-
336
-		if ( ! $has_setter_or_getter ) {
337
-			return false;
338
-		}
339
-
340
-		/* translators: %s: $key Key to check */
341
-		getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Generic add/update/get meta methods should not be used for internal meta data, including "%s". Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
342
-
343
-		return true;
344
-	}
345
-
346
-	/**
347
-	 * Magic method for setting data fields.
348
-	 *
349
-	 * This method does not update custom fields in the database.
350
-	 *
351
-	 * @since 1.0.19
352
-	 * @access public
353
-	 *
354
-	 */
355
-	public function __set( $key, $value ) {
356
-
357
-		if ( 'id' == strtolower( $key ) ) {
358
-			return $this->set_id( $value );
359
-		}
360
-
361
-		if ( method_exists( $this, "set_$key") ) {
362
-
363
-			/* translators: %s: $key Key to set */
364
-			getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Object data such as "%s" should not be accessed directly. Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
365
-
366
-			call_user_func( array( $this, "set_$key" ), $value );
367
-		} else {
368
-			$this->set_prop( $key, $value );
369
-		}
370
-
371
-	}
372
-
373
-	/**
24
+    /**
25
+     * ID for this object.
26
+     *
27
+     * @since 1.0.19
28
+     * @var int
29
+     */
30
+    protected $id = 0;
31
+
32
+    /**
33
+     * Core data for this object. Name value pairs (name + default value).
34
+     *
35
+     * @since 1.0.19
36
+     * @var array
37
+     */
38
+    protected $data = array();
39
+
40
+    /**
41
+     * Core data changes for this object.
42
+     *
43
+     * @since 1.0.19
44
+     * @var array
45
+     */
46
+    protected $changes = array();
47
+
48
+    /**
49
+     * This is false until the object is read from the DB.
50
+     *
51
+     * @since 1.0.19
52
+     * @var bool
53
+     */
54
+    protected $object_read = false;
55
+
56
+    /**
57
+     * This is the name of this object type.
58
+     *
59
+     * @since 1.0.19
60
+     * @var string
61
+     */
62
+    protected $object_type = 'data';
63
+
64
+    /**
65
+     * Extra data for this object. Name value pairs (name + default value).
66
+     * Used as a standard way for sub classes (like item types) to add
67
+     * additional information to an inherited class.
68
+     *
69
+     * @since 1.0.19
70
+     * @var array
71
+     */
72
+    protected $extra_data = array();
73
+
74
+    /**
75
+     * Set to _data on construct so we can track and reset data if needed.
76
+     *
77
+     * @since 1.0.19
78
+     * @var array
79
+     */
80
+    protected $default_data = array();
81
+
82
+    /**
83
+     * Contains a reference to the data store for this class.
84
+     *
85
+     * @since 1.0.19
86
+     * @var GetPaid_Data_Store
87
+     */
88
+    protected $data_store;
89
+
90
+    /**
91
+     * Stores meta in cache for future reads.
92
+     * A group must be set to to enable caching.
93
+     *
94
+     * @since 1.0.19
95
+     * @var string
96
+     */
97
+    protected $cache_group = '';
98
+
99
+    /**
100
+     * Stores the last error.
101
+     *
102
+     * @since 1.0.19
103
+     * @var string
104
+     */
105
+    public $last_error = '';
106
+
107
+    /**
108
+     * Stores additional meta data.
109
+     *
110
+     * @since 1.0.19
111
+     * @var array
112
+     */
113
+    protected $meta_data = null;
114
+
115
+    /**
116
+     * Default constructor.
117
+     *
118
+     * @param int|object|array|string $read ID to load from the DB (optional) or already queried data.
119
+     */
120
+    public function __construct( $read = 0 ) {
121
+        $this->data         = array_merge( $this->data, $this->extra_data );
122
+        $this->default_data = $this->data;
123
+    }
124
+
125
+    /**
126
+     * Only store the object ID to avoid serializing the data object instance.
127
+     *
128
+     * @return array
129
+     */
130
+    public function __sleep() {
131
+        return array( 'id' );
132
+    }
133
+
134
+    /**
135
+     * Re-run the constructor with the object ID.
136
+     *
137
+     * If the object no longer exists, remove the ID.
138
+     */
139
+    public function __wakeup() {
140
+        $this->__construct( absint( $this->id ) );
141
+
142
+        if ( ! empty( $this->last_error ) ) {
143
+            $this->set_id( 0 );
144
+        }
145
+
146
+    }
147
+
148
+    /**
149
+     * When the object is cloned, make sure meta is duplicated correctly.
150
+     *
151
+     * @since 1.0.19
152
+     */
153
+    public function __clone() {
154
+        $this->maybe_read_meta_data();
155
+        if ( ! empty( $this->meta_data ) ) {
156
+            foreach ( $this->meta_data as $array_key => $meta ) {
157
+                $this->meta_data[ $array_key ] = clone $meta;
158
+                if ( ! empty( $meta->id ) ) {
159
+                    $this->meta_data[ $array_key ]->id = null;
160
+                }
161
+            }
162
+        }
163
+    }
164
+
165
+    /**
166
+     * Get the data store.
167
+     *
168
+     * @since  1.0.19
169
+     * @return object
170
+     */
171
+    public function get_data_store() {
172
+        return $this->data_store;
173
+    }
174
+
175
+    /**
176
+     * Get the object type.
177
+     *
178
+     * @since  1.0.19
179
+     * @return string
180
+     */
181
+    public function get_object_type() {
182
+        return $this->object_type;
183
+    }
184
+
185
+    /**
186
+     * Returns the unique ID for this object.
187
+     *
188
+     * @since  1.0.19
189
+     * @return int
190
+     */
191
+    public function get_id() {
192
+        return $this->id;
193
+    }
194
+
195
+    /**
196
+     * Get form status.
197
+     *
198
+     * @since 1.0.19
199
+     * @param  string $context View or edit context.
200
+     * @return string
201
+     */
202
+    public function get_status( $context = 'view' ) {
203
+        return $this->get_prop( 'status', $context );
204
+    }
205
+
206
+    /**
207
+     * Delete an object, set the ID to 0, and return result.
208
+     *
209
+     * @since  1.0.19
210
+     * @param  bool $force_delete Should the data be deleted permanently.
211
+     * @return bool result
212
+     */
213
+    public function delete( $force_delete = false ) {
214
+        if ( $this->data_store && $this->exists() ) {
215
+            $this->data_store->delete( $this, array( 'force_delete' => $force_delete ) );
216
+            $this->set_id( 0 );
217
+            return true;
218
+        }
219
+        return false;
220
+    }
221
+
222
+    /**
223
+     * Save should create or update based on object existence.
224
+     *
225
+     * @since  1.0.19
226
+     * @return int
227
+     */
228
+    public function save() {
229
+        if ( ! $this->data_store ) {
230
+            return $this->get_id();
231
+        }
232
+
233
+        /**
234
+         * Trigger action before saving to the DB. Allows you to adjust object props before save.
235
+         *
236
+         * @param GetPaid_Data          $this The object being saved.
237
+         * @param GetPaid_Data_Store_WP $data_store The data store persisting the data.
238
+         */
239
+        do_action( 'getpaid_before_' . $this->object_type . '_object_save', $this, $this->data_store );
240
+
241
+        if ( $this->get_id() ) {
242
+            $this->data_store->update( $this );
243
+        } else {
244
+            $this->data_store->create( $this );
245
+        }
246
+
247
+        /**
248
+         * Trigger action after saving to the DB.
249
+         *
250
+         * @param GetPaid_Data          $this The object being saved.
251
+         * @param GetPaid_Data_Store_WP $data_store The data store persisting the data.
252
+         */
253
+        do_action( 'getpaid_after_' . $this->object_type . '_object_save', $this, $this->data_store );
254
+
255
+        return $this->get_id();
256
+    }
257
+
258
+    /**
259
+     * Change data to JSON format.
260
+     *
261
+     * @since  1.0.19
262
+     * @return string Data in JSON format.
263
+     */
264
+    public function __toString() {
265
+        return wp_json_encode( $this->get_data() );
266
+    }
267
+
268
+    /**
269
+     * Returns all data for this object.
270
+     *
271
+     * @since  1.0.19
272
+     * @return array
273
+     */
274
+    public function get_data() {
275
+        return array_merge( array( 'id' => $this->get_id() ), $this->data, array( 'meta_data' => $this->get_meta_data() ) );
276
+    }
277
+
278
+    /**
279
+     * Returns array of expected data keys for this object.
280
+     *
281
+     * @since   1.0.19
282
+     * @return array
283
+     */
284
+    public function get_data_keys() {
285
+        return array_keys( $this->data );
286
+    }
287
+
288
+    /**
289
+     * Returns all "extra" data keys for an object (for sub objects like item types).
290
+     *
291
+     * @since  1.0.19
292
+     * @return array
293
+     */
294
+    public function get_extra_data_keys() {
295
+        return array_keys( $this->extra_data );
296
+    }
297
+
298
+    /**
299
+     * Filter null meta values from array.
300
+     *
301
+     * @since  1.0.19
302
+     * @param mixed $meta Meta value to check.
303
+     * @return bool
304
+     */
305
+    protected function filter_null_meta( $meta ) {
306
+        return ! is_null( $meta->value );
307
+    }
308
+
309
+    /**
310
+     * Get All Meta Data.
311
+     *
312
+     * @since 1.0.19
313
+     * @return array of objects.
314
+     */
315
+    public function get_meta_data() {
316
+        $this->maybe_read_meta_data();
317
+        return array_values( array_filter( $this->meta_data, array( $this, 'filter_null_meta' ) ) );
318
+    }
319
+
320
+    /**
321
+     * Check if the key is an internal one.
322
+     *
323
+     * @since  1.0.19
324
+     * @param  string $key Key to check.
325
+     * @return bool   true if it's an internal key, false otherwise
326
+     */
327
+    protected function is_internal_meta_key( $key ) {
328
+        $internal_meta_key = ! empty( $key ) && $this->data_store && in_array( $key, $this->data_store->get_internal_meta_keys(), true );
329
+
330
+        if ( ! $internal_meta_key ) {
331
+            return false;
332
+        }
333
+
334
+        $has_setter_or_getter = is_callable( array( $this, 'set_' . $key ) ) || is_callable( array( $this, 'get_' . $key ) );
335
+
336
+        if ( ! $has_setter_or_getter ) {
337
+            return false;
338
+        }
339
+
340
+        /* translators: %s: $key Key to check */
341
+        getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Generic add/update/get meta methods should not be used for internal meta data, including "%s". Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
342
+
343
+        return true;
344
+    }
345
+
346
+    /**
347
+     * Magic method for setting data fields.
348
+     *
349
+     * This method does not update custom fields in the database.
350
+     *
351
+     * @since 1.0.19
352
+     * @access public
353
+     *
354
+     */
355
+    public function __set( $key, $value ) {
356
+
357
+        if ( 'id' == strtolower( $key ) ) {
358
+            return $this->set_id( $value );
359
+        }
360
+
361
+        if ( method_exists( $this, "set_$key") ) {
362
+
363
+            /* translators: %s: $key Key to set */
364
+            getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Object data such as "%s" should not be accessed directly. Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
365
+
366
+            call_user_func( array( $this, "set_$key" ), $value );
367
+        } else {
368
+            $this->set_prop( $key, $value );
369
+        }
370
+
371
+    }
372
+
373
+    /**
374 374
      * Margic method for retrieving a property.
375 375
      */
376 376
     public function __get( $key ) {
@@ -378,10 +378,10 @@  discard block
 block discarded – undo
378 378
         // Check if we have a helper method for that.
379 379
         if ( method_exists( $this, 'get_' . $key ) ) {
380 380
 
381
-			if ( 'post_type' != $key ) {
382
-				/* translators: %s: $key Key to set */
383
-				getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Object data such as "%s" should not be accessed directly. Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
384
-			}
381
+            if ( 'post_type' != $key ) {
382
+                /* translators: %s: $key Key to set */
383
+                getpaid_doing_it_wrong( __FUNCTION__, sprintf( __( 'Object data such as "%s" should not be accessed directly. Use getters and setters.', 'invoicing' ), $key ), '1.0.19' );
384
+            }
385 385
 
386 386
             return call_user_func( array( $this, 'get_' . $key ) );
387 387
         }
@@ -391,512 +391,512 @@  discard block
 block discarded – undo
391 391
             return $this->post->$key;
392 392
         }
393 393
 
394
-		return $this->get_prop( $key );
395
-
396
-    }
397
-
398
-	/**
399
-	 * Get Meta Data by Key.
400
-	 *
401
-	 * @since  1.0.19
402
-	 * @param  string $key Meta Key.
403
-	 * @param  bool   $single return first found meta with key, or all with $key.
404
-	 * @param  string $context What the value is for. Valid values are view and edit.
405
-	 * @return mixed
406
-	 */
407
-	public function get_meta( $key = '', $single = true, $context = 'view' ) {
408
-
409
-		// Check if this is an internal meta key.
410
-		$_key = str_replace( '_wpinv', '', $key );
411
-		$_key = str_replace( 'wpinv', '', $_key );
412
-		if ( $this->is_internal_meta_key( $_key ) ) {
413
-			$function = 'get_' . $_key;
414
-
415
-			if ( is_callable( array( $this, $function ) ) ) {
416
-				return $this->{$function}();
417
-			}
418
-		}
419
-
420
-		// Read the meta data if not yet read.
421
-		$this->maybe_read_meta_data();
422
-		$meta_data  = $this->get_meta_data();
423
-		$array_keys = array_keys( wp_list_pluck( $meta_data, 'key' ), $key, true );
424
-		$value      = $single ? '' : array();
425
-
426
-		if ( ! empty( $array_keys ) ) {
427
-			// We don't use the $this->meta_data property directly here because we don't want meta with a null value (i.e. meta which has been deleted via $this->delete_meta_data()).
428
-			if ( $single ) {
429
-				$value = $meta_data[ current( $array_keys ) ]->value;
430
-			} else {
431
-				$value = array_intersect_key( $meta_data, array_flip( $array_keys ) );
432
-			}
433
-		}
434
-
435
-		if ( 'view' === $context ) {
436
-			$value = apply_filters( $this->get_hook_prefix() . $key, $value, $this );
437
-		}
438
-
439
-		return $value;
440
-	}
441
-
442
-	/**
443
-	 * See if meta data exists, since get_meta always returns a '' or array().
444
-	 *
445
-	 * @since  1.0.19
446
-	 * @param  string $key Meta Key.
447
-	 * @return boolean
448
-	 */
449
-	public function meta_exists( $key = '' ) {
450
-		$this->maybe_read_meta_data();
451
-		$array_keys = wp_list_pluck( $this->get_meta_data(), 'key' );
452
-		return in_array( $key, $array_keys, true );
453
-	}
454
-
455
-	/**
456
-	 * Set all meta data from array.
457
-	 *
458
-	 * @since 1.0.19
459
-	 * @param array $data Key/Value pairs.
460
-	 */
461
-	public function set_meta_data( $data ) {
462
-		if ( ! empty( $data ) && is_array( $data ) ) {
463
-			$this->maybe_read_meta_data();
464
-			foreach ( $data as $meta ) {
465
-				$meta = (array) $meta;
466
-				if ( isset( $meta['key'], $meta['value'], $meta['id'] ) ) {
467
-					$this->meta_data[] = new GetPaid_Meta_Data(
468
-						array(
469
-							'id'    => $meta['id'],
470
-							'key'   => $meta['key'],
471
-							'value' => $meta['value'],
472
-						)
473
-					);
474
-				}
475
-			}
476
-		}
477
-	}
478
-
479
-	/**
480
-	 * Add meta data.
481
-	 *
482
-	 * @since 1.0.19
483
-	 *
484
-	 * @param string       $key Meta key.
485
-	 * @param string|array $value Meta value.
486
-	 * @param bool         $unique Should this be a unique key?.
487
-	 */
488
-	public function add_meta_data( $key, $value, $unique = false ) {
489
-		if ( $this->is_internal_meta_key( $key ) ) {
490
-			$function = 'set_' . $key;
491
-
492
-			if ( is_callable( array( $this, $function ) ) ) {
493
-				return $this->{$function}( $value );
494
-			}
495
-		}
496
-
497
-		$this->maybe_read_meta_data();
498
-		if ( $unique ) {
499
-			$this->delete_meta_data( $key );
500
-		}
501
-		$this->meta_data[] = new GetPaid_Meta_Data(
502
-			array(
503
-				'key'   => $key,
504
-				'value' => $value,
505
-			)
506
-		);
507
-	}
508
-
509
-	/**
510
-	 * Update meta data by key or ID, if provided.
511
-	 *
512
-	 * @since  1.0.19
513
-	 *
514
-	 * @param  string       $key Meta key.
515
-	 * @param  string|array $value Meta value.
516
-	 * @param  int          $meta_id Meta ID.
517
-	 */
518
-	public function update_meta_data( $key, $value, $meta_id = 0 ) {
519
-		if ( $this->is_internal_meta_key( $key ) ) {
520
-			$function = 'set_' . $key;
521
-
522
-			if ( is_callable( array( $this, $function ) ) ) {
523
-				return $this->{$function}( $value );
524
-			}
525
-		}
526
-
527
-		$this->maybe_read_meta_data();
528
-
529
-		$array_key = false;
530
-
531
-		if ( $meta_id ) {
532
-			$array_keys = array_keys( wp_list_pluck( $this->meta_data, 'id' ), $meta_id, true );
533
-			$array_key  = $array_keys ? current( $array_keys ) : false;
534
-		} else {
535
-			// Find matches by key.
536
-			$matches = array();
537
-			foreach ( $this->meta_data as $meta_data_array_key => $meta ) {
538
-				if ( $meta->key === $key ) {
539
-					$matches[] = $meta_data_array_key;
540
-				}
541
-			}
542
-
543
-			if ( ! empty( $matches ) ) {
544
-				// Set matches to null so only one key gets the new value.
545
-				foreach ( $matches as $meta_data_array_key ) {
546
-					$this->meta_data[ $meta_data_array_key ]->value = null;
547
-				}
548
-				$array_key = current( $matches );
549
-			}
550
-		}
551
-
552
-		if ( false !== $array_key ) {
553
-			$meta        = $this->meta_data[ $array_key ];
554
-			$meta->key   = $key;
555
-			$meta->value = $value;
556
-		} else {
557
-			$this->add_meta_data( $key, $value, true );
558
-		}
559
-	}
560
-
561
-	/**
562
-	 * Delete meta data.
563
-	 *
564
-	 * @since 1.0.19
565
-	 * @param string $key Meta key.
566
-	 */
567
-	public function delete_meta_data( $key ) {
568
-		$this->maybe_read_meta_data();
569
-		$array_keys = array_keys( wp_list_pluck( $this->meta_data, 'key' ), $key, true );
570
-
571
-		if ( $array_keys ) {
572
-			foreach ( $array_keys as $array_key ) {
573
-				$this->meta_data[ $array_key ]->value = null;
574
-			}
575
-		}
576
-	}
577
-
578
-	/**
579
-	 * Delete meta data.
580
-	 *
581
-	 * @since 1.0.19
582
-	 * @param int $mid Meta ID.
583
-	 */
584
-	public function delete_meta_data_by_mid( $mid ) {
585
-		$this->maybe_read_meta_data();
586
-		$array_keys = array_keys( wp_list_pluck( $this->meta_data, 'id' ), (int) $mid, true );
587
-
588
-		if ( $array_keys ) {
589
-			foreach ( $array_keys as $array_key ) {
590
-				$this->meta_data[ $array_key ]->value = null;
591
-			}
592
-		}
593
-	}
594
-
595
-	/**
596
-	 * Read meta data if null.
597
-	 *
598
-	 * @since 1.0.19
599
-	 */
600
-	protected function maybe_read_meta_data() {
601
-		if ( is_null( $this->meta_data ) ) {
602
-			$this->read_meta_data();
603
-		}
604
-	}
605
-
606
-	/**
607
-	 * Read Meta Data from the database. Ignore any internal properties.
608
-	 * Uses it's own caches because get_metadata does not provide meta_ids.
609
-	 *
610
-	 * @since 1.0.19
611
-	 * @param bool $force_read True to force a new DB read (and update cache).
612
-	 */
613
-	public function read_meta_data( $force_read = false ) {
614
-
615
-		// Reset meta data.
616
-		$this->meta_data = array();
617
-
618
-		// Maybe abort early.
619
-		if ( ! $this->get_id() || ! $this->data_store ) {
620
-			return;
621
-		}
622
-
623
-		// Only read from cache if the cache key is set.
624
-		$cache_key = null;
625
-		if ( ! $force_read && ! empty( $this->cache_group ) ) {
626
-			$cache_key     = GetPaid_Cache_Helper::get_cache_prefix( $this->cache_group ) . GetPaid_Cache_Helper::get_cache_prefix( 'object_' . $this->get_id() ) . 'object_meta_' . $this->get_id();
627
-			$raw_meta_data = wp_cache_get( $cache_key, $this->cache_group );
628
-		}
629
-
630
-		// Should we force read?
631
-		if ( empty( $raw_meta_data ) ) {
632
-			$raw_meta_data = $this->data_store->read_meta( $this );
633
-
634
-			if ( ! empty( $cache_key ) ) {
635
-				wp_cache_set( $cache_key, $raw_meta_data, $this->cache_group );
636
-			}
637
-
638
-		}
639
-
640
-		// Set meta data.
641
-		if ( is_array( $raw_meta_data ) ) {
642
-
643
-			foreach ( $raw_meta_data as $meta ) {
644
-				$this->meta_data[] = new GetPaid_Meta_Data(
645
-					array(
646
-						'id'    => (int) $meta->meta_id,
647
-						'key'   => $meta->meta_key,
648
-						'value' => maybe_unserialize( $meta->meta_value ),
649
-					)
650
-				);
651
-			}
652
-
653
-		}
654
-
655
-	}
656
-
657
-	/**
658
-	 * Update Meta Data in the database.
659
-	 *
660
-	 * @since 1.0.19
661
-	 */
662
-	public function save_meta_data() {
663
-		if ( ! $this->data_store || is_null( $this->meta_data ) ) {
664
-			return;
665
-		}
666
-		foreach ( $this->meta_data as $array_key => $meta ) {
667
-			if ( is_null( $meta->value ) ) {
668
-				if ( ! empty( $meta->id ) ) {
669
-					$this->data_store->delete_meta( $this, $meta );
670
-					unset( $this->meta_data[ $array_key ] );
671
-				}
672
-			} elseif ( empty( $meta->id ) ) {
673
-				$meta->id = $this->data_store->add_meta( $this, $meta );
674
-				$meta->apply_changes();
675
-			} else {
676
-				if ( $meta->get_changes() ) {
677
-					$this->data_store->update_meta( $this, $meta );
678
-					$meta->apply_changes();
679
-				}
680
-			}
681
-		}
682
-		if ( ! empty( $this->cache_group ) ) {
683
-			$cache_key = GetPaid_Cache_Helper::get_cache_prefix( $this->cache_group ) . GetPaid_Cache_Helper::get_cache_prefix( 'object_' . $this->get_id() ) . 'object_meta_' . $this->get_id();
684
-			wp_cache_delete( $cache_key, $this->cache_group );
685
-		}
686
-	}
687
-
688
-	/**
689
-	 * Set ID.
690
-	 *
691
-	 * @since 1.0.19
692
-	 * @param int $id ID.
693
-	 */
694
-	public function set_id( $id ) {
695
-		$this->id = absint( $id );
696
-	}
697
-
698
-	/**
699
-	 * Sets item status.
700
-	 *
701
-	 * @since 1.0.19
702
-	 * @param string $status New status.
703
-	 * @return array details of change.
704
-	 */
705
-	public function set_status( $status ) {
394
+        return $this->get_prop( $key );
395
+
396
+    }
397
+
398
+    /**
399
+     * Get Meta Data by Key.
400
+     *
401
+     * @since  1.0.19
402
+     * @param  string $key Meta Key.
403
+     * @param  bool   $single return first found meta with key, or all with $key.
404
+     * @param  string $context What the value is for. Valid values are view and edit.
405
+     * @return mixed
406
+     */
407
+    public function get_meta( $key = '', $single = true, $context = 'view' ) {
408
+
409
+        // Check if this is an internal meta key.
410
+        $_key = str_replace( '_wpinv', '', $key );
411
+        $_key = str_replace( 'wpinv', '', $_key );
412
+        if ( $this->is_internal_meta_key( $_key ) ) {
413
+            $function = 'get_' . $_key;
414
+
415
+            if ( is_callable( array( $this, $function ) ) ) {
416
+                return $this->{$function}();
417
+            }
418
+        }
419
+
420
+        // Read the meta data if not yet read.
421
+        $this->maybe_read_meta_data();
422
+        $meta_data  = $this->get_meta_data();
423
+        $array_keys = array_keys( wp_list_pluck( $meta_data, 'key' ), $key, true );
424
+        $value      = $single ? '' : array();
425
+
426
+        if ( ! empty( $array_keys ) ) {
427
+            // We don't use the $this->meta_data property directly here because we don't want meta with a null value (i.e. meta which has been deleted via $this->delete_meta_data()).
428
+            if ( $single ) {
429
+                $value = $meta_data[ current( $array_keys ) ]->value;
430
+            } else {
431
+                $value = array_intersect_key( $meta_data, array_flip( $array_keys ) );
432
+            }
433
+        }
434
+
435
+        if ( 'view' === $context ) {
436
+            $value = apply_filters( $this->get_hook_prefix() . $key, $value, $this );
437
+        }
438
+
439
+        return $value;
440
+    }
441
+
442
+    /**
443
+     * See if meta data exists, since get_meta always returns a '' or array().
444
+     *
445
+     * @since  1.0.19
446
+     * @param  string $key Meta Key.
447
+     * @return boolean
448
+     */
449
+    public function meta_exists( $key = '' ) {
450
+        $this->maybe_read_meta_data();
451
+        $array_keys = wp_list_pluck( $this->get_meta_data(), 'key' );
452
+        return in_array( $key, $array_keys, true );
453
+    }
454
+
455
+    /**
456
+     * Set all meta data from array.
457
+     *
458
+     * @since 1.0.19
459
+     * @param array $data Key/Value pairs.
460
+     */
461
+    public function set_meta_data( $data ) {
462
+        if ( ! empty( $data ) && is_array( $data ) ) {
463
+            $this->maybe_read_meta_data();
464
+            foreach ( $data as $meta ) {
465
+                $meta = (array) $meta;
466
+                if ( isset( $meta['key'], $meta['value'], $meta['id'] ) ) {
467
+                    $this->meta_data[] = new GetPaid_Meta_Data(
468
+                        array(
469
+                            'id'    => $meta['id'],
470
+                            'key'   => $meta['key'],
471
+                            'value' => $meta['value'],
472
+                        )
473
+                    );
474
+                }
475
+            }
476
+        }
477
+    }
478
+
479
+    /**
480
+     * Add meta data.
481
+     *
482
+     * @since 1.0.19
483
+     *
484
+     * @param string       $key Meta key.
485
+     * @param string|array $value Meta value.
486
+     * @param bool         $unique Should this be a unique key?.
487
+     */
488
+    public function add_meta_data( $key, $value, $unique = false ) {
489
+        if ( $this->is_internal_meta_key( $key ) ) {
490
+            $function = 'set_' . $key;
491
+
492
+            if ( is_callable( array( $this, $function ) ) ) {
493
+                return $this->{$function}( $value );
494
+            }
495
+        }
496
+
497
+        $this->maybe_read_meta_data();
498
+        if ( $unique ) {
499
+            $this->delete_meta_data( $key );
500
+        }
501
+        $this->meta_data[] = new GetPaid_Meta_Data(
502
+            array(
503
+                'key'   => $key,
504
+                'value' => $value,
505
+            )
506
+        );
507
+    }
508
+
509
+    /**
510
+     * Update meta data by key or ID, if provided.
511
+     *
512
+     * @since  1.0.19
513
+     *
514
+     * @param  string       $key Meta key.
515
+     * @param  string|array $value Meta value.
516
+     * @param  int          $meta_id Meta ID.
517
+     */
518
+    public function update_meta_data( $key, $value, $meta_id = 0 ) {
519
+        if ( $this->is_internal_meta_key( $key ) ) {
520
+            $function = 'set_' . $key;
521
+
522
+            if ( is_callable( array( $this, $function ) ) ) {
523
+                return $this->{$function}( $value );
524
+            }
525
+        }
526
+
527
+        $this->maybe_read_meta_data();
528
+
529
+        $array_key = false;
530
+
531
+        if ( $meta_id ) {
532
+            $array_keys = array_keys( wp_list_pluck( $this->meta_data, 'id' ), $meta_id, true );
533
+            $array_key  = $array_keys ? current( $array_keys ) : false;
534
+        } else {
535
+            // Find matches by key.
536
+            $matches = array();
537
+            foreach ( $this->meta_data as $meta_data_array_key => $meta ) {
538
+                if ( $meta->key === $key ) {
539
+                    $matches[] = $meta_data_array_key;
540
+                }
541
+            }
542
+
543
+            if ( ! empty( $matches ) ) {
544
+                // Set matches to null so only one key gets the new value.
545
+                foreach ( $matches as $meta_data_array_key ) {
546
+                    $this->meta_data[ $meta_data_array_key ]->value = null;
547
+                }
548
+                $array_key = current( $matches );
549
+            }
550
+        }
551
+
552
+        if ( false !== $array_key ) {
553
+            $meta        = $this->meta_data[ $array_key ];
554
+            $meta->key   = $key;
555
+            $meta->value = $value;
556
+        } else {
557
+            $this->add_meta_data( $key, $value, true );
558
+        }
559
+    }
560
+
561
+    /**
562
+     * Delete meta data.
563
+     *
564
+     * @since 1.0.19
565
+     * @param string $key Meta key.
566
+     */
567
+    public function delete_meta_data( $key ) {
568
+        $this->maybe_read_meta_data();
569
+        $array_keys = array_keys( wp_list_pluck( $this->meta_data, 'key' ), $key, true );
570
+
571
+        if ( $array_keys ) {
572
+            foreach ( $array_keys as $array_key ) {
573
+                $this->meta_data[ $array_key ]->value = null;
574
+            }
575
+        }
576
+    }
577
+
578
+    /**
579
+     * Delete meta data.
580
+     *
581
+     * @since 1.0.19
582
+     * @param int $mid Meta ID.
583
+     */
584
+    public function delete_meta_data_by_mid( $mid ) {
585
+        $this->maybe_read_meta_data();
586
+        $array_keys = array_keys( wp_list_pluck( $this->meta_data, 'id' ), (int) $mid, true );
587
+
588
+        if ( $array_keys ) {
589
+            foreach ( $array_keys as $array_key ) {
590
+                $this->meta_data[ $array_key ]->value = null;
591
+            }
592
+        }
593
+    }
594
+
595
+    /**
596
+     * Read meta data if null.
597
+     *
598
+     * @since 1.0.19
599
+     */
600
+    protected function maybe_read_meta_data() {
601
+        if ( is_null( $this->meta_data ) ) {
602
+            $this->read_meta_data();
603
+        }
604
+    }
605
+
606
+    /**
607
+     * Read Meta Data from the database. Ignore any internal properties.
608
+     * Uses it's own caches because get_metadata does not provide meta_ids.
609
+     *
610
+     * @since 1.0.19
611
+     * @param bool $force_read True to force a new DB read (and update cache).
612
+     */
613
+    public function read_meta_data( $force_read = false ) {
614
+
615
+        // Reset meta data.
616
+        $this->meta_data = array();
617
+
618
+        // Maybe abort early.
619
+        if ( ! $this->get_id() || ! $this->data_store ) {
620
+            return;
621
+        }
622
+
623
+        // Only read from cache if the cache key is set.
624
+        $cache_key = null;
625
+        if ( ! $force_read && ! empty( $this->cache_group ) ) {
626
+            $cache_key     = GetPaid_Cache_Helper::get_cache_prefix( $this->cache_group ) . GetPaid_Cache_Helper::get_cache_prefix( 'object_' . $this->get_id() ) . 'object_meta_' . $this->get_id();
627
+            $raw_meta_data = wp_cache_get( $cache_key, $this->cache_group );
628
+        }
629
+
630
+        // Should we force read?
631
+        if ( empty( $raw_meta_data ) ) {
632
+            $raw_meta_data = $this->data_store->read_meta( $this );
633
+
634
+            if ( ! empty( $cache_key ) ) {
635
+                wp_cache_set( $cache_key, $raw_meta_data, $this->cache_group );
636
+            }
637
+
638
+        }
639
+
640
+        // Set meta data.
641
+        if ( is_array( $raw_meta_data ) ) {
642
+
643
+            foreach ( $raw_meta_data as $meta ) {
644
+                $this->meta_data[] = new GetPaid_Meta_Data(
645
+                    array(
646
+                        'id'    => (int) $meta->meta_id,
647
+                        'key'   => $meta->meta_key,
648
+                        'value' => maybe_unserialize( $meta->meta_value ),
649
+                    )
650
+                );
651
+            }
652
+
653
+        }
654
+
655
+    }
656
+
657
+    /**
658
+     * Update Meta Data in the database.
659
+     *
660
+     * @since 1.0.19
661
+     */
662
+    public function save_meta_data() {
663
+        if ( ! $this->data_store || is_null( $this->meta_data ) ) {
664
+            return;
665
+        }
666
+        foreach ( $this->meta_data as $array_key => $meta ) {
667
+            if ( is_null( $meta->value ) ) {
668
+                if ( ! empty( $meta->id ) ) {
669
+                    $this->data_store->delete_meta( $this, $meta );
670
+                    unset( $this->meta_data[ $array_key ] );
671
+                }
672
+            } elseif ( empty( $meta->id ) ) {
673
+                $meta->id = $this->data_store->add_meta( $this, $meta );
674
+                $meta->apply_changes();
675
+            } else {
676
+                if ( $meta->get_changes() ) {
677
+                    $this->data_store->update_meta( $this, $meta );
678
+                    $meta->apply_changes();
679
+                }
680
+            }
681
+        }
682
+        if ( ! empty( $this->cache_group ) ) {
683
+            $cache_key = GetPaid_Cache_Helper::get_cache_prefix( $this->cache_group ) . GetPaid_Cache_Helper::get_cache_prefix( 'object_' . $this->get_id() ) . 'object_meta_' . $this->get_id();
684
+            wp_cache_delete( $cache_key, $this->cache_group );
685
+        }
686
+    }
687
+
688
+    /**
689
+     * Set ID.
690
+     *
691
+     * @since 1.0.19
692
+     * @param int $id ID.
693
+     */
694
+    public function set_id( $id ) {
695
+        $this->id = absint( $id );
696
+    }
697
+
698
+    /**
699
+     * Sets item status.
700
+     *
701
+     * @since 1.0.19
702
+     * @param string $status New status.
703
+     * @return array details of change.
704
+     */
705
+    public function set_status( $status ) {
706 706
         $old_status = $this->get_status();
707 707
 
708
-		$this->set_prop( 'status', $status );
709
-
710
-		return array(
711
-			'from' => $old_status,
712
-			'to'   => $status,
713
-		);
714
-    }
715
-
716
-	/**
717
-	 * Set all props to default values.
718
-	 *
719
-	 * @since 1.0.19
720
-	 */
721
-	public function set_defaults() {
722
-		$this->data    = $this->default_data;
723
-		$this->changes = array();
724
-		$this->set_object_read( false );
725
-	}
726
-
727
-	/**
728
-	 * Set object read property.
729
-	 *
730
-	 * @since 1.0.19
731
-	 * @param boolean $read Should read?.
732
-	 */
733
-	public function set_object_read( $read = true ) {
734
-		$this->object_read = (bool) $read;
735
-	}
736
-
737
-	/**
738
-	 * Get object read property.
739
-	 *
740
-	 * @since  1.0.19
741
-	 * @return boolean
742
-	 */
743
-	public function get_object_read() {
744
-		return (bool) $this->object_read;
745
-	}
746
-
747
-	/**
748
-	 * Set a collection of props in one go, collect any errors, and return the result.
749
-	 * Only sets using public methods.
750
-	 *
751
-	 * @since  1.0.19
752
-	 *
753
-	 * @param array  $props Key value pairs to set. Key is the prop and should map to a setter function name.
754
-	 * @param string $context In what context to run this.
755
-	 *
756
-	 * @return bool|WP_Error
757
-	 */
758
-	public function set_props( $props, $context = 'set' ) {
759
-		$errors = false;
760
-
761
-		foreach ( $props as $prop => $value ) {
762
-			try {
763
-				/**
764
-				 * Checks if the prop being set is allowed, and the value is not null.
765
-				 */
766
-				if ( is_null( $value ) || in_array( $prop, array( 'prop', 'date_prop', 'meta_data' ), true ) ) {
767
-					continue;
768
-				}
769
-				$setter = "set_$prop";
770
-
771
-				if ( is_callable( array( $this, $setter ) ) ) {
772
-					$this->{$setter}( $value );
773
-				}
774
-			} catch ( Exception $e ) {
775
-				if ( ! $errors ) {
776
-					$errors = new WP_Error();
777
-				}
778
-				$errors->add( $e->getCode(), $e->getMessage() );
779
-				$this->last_error = $e->getMessage();
780
-			}
781
-		}
782
-
783
-		return $errors && count( $errors->get_error_codes() ) ? $errors : true;
784
-	}
785
-
786
-	/**
787
-	 * Sets a prop for a setter method.
788
-	 *
789
-	 * This stores changes in a special array so we can track what needs saving
790
-	 * the the DB later.
791
-	 *
792
-	 * @since 1.0.19
793
-	 * @param string $prop Name of prop to set.
794
-	 * @param mixed  $value Value of the prop.
795
-	 */
796
-	protected function set_prop( $prop, $value ) {
797
-		if ( array_key_exists( $prop, $this->data ) ) {
798
-			if ( true === $this->object_read ) {
799
-				if ( $value !== $this->data[ $prop ] || array_key_exists( $prop, $this->changes ) ) {
800
-					$this->changes[ $prop ] = $value;
801
-				}
802
-			} else {
803
-				$this->data[ $prop ] = $value;
804
-			}
805
-		}
806
-	}
807
-
808
-	/**
809
-	 * Return data changes only.
810
-	 *
811
-	 * @since 1.0.19
812
-	 * @return array
813
-	 */
814
-	public function get_changes() {
815
-		return $this->changes;
816
-	}
817
-
818
-	/**
819
-	 * Merge changes with data and clear.
820
-	 *
821
-	 * @since 1.0.19
822
-	 */
823
-	public function apply_changes() {
824
-		$this->data    = array_replace( $this->data, $this->changes );
825
-		$this->changes = array();
826
-	}
827
-
828
-	/**
829
-	 * Prefix for action and filter hooks on data.
830
-	 *
831
-	 * @since  1.0.19
832
-	 * @return string
833
-	 */
834
-	protected function get_hook_prefix() {
835
-		return 'wpinv_get_' . $this->object_type . '_';
836
-	}
837
-
838
-	/**
839
-	 * Gets a prop for a getter method.
840
-	 *
841
-	 * Gets the value from either current pending changes, or the data itself.
842
-	 * Context controls what happens to the value before it's returned.
843
-	 *
844
-	 * @since  1.0.19
845
-	 * @param  string $prop Name of prop to get.
846
-	 * @param  string $context What the value is for. Valid values are view and edit.
847
-	 * @return mixed
848
-	 */
849
-	protected function get_prop( $prop, $context = 'view' ) {
850
-		$value = null;
851
-
852
-		if ( array_key_exists( $prop, $this->data ) ) {
853
-			$value = array_key_exists( $prop, $this->changes ) ? $this->changes[ $prop ] : $this->data[ $prop ];
854
-
855
-			if ( 'view' === $context ) {
856
-				$value = apply_filters( $this->get_hook_prefix() . $prop, $value, $this );
857
-			}
858
-		}
859
-
860
-		return $value;
861
-	}
862
-
863
-	/**
864
-	 * Sets a date prop whilst handling formatting and datetime objects.
865
-	 *
866
-	 * @since 1.0.19
867
-	 * @param string         $prop Name of prop to set.
868
-	 * @param string|integer $value Value of the prop.
869
-	 */
870
-	protected function set_date_prop( $prop, $value ) {
871
-
872
-		if ( empty( $value ) ) {
873
-			$this->set_prop( $prop, null );
874
-			return;
875
-		}
876
-		$this->set_prop( $prop, $value );
877
-
878
-	}
879
-
880
-	/**
881
-	 * When invalid data is found, throw an exception unless reading from the DB.
882
-	 *
883
-	 * @since 1.0.19
884
-	 * @param string $code             Error code.
885
-	 * @param string $message          Error message.
886
-	 */
887
-	protected function error( $code, $message ) {
888
-		$this->last_error = $message;
889
-	}
890
-
891
-	/**
892
-	 * Checks if the object is saved in the database
893
-	 *
894
-	 * @since 1.0.19
895
-	 * @return bool
896
-	 */
897
-	public function exists() {
898
-		$id = $this->get_id();
899
-		return ! empty( $id );
900
-	}
708
+        $this->set_prop( 'status', $status );
709
+
710
+        return array(
711
+            'from' => $old_status,
712
+            'to'   => $status,
713
+        );
714
+    }
715
+
716
+    /**
717
+     * Set all props to default values.
718
+     *
719
+     * @since 1.0.19
720
+     */
721
+    public function set_defaults() {
722
+        $this->data    = $this->default_data;
723
+        $this->changes = array();
724
+        $this->set_object_read( false );
725
+    }
726
+
727
+    /**
728
+     * Set object read property.
729
+     *
730
+     * @since 1.0.19
731
+     * @param boolean $read Should read?.
732
+     */
733
+    public function set_object_read( $read = true ) {
734
+        $this->object_read = (bool) $read;
735
+    }
736
+
737
+    /**
738
+     * Get object read property.
739
+     *
740
+     * @since  1.0.19
741
+     * @return boolean
742
+     */
743
+    public function get_object_read() {
744
+        return (bool) $this->object_read;
745
+    }
746
+
747
+    /**
748
+     * Set a collection of props in one go, collect any errors, and return the result.
749
+     * Only sets using public methods.
750
+     *
751
+     * @since  1.0.19
752
+     *
753
+     * @param array  $props Key value pairs to set. Key is the prop and should map to a setter function name.
754
+     * @param string $context In what context to run this.
755
+     *
756
+     * @return bool|WP_Error
757
+     */
758
+    public function set_props( $props, $context = 'set' ) {
759
+        $errors = false;
760
+
761
+        foreach ( $props as $prop => $value ) {
762
+            try {
763
+                /**
764
+                 * Checks if the prop being set is allowed, and the value is not null.
765
+                 */
766
+                if ( is_null( $value ) || in_array( $prop, array( 'prop', 'date_prop', 'meta_data' ), true ) ) {
767
+                    continue;
768
+                }
769
+                $setter = "set_$prop";
770
+
771
+                if ( is_callable( array( $this, $setter ) ) ) {
772
+                    $this->{$setter}( $value );
773
+                }
774
+            } catch ( Exception $e ) {
775
+                if ( ! $errors ) {
776
+                    $errors = new WP_Error();
777
+                }
778
+                $errors->add( $e->getCode(), $e->getMessage() );
779
+                $this->last_error = $e->getMessage();
780
+            }
781
+        }
782
+
783
+        return $errors && count( $errors->get_error_codes() ) ? $errors : true;
784
+    }
785
+
786
+    /**
787
+     * Sets a prop for a setter method.
788
+     *
789
+     * This stores changes in a special array so we can track what needs saving
790
+     * the the DB later.
791
+     *
792
+     * @since 1.0.19
793
+     * @param string $prop Name of prop to set.
794
+     * @param mixed  $value Value of the prop.
795
+     */
796
+    protected function set_prop( $prop, $value ) {
797
+        if ( array_key_exists( $prop, $this->data ) ) {
798
+            if ( true === $this->object_read ) {
799
+                if ( $value !== $this->data[ $prop ] || array_key_exists( $prop, $this->changes ) ) {
800
+                    $this->changes[ $prop ] = $value;
801
+                }
802
+            } else {
803
+                $this->data[ $prop ] = $value;
804
+            }
805
+        }
806
+    }
807
+
808
+    /**
809
+     * Return data changes only.
810
+     *
811
+     * @since 1.0.19
812
+     * @return array
813
+     */
814
+    public function get_changes() {
815
+        return $this->changes;
816
+    }
817
+
818
+    /**
819
+     * Merge changes with data and clear.
820
+     *
821
+     * @since 1.0.19
822
+     */
823
+    public function apply_changes() {
824
+        $this->data    = array_replace( $this->data, $this->changes );
825
+        $this->changes = array();
826
+    }
827
+
828
+    /**
829
+     * Prefix for action and filter hooks on data.
830
+     *
831
+     * @since  1.0.19
832
+     * @return string
833
+     */
834
+    protected function get_hook_prefix() {
835
+        return 'wpinv_get_' . $this->object_type . '_';
836
+    }
837
+
838
+    /**
839
+     * Gets a prop for a getter method.
840
+     *
841
+     * Gets the value from either current pending changes, or the data itself.
842
+     * Context controls what happens to the value before it's returned.
843
+     *
844
+     * @since  1.0.19
845
+     * @param  string $prop Name of prop to get.
846
+     * @param  string $context What the value is for. Valid values are view and edit.
847
+     * @return mixed
848
+     */
849
+    protected function get_prop( $prop, $context = 'view' ) {
850
+        $value = null;
851
+
852
+        if ( array_key_exists( $prop, $this->data ) ) {
853
+            $value = array_key_exists( $prop, $this->changes ) ? $this->changes[ $prop ] : $this->data[ $prop ];
854
+
855
+            if ( 'view' === $context ) {
856
+                $value = apply_filters( $this->get_hook_prefix() . $prop, $value, $this );
857
+            }
858
+        }
859
+
860
+        return $value;
861
+    }
862
+
863
+    /**
864
+     * Sets a date prop whilst handling formatting and datetime objects.
865
+     *
866
+     * @since 1.0.19
867
+     * @param string         $prop Name of prop to set.
868
+     * @param string|integer $value Value of the prop.
869
+     */
870
+    protected function set_date_prop( $prop, $value ) {
871
+
872
+        if ( empty( $value ) ) {
873
+            $this->set_prop( $prop, null );
874
+            return;
875
+        }
876
+        $this->set_prop( $prop, $value );
877
+
878
+    }
879
+
880
+    /**
881
+     * When invalid data is found, throw an exception unless reading from the DB.
882
+     *
883
+     * @since 1.0.19
884
+     * @param string $code             Error code.
885
+     * @param string $message          Error message.
886
+     */
887
+    protected function error( $code, $message ) {
888
+        $this->last_error = $message;
889
+    }
890
+
891
+    /**
892
+     * Checks if the object is saved in the database
893
+     *
894
+     * @since 1.0.19
895
+     * @return bool
896
+     */
897
+    public function exists() {
898
+        $id = $this->get_id();
899
+        return ! empty( $id );
900
+    }
901 901
 
902 902
 }
Please login to merge, or discard this patch.