PluginProbe
Property Hive / 2.2.3
Property Hive v2.2.3
2.3.0 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 1.4.46 1.4.47 1.4.48 1.4.49 1.4.5 1.4.50 1.4.51 1.4.52 1.4.53 1.4.54 1.4.55 1.4.56 1.4.57 1.4.58 1.4.59 1.4.6 1.4.60 1.4.61 1.4.62 All 260 releases
propertyhive / includes / ph-form-functions.php

ph-form-functions.php in Property Hive 2.2.3, at includes/ph-form-functions.php

1,751 lines 70.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * PropertyHive Form Functions
4 *
5 * Functions related to drawing forms on the frontend.
6 *
7 * @author PropertyHive
8 * @category Core
9 * @package PropertyHive/Functions
10 * @version 1.0.0
11 */
12
13 /**
14 * Main function for drawing entire property search form. We give the ability for an ID to be passed so differently formatted forms can be used
15 * (ie. a homepage search form might be different from a search form on search results)
16 *
17 * @param string $id
18 * @return void
19 */
20 function ph_get_search_form( $id = 'default' ) {
21
22 $form_controls = ph_get_search_form_fields();
23
24 $form_controls = apply_filters( 'propertyhive_search_form_fields_' . $id, $form_controls );
25 $form_controls = apply_filters( 'propertyhive_search_form_fields', $form_controls );
26
27 // We 100% need department so make sure it exists. If it doesn't, set a hidden field
28 if ( !isset($form_controls['department']) )
29 {
30 $original_form_controls = ph_get_search_form_fields();
31 $original_department = $original_form_controls['department'];
32 $original_department['type'] = 'hidden';
33
34 $form_controls['department'] = $original_department;
35 }
36
37 // append hidden order and view fields so these are maintained should a new search be performed
38 foreach ( $_REQUEST as $key => $value )
39 {
40 if ( isset($form_controls[$key]) )
41 continue;
42
43 if ( $key == 'officeID' && isset($form_controls['office']) )
44 continue;
45
46 if ( $key == 'paged' )
47 continue;
48
49 if (
50 ( $key == 'minimum_price' || $key == 'maximum_price' ) && array_key_exists('price_slider', $form_controls) ||
51 ( $key == 'minimum_rent' || $key == 'maximum_rent' ) && array_key_exists('rent_slider', $form_controls) ||
52 ( $key == 'minimum_bedrooms' || $key == 'maximum_bedrooms' ) && array_key_exists('bedrooms_slider', $form_controls)
53 )
54 continue;
55
56 // we've received a field that isn't a standard form control so let's store it in a hidden field so it's not lost
57 if ( is_array($value) )
58 {
59 foreach ( $value as $i => $val )
60 {
61 $form_controls[$key . '-' . $i] = array('type' => 'hidden', 'name' => $key . '[]', 'value' => stripslashes( ph_clean( $val) ));
62 }
63 }
64 else
65 {
66 $form_controls[$key] = array('type' => 'hidden', 'value' => stripslashes( ph_clean( $value) ));
67 }
68 }
69
70 $form_controls = apply_filters( 'propertyhive_search_form_fields_after_' . $id, $form_controls );
71 $form_controls = apply_filters( 'propertyhive_search_form_fields_after', $form_controls );
72
73 ph_get_template( 'global/search-form.php', array( 'form_controls' => $form_controls, 'id' => $id ) );
74
75 }
76
77 /**
78 * Get default fields to be shown on search forms
79 *
80 * @return array
81 */
82 function ph_get_search_form_fields()
83 {
84 $fields = array();
85
86 $departments = ph_get_departments();
87
88 $department_options = array();
89 $default_value = '';
90
91 foreach ( $departments as $key => $value )
92 {
93 if ( get_option( 'propertyhive_active_departments_' . str_replace("residential-", "", $key) ) == 'yes' )
94 {
95 $department_options[$key] = $value;
96
97 if ($default_value == '' && get_option( 'propertyhive_primary_department' ) == $key )
98 {
99 $default_value = $key;
100 }
101 }
102 }
103
104 $sales_department_active = false;
105 if ( array_key_exists('residential-sales', $departments) )
106 {
107 $sales_department_active = true;
108 }
109 else
110 {
111 $custom_departments = ph_get_custom_departments();
112 if ( !empty($custom_departments) )
113 {
114 foreach ( $custom_departments as $key => $department )
115 {
116 if ( isset($department['based_on']) && $department['based_on'] == 'residential-sales' )
117 {
118 $sales_department_active = true;
119 }
120 }
121 }
122 }
123
124 $lettings_department_active = false;
125 if ( array_key_exists('residential-lettings', $departments) )
126 {
127 $lettings_department_active = true;
128 }
129 else
130 {
131 $custom_departments = ph_get_custom_departments();
132 if ( !empty($custom_departments) )
133 {
134 foreach ( $custom_departments as $key => $department )
135 {
136 if ( isset($department['based_on']) && $department['based_on'] == 'residential-lettings' )
137 {
138 $lettings_department_active = true;
139 }
140 }
141 }
142 }
143
144 $commercial_department_active = false;
145 if ( array_key_exists('commercial', $departments) )
146 {
147 $commercial_department_active = true;
148 }
149 else
150 {
151 $custom_departments = ph_get_custom_departments();
152 if ( !empty($custom_departments) )
153 {
154 foreach ( $custom_departments as $key => $department )
155 {
156 if ( isset($department['based_on']) && $department['based_on'] == 'commercial' )
157 {
158 $commercial_department_active = true;
159 }
160 }
161 }
162 }
163
164 $fields['department'] = array(
165 'type' => 'radio',
166 'options' => $department_options,
167 'value' => $default_value
168 );
169
170 if ( $sales_department_active || $lettings_department_active )
171 {
172 if ( $sales_department_active )
173 {
174 $prices = array(
175 '' => __( 'No preference', 'propertyhive' ),
176 '100000' => '&pound;100,000',
177 '150000' => '&pound;150,000',
178 '200000' => '&pound;200,000',
179 '250000' => '&pound;250,000',
180 '300000' => '&pound;300,000',
181 '500000' => '&pound;500,000',
182 '750000' => '&pound;750,000',
183 '1000000' => '&pound;1,000,000'
184 );
185
186 $fields['minimum_price'] = array(
187 'type' => 'select',
188 'show_label' => true,
189 'label' => __( 'Min Price', 'propertyhive' ),
190 'before' => '<div class="control control-minimum_price sales-only">',
191 'options' => $prices
192 );
193
194 $fields['maximum_price'] = array(
195 'type' => 'select',
196 'show_label' => true,
197 'label' => __( 'Max Price', 'propertyhive' ),
198 'before' => '<div class="control control-maximum_price sales-only">',
199 'options' => $prices
200 );
201 }
202
203 if ( $lettings_department_active )
204 {
205 $prices = array(
206 '' => __( 'No preference', 'propertyhive' ),
207 '500' => '&pound;500 PCM',
208 '600' => '&pound;600 PCM',
209 '750' => '&pound;750 PCM',
210 '1000' => '&pound;1000 PCM',
211 '1250' => '&pound;1250 PCM',
212 '1500' => '&pound;1500 PCM',
213 '2000' => '&pound;2000 PCM'
214 );
215
216 $fields['minimum_rent'] = array(
217 'type' => 'select',
218 'show_label' => true,
219 'label' => __( 'Min Rent', 'propertyhive' ),
220 'before' => '<div class="control control-minimum_rent lettings-only">',
221 'options' => $prices
222 );
223
224 $fields['maximum_rent'] = array(
225 'type' => 'select',
226 'show_label' => true,
227 'label' => __( 'Max Rent', 'propertyhive' ),
228 'before' => '<div class="control control-maximum_rent lettings-only">',
229 'options' => $prices
230 );
231 }
232
233 $fields['minimum_bedrooms'] = array(
234 'type' => 'select',
235 'show_label' => true,
236 'label' => __( 'Min Beds', 'propertyhive' ),
237 'before' => '<div class="control control-minimum_bedrooms residential-only">',
238 'options' => array( '' => __( 'No preference', 'propertyhive' ), 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5)
239 );
240
241 $fields['property_type'] = array(
242 'type' => 'property_type',
243 'show_label' => true,
244 'before' => '<div class="control control-property_type residential-only">',
245 'label' => __( 'Type', 'propertyhive' ),
246 );
247 }
248
249 if ( $commercial_department_active )
250 {
251 $sizes = array(
252 '' => __( 'No preference', 'propertyhive' ),
253 '250' => '250 sq ft',
254 '500' => '500 sq ft',
255 '1000' => '1,000 sq ft',
256 '2500' => '2,500 sq ft',
257 '5000' => '5,000 sq ft',
258 '10000' => '10,000 sq ft',
259 '25000' => '25,000 sq ft',
260 '50000' => '50,000 sq ft'
261 );
262
263 $fields['minimum_floor_area'] = array(
264 'type' => 'select',
265 'show_label' => true,
266 'label' => __( 'Min Floor Area', 'propertyhive' ),
267 'before' => '<div class="control control-minimum_floor_area commercial-only">',
268 'options' => $sizes
269 );
270
271 $fields['maximum_floor_area'] = array(
272 'type' => 'select',
273 'show_label' => true,
274 'label' => __( 'Max Floor Area', 'propertyhive' ),
275 'before' => '<div class="control control-maximum_floor_area commercial-only">',
276 'options' => $sizes
277 );
278
279 $fields['commercial_property_type'] = array(
280 'type' => 'commercial_property_type',
281 'show_label' => true,
282 'before' => '<div class="control control-commercial_property_type commercial-only">',
283 'label' => __( 'Type', 'propertyhive' ),
284 );
285 }
286
287 return $fields;
288 }
289
290 /**
291 * Main function for drawing property enquiry form.
292 *
293 * @param string $property_id
294 * @return void
295 */
296 function propertyhive_enquiry_form( $property_id = '' )
297 {
298 global $post;
299
300 $form_controls = ph_get_property_enquiry_form_fields( $property_id );
301
302 $form_controls = apply_filters( 'propertyhive_property_enquiry_form_fields', $form_controls, $property_id );
303
304 $form_controls['property_id'] = array(
305 'type' => 'hidden',
306 'value' => ( $property_id != '' ? $property_id : $post->ID )
307 );
308
309 $utm_fields = array( 'utm_source', 'utm_medium', 'utm_term', 'utm_content', 'utm_campaign', 'gclid', 'fbclid' );
310 foreach ( $utm_fields as $utm_field )
311 {
312 $form_controls[$utm_field] = array(
313 'type' => 'hidden',
314 'value' =>''
315 );
316 }
317
318 if ( get_option( 'propertyhive_property_enquiry_form_disclaimer', '' ) != '' )
319 {
320 $disclaimer = get_option( 'propertyhive_property_enquiry_form_disclaimer', '' );
321
322 $form_controls['disclaimer'] = array(
323 'type' => 'checkbox',
324 'label' => $disclaimer,
325 'label_style' => 'width:100%;',
326 'required' => true
327 );
328 }
329
330 ph_get_template( 'global/make-enquiry-form.php',array( 'form_controls' => $form_controls ) );
331 }
332
333 /**
334 * Get default fields to be shown on search forms
335 *
336 * @return array
337 */
338 function ph_get_property_enquiry_form_fields( $property_id = '' )
339 {
340 global $post;
341
342 $fields = array();
343
344 $fields['name'] = array(
345 'type' => 'text',
346 'label' => __( 'Full Name', 'propertyhive' ),
347 'show_label' => true,
348 'before' => '<div class="control control-name">',
349 'required' => true
350 );
351 if ( is_user_logged_in() )
352 {
353 $current_user = wp_get_current_user();
354
355 $fields['name']['value'] = $current_user->display_name;
356 }
357
358 $fields['email_address'] = array(
359 'type' => 'email',
360 'label' => __( 'Email Address', 'propertyhive' ),
361 'show_label' => true,
362 'before' => '<div class="control control-email_address">',
363 'required' => true
364 );
365 if ( is_user_logged_in() )
366 {
367 $current_user = wp_get_current_user();
368
369 $fields['email_address']['value'] = $current_user->user_email;
370 }
371
372 $fields['telephone_number'] = array(
373 'type' => 'text',
374 'label' => __( 'Number', 'propertyhive' ),
375 'show_label' => true,
376 'before' => '<div class="control control-telephone_number">',
377 'required' => true
378 );
379
380 $fields['message'] = array(
381 'type' => 'textarea',
382 'label' => __( 'Message', 'propertyhive' ),
383 'show_label' => true,
384 'before' => '<div class="control control-message">',
385 'required' => true
386 );
387
388 return $fields;
389 }
390
391 /**
392 * Get default fields to be shown on applicant registration forms
393 *
394 * @return array
395 */
396 function ph_get_user_details_form_fields()
397 {
398 global $post;
399
400 if ( is_user_logged_in() )
401 {
402 $current_user = wp_get_current_user();
403
404 if ( $current_user instanceof WP_User )
405 {
406 $contact = new PH_Contact( '', $current_user->ID );
407 }
408 }
409
410 $fields = array();
411
412 $fields['name'] = array(
413 'type' => 'text',
414 'label' => __( 'Full Name', 'propertyhive' ),
415 'required' => true
416 );
417 if ( is_user_logged_in() && $current_user instanceof WP_User )
418 {
419 $fields['name']['value'] = $current_user->display_name;
420 }
421
422 $fields['email_address'] = array(
423 'type' => 'email',
424 'label' => __( 'Email Address', 'propertyhive' ),
425 'required' => true
426 );
427 if ( is_user_logged_in() && $current_user instanceof WP_User )
428 {
429 $fields['email_address']['value'] = $current_user->user_email;
430 }
431
432 $fields['telephone_number'] = array(
433 'type' => 'text',
434 'label' => __( 'Telephone Number', 'propertyhive' ),
435 'required' => false
436 );
437 if ( is_user_logged_in() && $current_user instanceof WP_User )
438 {
439 $fields['telephone_number']['value'] = $contact->telephone_number;
440 }
441
442 if ( get_option( 'propertyhive_applicant_users', '' ) == 'yes' )
443 {
444 $fields['password'] = array(
445 'type' => 'password',
446 'label' => __( 'Password', 'propertyhive' ),
447 'required' => true
448 );
449
450 $fields['password2'] = array(
451 'type' => 'password',
452 'label' => __( 'Confirm Password', 'propertyhive' ),
453 'required' => true
454 );
455 }
456
457 return $fields;
458 }
459
460 /**
461 * Get default fields to be shown on applicant registration forms
462 *
463 * @return array
464 */
465 function ph_get_applicant_requirements_form_fields($applicant_profile = false)
466 {
467 global $post;
468
469 $fields = array();
470
471 $offices = array();
472 $value = '';
473
474 $args = array(
475 'post_type' => 'office',
476 'nopaging' => true,
477 'orderby' => 'title',
478 'order' => 'ASC'
479 );
480
481 $office_query = new WP_Query( $args );
482
483 if ( $office_query->have_posts() )
484 {
485 while ( $office_query->have_posts() )
486 {
487 $office_query->the_post();
488
489 $offices[get_the_ID()] = get_the_title();
490
491 if ( get_post_meta(get_the_ID(), 'primary', TRUE) == 1 )
492 {
493 $value = get_the_ID();
494 }
495 }
496 }
497 wp_reset_postdata();
498
499 $fields['office_id'] = array(
500 'type' => ( (count($offices) <= 1) ? 'hidden' : 'select' ),
501 'label' => __( 'Office', 'propertyhive' ),
502 'required' => false,
503 'show_label' => true,
504 'value' => $value,
505 'options' => $offices
506 );
507
508 $value = '';
509
510 $ph_departments = ph_get_departments();
511 $departments = array();
512
513 $show_residential_fields = false;
514 $show_commercial_fields = false;
515 foreach ( $ph_departments as $key => $department )
516 {
517 if ( get_option( 'propertyhive_active_departments_' . str_replace("residential-", "", $key) ) == 'yes' )
518 {
519 $departments[$key] = $department;
520 if ($value == '' && (get_option( 'propertyhive_primary_department' ) == $key || get_option( 'propertyhive_primary_department' ) === FALSE) )
521 {
522 $value = $key;
523 }
524
525 if ( in_array($key, array('residential-sales', 'residential-lettings')) || in_array(ph_get_custom_department_based_on($key), array('residential-sales', 'residential-lettings')) )
526 {
527 $show_residential_fields = true;
528 }
529
530 if ( in_array($key, array('commercial')) || in_array(ph_get_custom_department_based_on($key), array('commercial')) )
531 {
532 $show_commercial_fields = true;
533 }
534 }
535 }
536
537 $fields['department'] = array(
538 'type' => 'radio',
539 'label' => __( 'Looking For', 'propertyhive' ),
540 'required' => true,
541 'show_label' => true,
542 'value' => $value,
543 'options' => $departments
544 );
545 if ( is_user_logged_in() && isset($applicant_profile['department']) )
546 {
547 $fields['department']['value'] = $applicant_profile['department'];
548 }
549 if ( count($departments) == 1 )
550 {
551 $fields['department']['type'] = 'hidden';
552 }
553
554 if ( $show_residential_fields )
555 {
556 $fields['maximum_price'] = array(
557 'type' => 'number',
558 'label' => __( 'Maximum Price', 'propertyhive' ),
559 'style' => 'max-width:150px;',
560 'before' => '<div class="control control-minimum_price sales-only">',
561 'required' => false
562 );
563 if ( is_user_logged_in() && isset($applicant_profile['max_price']) )
564 {
565 $fields['maximum_price']['value'] = $applicant_profile['max_price'];
566 }
567
568 $fields['maximum_rent'] = array(
569 'type' => 'number',
570 'label' => __( 'Maximum Rent', 'propertyhive' ) . ' (PCM)',
571 'style' => 'max-width:150px;',
572 'before' => '<div class="control control-minimum_price lettings-only">',
573 'required' => false
574 );
575 if ( is_user_logged_in() && isset($applicant_profile['max_rent']) )
576 {
577 $fields['maximum_rent']['value'] = $applicant_profile['max_rent'];
578 }
579
580 $fields['minimum_bedrooms'] = array(
581 'type' => 'number',
582 'label' => __( 'Minimum Bedrooms', 'propertyhive' ),
583 'style' => 'max-width:80px;',
584 'before' => '<div class="control control-minimum_bedrooms residential-only">',
585 'required' => false
586 );
587 if ( is_user_logged_in() && isset($applicant_profile['min_beds']) )
588 {
589 $fields['minimum_bedrooms']['value'] = $applicant_profile['min_beds'];
590 }
591
592 $args = array(
593 'hide_empty' => false,
594 'parent' => 0
595 );
596 $terms = get_terms( 'property_type', $args );
597
598 $options = array();
599
600 $selected_value = '';
601 if ( !empty( $terms ) && !is_wp_error( $terms ) )
602 {
603 $options = array( '' => __( 'All Property Types', 'propertyhive' ) );
604
605 foreach ($terms as $term)
606 {
607 $options[$term->term_id] = $term->name;
608
609 $args = array(
610 'hide_empty' => false,
611 'parent' => $term->term_id
612 );
613 $subterms = get_terms( 'property_type', $args );
614
615 if ( !empty( $subterms ) && !is_wp_error( $subterms ) )
616 {
617 foreach ($subterms as $term)
618 {
619 $options[$term->term_id] = '- ' . $term->name;
620 }
621 }
622 }
623 }
624
625 if ( !empty($options) )
626 {
627 $fields['property_type'] = array(
628 'type' => 'select',
629 'label' => __( 'Property Type', 'propertyhive' ),
630 'before' => '<div class="control control-property_type residential-only">',
631 'required' => false,
632 'multiselect' => true,
633 'options' => $options,
634 );
635
636 if ( is_user_logged_in() && isset($applicant_profile['property_types']) && is_array($applicant_profile['property_types']) && !empty($applicant_profile['property_types']) )
637 {
638 $fields['property_type']['value'] = $applicant_profile['property_types'];
639 }
640 }
641 }
642
643 if ( $show_commercial_fields )
644 {
645 $fields['available_as_sale'] = array(
646 'type' => 'checkbox',
647 'label' => __( 'For Sale', 'propertyhive' ),
648 'before' => '<div class="control control-available_as_sale commercial-only">',
649 'required' => false,
650 );
651 if ( is_user_logged_in() && isset($applicant_profile['available_as']) && in_array('sale', $applicant_profile['available_as']) )
652 {
653 $fields['available_as_sale']['checked'] = true;
654 }
655
656 $fields['available_as_rent'] = array(
657 'type' => 'checkbox',
658 'label' => __( 'To Rent', 'propertyhive' ),
659 'before' => '<div class="control control-available_as_rent commercial-only">',
660 'required' => false,
661 );
662 if ( is_user_logged_in() && isset($applicant_profile['available_as']) && in_array('rent', $applicant_profile['available_as']) )
663 {
664 $fields['available_as_rent']['checked'] = true;
665 }
666
667 $fields['minimum_floor_area'] = array(
668 'type' => 'number',
669 'label' => __( 'Min Floor Area (Sq Ft)', 'propertyhive' ),
670 'style' => 'max-width:150px;',
671 'before' => '<div class="control control-minimum_floor_area commercial-only">',
672 'required' => false
673 );
674 if ( is_user_logged_in() && isset($applicant_profile['min_floor_area']) )
675 {
676 $fields['minimum_floor_area']['value'] = $applicant_profile['min_floor_area'];
677 }
678
679 $fields['maximum_floor_area'] = array(
680 'type' => 'number',
681 'label' => __( 'Max Floor Area (Sq Ft)', 'propertyhive' ),
682 'style' => 'max-width:150px;',
683 'before' => '<div class="control control-maximum_floor_area commercial-only">',
684 'required' => false
685 );
686 if ( is_user_logged_in() && isset($applicant_profile['max_floor_area']) )
687 {
688 $fields['maximum_floor_area']['value'] = $applicant_profile['max_floor_area'];
689 }
690
691 $args = array(
692 'hide_empty' => false,
693 'parent' => 0
694 );
695 $terms = get_terms( 'commercial_property_type', $args );
696
697 $options = array();
698
699 $selected_value = '';
700 if ( !empty( $terms ) && !is_wp_error( $terms ) )
701 {
702 $options = array( '' => __( 'All Property Types', 'propertyhive' ) );
703
704 foreach ($terms as $term)
705 {
706 $options[$term->term_id] = $term->name;
707
708 $args = array(
709 'hide_empty' => false,
710 'parent' => $term->term_id
711 );
712 $subterms = get_terms( 'commercial_property_type', $args );
713
714 if ( !empty( $subterms ) && !is_wp_error( $subterms ) )
715 {
716 foreach ($subterms as $term)
717 {
718 $options[$term->term_id] = '- ' . $term->name;
719 }
720 }
721 }
722 }
723
724 if ( !empty($options) )
725 {
726 $fields['commercial_property_type'] = array(
727 'type' => 'select',
728 'label' => __( 'Property Type', 'propertyhive' ),
729 'before' => '<div class="control control-commercial_property_type commercial-only">',
730 'required' => false,
731 'multiselect' => true,
732 'options' => $options,
733 );
734
735 if ( is_user_logged_in() && isset($applicant_profile['commercial_property_types']) && is_array($applicant_profile['commercial_property_types']) && !empty($applicant_profile['commercial_property_types']) )
736 {
737 $fields['commercial_property_type']['value'] = $applicant_profile['commercial_property_types'];
738 }
739 }
740 }
741
742 if ( get_option('propertyhive_applicant_locations_type') != 'text' )
743 {
744 $args = array(
745 'hide_empty' => false,
746 'parent' => 0
747 );
748 $terms = get_terms( 'location', $args );
749
750 if ( !empty( $terms ) && !is_wp_error( $terms ) )
751 {
752 $fields['location'] = array(
753 'type' => 'location',
754 'label' => __( 'Location', 'propertyhive' ),
755 'blank_option' => __( 'All Locations', 'propertyhive' ),
756 'required' => false,
757 'multiselect' => true,
758 );
759
760 if ( is_user_logged_in() && isset($applicant_profile['locations']) && is_array($applicant_profile['locations']) && !empty($applicant_profile['locations']) )
761 {
762 $fields['location']['value'] = $applicant_profile['locations'];
763 }
764 }
765 }
766 else
767 {
768 $fields['location_text'] = array(
769 'type' => 'text',
770 'label' => __( 'Location', 'propertyhive' ),
771 'required' => false
772 );
773
774 if ( is_user_logged_in() && isset($applicant_profile['location_text']) && $applicant_profile['location_text'] != '' )
775 {
776 $fields['location_text']['value'] = $applicant_profile['location_text'];
777 }
778 }
779
780 $fields['additional_requirements'] = array(
781 'type' => 'textarea',
782 'label' => __( 'Additional Requirements', 'propertyhive' ),
783 'required' => false
784 );
785 if ( is_user_logged_in() && isset($applicant_profile['notes']) )
786 {
787 $fields['additional_requirements']['value'] = $applicant_profile['notes'];
788 }
789
790 return $fields;
791 }
792
793 /**
794 * Output individual field
795 *
796 * @return void
797 */
798 function ph_form_field( $key, $field )
799 {
800 global $post;
801
802 $output = '';
803
804 switch ($field['type'])
805 {
806 case "text":
807 case "email":
808 case "date":
809 case "number":
810 case "password":
811 {
812 $field['id'] = isset( $field['id'] ) ? $field['id'] : $key;
813 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
814 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
815 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
816 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
817 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
818 $field['placeholder'] = isset( $field['placeholder'] ) ? $field['placeholder'] : ( ( $field['type'] == 'date' ) ? 'dd/mm/yyyy' : '' );
819 $field['required'] = isset( $field['required'] ) ? $field['required'] : false;
820 $field['style'] = isset( $field['style'] ) ? $field['style'] : '';
821
822 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
823 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
824 {
825 $field['value'] = sanitize_text_field( wp_unslash( $_GET[$key] ) );
826 }
827 else
828 {
829 if ( !is_post_type_archive('property') && !is_singular('property') && isset($post->ID) )
830 {
831 $value = get_post_meta( $post->ID, '_' . $key, true );
832 if ( $value != '' )
833 {
834 $field['value'] = $value;
835 }
836 }
837 }
838
839 $output .= $field['before'];
840
841 if ($field['show_label'])
842 {
843 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'];
844 if ($field['required'])
845 {
846 $output .= '<span class="required"> *</span>';
847 }
848 $output .= '</label>';
849 }
850
851 $output .= '<input
852 type="' . esc_attr( $field['type'] ) . '"
853 name="' . esc_attr( $key ) . '"
854 id="' . esc_attr( $field['id'] ) . '"
855 value="' . esc_attr( $field['value'] ) . '"
856 placeholder="' . esc_attr( $field['placeholder'] ) . '"
857 class="' . esc_attr( $field['class'] ) . '"
858 style="' . esc_attr( $field['style'] ) . '"
859 ' . ( ($field['required']) ? 'required' : '' ) . '
860 >';
861
862 $output .= $field['after'];
863
864 break;
865 }
866 case "textarea":
867 {
868 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
869 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
870 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
871 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
872 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
873 $field['placeholder'] = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
874 $field['required'] = isset( $field['required'] ) ? $field['required'] : false;
875
876 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
877 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
878 {
879 $field['value'] = sanitize_textarea_field( wp_unslash( $_GET[$key] ) );
880 }
881 else
882 {
883 if ( !is_post_type_archive('property') && !is_singular('property') && isset($post->ID) )
884 {
885 $value = get_post_meta( $post->ID, '_' . $key, true );
886 if ( $value != '' )
887 {
888 $field['value'] = $value;
889 }
890 }
891 }
892
893 $output .= $field['before'];
894
895 if ($field['show_label'])
896 {
897 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'];
898 if ($field['required'])
899 {
900 $output .= '<span class="required"> *</span>';
901 }
902 $output .= '</label>';
903 }
904
905 $output .= '<textarea
906 name="' . esc_attr( $key ) . '"
907 id="' . esc_attr( $key ) . '"
908 placeholder="' . esc_attr( $field['placeholder'] ) . '"
909 class="' . esc_attr( $field['class'] ) . '"
910 ' . ( ($field['required']) ? 'required' : '' ) . '
911 >' . esc_attr( $field['value'] ) . '</textarea>';
912
913 $output .= $field['after'];
914
915 break;
916 }
917 case "checkbox":
918 {
919 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
920 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
921 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
922 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
923 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
924 $field['label_style'] = isset( $field['label_style'] ) ? $field['label_style'] : '';
925 $field['value'] = isset( $field['value'] ) ? $field['value'] : 'yes';
926 $field['checked'] = isset( $field['checked'] ) ? $field['checked'] : false;
927 if ( isset( $_GET[$key] ) && sanitize_text_field(wp_unslash($_GET[$key])) == $field['value'] )
928 {
929 $field['checked'] = true;
930 }
931 else
932 {
933 if ( !is_post_type_archive('property') && !is_singular('property') && isset($post->ID) )
934 {
935 $value = get_post_meta( $post->ID, '_' . $key, true );
936 if ( $value == 'yes' )
937 {
938 $field['checked'] = true;
939 }
940 }
941 }
942
943 $output .= $field['before'];
944
945 $output .= '<label style="' . esc_attr( $field['label_style'] ) . '"><input
946 type="' . esc_attr( $field['type'] ) . '"
947 name="' . esc_attr( $key ) . '"
948 value="' . esc_attr( $field['value'] ) . '"
949 class="' . esc_attr( $field['class'] ) . '"
950 ' . checked( $field['checked'], true, false ) . '
951 >';
952 if ($field['show_label'])
953 {
954 $output .= ' <span>' . $field['label'] . '</span>';
955 }
956 $output .= '</label>';
957
958 $output .= $field['after'];
959
960 break;
961 }
962 case "radio":
963 {
964 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
965 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
966 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
967 $field['before_option'] = isset( $field['before_option'] ) ? $field['before_option'] : '<label>';
968 $field['after_option'] = isset( $field['after_option'] ) ? $field['after_option'] : '</label>';
969 $field['before_input'] = isset( $field['before_input'] ) ? $field['before_input'] : '';
970 $field['after_input'] = isset( $field['after_input'] ) ? $field['after_input'] : '';
971 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : false;
972 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
973 $field['options'] = ( isset( $field['options'] ) && is_array( $field['options'] ) ) ? $field['options'] : array();
974
975 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
976 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
977 {
978 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
979 }
980
981 $output .= $field['before'];
982
983 if ($field['show_label'])
984 {
985 // get first option as 'for'
986 $option_key = '';
987 foreach ( $field['options'] as $option_key => $value )
988 {
989 break;
990 }
991 $output .= '<label for="' . esc_attr( $key ) . '_' . esc_attr( $option_key ) . '">' . $field['label'] . '</label>';
992 }
993
994 foreach ( $field['options'] as $option_key => $value )
995 {
996 $id = esc_attr( $key ) . '_' . esc_attr( $option_key );
997 $output .= str_replace("{id}", $id, $field['before_option']);
998 $output .= str_replace("{id}", $id, $field['before_input']);
999 $output .= '<input
1000 type="' . esc_attr( $field['type'] ) . '"
1001 name="' . esc_attr( $key ) . '"
1002 id="' . $id . '"
1003 value="' . esc_attr( $option_key ) . '"
1004 class="' . esc_attr( $field['class'] ) . '"
1005 ' . checked( esc_attr( $field['value'] ), esc_attr( $option_key ), false ) . '
1006 >';
1007 $output .= str_replace("{id}", $id, $field['after_input']);
1008 $output .= ' ' . esc_html( $value );
1009 $output .= str_replace("{id}", $id, $field['after_option']);
1010 }
1011
1012 $output .= $field['after'];
1013
1014 break;
1015 }
1016 case "select":
1017 {
1018 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
1019 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1020 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1021 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1022 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1023 $field['required'] = isset( $field['required'] ) ? $field['required'] : false;
1024 $field['options'] = ( isset( $field['options'] ) && is_array( $field['options'] ) ) ? $field['options'] : array();
1025 $field['multiselect'] = isset( $field['multiselect'] ) ? $field['multiselect'] : false;
1026
1027 if ( $field['multiselect'] )
1028 {
1029 wp_enqueue_script( 'multiselect' );
1030 }
1031
1032 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1033 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1034 {
1035 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
1036 }
1037 else
1038 {
1039 if ( !is_post_type_archive('property') && !is_singular('property') && isset($post->ID) )
1040 {
1041 $value = get_post_meta( $post->ID, '_' . $key, true );
1042 if ( $value != '' )
1043 {
1044 $field['value'] = $value;
1045 }
1046 }
1047 }
1048
1049 $output .= $field['before'];
1050
1051 if ($field['show_label'])
1052 {
1053 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'];
1054 if ($field['required'])
1055 {
1056 $output .= '<span class="required"> *</span>';
1057 }
1058 $output .= '</label>';
1059 }
1060
1061 $blank_option = '';
1062 foreach ( $field['options'] as $option_key => $value )
1063 {
1064 if ( $field['multiselect'] && $option_key == '' )
1065 {
1066 $blank_option = $value;
1067 continue;
1068 }
1069 }
1070
1071 $output .= '<select
1072 name="' . esc_attr( $key ) . ( $field['multiselect'] ? '[]' : '' ) . '"
1073 id="' . esc_attr( $key ) . '"
1074 class="' . esc_attr( $field['class'] ) . ( $field['multiselect'] ? ' ph-form-multiselect' : '' ) . '"
1075 ' . ( $field['multiselect'] ? ' multiple="multiple"' : '' ) . '
1076 data-blank-option="' . esc_attr($blank_option) . '"
1077 >';
1078
1079 foreach ( $field['options'] as $option_key => $value )
1080 {
1081 if ( $field['multiselect'] && $option_key == '' )
1082 {
1083 // Skip because we don't want a blank option in the multiselect. Instead use $value as the placeholder
1084 continue;
1085 }
1086
1087 $output .= '<option
1088 value="' . esc_attr( $option_key ) . '"';
1089 if ( !$field['multiselect'] )
1090 {
1091 $output .= selected( esc_attr( $field['value'] ), esc_attr( $option_key ), false );
1092 }
1093 else
1094 {
1095 if (
1096 ( isset($_REQUEST[$key]) && is_array($_REQUEST[$key]) && in_array($option_key, $_REQUEST[$key]) )
1097 ||
1098 ( !isset($_REQUEST[$key]) && is_array($field['value']) && in_array($option_key, $field['value']) )
1099 )
1100 {
1101 $output .= ' selected';
1102 }
1103 }
1104 $output .= '>' . esc_html( __( $value, 'propertyhive' ) ) . '</option>';
1105 }
1106
1107 $output .= '</select>';
1108
1109 $output .= $field['after'];
1110
1111 break;
1112 }
1113 case "office":
1114 {
1115 $key = 'officeID';
1116
1117 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
1118 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1119 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1120 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1121 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1122 $field['blank_option'] = isset( $field['blank_option'] ) ? __( $field['blank_option'], 'propertyhive' ) : __( 'No preference', 'propertyhive' );
1123 $field['multiselect'] = isset( $field['multiselect'] ) ? $field['multiselect'] : false;
1124
1125 if ( $field['multiselect'] )
1126 {
1127 wp_enqueue_script( 'multiselect' );
1128 }
1129
1130 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1131 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1132 {
1133 $field['value'] = (int)$_GET[$key];
1134 }
1135
1136 $output .= $field['before'];
1137
1138 if ($field['show_label'])
1139 {
1140 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'] . '</label>';
1141 }
1142
1143 $output .= '<select
1144 name="' . esc_attr( $key ) . ( $field['multiselect'] ? '[]' : '' ) . '"
1145 id="' . esc_attr( $key ) . '"
1146 class="' . esc_attr( $field['class'] ) . ( $field['multiselect'] ? ' ph-form-multiselect' : '' ) . '"
1147 ' . ( $field['multiselect'] ? ' multiple="multiple"' : '' ) . '
1148 data-blank-option="' . esc_attr( $field['blank_option'] ) . '"
1149 >';
1150
1151 if ( !$field['multiselect'] )
1152 {
1153 $output .= '<option
1154 value=""
1155 ' . selected( esc_attr( $field['value'] ), esc_attr( '' ), false ) . '
1156 >' . esc_html( $field['blank_option'] ) . '</option>';
1157 }
1158
1159 $args = array(
1160 'post_type' => 'office',
1161 'nopaging' => true,
1162 'orderby' => 'title',
1163 'order' => 'ASC'
1164 );
1165 $office_query = new WP_Query($args);
1166
1167 if ($office_query->have_posts())
1168 {
1169 while ($office_query->have_posts())
1170 {
1171 $office_query->the_post();
1172
1173 $output .= '<option
1174 value="' . esc_attr( $post->ID ) . '" ';
1175 if ( !$field['multiselect'] )
1176 {
1177 $output .= selected( esc_attr( $field['value'] ), esc_attr( $post->ID ), false );
1178 }
1179 else
1180 {
1181 if ( isset($_REQUEST[$key]) && is_array($_REQUEST[$key]) && in_array($post->ID, $_REQUEST[$key]) )
1182 {
1183 $output .= ' selected';
1184 }
1185 }
1186 $output .= '>' . esc_html( get_the_title() ) . '</option>';
1187
1188 }
1189 }
1190 wp_reset_postdata();
1191
1192 $output .= '</select>';
1193
1194 $output .= $field['after'];
1195
1196 break;
1197 }
1198 case "country":
1199 {
1200 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
1201 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1202 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1203 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1204 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1205
1206 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1207 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1208 {
1209 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
1210 }
1211
1212 $output .= $field['before'];
1213
1214 if ($field['show_label'])
1215 {
1216 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'] . '</label>';
1217 }
1218
1219 $output .= '<select
1220 name="' . esc_attr( $key ) . '"
1221 id="' . esc_attr( $key ) . '"
1222 class="' . esc_attr( $field['class'] ) . '"
1223 >';
1224
1225 $output .= '<option
1226 value=""
1227 ' . selected( esc_attr( $field['value'] ), esc_attr( '' ), false ) . '
1228 >' . esc_html( __( 'No preference', 'propertyhive' ) ) . '</option>';
1229
1230 $countries = get_option( 'propertyhive_countries', array() );
1231 if ( is_array($countries) && !empty($countries) )
1232 {
1233 $ph_countries = new PH_Countries;
1234
1235 foreach ( $countries as $country )
1236 {
1237 $ph_country = $ph_countries->get_country( $country );
1238
1239 if ( $ph_country !== FALSE )
1240 {
1241 $output .= '<option
1242 value="' . esc_attr( $country ) . '"
1243 ' . selected( esc_attr( $field['value'] ), esc_attr( $country ), false ) . '
1244 >' . esc_html( $ph_country['name'] ) . '</option>';
1245 }
1246 }
1247 }
1248
1249 $output .= '</select>';
1250
1251 $output .= $field['after'];
1252
1253 break;
1254 }
1255 case "slider":
1256 {
1257 wp_enqueue_script('jquery');
1258 wp_enqueue_script('jquery-ui-core');
1259 wp_enqueue_script('jquery-ui-slider');
1260 wp_enqueue_script('jquery-ui-touch-punch', PH()->plugin_url() . '/assets/js/jquery-ui-touch-punch/jquery.ui.touch-punch.min.js', array('jquery'), '0.2.3', true);
1261 wp_enqueue_style( 'jquery-ui-style', PH()->plugin_url() . '/assets/css/jquery-ui/jquery-ui.css', array(), PH_VERSION );
1262
1263 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1264 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1265 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1266 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1267 $field['min'] = isset( $field['min'] ) ? $field['min'] : '';
1268 $field['max'] = isset( $field['max'] ) ? $field['max'] : '';
1269 $field['step'] = isset( $field['step'] ) ? $field['step'] : '1';
1270
1271 $output .= $field['before'];
1272
1273 if ($field['show_label'])
1274 {
1275 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'];
1276 $output .= ' - <span id="search-form-slider-value-' . $key . '" class="search-form-slider-value search-form-slider-value-' . $key . '"></span>';
1277 $output .= '</label>';
1278 }
1279
1280 $output .= '<div id="search-form-slider-' . $key . '" class="search-form-slider search-form-slider-' . $key . '" style="min-width:150px;"></div>';
1281
1282 $field_name = str_replace("_slider", "", $key);
1283 $output .= '<input type="hidden" name="minimum_' . $field_name . '" class="min_slider_value-' . $key . '" id="min_slider_value-' . $key . '" value="' . ( isset($_GET['minimum_' . $field_name]) ? ph_clean($_GET['minimum_' . $field_name]) : '' ) . '">';
1284 $output .= '<input type="hidden" name="maximum_' . $field_name . '" class="max_slider_value-' . $key . '" id="max_slider_value-' . $key . '" value="' . ( isset($_GET['maximum_' . $field_name]) ? ph_clean($_GET['maximum_' . $field_name]) : '' ) . '">';
1285
1286 $output .= $field['after'];
1287
1288 $value = '';
1289 $prefix = '';
1290 $suffix = '';
1291
1292 if ( $key == 'price_slider' || $key == 'rent_slider' )
1293 {
1294 $prefix = '£';
1295
1296 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
1297
1298 $ph_countries = new PH_Countries();
1299 $countries = $ph_countries->countries;
1300
1301 foreach ( $countries as $country_code => $country )
1302 {
1303 if ( isset($country['currency_code']) && $country['currency_code'] == $search_form_currency )
1304 {
1305 if ( $country['currency_prefix'] === true )
1306 {
1307 $prefix = $country['currency_symbol'];
1308 $suffix = '';
1309 }
1310 else
1311 {
1312 $prefix = '';
1313 $suffix = $country['currency_symbol'];
1314 }
1315 break;
1316 }
1317 }
1318 }
1319
1320 if ( $field['min'] != '' && $field['max'] != '' )
1321 {
1322 $value = 'values: [ ' . ( isset($_GET['minimum_' . $field_name]) && $_GET['minimum_' . $field_name] != '' ? ph_clean($_GET['minimum_' . $field_name]) : $field['min'] ) . ', ' . ( isset($_GET['maximum_' . $field_name]) && $_GET['maximum_' . $field_name] != '' ? ph_clean($_GET['maximum_' . $field_name]) : $field['max'] ) . ' ],';
1323 }
1324
1325 $output .= '<script>
1326 jQuery(document).ready(function()
1327 {
1328 jQuery( ".search-form-slider-' . $key . '" ).each(function(index)
1329 {
1330 jQuery(this).slider({
1331 range: ' . ( ( $field['min'] != '' && $field['max'] != '' ) ? 'true' : 'false' ) . ',
1332 step: ' . $field['step'] . ',
1333 ' . ( $field['min'] != '' ? 'min: ' . $field['min'] . ',' : '' ) . '
1334 ' . ( $field['max'] != '' ? 'max: ' . $field['max'] . ',' : '' ) . '
1335 ' . $value . '
1336 slide: function( event, ui ) {
1337 //jQuery( "#search-form-slider-value-' . $key . '" ).html( "' . $prefix . '" + ui.values[ 0 ].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" + " - ' . $prefix . '" + ui.values[ 1 ].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" );
1338 //jQuery( "#min_slider_value-' . $key . '" ).val( ui.values[0] );
1339 //jQuery( "#max_slider_value-' . $key . '" ).val( ui.values[1] );
1340
1341 jQuery(this).closest("form").find(".search-form-slider-value-' . $key . '").html( "' . $prefix . '" + ui.values[ 0 ].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" + " - ' . $prefix . '" + ui.values[ 1 ].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" );
1342 jQuery(this).closest("form").find(".min_slider_value-' . $key . '").val( ui.values[0] );
1343 jQuery(this).closest("form").find(".max_slider_value-' . $key . '").val( ui.values[1] );
1344 }
1345 });
1346 jQuery(this).closest("form").find(".search-form-slider-value-' . $key . '").html( "' . $prefix . '" + jQuery( "#search-form-slider-' . $key . '" ).slider( "values", 0 ).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" + " - ' . $prefix . '" + jQuery( "#search-form-slider-' . $key . '" ).slider( "values", 1 ).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "' . $suffix . '" );
1347 });
1348 });
1349 </script>';
1350
1351 break;
1352 }
1353 case "hidden":
1354 {
1355 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1356 $field['name'] = isset( $field['name'] ) ? $field['name'] : $key;
1357 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1358 {
1359 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
1360 }
1361
1362 $output .= '<input type="hidden" name="' . esc_attr( $field['name'] ) . '" value="' . esc_attr($field['value']) . '">';
1363 break;
1364 }
1365 case "html":
1366 {
1367 $field['html'] = isset( $field['html'] ) ? $field['html'] : '';
1368 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1369 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1370
1371 $output .= $field['before'];
1372 $output .= $field['html'];
1373 $output .= $field['after'];
1374
1375 break;
1376 }
1377 case "recaptcha":
1378 {
1379 $field['site_key'] = isset( $field['site_key'] ) ? $field['site_key'] : '';
1380
1381 $output .= '<script src="https://www.google.com/recaptcha/api.js"></script>
1382 <div class="g-recaptcha" data-sitekey="' . esc_attr($field['site_key']) . '"></div>';
1383 break;
1384 }
1385 case "recaptcha-v3":
1386 {
1387 $field['site_key'] = isset( $field['site_key'] ) ? $field['site_key'] : '';
1388
1389 $output .= '
1390 <script src="https://www.google.com/recaptcha/api.js?render=' . $field['site_key'] . '"></script>
1391 <script>
1392 grecaptcha.ready(function() {
1393 grecaptcha.execute("' . $field['site_key'] . '", {action:\'submit\'})
1394 .then(function(token) {
1395 // add token value to form
1396 document.querySelectorAll("#g-recaptcha-response").forEach(
1397 elem => (elem.value = token)
1398 );
1399 });
1400 });
1401 </script>
1402 <input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">
1403 ';
1404 break;
1405 }
1406 case "hCaptcha":
1407 {
1408 $field['site_key'] = isset( $field['site_key'] ) ? $field['site_key'] : '';
1409
1410 $output .= '<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
1411 <div class="h-captcha" data-sitekey="' . $field['site_key'] . '"></div>';
1412 break;
1413 }
1414 case "turnstile":
1415 {
1416 $field['site_key'] = isset( $field['site_key'] ) ? $field['site_key'] : '';
1417
1418 $output .= '<div class="turnstile" data-sitekey="' . $field['site_key'] . '"></div>';
1419 break;
1420 }
1421 case "daterange":
1422 {
1423 wp_enqueue_script( 'moment.js', '//cdn.jsdelivr.net/momentjs/latest/moment.min.js' );
1424 wp_enqueue_script( 'daterangepicker.js', '//cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js' );
1425 wp_enqueue_style( 'daterangepicker.css', '//cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css' );
1426
1427 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1428 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1429
1430 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1431 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1432
1433 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1434 $field['style'] = isset( $field['style'] ) ? $field['style'] : '';
1435 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
1436 $field['placeholder'] = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
1437
1438 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1439 {
1440 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
1441 }
1442
1443 $output .= $field['before'];
1444
1445 if ($field['show_label'])
1446 {
1447 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'] . '</label>';
1448 }
1449
1450 $output .= '<input type="text" autocomplete="off"
1451 name="' . esc_attr( $key ) . '"
1452 id="' . esc_attr( $key ) . '"
1453 value="' . esc_attr( $field['value'] ) . '"
1454 style="' . esc_attr( $field['style'] ) . '"
1455 class="' . esc_attr( $field['class'] ) . '"
1456 placeholder="' . esc_attr( $field['placeholder'] ) . '"
1457 />';
1458 $output .= $field['after'];
1459
1460 break;
1461 }
1462 default:
1463 {
1464 if ( taxonomy_exists($field['type']) )
1465 {
1466 $field['class'] = isset( $field['class'] ) ? $field['class'] : '';
1467 $field['before'] = isset( $field['before'] ) ? $field['before'] : '<div class="control control-' . $key . '">';
1468 $field['after'] = isset( $field['after'] ) ? $field['after'] : '</div>';
1469 $field['show_label'] = isset( $field['show_label'] ) ? $field['show_label'] : true;
1470 $field['label'] = isset( $field['label'] ) ? $field['label'] : '';
1471 $field['blank_option'] = isset( $field['blank_option'] ) ? __( $field['blank_option'], 'propertyhive' ) : __( 'No preference', 'propertyhive' );
1472 $field['parent_terms_only'] = isset( $field['parent_terms_only'] ) ? $field['parent_terms_only'] : false;
1473 $field['hide_empty'] = isset( $field['hide_empty'] ) ? $field['hide_empty'] : false;
1474 $field['multiselect'] = isset( $field['multiselect'] ) ? $field['multiselect'] : false;
1475 $field['dynamic_population'] = ( isset( $field['dynamic_population'] ) && $field['type'] == 'location' && $field['parent_terms_only'] === false && $field['multiselect'] === false ) ? $field['dynamic_population'] : false; // only applies to location
1476
1477 if ( $field['multiselect'] )
1478 {
1479 wp_enqueue_script( 'multiselect' );
1480 }
1481
1482 $options = array(
1483 '' => array(
1484 'label' => $field['blank_option'],
1485 'parent' => 0
1486 )
1487 );
1488 $args = array(
1489 'hide_empty' => $field['hide_empty'],
1490 'parent' => 0
1491 );
1492 $args = apply_filters( 'propertyhive_form_taxonomy_terms_args', $args, $field );
1493 $terms = get_terms( $field['type'], $args );
1494
1495 $levels_of_taxonomy = 1;
1496 if ( !empty( $terms ) && !is_wp_error( $terms ) )
1497 {
1498 foreach ($terms as $term)
1499 {
1500 if ( isset($field['hide_empty']) && $field['hide_empty'] === true )
1501 {
1502 $empty_check_args = array(
1503 'post_type' => 'property',
1504 'meta_query' => array(
1505 array(
1506 'key' => '_on_market',
1507 'value' => 'yes',
1508 ),
1509 ),
1510 'tax_query' => array(
1511 array(
1512 'taxonomy' => $field['type'],
1513 'field' => 'term_id',
1514 'terms' => $term->term_id,
1515 ),
1516 ),
1517 );
1518
1519 $empty_check_args = apply_filters( 'propertyhive_taxonomy_hide_empty_args', $empty_check_args, $field, $term->term_id );
1520
1521 $empty_check_query = new WP_Query( $empty_check_args );
1522
1523 if ( !$empty_check_query->have_posts() )
1524 {
1525 continue;
1526 }
1527 }
1528
1529 $options[(int)$term->term_id] = array(
1530 'label' => __( $term->name, 'propertyhive' ),
1531 'parent' => 0
1532 );
1533
1534 if ($field['dynamic_population'])
1535 $levels_of_taxonomy = max(1, $levels_of_taxonomy);
1536
1537 if (
1538 !isset($field['parent_terms_only'])
1539 ||
1540 (
1541 isset($field['parent_terms_only']) &&
1542 $field['parent_terms_only'] === false
1543 )
1544 )
1545 {
1546 $args = array(
1547 'hide_empty' => $field['hide_empty'],
1548 'parent' => $term->term_id,
1549 );
1550 $args = apply_filters( 'propertyhive_form_taxonomy_terms_args', $args, $field );
1551 $args = apply_filters( 'propertyhive_form_taxonomy_subterms_args', $args, $field );
1552 $subterms = get_terms( $field['type'], $args );
1553
1554 if ( !empty( $subterms ) && !is_wp_error( $subterms ) )
1555 {
1556 foreach ($subterms as $subterm)
1557 {
1558 if ( isset($field['hide_empty']) && $field['hide_empty'] === true )
1559 {
1560 $empty_check_args = array(
1561 'post_type' => 'property',
1562 'meta_query' => array(
1563 array(
1564 'key' => '_on_market',
1565 'value' => 'yes',
1566 ),
1567 ),
1568 'tax_query' => array(
1569 array(
1570 'taxonomy' => $field['type'],
1571 'field' => 'term_id',
1572 'terms' => $subterm->term_id,
1573 ),
1574 ),
1575 );
1576
1577 $empty_check_args = apply_filters( 'propertyhive_taxonomy_hide_empty_args', $empty_check_args, $field, $subterm->term_id );
1578
1579 $empty_check_query = new WP_Query( $empty_check_args );
1580
1581 if ( !$empty_check_query->have_posts() )
1582 {
1583 continue;
1584 }
1585 }
1586
1587 $options[(int)$subterm->term_id] = array(
1588 'label' => ( !$field['dynamic_population'] ? '- ' : '' ) . __( $subterm->name, 'propertyhive' ),
1589 'parent' => (int)$term->term_id,
1590 );
1591
1592 if ($field['dynamic_population'])
1593 $levels_of_taxonomy = max(2, $levels_of_taxonomy);
1594
1595 $args = array(
1596 'hide_empty' => $field['hide_empty'],
1597 'parent' => (int)$subterm->term_id
1598 );
1599 $args = apply_filters( 'propertyhive_form_taxonomy_terms_args', $args, $field );
1600 $args = apply_filters( 'propertyhive_form_taxonomy_subsubterms_args', $args, $field );
1601 $subsubterms = get_terms( $field['type'], $args );
1602
1603 if ( !empty( $subsubterms ) && !is_wp_error( $subsubterms ) )
1604 {
1605 foreach ($subsubterms as $subsubterm)
1606 {
1607 if ( isset($field['hide_empty']) && $field['hide_empty'] === true )
1608 {
1609 $empty_check_args = array(
1610 'post_type' => 'property',
1611 'meta_query' => array(
1612 array(
1613 'key' => '_on_market',
1614 'value' => 'yes',
1615 ),
1616 ),
1617 'tax_query' => array(
1618 array(
1619 'taxonomy' => $field['type'],
1620 'field' => 'term_id',
1621 'terms' => $subsubterm->term_id,
1622 ),
1623 ),
1624 );
1625
1626 $empty_check_args = apply_filters( 'propertyhive_taxonomy_hide_empty_args', $empty_check_args, $field, $subsubterm->term_id );
1627
1628 $empty_check_query = new WP_Query( $empty_check_args );
1629
1630 if ( !$empty_check_query->have_posts() )
1631 {
1632 continue;
1633 }
1634 }
1635
1636 $options[(int)$subsubterm->term_id] = array(
1637 'label' => ( !$field['dynamic_population'] ? '- - ' : '' ) . __( $subsubterm->name, 'propertyhive' ),
1638 'parent' => (int)$subterm->term_id,
1639 );
1640
1641 if ($field['dynamic_population'])
1642 $levels_of_taxonomy = max(3, $levels_of_taxonomy);
1643 }
1644 }
1645 }
1646 }
1647 }
1648 }
1649 }
1650
1651 if ( $field['dynamic_population'] )
1652 {
1653 wp_localize_script( 'propertyhive_dynamic_population', 'propertyhive_dynamic_population_params', array(
1654 'options' => $options,
1655 'levels_of_taxonomy' => $levels_of_taxonomy,
1656 'value' => isset($_GET[$field['type']]) ? ph_clean($_GET[$field['type']]) : '',
1657 'other_values' => ( isset($_GET['other_' . $field['type']]) && is_array($_GET['other_' . $field['type']]) && !empty($_GET['other_' . $field['type']]) ) ? ph_clean(array_filter($_GET['other_' . $field['type']])) : array(),
1658 'taxonomy' => $field['type'],
1659 ) );
1660 wp_enqueue_script( 'propertyhive_dynamic_population' );
1661 }
1662
1663 $field['value'] = isset( $field['value'] ) ? $field['value'] : '';
1664 if ( isset( $_GET[$key] ) && ! empty( $_GET[$key] ) )
1665 {
1666 $field['value'] = sanitize_text_field(wp_unslash($_GET[$key]));
1667 }
1668
1669 for ( $level_i = 1; $level_i <= $levels_of_taxonomy; ++$level_i )
1670 {
1671 $output .= $field['before'];
1672
1673 if ($field['show_label'])
1674 {
1675 $output .= '<label for="' . esc_attr( $key ) . '">' . $field['label'] . '</label>';
1676 }
1677
1678 $output .= '<select
1679 name="' . esc_attr( $key ) . ( $field['multiselect'] ? '[]' : '' ) . '"
1680 id="' . esc_attr( $key ) . '"
1681 class="' . esc_attr( $field['class'] ) . ( $field['multiselect'] ? ' ph-form-multiselect' : '' ) . '"
1682 ' . ( $field['multiselect'] ? ' multiple="multiple"' : '' ) .
1683 ( $field['dynamic_population'] ? ' data-dynamic-population-level="' . $level_i . '"' : '' ) .
1684 ( ( $field['dynamic_population'] && $level_i > 1 ) ? ' disabled' : '' ) . '
1685 data-blank-option="' . esc_attr($field['blank_option']) . '"
1686 >';
1687
1688 if ( $level_i == 1 )
1689 {
1690 foreach ( $options as $option_key => $value )
1691 {
1692 if ( $field['multiselect'] && $option_key == '' )
1693 {
1694 // Skip because we don't want a blank option in the multiselect. Instead use $value as the placeholder
1695 continue;
1696 }
1697
1698 if ( $field['dynamic_population'] && $value['parent'] != '0' )
1699 {
1700 continue;
1701 }
1702
1703 $output .= '<option
1704 value="' . esc_attr( $option_key ) . '"';
1705 if ( !$field['multiselect'] )
1706 {
1707 $output .= selected( esc_attr( $field['value'] ), esc_attr( $option_key ), false );
1708 }
1709 else
1710 {
1711 if ( isset($_REQUEST[$key]) && is_array($_REQUEST[$key]) && in_array($option_key, $_REQUEST[$key]) )
1712 {
1713 $output .= ' selected';
1714 }
1715 elseif ( is_array($field['value']) && in_array($option_key, $field['value']) )
1716 {
1717 $output .= ' selected';
1718 }
1719 }
1720 $output .= '>' . esc_html( $value['label'] ) . '</option>';
1721 }
1722 }
1723
1724 $output .= '</select>';
1725
1726 $output .= $field['after'];
1727
1728 if ( $field['type'] == 'availability' )
1729 {
1730 $availability_departments = get_option( 'propertyhive_availability_departments', array() );
1731 if ( !is_array($availability_departments) ) { $availability_departments = array(); }
1732
1733 if ( !empty($availability_departments) )
1734 {
1735 ?>
1736 <script>
1737 var selected_availability = '<?php echo ( isset($_REQUEST[$key]) && $_REQUEST[$key] != '' ? (int)$_REQUEST[$key] : '' ); ?>';
1738 var availability_departments = <?php echo json_encode($availability_departments); ?>;
1739 var availabilities = <?php echo json_encode($options); ?>;
1740 var availabilities_order = <?php echo json_encode(array_keys($options)); ?>;
1741 </script>
1742 <?php
1743 }
1744 }
1745 }
1746 }
1747 }
1748 }
1749
1750 echo $output;
1751 }