PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.5.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.5.3
3.6.0 3.5.3 3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / includes / fields / class-evf-field-address.php
everest-forms / includes / fields Last commit date
class-evf-field-address.php 1 week ago class-evf-field-ai.php 1 year ago class-evf-field-captcha.php 2 months ago class-evf-field-checkbox.php 3 months ago class-evf-field-color.php 2 months ago class-evf-field-country.php 3 months ago class-evf-field-credit-card.php 2 months ago class-evf-field-date-time.php 2 months ago class-evf-field-divider.php 2 years ago class-evf-field-email.php 1 year ago class-evf-field-file-upload.php 1 year ago class-evf-field-first-name.php 1 year ago class-evf-field-hcaptcha.php 5 months ago class-evf-field-hidden.php 1 year ago class-evf-field-html.php 10 months ago class-evf-field-image-upload.php 1 year ago class-evf-field-last-name.php 1 year ago class-evf-field-likert.php 1 year ago class-evf-field-lookup.php 2 months ago class-evf-field-number.php 1 year ago class-evf-field-password.php 2 months ago class-evf-field-payment-authorize-net.php 2 months ago class-evf-field-payment-checkbox.php 2 months ago class-evf-field-payment-coupon.php 2 months ago class-evf-field-payment-gateway-selector.php 2 months ago class-evf-field-payment-quantity.php 2 months ago class-evf-field-payment-radio.php 2 months ago class-evf-field-payment-single.php 2 months ago class-evf-field-payment-square.php 2 years ago class-evf-field-payment-subscription-plan.php 2 months ago class-evf-field-payment-subtotal.php 2 months ago class-evf-field-payment-total.php 2 months ago class-evf-field-phone.php 1 year ago class-evf-field-privacy-policy.php 3 months ago class-evf-field-private-note.php 1 year ago class-evf-field-progress.php 2 months ago class-evf-field-radio.php 3 months ago class-evf-field-range-slider.php 2 months ago class-evf-field-rating.php 3 months ago class-evf-field-recaptcha.php 5 months ago class-evf-field-repeater.php 2 months ago class-evf-field-reset.php 2 months ago class-evf-field-scale-rating.php 1 year ago class-evf-field-select.php 1 year ago class-evf-field-signature.php 2 months ago class-evf-field-text.php 1 year ago class-evf-field-textarea.php 1 year ago class-evf-field-title.php 2 years ago class-evf-field-turnstile.php 5 months ago class-evf-field-url.php 1 year ago class-evf-field-wysiwyg.php 3 months ago class-evf-field-yes-no.php 1 year ago payment-amount-helpers.php 2 months ago
class-evf-field-address.php
1237 lines
1 <?php
2 /**
3 * Address text field.
4 *
5 * @package EverestForms\Fields
6 * @since 3.0.0
7 */
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * EVF_Field_Address Class.
13 */
14 class EVF_Field_Address extends EVF_Form_Fields {
15
16 /**
17 * Address schemes.
18 *
19 * @var array
20 */
21 public $schemes = array();
22
23 /**
24 * Constructor.
25 */
26 public function __construct() {
27 $this->name = esc_html__( 'Address', 'everest-forms' );
28 $this->type = 'address';
29 $this->icon = 'evf-icon evf-icon-map-marker';
30 $this->order = 110;
31 $this->group = 'advanced';
32 $this->settings = array(
33 'basic-options' => array(
34 'field_options' => array(
35 'label',
36 'description',
37 'required',
38 'required_field_message_setting',
39 'required_field_message',
40 ),
41 ),
42 'advanced-options' => array(
43 'field_options' => array(
44 'meta',
45 'address_1',
46 'address_2',
47 'city',
48 'state',
49 'postal',
50 'country',
51 'label_hide',
52 'sublabel_hide',
53 'enable_country_flag',
54 'css',
55 ),
56 ),
57 );
58
59 // Allow for additional or customizing address schemes.
60 $this->schemes = apply_filters(
61 'everest_forms_default_address_schemes',
62 array(
63 'address1_label' => esc_html__( 'Address Line 1', 'everest-forms' ),
64 'address2_label' => esc_html__( 'Address Line 2', 'everest-forms' ),
65 'city_label' => esc_html__( 'City', 'everest-forms' ),
66 'postal_label' => esc_html__( 'Zip / Postal Code', 'everest-forms' ),
67 'state_label' => esc_html__( 'State / Province / Region', 'everest-forms' ),
68 'states' => evf_get_states(),
69 'country_label' => esc_html__( 'Country', 'everest-forms' ),
70 'countries' => evf_get_countries(),
71 )
72 );
73
74 parent::__construct();
75 }
76
77 /**
78 * Hook in tabs.
79 */
80 public function init_hooks() {
81 add_filter( 'everest_forms_field_properties_' . $this->type, array( $this, 'field_properties' ), 5, 3 );
82 add_filter( 'everest_forms_field_exporter_' . $this->type, array( $this, 'field_exporter' ) );
83 }
84
85 /**
86 * Enable country flag field option.
87 *
88 * @param array $field Field Data.
89 */
90 public function enable_country_flag( $field ) {
91 $value = isset( $field['enable_country_flag'] ) ? $field['enable_country_flag'] : '0';
92 $tooltip = esc_html__( 'Check this option to show country flag.', 'everest-forms' );
93
94 // Enabled country flag.
95 $enable_country_flag = $this->field_element(
96 'toggle',
97 $field,
98 array(
99 'slug' => 'enable_country_flag',
100 'value' => $value,
101 'desc' => esc_html__( 'Enable Country Flag', 'everest-forms' ),
102 'tooltip' => $tooltip,
103 ),
104 false
105 );
106 $this->field_element(
107 'row',
108 $field,
109 array(
110 'slug' => 'enable_country_flag',
111 'content' => $enable_country_flag,
112 )
113 );
114 }
115
116 /**
117 * Field options address line 1.
118 *
119 * @param array $field Field Data.
120 */
121 public function address_1( $field ) {
122 $address1_placeholder = ! empty( $field['address1_placeholder'] ) ? esc_attr( $field['address1_placeholder'] ) : '';
123 $address1_default = ! empty( $field['address1_default'] ) ? esc_attr( $field['address1_default'] ) : '';
124 $address1_hide = ! empty( $field['address1_hide'] ) ? true : false;
125 $address1_label = ! empty( $field['address1_label'] ) ? esc_attr( $field['address1_label'] ) : $this->schemes['address1_label'];
126
127 // Address Line 1.
128 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-address1" id="everest-forms-field-option-row-%1$s-address1" data-subfield="address-1" data-field-id="%1$s">', esc_attr( $field['id'] ) );
129 $slug = 'address1_label';
130 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
131 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
132
133 $output = $this->field_element(
134 'text',
135 $field,
136 array(
137 'slug' => $slug,
138 'value' => $address1_label,
139 'placeholder' => $this->schemes['address1_label'],
140 'class' => 'sync-input label-edit-input everest-forms-hidden',
141 'data' => array(
142 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
143 'label' => sprintf( '.%s', $label_class ),
144 ),
145 ),
146 false
147 );
148 $output .= $this->field_element(
149 'label',
150 $field,
151 array(
152 'slug' => $slug,
153 'class' => $label_class . ' toggle-handle',
154 'value' => $address1_label,
155 'data' => array(
156 'label' => sprintf( '.%s', $label_class ),
157 'input' => $input_element_id,
158 ),
159 ),
160 false
161 );
162 $output .= $this->field_element(
163 'icon',
164 $field,
165 array(
166 'tooltip' => 'Edit Label',
167 'class' => 'toggle-handle ',
168 'data' => array(
169 'label' => sprintf( '.%s', $label_class ),
170 'input' => $input_element_id,
171 ),
172 ),
173 false
174 );
175 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
176 echo '<div class="placeholder">';
177 printf( '<input type="text" class="widefat placeholder" id="everest-forms-field-option-%1$s-address1_placeholder" name="form_fields[%1$s][address1_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $address1_placeholder ) );
178 printf( '<label for="everest-forms-field-option-%s-address1_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
179 echo '</div>';
180 echo '<div class="default">';
181 printf( '<input type="text" class="widefat default" id="everest-forms-field-option-%1$s-address1_default" name="form_fields[%1$s][address1_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $address1_default ) );
182 printf( '<label for="everest-forms-field-option-%s-address1_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
183 echo '</div>';
184 echo '<div class="hide">';
185 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][address1_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( true, $address1_hide, false ) );
186 echo '</div>';
187 echo '</div>';
188 }
189
190 /**
191 * Field options address line 2.
192 *
193 * @param array $field Field Data.
194 */
195 public function address_2( $field ) {
196 $address2_placeholder = ! empty( $field['address2_placeholder'] ) ? esc_attr( $field['address2_placeholder'] ) : '';
197 $address2_default = ! empty( $field['address2_default'] ) ? esc_attr( $field['address2_default'] ) : '';
198 $address2_hide = ! empty( $field['address2_hide'] ) ? true : false;
199 $address2_label = ! empty( $field['address2_label'] ) ? esc_attr( $field['address2_label'] ) : $this->schemes['address2_label'];
200
201 // Address Line 2.
202 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-address2" id="everest-forms-field-option-row-%1$s-address2" data-subfield="address-2" data-field-id="%1$s">', esc_attr( $field['id'] ) );
203 $slug = 'address2_label';
204 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
205 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
206
207 $output = $this->field_element(
208 'text',
209 $field,
210 array(
211 'slug' => $slug,
212 'value' => $address2_label,
213 'placeholder' => $this->schemes['address2_label'],
214 'class' => 'sync-input label-edit-input everest-forms-hidden',
215 'data' => array(
216 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
217 'label' => sprintf( '.%s', $label_class ),
218 ),
219 ),
220 false
221 );
222 $output .= $this->field_element(
223 'label',
224 $field,
225 array(
226 'slug' => $slug,
227 'class' => $label_class . ' toggle-handle',
228 'value' => $address2_label,
229 'data' => array(
230 'label' => sprintf( '.%s', $label_class ),
231 'input' => $input_element_id,
232 ),
233 ),
234 false
235 );
236 $output .= $this->field_element(
237 'icon',
238 $field,
239 array(
240 'tooltip' => 'Edit Label',
241 'class' => 'toggle-handle ',
242 'data' => array(
243 'label' => sprintf( '.%s', $label_class ),
244 'input' => $input_element_id,
245 ),
246 ),
247 false
248 );
249 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
250 echo '<div class="placeholder">';
251 printf( '<input type="text" class="widefat placeholder" id="everest-forms-field-option-%1$s-address2_placeholder" name="form_fields[%1$s][address2_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $address2_placeholder ) );
252 printf( '<label for="everest-forms-field-option-%s-address2_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
253 echo '</div>';
254 echo '<div class="default">';
255 printf( '<input type="text" class="widefat default" id="everest-forms-field-option-%1$s-address2_default" name="form_fields[%1$s][address2_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $address2_default ) );
256 printf( '<label for="everest-forms-field-option-%s-address2_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
257 echo '</div>';
258 echo '<div class="hide">';
259 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][address2_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( true, $address2_hide, false ) );
260 echo '</div>';
261 echo '</div>';
262 }
263
264 /**
265 * Field option for city.
266 *
267 * @param array $field Field Data.
268 */
269 public function city( $field ) {
270 $city_placeholder = ! empty( $field['city_placeholder'] ) ? esc_attr( $field['city_placeholder'] ) : '';
271 $city_default = ! empty( $field['city_default'] ) ? esc_attr( $field['city_default'] ) : '';
272 $city_hide = ! empty( $field['city_hide'] ) ? true : false;
273 $city_label = ! empty( $field['city_label'] ) ? esc_attr( $field['city_label'] ) : $this->schemes['city_label'];
274
275 // City.
276 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-city" id="everest-forms-field-option-row-%1$s-city" data-subfield="city" data-field-id="%1$s">', esc_attr( $field['id'] ) );
277 $slug = 'city_label';
278 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
279 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
280
281 $output = $this->field_element(
282 'text',
283 $field,
284 array(
285 'slug' => $slug,
286 'value' => $city_label,
287 'placeholder' => $this->schemes['city_label'],
288 'class' => 'sync-input label-edit-input everest-forms-hidden',
289 'data' => array(
290 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
291 'label' => sprintf( '.%s', $label_class ),
292 ),
293 ),
294 false
295 );
296 $output .= $this->field_element(
297 'label',
298 $field,
299 array(
300 'slug' => $slug,
301 'class' => $label_class . ' toggle-handle',
302 'value' => $city_label,
303 'data' => array(
304 'label' => sprintf( '.%s', $label_class ),
305 'input' => $input_element_id,
306 ),
307 ),
308 false
309 );
310 $output .= $this->field_element(
311 'icon',
312 $field,
313 array(
314 'tooltip' => 'Edit Label',
315 'class' => 'toggle-handle ',
316 'data' => array(
317 'label' => sprintf( '.%s', $label_class ),
318 'input' => $input_element_id,
319 ),
320 ),
321 false
322 );
323 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
324 echo '<div class="placeholder">';
325 printf( '<input type="text" class="widefat placeholder" id="everest-forms-field-option-%1$s-city_placeholder" name="form_fields[%1$s][city_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $city_placeholder ) );
326 printf( '<label for="everest-forms-field-option-%s-city_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
327 echo '</div>';
328 echo '<div class="default">';
329 printf( '<input type="text" class="widefat default" id="everest-forms-field-option-%1$s-city_default" name="form_fields[%1$s][city_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $city_default ) );
330 printf( '<label for="everest-forms-field-option-%s-city_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
331 echo '</div>';
332 echo '<div class="hide">';
333 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][city_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( true, $city_hide, false ) );
334 echo '</div>';
335 echo '</div>';
336 }
337
338 /**
339 * Field option for state/region.
340 *
341 * @param array $field Field Data.
342 */
343 public function state( $field ) {
344 $state_placeholder = ! empty( $field['state_placeholder'] ) ? esc_attr( $field['state_placeholder'] ) : '';
345 $state_default = ! empty( $field['state_default'] ) ? esc_attr( $field['state_default'] ) : '';
346 $state_hide = ! empty( $field['state_hide'] ) ? true : false;
347 $state_label = ! empty( $field['state_label'] ) ? esc_attr( $field['state_label'] ) : $this->schemes['state_label'];
348
349 // State/region.
350 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-state" id="everest-forms-field-option-row-%1$s-state" data-subfield="state" data-field-id="%1$s">', esc_attr( $field['id'] ) );
351 $slug = 'state_label';
352 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
353 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
354
355 $output = $this->field_element(
356 'text',
357 $field,
358 array(
359 'slug' => $slug,
360 'value' => $state_label,
361 'placeholder' => $this->schemes['state_label'],
362 'class' => 'sync-input label-edit-input everest-forms-hidden',
363 'data' => array(
364 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
365 'label' => sprintf( '.%s', $label_class ),
366 ),
367 ),
368 false
369 );
370 $output .= $this->field_element(
371 'label',
372 $field,
373 array(
374 'slug' => $slug,
375 'class' => $label_class . ' toggle-handle',
376 'value' => $state_label,
377 'data' => array(
378 'label' => sprintf( '.%s', $label_class ),
379 'input' => $input_element_id,
380 ),
381 ),
382 false
383 );
384 $output .= $this->field_element(
385 'icon',
386 $field,
387 array(
388 'tooltip' => 'Edit Label',
389 'class' => 'toggle-handle ',
390 'data' => array(
391 'label' => sprintf( '.%s', $label_class ),
392 'input' => $input_element_id,
393 ),
394 ),
395 false
396 );
397 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
398 echo '<div class="placeholder">';
399 printf( '<input type="text" class="widefat placeholder" id="everest-forms-field-option-%1$s-state_placeholder" name="form_fields[%1$s][state_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $state_placeholder ) );
400 printf( '<label for="everest-forms-field-option-%s-state_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
401 echo '</div>';
402 /**
403 * Commented this code for future use.
404 *
405 * @since 1.5.9
406 */
407 // echo '<div class="default">';
408 // printf( '<input type="text" class="widefat default" id="everest-forms-field-option-%1$s-state_default" name="form_fields[%1$s][state_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $state_default ) );
409 // printf( '<label for="everest-forms-field-option-%s-state_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
410 // echo '</div>';
411 echo '<div class="hide">';
412 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][state_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( true, $state_hide, false ) );
413 echo '</div>';
414 echo '</div>';
415 }
416
417 /**
418 * Field option for zip/postal code.
419 *
420 * @param array $field Field Data.
421 */
422 public function postal( $field ) {
423 $postal_placeholder = ! empty( $field['postal_placeholder'] ) ? esc_attr( $field['postal_placeholder'] ) : '';
424 $postal_default = ! empty( $field['postal_default'] ) ? esc_attr( $field['postal_default'] ) : '';
425 $postal_hide = ! empty( $field['postal_hide'] );
426 $postal_label = ! empty( $field['postal_label'] ) ? esc_attr( $field['postal_label'] ) : $this->schemes['postal_label'];
427
428 // ZIP/Postal.
429 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-postal" id="everest-forms-field-option-row-%1$s-postal" data-subfield="postal" data-field-id="%1$s">', esc_attr( $field['id'] ) );
430 $slug = 'postal_label';
431 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
432 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
433
434 $output = $this->field_element(
435 'text',
436 $field,
437 array(
438 'slug' => $slug,
439 'value' => $postal_label,
440 'placeholder' => $this->schemes['postal_label'],
441 'class' => 'sync-input label-edit-input everest-forms-hidden',
442 'data' => array(
443 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
444 'label' => sprintf( '.%s', $label_class ),
445 ),
446 ),
447 false
448 );
449 $output .= $this->field_element(
450 'label',
451 $field,
452 array(
453 'slug' => $slug,
454 'class' => $label_class . ' toggle-handle',
455 'value' => $postal_label,
456 'data' => array(
457 'label' => sprintf( '.%s', $label_class ),
458 'input' => $input_element_id,
459 ),
460 ),
461 false
462 );
463 $output .= $this->field_element(
464 'icon',
465 $field,
466 array(
467 'tooltip' => 'Edit Label',
468 'class' => 'toggle-handle ',
469 'data' => array(
470 'label' => sprintf( '.%s', $label_class ),
471 'input' => $input_element_id,
472 ),
473 ),
474 false
475 );
476 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
477 echo '<div class="placeholder">';
478 printf( '<input type="text" class="placeholder" id="everest-forms-field-option-%1$s-postal_placeholder" name="form_fields[%1$s][postal_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $postal_placeholder ) );
479 printf( '<label for="everest-forms-field-option-%s-postal_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
480 echo '</div>';
481 echo '<div class="default">';
482 printf( '<input type="text" class="default" id="everest-forms-field-option-%1$s-postal_default" name="form_fields[%1$s][postal_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $postal_default ) );
483 printf( '<label for="everest-forms-field-option-%s-postal_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
484 echo '</div>';
485 echo '<div class="hide">';
486 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][postal_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( true, $postal_hide, false ) );
487 echo '</div>';
488 echo '</div>';
489 }
490
491 /**
492 * Field option for country.
493 *
494 * @param array $field Field Data.
495 */
496 public function country( $field ) {
497 $country_placeholder = ! empty( $field['country_placeholder'] ) ? esc_attr( $field['country_placeholder'] ) : '';
498 $country_default = ! empty( $field['country_default'] ) ? esc_attr( $field['country_default'] ) : '';
499 $country_hide = ! empty( $field['country_hide'] ) ? true : false;
500 $country_label = ! empty( $field['country_label'] ) ? esc_attr( $field['country_label'] ) : $this->schemes['country_label'];
501 $selected_country = isset( $field['country_list'] ) ? $field['country_list'] : array();
502 $country = evf_get_countries();
503
504 // Country.
505 printf( '<div class="clearfix everest-forms-field-option-row everest-forms-field-option-row-country" id="everest-forms-field-option-row-%1$s-country" data-subfield="country" data-field-id="%1$s">', esc_attr( $field['id'] ) );
506 $slug = 'country_label';
507 $input_element_id = sprintf( '#everest-forms-field-option-%s-%s', $field['id'], $slug );
508 $label_class = sprintf( '%s-%s', $slug, $field['id'] );
509
510 $output = $this->field_element(
511 'text',
512 $field,
513 array(
514 'slug' => $slug,
515 'value' => $country_label,
516 'placeholder' => $this->schemes['country_label'],
517 'class' => 'sync-input label-edit-input everest-forms-hidden',
518 'data' => array(
519 'sync-targets' => sprintf( '.%s, .%s-preview', $label_class, $label_class ),
520 'label' => sprintf( '.%s', $label_class ),
521 ),
522 ),
523 false
524 );
525 $output .= $this->field_element(
526 'label',
527 $field,
528 array(
529 'slug' => $slug,
530 'class' => $label_class . ' toggle-handle',
531 'value' => $country_label,
532 'data' => array(
533 'label' => sprintf( '.%s', $label_class ),
534 'input' => $input_element_id,
535 ),
536 ),
537 false
538 );
539 $output .= $this->field_element(
540 'icon',
541 $field,
542 array(
543 'tooltip' => 'Edit Label',
544 'class' => 'toggle-handle ',
545 'data' => array(
546 'label' => sprintf( '.%s', $label_class ),
547 'input' => $input_element_id,
548 ),
549 ),
550 false
551 );
552 printf( '<div class="everest-forms-label-edit">%s</div>', $output ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
553 echo '<div class="placeholder">';
554 printf( '<input type="text" class="placeholder" id="everest-forms-field-option-%1$s-country_placeholder" name="form_fields[%1$s][country_placeholder]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $country_placeholder ) );
555 printf( '<label for="everest-forms-field-option-%s-country_placeholder" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Placeholder', 'everest-forms' ) );
556 echo '</div>';
557 echo '<div class="default">';
558 printf( '<select class="default" id="everest-forms-field-option-%1$s-country_default" name="form_fields[%1$s][country_default]" value="%2$s">', esc_attr( $field['id'] ), esc_attr( $country_default ) );
559 printf( '<option value=""></option>' );
560 foreach ( $country as $country_key => $country_label ) {
561 $select = false;
562
563 if ( ! empty( $country_default ) && ( $country_key === $country_default || $country_label === $country_default ) ) {
564 $select = true;
565 }
566
567 if ( ! in_array( $country_key, $selected_country, true ) && is_array( $selected_country ) && ! empty( $selected_country ) ) {
568 continue;
569 }
570
571 printf( '<option value="%s" %s>%s</option>', esc_attr( $country_key ), selected( $select, true, false ), esc_html( $country_label ) );
572 }
573 echo '</select>';
574 printf( '<label for="everest-forms-field-option-%s-country_default" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Value', 'everest-forms' ) );
575 echo '</div>';
576 echo '<div class="hide">';
577 printf( ' <input type="checkbox" class="hide" name="form_fields[%s][country_hide]" value="1" %s>', esc_attr( $field['id'] ), checked( '1', $country_hide, false ) );
578 echo '</div>';
579 echo '<div class="country-list">';
580 echo '<select class="country_list evf-select2-multiple" id="everest-forms-field-option-' . esc_attr( $field['id'] ) . '-country_list" name="form_fields[' . esc_attr( $field['id'] ) . '][country_list][]" data-select_all_unselect_all="1" data-placeholder="Select Country(s)" data-selected_msg="Selected %qty% Country(s)" multiple="" >';
581 foreach ( $country as $country_key => $country_label ) {
582 if ( is_array( $selected_country ) && ! empty( $selected_country ) ) {
583 printf( '<option value="%s" %s>%s</option>', esc_attr( $country_key ), selected( in_array( $country_key, $selected_country, true ), true, false ), $country_label );
584 } else {
585 printf( '<option value="%s" %s>%s</option>', esc_attr( $country_key ), selected( in_array( $country_key, array_keys( $country ), true ), true, false ), $country_label );
586 }
587 }
588 echo '</select>';
589 printf( '<label for="everest-forms-field-option-%s-country_list" class="sub-label">%s</label>', esc_attr( $field['id'] ), esc_html__( 'Default Country List', 'everest-forms' ) );
590 echo '</div>';
591 echo '</div>';
592 }
593
594 /**
595 * Define additional field properties.
596 *
597 * @since 1.0.0
598 *
599 * @param array $properties Field properties.
600 * @param array $field Field settings.
601 * @param array $form_data Form data and settings.
602 *
603 * @return array of additional field properties.
604 */
605 public function field_properties( $properties, $field, $form_data ) {
606 $form_id = absint( $form_data['id'] );
607 $field_id = $field['id'];
608
609 // Remove primary input.
610 unset( $properties['inputs']['primary'] );
611
612 // Properties shared by both core schemes.
613 $props = array(
614 'inputs' => array(
615 'address1' => array(
616 'attr' => array(
617 'name' => "everest_forms[form_fields][{$field_id}][address1]",
618 'value' => ! empty( $field['address1_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['address1_default'], $form_data ) : '',
619 'placeholder' => ! empty( $field['address1_placeholder'] ) ? $field['address1_placeholder'] : '',
620 ),
621 'block' => array(),
622 'class' => array(
623 'evf-field-address-address1',
624 ),
625 'data' => array(),
626 'hidden' => ! empty( $field['address1_hide'] ),
627 'id' => "evf-{$form_id}-field_{$field_id}",
628 'required' => ! empty( $field['required'] ) ? 'required' : '',
629 'sublabel' => array(
630 'hidden' => ! empty( $field['sublabel_hide'] ),
631 'value' => isset( $field['address1_label'] ) ? $field['address1_label'] : $this->schemes['address1_label'],
632 ),
633 ),
634 'address2' => array(
635 'attr' => array(
636 'name' => "everest_forms[form_fields][{$field_id}][address2]",
637 'value' => ! empty( $field['address2_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['address2_default'], $form_data ) : '',
638 'placeholder' => ! empty( $field['address2_placeholder'] ) ? $field['address2_placeholder'] : '',
639 ),
640 'block' => array(),
641 'class' => array(
642 'evf-field-address-address2',
643 ),
644 'data' => array(),
645 'hidden' => ! empty( $field['address2_hide'] ),
646 'id' => "evf-{$form_id}-field_{$field_id}-address2",
647 'required' => '',
648 'sublabel' => array(
649 'hidden' => ! empty( $field['sublabel_hide'] ),
650 'value' => isset( $field['address2_label'] ) ? $field['address2_label'] : $this->schemes['address2_label'],
651 ),
652 ),
653 'city' => array(
654 'attr' => array(
655 'name' => "everest_forms[form_fields][{$field_id}][city]",
656 'value' => ! empty( $field['city_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['city_default'], $form_data ) : '',
657 'placeholder' => ! empty( $field['city_placeholder'] ) ? $field['city_placeholder'] : '',
658 ),
659 'block' => array(
660 'evf-field-row-block',
661 'everest-forms-one-half',
662 'everest-forms-first',
663 ),
664 'class' => array(
665 'evf-field-address-city',
666 ),
667 'data' => array(),
668 'hidden' => ! empty( $field['city_hide'] ),
669 'id' => "evf-{$form_id}-field_{$field_id}-city",
670 'required' => ! empty( $field['required'] ) ? 'required' : '',
671 'sublabel' => array(
672 'hidden' => ! empty( $field['sublabel_hide'] ),
673 'value' => isset( $field['city_label'] ) ? $field['city_label'] : $this->schemes['city_label'],
674 ),
675 ),
676 'state' => array(
677 'attr' => array(
678 'name' => "everest_forms[form_fields][{$field_id}][state]",
679 'value' => ! empty( $field['state_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['state_default'], $form_data ) : apply_filters( 'everest_forms_state_default_value', '' ),
680 'placeholder' => ! empty( $field['state_placeholder'] ) ? $field['state_placeholder'] : '',
681 ),
682 'block' => array(
683 'evf-field-row-block',
684 'everest-forms-one-half',
685 ),
686 'class' => array(
687 'evf-field-address-state',
688 ),
689 'data' => array(),
690 'hidden' => ! empty( $field['state_hide'] ),
691 'id' => "evf-{$form_id}-field_{$field_id}-state",
692 'options' => isset( $this->schemes['states'] ) ? $this->schemes['states'] : array(),
693 'required' => ! empty( $field['required'] ) ? 'required' : '',
694 'sublabel' => array(
695 'hidden' => ! empty( $field['sublabel_hide'] ),
696 'value' => isset( $field['state_label'] ) ? $field['state_label'] : $this->schemes['state_label'],
697 ),
698 ),
699 'postal' => array(
700 'attr' => array(
701 'name' => "everest_forms[form_fields][{$field_id}][postal]",
702 'value' => ! empty( $field['postal_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['postal_default'], $form_data ) : '',
703 'placeholder' => ! empty( $field['postal_placeholder'] ) ? $field['postal_placeholder'] : '',
704 ),
705 'block' => array(
706 'evf-field-row-block',
707 'everest-forms-one-half',
708 'everest-forms-first',
709 ),
710 'class' => array(
711 'evf-field-address-postal',
712 ),
713 'data' => array(),
714 'hidden' => ! empty( $field['postal_hide'] ),
715 'id' => "evf-{$form_id}-field_{$field_id}-postal",
716 'required' => ! empty( $field['required'] ) ? 'required' : '',
717 'sublabel' => array(
718 'hidden' => ! empty( $field['sublabel_hide'] ),
719 'value' => isset( $field['postal_label'] ) ? $field['postal_label'] : $this->schemes['postal_label'],
720 ),
721 ),
722 'country' => array(
723 'attr' => array(
724 'name' => "everest_forms[form_fields][{$field_id}][country]",
725 'value' => ! empty( $field['country_default'] ) ? apply_filters( 'everest_forms_process_smart_tags', $field['country_default'], $form_data ) : '',
726 'placeholder' => ! empty( $field['country_placeholder'] ) ? $field['country_placeholder'] : '',
727 ),
728 'block' => array(
729 'evf-field-row-block',
730 'everest-forms-one-half',
731 ),
732 'class' => array(
733 'evf-field-address-country',
734 ),
735 'data' => array(),
736 'hidden' => ! empty( $field['country_hide'] ),
737 'id' => "evf-{$form_id}-field_{$field_id}-country",
738 'options' => isset( $this->schemes['countries'] ) ? $this->schemes['countries'] : array(),
739 'required' => ! empty( $field['required'] ) ? 'required' : '',
740 'sublabel' => array(
741 'hidden' => ! empty( $field['sublabel_hide'] ),
742 'value' => isset( $field['country_label'] ) ? $field['country_label'] : $this->schemes['country_label'],
743 ),
744 ),
745 ),
746 );
747 $properties = array_merge_recursive( $properties, $props );
748
749 // Input keys.
750 $input_keys = array( 'address1', 'address2', 'city', 'state', 'postal', 'country' );
751
752 // Add input error and required class if needed.
753 foreach ( $input_keys as $input_key ) {
754 // Input error class.
755 if ( ! empty( $properties['error']['value'][ $input_key ] ) ) {
756 $properties['inputs'][ $input_key ]['class'][] = 'evf-error';
757 }
758
759 // Input required class.
760 if ( ! empty( $properties['inputs'][ $input_key ]['required'] ) ) {
761 $properties['inputs'][ $input_key ]['class'][] = 'validate-required';
762 }
763 }
764
765 return $properties;
766 }
767
768 /**
769 * Filter callback for outputting formatted data.
770 *
771 * @param array $field Field Data.
772 */
773 public function field_exporter( $field ) {
774 $value = '';
775 $value .= ! empty( $field['address1'] ) ? $field['address1'] . ',<br>' : '';
776 $value .= ! empty( $field['address2'] ) ? $field['address2'] . ',<br>' : '';
777 $value .= ! empty( $field['city'] ) ? $field['city'] . ', ' : '';
778 $value .= isset( evf_get_states()[ $field['country'] ][ $field['state'] ] ) ? evf_get_states()[ $field['country'] ][ $field['state'] ] : $field['state'];
779 $value .= ! empty( $field['postal'] ) ? ' ' . $field['postal'] . ',<br>' : '';
780 $value .= ! empty( $field['country'] ) ? isset( evf_get_countries()[ $field['country'] ] ) ? evf_get_countries()[ $field['country'] ] : $field['country'] . '.' : '';
781
782 return array(
783 'label' => ! empty( $field['name'] ) ? $field['name'] : ucfirst( str_replace( '_', ' ', $field['type'] ) ) . " - {$field['id']}",
784 'value' => ! empty( $value ) ? $value : false,
785 );
786 }
787
788 /**
789 * Field preview inside the builder.
790 *
791 * @param array $field Field Data.
792 */
793 public function field_preview( $field ) {
794 $address1_placeholder = ! empty( $field['address1_placeholder'] ) ? esc_attr( $field['address1_placeholder'] ) : '';
795 $address1_label = ! empty( $field['address1_label'] ) ? esc_attr( $field['address1_label'] ) : $this->schemes['address1_label'];
796 $address1_hide = ! empty( $field['address1_hide'] ) ? 'hidden' : '';
797
798 $address2_placeholder = ! empty( $field['address2_placeholder'] ) ? esc_attr( $field['address2_placeholder'] ) : '';
799 $address2_label = ! empty( $field['address2_label'] ) ? esc_attr( $field['address2_label'] ) : $this->schemes['address2_label'];
800 $address2_hide = ! empty( $field['address2_hide'] ) ? 'hidden' : '';
801
802 $city_placeholder = ! empty( $field['city_placeholder'] ) ? esc_attr( $field['city_placeholder'] ) : '';
803 $city_label = ! empty( $field['city_label'] ) ? esc_attr( $field['city_label'] ) : $this->schemes['city_label'];
804 $city_hide = ! empty( $field['city_hide'] ) ? 'hidden' : '';
805
806 $state_placeholder = ! empty( $field['state_placeholder'] ) ? esc_attr( $field['state_placeholder'] ) : '';
807 $state_label = ! empty( $field['state_label'] ) ? esc_attr( $field['state_label'] ) : $this->schemes['state_label'];
808 $state_hide = ! empty( $field['state_hide'] ) ? 'hidden' : '';
809
810 $postal_placeholder = ! empty( $field['postal_placeholder'] ) ? esc_attr( $field['postal_placeholder'] ) : '';
811 $postal_label = ! empty( $field['postal_label'] ) ? esc_attr( $field['postal_label'] ) : $this->schemes['postal_label'];
812 $postal_hide = ! empty( $field['postal_hide'] ) ? 'hidden' : '';
813
814 $country_placeholder = ! empty( $field['country_placeholder'] ) ? esc_attr( $field['country_placeholder'] ) : '';
815 $country_label = ! empty( $field['country_label'] ) ? esc_attr( $field['country_label'] ) : $this->schemes['country_label'];
816 $country_default = ! empty( $field['country_default'] ) ? esc_attr( $field['country_default'] ) : '';
817 $country_hide = ! empty( $field['country_hide'] ) ? 'hidden' : '';
818
819 // Label.
820 $this->field_preview_option( 'label', $field );
821
822 // Field elements.
823 echo '<div class="everest-forms-address-scheme everest-forms-address-scheme-default">';
824
825 // Row 1 - Address Line 1.
826 printf( '<div class="everest-forms-field-row everest-forms-address-1 %s">', esc_attr( $address1_hide ) );
827 printf( '<input type="text" class="widefat" placeholder="%s" disabled>', esc_attr( $address1_placeholder ) );
828 printf( '<label class="everest-forms-sub-label address1_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $address1_label ) );
829 echo '</div>';
830
831 // Row 2 - Address Line 2.
832 printf( '<div class="everest-forms-field-row everest-forms-address-2 %s">', esc_attr( $address2_hide ) );
833 printf( '<input type="text" class="widefat" placeholder="%s" disabled>', esc_attr( $address2_placeholder ) );
834 printf( '<label class="everest-forms-sub-label address2_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $address2_label ) );
835 echo '</div>';
836
837 // Row 3 - City & State.
838 echo '<div class="everest-forms-field-row clearfix">';
839
840 // City.
841 printf( '<div class="everest-forms-city everest-forms-one-half %s">', esc_attr( $city_hide ) );
842 printf( '<input type="text" class="widefat" placeholder="%s" disabled>', esc_attr( $city_placeholder ) );
843 printf( '<label class="everest-forms-sub-label city_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $city_label ) );
844 echo '</div>';
845
846 // State / Providence / Region.
847 printf( '<div class="everest-forms-state everest-forms-one-half last %s">', esc_attr( $state_hide ) );
848 printf( '<input type="text" class="widefat" placeholder="%s" disabled>', esc_attr( $state_placeholder ) );
849 printf( '<label class="everest-forms-sub-label state_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $state_label ) );
850 echo '</div>';
851
852 echo '</div>';
853
854 // Row 4 - Zip & Country.
855 echo '<div class="everest-forms-field-row clearfix">';
856
857 // ZIP / Postal.
858 printf( '<div class="everest-forms-postal everest-forms-one-half %s">', esc_attr( $postal_hide ) );
859 printf( '<input type="text" class="widefat" placeholder="%s" disabled>', esc_attr( $postal_placeholder ) );
860 printf( '<label class="everest-forms-sub-label postal_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $postal_label ) );
861 echo '</div>';
862
863 // Country.
864 printf( '<div class="everest-forms-country everest-forms-one-half last %s">', esc_attr( $country_hide ) );
865 echo '<select class="widefat" disabled>';
866
867 if ( ! empty( $country_placeholder ) ) {
868 printf( '<option value="" class="placeholder" selected>%s</option>', esc_html( $country_placeholder ) );
869 }
870
871 if ( ! empty( $this->schemes['countries'] ) ) {
872 foreach ( $this->schemes['countries'] as $key => $country ) {
873 $select = false;
874 if ( ! empty( $country_default ) && ( $key === $country_default || $country === $country_default ) ) {
875 $select = true;
876 }
877
878 printf( '<option %s>%s</option>', selected( $select, true, false ), esc_html( $country ) );
879 }
880 }
881
882 echo '</select>';
883
884 printf( '<label class="everest-forms-sub-label country_label-%s-preview">%s</label>', esc_attr( $field['id'] ), esc_html( $country_label ) );
885
886 echo '</div>';
887
888 echo '</div>';
889
890 echo '</div>';
891
892 // Description.
893 $this->field_preview_option( 'description', $field );
894 }
895
896 /**
897 * Field display on the form front-end.
898 *
899 * @since 1.0.0
900 *
901 * @param array $field Field Data.
902 * @param array $field_atts Field attributes.
903 * @param array $form_data All Form Data.
904 */
905 public function field_display( $field, $field_atts, $form_data ) {
906 $address1 = ! empty( $field['properties']['inputs']['address1'] ) ? $field['properties']['inputs']['address1'] : array();
907 $address2 = ! empty( $field['properties']['inputs']['address2'] ) ? $field['properties']['inputs']['address2'] : array();
908 $city = ! empty( $field['properties']['inputs']['city'] ) ? $field['properties']['inputs']['city'] : array();
909 $state = ! empty( $field['properties']['inputs']['state'] ) ? $field['properties']['inputs']['state'] : array();
910 $postal = ! empty( $field['properties']['inputs']['postal'] ) ? $field['properties']['inputs']['postal'] : array();
911 $country = ! empty( $field['properties']['inputs']['country'] ) ? $field['properties']['inputs']['country'] : array();
912 $conditional_id = isset( $field['properties']['inputs']['primary']['attr']['conditional_id'] ) ? $field['properties']['inputs']['primary']['attr']['conditional_id'] : '';
913 $conditional_rules = isset( $field['properties']['inputs']['primary']['attr']['conditional_rules'] ) ? $field['properties']['inputs']['primary']['attr']['conditional_rules'] : '';
914 $readonly = isset( $field['properties']['inputs']['primary']['attr']['disabled'] ) ? $field['properties']['inputs']['primary']['attr']['disabled'] : '';
915 $autocomplete_address = isset( $field['autocomplete_address'] ) ? $field['autocomplete_address'] : '';
916 $current_location = get_option( 'everest_forms_google_map_current_location' );
917 $selected_country = isset( $field['country_list'] ) ? $field['country_list'] : array();
918
919 // Enable country flag.
920 if ( empty( $postal['hidden'] ) && isset( $field['enable_country_flag'] ) ) {
921 $country['class'][] = esc_attr( 'evf-country-flag-selector' );
922 }
923 printf(
924 '<input id="%s" type="hidden" class="input-text evf-conditional-logic-holder" conditional_rules="%s" conditional_id="%s" />',
925 esc_attr( $field['id'] ),
926 esc_attr( $conditional_rules ),
927 esc_attr( $conditional_id )
928 );
929
930 do_action( 'everest_forms_map_field_display', $field, $field_atts, $form_data );
931 if ( 'yes' === $current_location ) {
932 printf(
933 '<div class="evf-addrres-geo-location" data-current-location=%s></div>',
934 esc_attr( $current_location )
935 );
936 }
937
938 if ( empty( $address1['hidden'] ) ) {
939 // Row wrapper.
940 echo '<div class="everest-forms-field-row" >';
941
942 // Address Line 1.
943 echo '<div ' . evf_html_attributes( false, $address1['block'] ) . '>';
944 $this->field_display_sublabel( 'address1', 'before', $field );
945 printf(
946 '<input type="text" %s %s %s %s>',
947 evf_html_attributes( $address1['id'], $address1['class'], $address1['data'], $address1['attr'] ),
948 esc_attr( $address1['required'] ),
949 esc_attr( $readonly ),
950 isset( $field['address_style'] ) && 'address' === $field['address_style'] && $autocomplete_address ? 'data-address ="' . esc_attr( $field['address_style'] ) . '"' : ''
951 );
952 $this->field_display_sublabel( 'address1', 'after', $field );
953 $this->field_display_error( 'address1', $field );
954 echo '</div>';
955
956 echo '</div>';
957 }
958
959 if ( isset( $field['address_style'] ) && 'map' === $field['address_style'] ) {
960 return;
961 }
962
963 if ( empty( $address2['hidden'] ) ) {
964
965 // Row wrapper.
966 echo '<div class="everest-forms-field-row">';
967
968 // Address Line 2.
969 echo '<div ' . evf_html_attributes( false, $address2['block'] ) . ' >';
970 $this->field_display_sublabel( 'address2', 'before', $field );
971 printf(
972 '<input type="text" %s %s %s>',
973 evf_html_attributes( $address2['id'], $address2['class'], $address2['data'], $address2['attr'] ),
974 esc_attr( $address2['required'] ),
975 esc_attr( $readonly )
976 );
977 $this->field_display_sublabel( 'address2', 'after', $field );
978 $this->field_display_error( 'address2', $field );
979 echo '</div>';
980
981 echo '</div>';
982 }
983
984 // Only render this row if we have at least one of the items.
985 if ( empty( $city['hidden'] ) || empty( $state['hidden'] ) ) {
986
987 // Row wrapper.
988 echo '<div class="everest-forms-field-row">';
989
990 // City.
991 if ( empty( $city['hidden'] ) ) {
992 echo '<div ' . evf_html_attributes( false, $city['block'] ) . '>';
993 $this->field_display_sublabel( 'city', 'before', $field );
994 printf(
995 '<input type="text" %s %s %s>',
996 evf_html_attributes( $city['id'], $city['class'], $city['data'], $city['attr'] ),
997 esc_attr( $city['required'] ),
998 esc_attr( $readonly )
999 );
1000 $this->field_display_sublabel( 'city', 'after', $field );
1001 $this->field_display_error( 'city', $field );
1002 echo '</div>';
1003 }
1004
1005 // state.
1006 if ( isset( $state['options'] ) && empty( $state['hidden'] ) ) {
1007
1008 echo '<div ' . evf_html_attributes( false, $state['block'] ) . '>';
1009 $this->field_display_sublabel( 'state', 'before', $field );
1010 printf(
1011 '<span class="%s">',
1012 esc_attr( $state['id'] )
1013 );
1014 $country_options = ! empty( $country['attr']['value'] ) ? $country['attr']['value'] : 'AF';
1015 $state_options = isset( $state['options'][ $country_options ] ) ? $state['options'][ $country_options ] : '';
1016
1017 if ( isset( $state_options ) && ! empty( $state_options ) ) {
1018 printf(
1019 '<select %s %s %s>',
1020 evf_html_attributes( $state['id'], $state['class'], $state['data'], $state['attr'] ),
1021 esc_attr( $state['required'] ),
1022 esc_attr( $readonly )
1023 );
1024 if ( ! empty( $state['attr']['placeholder'] ) && empty( $state['attr']['value'] ) ) {
1025 printf( '<option class="placeholder" value="" selected disabled>%s</option>', esc_html( $state['attr']['placeholder'] ) );
1026 }
1027
1028 foreach ( $state_options as $state_key => $state_label ) {
1029 $select = false;
1030 if ( ! empty( $state['attr']['value'] ) && ( $state_key === $state['attr']['value'] || $state_label === $state['attr']['value'] ) ) {
1031 $select = true;
1032 }
1033 printf( '<option value="%s" %s>%s</option>', esc_attr( $state_key ), selected( $select, true, false ), esc_html( $state_label ) );
1034 }
1035 echo '</select>';
1036 } else {
1037 printf(
1038 '<input type="text" %s %s %s>',
1039 evf_html_attributes( $state['id'], $state['class'], $state['data'], $state['attr'] ),
1040 esc_attr( $state['required'] ),
1041 esc_attr( $readonly )
1042 );
1043 }
1044 echo '</span>';
1045 $this->field_display_sublabel( 'state', 'after', $field );
1046 $this->field_display_error( 'state', $field );
1047 echo '</div>';
1048 }
1049
1050 echo '</div>';
1051 }
1052
1053 // Only render this row if we have at least one of the items.
1054 if ( empty( $postal['hidden'] ) || empty( $country['hidden'] ) ) {
1055
1056 // Row wrapper.
1057 echo '<div class="everest-forms-field-row">';
1058
1059 // Postal.
1060 if ( empty( $postal['hidden'] ) ) {
1061 echo '<div ' . evf_html_attributes( false, $postal['block'] ) . '>';
1062 $this->field_display_sublabel( 'postal', 'before', $field );
1063 printf(
1064 '<input type="text" %s %s %s>',
1065 evf_html_attributes( $postal['id'], $postal['class'], $postal['data'], $postal['attr'] ),
1066 esc_attr( $postal['required'] ),
1067 esc_attr( $readonly )
1068 );
1069 $this->field_display_sublabel( 'postal', 'after', $field );
1070 $this->field_display_error( 'postal', $field );
1071 echo '</div>';
1072 }
1073
1074 // Country.
1075 if ( isset( $country['options'] ) && empty( $country['hidden'] ) ) {
1076 echo '<div ' . evf_html_attributes( false, $country['block'] ) . '>';
1077 $this->field_display_sublabel( 'country', 'before', $field );
1078 printf(
1079 '<select %s %s %s>',
1080 evf_html_attributes( $country['id'], $country['class'], $country['data'], $country['attr'] ),
1081 esc_attr( $country['required'] ),
1082 esc_attr( $readonly )
1083 );
1084 if ( ! empty( $country['attr']['placeholder'] ) && empty( $country['attr']['value'] ) ) {
1085 printf( '<option class="placeholder" value="" selected disabled>%s</option>', esc_html( $country['attr']['placeholder'] ) );
1086 }
1087 foreach ( $country['options'] as $country_key => $country_label ) {
1088 $select = false;
1089 if ( ! empty( $country['attr']['value'] ) && ( $country_key === $country['attr']['value'] || $country_label === $country['attr']['value'] ) ) {
1090 $select = true;
1091 }
1092
1093 if ( ! in_array( $country_key, $selected_country, true ) && is_array( $selected_country ) && ! empty( $selected_country ) ) {
1094 continue;
1095 }
1096
1097 printf( '<option value="%s" %s>%s</option>', esc_attr( $country_key ), selected( $select, true, false ), esc_html( $country_label ) );
1098 }
1099 echo '</select>';
1100
1101 $this->field_display_sublabel( 'country', 'after', $field );
1102 $this->field_display_error( 'country', $field );
1103 echo '</div>';
1104 }
1105
1106 echo '</div>';
1107 }
1108 }
1109
1110 /**
1111 * Edit form field display on the entry back-end.
1112 *
1113 * @since 1.7.0
1114 *
1115 * @param array $entry_field Entry field data.
1116 * @param array $field Field data.
1117 * @param array $form_data Form data and settings.
1118 */
1119 public function edit_form_field_display( $entry_field, $field, $form_data ) {
1120 $input_keys = array( 'address1', 'address2', 'city', 'state', 'postal', 'country' );
1121
1122 foreach ( $input_keys as $input_key ) {
1123 if ( isset( $entry_field[ $input_key ] ) ) {
1124 $field['properties'] = $this->get_single_field_property_value( $entry_field[ $input_key ], $input_key, $field['properties'], $field );
1125 }
1126 }
1127
1128 $this->field_display( $field, null, $form_data );
1129 }
1130
1131 /**
1132 * Validates field on form submit.
1133 *
1134 * @param string $field_id Field Id.
1135 * @param array $field_submit Submitted Data.
1136 * @param array $form_data All Form Data.
1137 */
1138 public function validate( $field_id, $field_submit, $form_data ) {
1139 $form_id = $form_data['id'];
1140 $required_message = isset( $form_data['form_fields'][ $field_id ]['required-field-message'], $form_data['form_fields'][ $field_id ]['required_field_message_setting'] ) && ! empty( $form_data['form_fields'][ $field_id ]['required-field-message'] ) && 'individual' == $form_data['form_fields'][ $field_id ]['required_field_message_setting'] ? $form_data['form_fields'][ $field_id ]['required-field-message'] : get_option( 'everest_forms_required_validation' );
1141
1142 $entry = isset( $form_data['entry'] ) ? $form_data['entry'] : array();
1143 $visible = apply_filters( 'everest_forms_visible_fields', true, $form_data['form_fields'][ $field_id ], $entry, $form_data );
1144
1145 if ( false === $visible ) {
1146 return;
1147 }
1148
1149 // Extended required validation needed for the different address fields.
1150 if ( ! empty( $form_data['form_fields'][ $field_id ]['required'] ) ) {
1151
1152 // Require Address Line 1.
1153 if ( empty( $form_data['form_fields'][ $field_id ]['address1_hide'] ) && empty( $field_submit['address1'] ) ) {
1154 evf()->task->errors[ $form_id ][ $field_id ]['address1'] = $required_message;
1155 update_option( 'evf_validation_error', 'yes' );
1156 }
1157
1158 if ( isset( $form_data['form_fields'][ $field_id ]['address_style'] ) && 'map' === $form_data['form_fields'][ $field_id ]['address_style'] ) {
1159 return;
1160 }
1161
1162 // Require City.
1163 if ( empty( $form_data['form_fields'][ $field_id ]['city_hide'] ) && isset( $this->schemes['city_label'] ) && empty( $field_submit['city'] ) ) {
1164 evf()->task->errors[ $form_id ][ $field_id ]['city'] = $required_message;
1165 update_option( 'evf_validation_error', 'yes' );
1166 }
1167
1168 // Required State.
1169 if ( empty( $form_data['form_fields'][ $field_id ]['state_hide'] ) && isset( $this->schemes['states'] ) && empty( $field_submit['state'] ) ) {
1170 evf()->task->errors[ $form_id ][ $field_id ]['state'] = $required_message;
1171
1172 update_option( 'evf_validation_error', 'yes' );
1173 }
1174
1175 // Require ZIP/Postal.
1176 if ( empty( $form_data['form_fields'][ $field_id ]['postal_hide'] ) && isset( $this->schemes['postal_label'] ) && empty( $field_submit['postal'] ) ) {
1177 evf()->task->errors[ $form_id ][ $field_id ]['postal'] = $required_message;
1178 update_option( 'evf_validation_error', 'yes' );
1179 }
1180
1181 // Required Country.
1182 if ( empty( $form_data['form_fields'][ $field_id ]['country_hide'] ) && isset( $this->schemes['countries'] ) && empty( $field_submit['country'] ) ) {
1183 evf()->task->errors[ $form_id ][ $field_id ]['country'] = $required_message;
1184 update_option( 'evf_validation_error', 'yes' );
1185 }
1186 }
1187 }
1188
1189 /**
1190 * Formats and sanitizes field.
1191 *
1192 * @param string $field_id Field Id.
1193 * @param array $field_submit Submitted Field.
1194 * @param array $form_data All Form Data.
1195 * @param string $meta_key Field Meta Key.
1196 */
1197 public function format( $field_id, $field_submit, $form_data, $meta_key ) {
1198 $name = ! empty( $form_data['form_fields'][ $field_id ]['label'] ) ? $form_data['form_fields'][ $field_id ]['label'] : '';
1199 $address1 = ! empty( $field_submit['address1'] ) ? $field_submit['address1'] : '';
1200 $address2 = ! empty( $field_submit['address2'] ) ? $field_submit['address2'] : '';
1201 $city = ! empty( $field_submit['city'] ) ? $field_submit['city'] : '';
1202 $state = ! empty( $field_submit['state'] ) ? $field_submit['state'] : '';
1203 $postal = ! empty( $field_submit['postal'] ) ? $field_submit['postal'] : '';
1204 $country = ! empty( $field_submit['country'] ) ? $field_submit['country'] : '';
1205
1206 $value = '';
1207 $value .= ! empty( $address1 ) ? "$address1\n" : '';
1208 $value .= ! empty( $address2 ) ? "$address2\n" : '';
1209 if ( ! empty( $city ) && ! empty( $state ) ) {
1210 $value .= "$city, $state\n";
1211 } elseif ( ! empty( $state ) ) {
1212 $value .= "$state\n";
1213 } elseif ( ! empty( $city ) ) {
1214 $value .= "$city\n";
1215 }
1216 $value .= ! empty( $postal ) ? "$postal\n" : '';
1217 $value .= ! empty( $country ) ? "$country\n" : '';
1218 $value = evf_sanitize_textarea_field( $value );
1219
1220 evf()->task->form_fields[ $field_id ] = array(
1221 'name' => make_clickable( $name ),
1222 'value' => $value,
1223 'id' => $field_id,
1224 'type' => $this->type,
1225 'address1' => sanitize_text_field( $address1 ),
1226 'address2' => sanitize_text_field( $address2 ),
1227 'city' => sanitize_text_field( $city ),
1228 'state' => sanitize_text_field( $state ),
1229 'postal' => sanitize_text_field( $postal ),
1230 'country' => sanitize_text_field( $country ),
1231 'meta_key' => $meta_key,
1232 );
1233 }
1234
1235
1236 }
1237