Visual Form Builder - Version 2.7.4

Version Description

Fix bug where referer URL did not match domains that prepended www. Fix bug where file uploads were not being sent. Other updates and fixes.

Download this release

Release Info

Developer mmuro
Plugin Icon 128x128 Visual Form Builder
Version 2.7.4
Comparing to
See all releases

Code changes from version 2.7.3 to 2.7.4

images/plus-sign.png DELETED
Binary file
includes/class-entries-detail.php CHANGED
@@ -70,7 +70,7 @@ class VisualFormBuilder_Entries_Detail{
70
  </div> <!-- #minor-publishing -->
71
 
72
  <div id="major-publishing-actions">
73
- <div id="delete-action"><?php echo sprintf( '<a class="submitdelete deletion entry-delete" href="?page=%s&action=%s&entry=%s">Delete</a>', $_REQUEST['page'], 'delete', $entry_id ); ?></div>
74
  <div class="clear"></div>
75
  </div> <!-- #major-publishing-actions -->
76
  </div> <!-- #submitbox -->
70
  </div> <!-- #minor-publishing -->
71
 
72
  <div id="major-publishing-actions">
73
+ <div id="delete-action"><?php echo sprintf( '<a class="submitdelete deletion entry-delete" href="?page=%s&action=%s&entry=%s">Trash</a>', $_REQUEST['page'], 'trash_entry', $entry_id ); ?></div>
74
  <div class="clear"></div>
75
  </div> <!-- #major-publishing-actions -->
76
  </div> <!-- #submitbox -->
includes/class-entries-list.php CHANGED
@@ -140,8 +140,19 @@ class VisualFormBuilder_Entries_List extends WP_List_Table {
140
  $where .= " AND YEAR(date_submitted) = $year AND MONTH(date_submitted) = $month";
141
  }
142
 
 
 
 
 
 
 
 
143
  // Entries type filter
144
  $where .= ( $this->get_entry_status() && 'all' !== $this->get_entry_status() ) ? $wpdb->prepare( ' AND entries.entry_approved = %s', $this->get_entry_status() ) : '';
 
 
 
 
145
 
146
  $sql_order = sanitize_sql_orderby( "$order_col $order" );
147
  $cols = $wpdb->get_results( "SELECT forms.form_title, entries.entries_id, entries.form_id, entries.subject, entries.sender_name, entries.sender_email, entries.emails_to, entries.date_submitted, entries.ip_address FROM $this->form_table_name AS forms INNER JOIN $this->entries_table_name AS entries ON entries.form_id = forms.form_id WHERE 1=1 $where $search ORDER BY $sql_order LIMIT $per_page $offset" );
@@ -512,9 +523,23 @@ class VisualFormBuilder_Entries_List extends WP_List_Table {
512
 
513
  $where .= " AND YEAR(date_submitted) = $year AND MONTH(date_submitted) = $month";
514
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
 
516
  // How many entries do we have?
517
- $total_items = $wpdb->get_var( "SELECT COUNT(*) FROM $this->entries_table_name AS forms WHERE 1=1 $where" );
518
 
519
  // Add sorted data to the items property
520
  $this->items = $data;
140
  $where .= " AND YEAR(date_submitted) = $year AND MONTH(date_submitted) = $month";
141
  }
142
 
143
+ // Get the month/year from the dropdown
144
+ $today = isset( $_REQUEST['today'] ) ? (int) $_REQUEST['today'] : 0;
145
+
146
+ // Parse month/year and build the clause
147
+ if ( $today > 0 )
148
+ $where .= " AND entries.date_submitted >= curdate()";
149
+
150
  // Entries type filter
151
  $where .= ( $this->get_entry_status() && 'all' !== $this->get_entry_status() ) ? $wpdb->prepare( ' AND entries.entry_approved = %s', $this->get_entry_status() ) : '';
152
+
153
+ // Always display approved entries, unless an Entries Type filter is set
154
+ if ( !$this->get_entry_status() || 'all' == $this->get_entry_status() )
155
+ $where .= $wpdb->prepare( ' AND entries.entry_approved = %d', 1 );
156
 
157
  $sql_order = sanitize_sql_orderby( "$order_col $order" );
158
  $cols = $wpdb->get_results( "SELECT forms.form_title, entries.entries_id, entries.form_id, entries.subject, entries.sender_name, entries.sender_email, entries.emails_to, entries.date_submitted, entries.ip_address FROM $this->form_table_name AS forms INNER JOIN $this->entries_table_name AS entries ON entries.form_id = forms.form_id WHERE 1=1 $where $search ORDER BY $sql_order LIMIT $per_page $offset" );
523
 
524
  $where .= " AND YEAR(date_submitted) = $year AND MONTH(date_submitted) = $month";
525
  }
526
+
527
+ // Get the month/year from the dropdown
528
+ $today = isset( $_REQUEST['today'] ) ? (int) $_REQUEST['today'] : 0;
529
+
530
+ // Parse month/year and build the clause
531
+ if ( $today > 0 )
532
+ $where .= " AND entries.date_submitted >= curdate()";
533
+
534
+ // Entry type filter
535
+ $where .= ( $this->get_entry_status() && 'all' !== $this->get_entry_status() ) ? $wpdb->prepare( ' AND entries.entry_approved = %s', $this->get_entry_status() ) : '';
536
+
537
+ // Always display approved entries, unless an Entries Type filter is set
538
+ if ( !$this->get_entry_status() || 'all' == $this->get_entry_status() )
539
+ $where .= $wpdb->prepare( ' AND entries.entry_approved = %d', 1 );
540
 
541
  // How many entries do we have?
542
+ $total_items = $wpdb->get_var( "SELECT COUNT(*) FROM $this->entries_table_name AS entries WHERE 1=1 $where" );
543
 
544
  // Add sorted data to the items property
545
  $this->items = $data;
includes/email.php CHANGED
@@ -4,17 +4,17 @@ global $wpdb, $post;
4
  $required = ( isset( $_REQUEST['_vfb-required-secret'] ) && $_REQUEST['_vfb-required-secret'] == '0' ) ? false : true;
5
  $secret_field = ( isset( $_REQUEST['_vfb-secret'] ) ) ? $_REQUEST['_vfb-secret'] : '';
6
  $honeypot = ( isset( $_REQUEST['vfb-spam'] ) ) ? $_REQUEST['vfb-spam'] : '';
7
- $referrer = ( isset( $_REQUEST['vfb_referral_url'] ) ) ? $_REQUEST['vfb_referral_url'] : false;
8
  $wp_get_referer = wp_get_referer();
9
 
10
  // If the verification is set to required, run validation check
11
- if ( true == $required && !empty( $secret_field ) ) {
12
  if ( !empty( $honeypot ) )
13
  wp_die( __( 'Security check: hidden spam field should be blank.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
14
  if ( !is_numeric( $_REQUEST[ $secret_field ] ) || strlen( $_REQUEST[ $secret_field ] ) !== 2 )
15
  wp_die( __( 'Security check: failed secret question. Please try again!' , 'visual-form-builder'), '', array( 'back_link' => true ) );
16
- }
17
-
18
  // Basic security check before moving any further
19
  if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
20
 
@@ -23,7 +23,7 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
23
  wp_die( __( 'Security check: referal URL does not appear to be set.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
24
 
25
  // Test if the referral URL matches what sent from WordPress
26
- if ( $referrer !== $wp_get_referer )
27
  wp_die( __( 'Security check: referal does not match this site.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
28
 
29
  // Test if it's a known SPAM bot
@@ -41,7 +41,7 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
41
  $forms = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $this->form_table_name WHERE form_id = %d ORDER BY $order", $form_id ) );
42
 
43
  // Get sender and email details
44
- foreach ( $forms as $form ) {
45
  $form_settings = (object) array(
46
  'form_title' => stripslashes( html_entity_decode( $form->form_title, ENT_QUOTES, 'UTF-8' ) ),
47
  'form_subject' => stripslashes( html_entity_decode( $form->form_email_subject, ENT_QUOTES, 'UTF-8' ) ),
@@ -57,7 +57,7 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
57
  );
58
  // Allow the form settings to be filtered (ex: return $form_settings->'form_title' = 'Hello World';)
59
  $form_settings = (object) apply_filters_ref_array( 'vfb_email_form_settings', array( $form_settings, $form_id ) );
60
- }
61
 
62
  // Sender name field ID
63
  $sender = $wpdb->get_var( $wpdb->prepare( "SELECT form_email_from_name_override FROM $this->form_table_name WHERE form_id = %d", $form_id ) );
@@ -202,7 +202,9 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
202
  $value = $this->build_array_form_item( $value, $field->field_type );
203
  // If multiple values, build the list
204
  elseif ( is_array( $value ) )
205
- $value = esc_html( implode( ', ', $value ) );
 
 
206
  // Lastly, handle single values
207
  else
208
  $value = html_entity_decode( stripslashes( esc_html( $value ) ), ENT_QUOTES, 'UTF-8' );
@@ -225,7 +227,10 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
225
  // Validate input
226
  $this->validate_input( $value, $field->field_name, $field->field_type, $field->field_required );
227
 
228
- if ( ! in_array( $field->field_type, array( 'verification', 'secret', 'submit' ) ) ) :
 
 
 
229
  if ( $field->field_type == 'fieldset' ) :
230
  $body .= sprintf(
231
  '<tr style="background-color:#393E40;color:white;font-size:14px;">
@@ -335,8 +340,8 @@ if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
335
  // If site domain and admin_email domain match, use admin_email, otherwise a same domain email must be created
336
  $from_email = ( $sitename == $domain ) ? $from_email : "wordpress@$sitename";
337
 
338
- $reply_to = "\"$header_from_name\" <$header_from>";
339
- $headers = "Sender: $from_email\r\n" . "From: $reply_to\r\n" . "Reply-To: $reply_to\r\n" . "Content-Type: $header_content_type; charset=\"" . get_option('blog_charset') . "\"\r\n";
340
 
341
  $form_subject = wp_specialchars_decode( $form_settings->form_subject, ENT_QUOTES );
342
  $notify_subject = wp_specialchars_decode( $form_settings->form_notification_subject, ENT_QUOTES );
4
  $required = ( isset( $_REQUEST['_vfb-required-secret'] ) && $_REQUEST['_vfb-required-secret'] == '0' ) ? false : true;
5
  $secret_field = ( isset( $_REQUEST['_vfb-secret'] ) ) ? $_REQUEST['_vfb-secret'] : '';
6
  $honeypot = ( isset( $_REQUEST['vfb-spam'] ) ) ? $_REQUEST['vfb-spam'] : '';
7
+ $referrer = ( isset( $_REQUEST['_wp_http_referer'] ) ) ? $_REQUEST['_wp_http_referer'] : false;
8
  $wp_get_referer = wp_get_referer();
9
 
10
  // If the verification is set to required, run validation check
11
+ if ( true == $required && !empty( $secret_field ) ) :
12
  if ( !empty( $honeypot ) )
13
  wp_die( __( 'Security check: hidden spam field should be blank.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
14
  if ( !is_numeric( $_REQUEST[ $secret_field ] ) || strlen( $_REQUEST[ $secret_field ] ) !== 2 )
15
  wp_die( __( 'Security check: failed secret question. Please try again!' , 'visual-form-builder'), '', array( 'back_link' => true ) );
16
+ endif;
17
+
18
  // Basic security check before moving any further
19
  if ( isset( $_REQUEST['visual-form-builder-submit'] ) ) :
20
 
23
  wp_die( __( 'Security check: referal URL does not appear to be set.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
24
 
25
  // Test if the referral URL matches what sent from WordPress
26
+ if ( $wp_get_referer )
27
  wp_die( __( 'Security check: referal does not match this site.' , 'visual-form-builder'), '', array( 'back_link' => true ) );
28
 
29
  // Test if it's a known SPAM bot
41
  $forms = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $this->form_table_name WHERE form_id = %d ORDER BY $order", $form_id ) );
42
 
43
  // Get sender and email details
44
+ foreach ( $forms as $form ) :
45
  $form_settings = (object) array(
46
  'form_title' => stripslashes( html_entity_decode( $form->form_title, ENT_QUOTES, 'UTF-8' ) ),
47
  'form_subject' => stripslashes( html_entity_decode( $form->form_email_subject, ENT_QUOTES, 'UTF-8' ) ),
57
  );
58
  // Allow the form settings to be filtered (ex: return $form_settings->'form_title' = 'Hello World';)
59
  $form_settings = (object) apply_filters_ref_array( 'vfb_email_form_settings', array( $form_settings, $form_id ) );
60
+ endforeach;
61
 
62
  // Sender name field ID
63
  $sender = $wpdb->get_var( $wpdb->prepare( "SELECT form_email_from_name_override FROM $this->form_table_name WHERE form_id = %d", $form_id ) );
202
  $value = $this->build_array_form_item( $value, $field->field_type );
203
  // If multiple values, build the list
204
  elseif ( is_array( $value ) )
205
+ $value = $this->build_array_form_item( $value, $field->field_type );
206
+ elseif ( 'radio' == $field->field_type )
207
+ $value = wp_specialchars_decode( stripslashes( esc_html( $value ) ), ENT_QUOTES );
208
  // Lastly, handle single values
209
  else
210
  $value = html_entity_decode( stripslashes( esc_html( $value ) ), ENT_QUOTES, 'UTF-8' );
227
  // Validate input
228
  $this->validate_input( $value, $field->field_name, $field->field_type, $field->field_required );
229
 
230
+ $removed_field_types = array( 'verification', 'secret', 'submit' );
231
+
232
+ // Don't add certain fields to the email
233
+ if ( ! in_array( $field->field_type, $removed_field_types ) ) :
234
  if ( $field->field_type == 'fieldset' ) :
235
  $body .= sprintf(
236
  '<tr style="background-color:#393E40;color:white;font-size:14px;">
340
  // If site domain and admin_email domain match, use admin_email, otherwise a same domain email must be created
341
  $from_email = ( $sitename == $domain ) ? $from_email : "wordpress@$sitename";
342
 
343
+ $reply_to = "\"$from_name\" <$header_from>";
344
+ $headers = "Sender: $from_email\r\n" . "From: $reply_to\r\n" . "Reply-To: $reply_to\r\n" . "Content-Type: $header_content_type; charset=\"" . get_option('blog_charset') . "\"\r\n";
345
 
346
  $form_subject = wp_specialchars_decode( $form_settings->form_subject, ENT_QUOTES );
347
  $notify_subject = wp_specialchars_decode( $form_settings->form_notification_subject, ENT_QUOTES );
includes/form-output.php CHANGED
@@ -1,8 +1,4 @@
1
  <?php
2
- // Turn off caching plugin for this page to fix occasional nonce error
3
- if ( !defined( 'DONOTCACHEPAGE' ) )
4
- define( 'DONOTCACHEPAGE', true );
5
-
6
  global $wpdb;
7
 
8
  // Extract shortcode attributes, set defaults
@@ -42,22 +38,29 @@ $open_fieldset = $open_section = false;
42
  $submit = 'Submit';
43
  $verification = '';
44
 
45
- // Current URL
46
- $current_url = 'http'. ( empty( $_SERVER['HTTPS'] ) ? '' : 's' ) . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
47
-
48
  $label_alignment = ( $form->form_label_alignment !== '' ) ? " $form->form_label_alignment" : '';
49
- $output = '<div class="visual-form-builder-container"><form id="' . $form->form_key . '" class="visual-form-builder' . $label_alignment . '" method="post" 46="multipart/form-data">
50
- <input type="hidden" name="form_id" value="' . $form->form_id . '" />';
51
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  foreach ( $fields as $field ) :
53
  $field_id = absint( $field->field_id );
54
  $field_type = esc_html( $field->field_type );
55
- // If field is required, build the span and add setup the 'required' class
56
  $required_span = ( !empty( $field->field_required ) && $field->field_required === 'yes' ) ? ' <span>*</span>' : '';
57
  $required = ( !empty( $field->field_required ) && $field->field_required === 'yes' ) ? ' required' : '';
58
  $validation = ( !empty( $field->field_validation ) ) ? " $field->field_validation" : '';
59
  $css = ( !empty( $field->field_css ) ) ? " $field->field_css" : '';
60
- $id_attr = 'vfb-' . esc_html( $field->field_key ) . '-' . $field->field_id;
61
  $size = ( !empty( $field->field_size ) ) ? " vfb-$field->field_size" : '';
62
  $layout = ( !empty( $field->field_layout ) ) ? " vfb-$field->field_layout" : '';
63
  $default = ( !empty( $field->field_default ) ) ? wp_specialchars_decode( esc_html( stripslashes( $field->field_default ) ), ENT_QUOTES ) : '';
@@ -90,7 +93,7 @@ foreach ( $fields as $field ) :
90
  $field->field_key,
91
  $css,
92
  $id_attr,
93
- stripslashes( $field->field_name )
94
  );
95
 
96
  $open_fieldset = true;
@@ -102,7 +105,7 @@ foreach ( $fields as $field ) :
102
  '<div class="vfb-section-div %1$s %2$s"><h4>%3$s</h4>',
103
  $id_attr,
104
  $css,
105
- stripslashes( $field->field_name )
106
  );
107
 
108
  // Save section ID for future comparison
@@ -122,7 +125,7 @@ foreach ( $fields as $field ) :
122
  $columns_choice,
123
  $layout,
124
  $id_attr,
125
- stripslashes( $field->field_name ),
126
  $required_span
127
  );
128
  endif;
@@ -136,7 +139,7 @@ foreach ( $fields as $field ) :
136
  $field->field_key,
137
  $css,
138
  $id_attr,
139
- stripslashes( $field->field_name )
140
  );
141
  endif;
142
 
@@ -201,7 +204,7 @@ foreach ( $fields as $field ) :
201
 
202
  $form_item = sprintf(
203
  '<input type="%8$s" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text %4$s %5$s %6$s %7$s" />',
204
- absint( $field->field_id ),
205
  $id_attr,
206
  $default,
207
  $size,
@@ -219,7 +222,7 @@ foreach ( $fields as $field ) :
219
 
220
  $form_item = sprintf(
221
  '<textarea name="vfb-%1$d" id="%2$s" class="vfb-textarea %4$s %5$s %6$s">%3$s</textarea>',
222
- absint( $field->field_id ),
223
  $id_attr,
224
  $default,
225
  $size,
@@ -243,12 +246,12 @@ foreach ( $fields as $field ) :
243
 
244
  // Loop through each option and output
245
  foreach ( $field_options as $option => $value ) {
246
- $options .= sprintf( '<option value="%1$s"%2$s>%1$s</option>', trim( stripslashes( $value ) ), selected( $default, ++$option, 0 ) );
247
  }
248
 
249
  $form_item = sprintf(
250
  '<select name="vfb-%1$d" id="%2$s" class="vfb-select %3$s %4$s %5$s">%6$s</select>',
251
- absint( $field->field_id ),
252
  $id_attr,
253
  $size,
254
  $required,
@@ -268,15 +271,18 @@ foreach ( $fields as $field ) :
268
 
269
  // Loop through each option and output
270
  foreach ( $field_options as $option => $value ) {
 
 
271
  $options .= sprintf(
272
- '<span><input type="radio" name="vfb-%1$d" id="%2$s-%3$d" value="%6$s" class="vfb-radio %4$s %5$s"%7$s /><label for="%2$s-%3$d" class="vfb-choice">%6$s</label></span>',
273
- absint( $field->field_id ),
274
  $id_attr,
275
  $option,
276
  $required,
277
  $css,
278
- trim( stripslashes( $value ) ),
279
- checked( $default, ++$option, 0 )
 
280
  );
281
  }
282
 
@@ -299,13 +305,14 @@ foreach ( $fields as $field ) :
299
  // Loop through each option and output
300
  foreach ( $field_options as $option => $value ) {
301
  $options .= sprintf(
302
- '<span><input type="checkbox" name="vfb-%1$d[]" id="%2$s-%3$d" value="%6$s" class="vfb-checkbox %4$s %5$s"%7$s /><label for="%2$s-%3$d" class="vfb-choice">%6$s</label></span>',
303
- absint( $field->field_id ),
304
  $id_attr,
305
  $option,
306
  $required,
307
  $css,
308
- trim( stripslashes( $value ) ),
 
309
  checked( $default, ++$option, 0 )
310
  );
311
  }
@@ -368,7 +375,7 @@ foreach ( $fields as $field ) :
368
 
369
  $address .= sprintf(
370
  '<span class="vfb-%3$s"><select name="vfb-%1$d[%4$s]" class="vfb-select %7$s %8$s" id="%2$s-%4$s">%6$s</select><label for="%2$s-%4$s">%5$s</label></span>',
371
- absint( $field->field_id ),
372
  $id_attr,
373
  $part['layout'],
374
  $parts,
@@ -382,7 +389,7 @@ foreach ( $fields as $field ) :
382
 
383
  $address .= sprintf(
384
  '<span class="vfb-%3$s"><input type="text" name="vfb-%1$d[%4$s]" id="%2$s-%4$s" maxlength="150" class="vfb-text vfb-medium %7$s %8$s" /><label for="%2$s-%4$s">%5$s</label></span>',
385
- absint( $field->field_id ),
386
  $id_attr,
387
  $part['layout'],
388
  $parts,
@@ -404,7 +411,7 @@ foreach ( $fields as $field ) :
404
 
405
  $form_item = sprintf(
406
  '<input type="text" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text vfb-date-picker %4$s %5$s %6$s" />',
407
- absint( $field->field_id ),
408
  $id_attr,
409
  $default,
410
  $size,
@@ -445,7 +452,7 @@ foreach ( $fields as $field ) :
445
  if ( $time_format == '12' ) {
446
  $ampm = sprintf(
447
  '<span class="vfb-time"><select name="vfb-%1$d[ampm]" id="%2$s-ampm" class="vfb-select %5$s %6$s"><option value="AM">AM</option><option value="PM">PM</option></select><label for="%2$s-ampm">AM/PM</label></span>',
448
- absint( $field->field_id ),
449
  $id_attr,
450
  $hour,
451
  $minute,
@@ -458,7 +465,7 @@ foreach ( $fields as $field ) :
458
  '<span class="vfb-time"><select name="vfb-%1$d[hour]" id="%2$s-hour" class="vfb-select %5$s %6$s">%3$s</select><label for="%2$s-hour">HH</label></span>' .
459
  '<span class="vfb-time"><select name="vfb-%1$d[min]" id="%2$s-min" class="vfb-select %5$s %6$s">%4$s</select><label for="%2$s-min">MM</label></span>' .
460
  '%7$s',
461
- absint( $field->field_id ),
462
  $id_attr,
463
  $hour,
464
  $minute,
@@ -478,7 +485,7 @@ foreach ( $fields as $field ) :
478
  $form_item = sprintf(
479
  '<script type="text/javascript">edToolbar("%2$s");</script>' .
480
  '<textarea name="vfb-%1$d" id="%2$s" class="vfb-textarea vfbEditor %4$s %5$s %6$s">%3$s</textarea>',
481
- absint( $field->field_id ),
482
  $id_attr,
483
  $default,
484
  $size,
@@ -502,7 +509,7 @@ foreach ( $fields as $field ) :
502
 
503
  $form_item = sprintf(
504
  '<input type="file" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text %4$s %5$s %6$s %7$s %8$s" />',
505
- absint( $field->field_id ),
506
  $id_attr,
507
  $default,
508
  $size,
@@ -512,8 +519,8 @@ foreach ( $fields as $field ) :
512
  $accept
513
  );
514
 
515
- $output .= ( !empty( $description ) ) ? sprintf( '<span>%1$s<label>%2$s</label></span>', $form_item, $description ) : $form_item;
516
-
517
  break;
518
 
519
  case 'instructions' :
@@ -523,11 +530,13 @@ foreach ( $fields as $field ) :
523
  break;
524
 
525
  case 'submit' :
526
-
527
  $submit = sprintf(
528
- '<li class="vfb-item vfb-item-submit" id="%2$s"><input type="submit" name="visual-form-builder-submit" value="%1$s" class="vfb-submit %3$s" id="sendmail" /></li>',
529
- esc_attr( stripslashes( $field->field_name ) ),
 
 
530
  $id_attr,
 
531
  $css
532
  );
533
 
@@ -573,7 +582,7 @@ $output .= sprintf(
573
  $submit
574
  );
575
 
576
- $output .= sprintf( '<input type="hidden" name="vfb_referral_url" value="%s">', $current_url );
577
 
578
  // Close the form out
579
  $output .= '</form>';
1
  <?php
 
 
 
 
2
  global $wpdb;
3
 
4
  // Extract shortcode attributes, set defaults
38
  $submit = 'Submit';
39
  $verification = '';
40
 
 
 
 
41
  $label_alignment = ( $form->form_label_alignment !== '' ) ? " $form->form_label_alignment" : '';
 
 
42
 
43
+ // Start form container
44
+ $output .= '<div class="visual-form-builder-container">';
45
+
46
+ $output .= sprintf(
47
+ '<form id="%1$s-%2$d" class="visual-form-builder %3$s %4$s" method="post" enctype="multipart/form-data">
48
+ <input type="hidden" name="form_id" value="%5$d" />',
49
+ esc_html( $form->form_key ),
50
+ $form_id,
51
+ "vfb-form-$form_id",
52
+ $label_alignment,
53
+ absint( $form->form_id )
54
+ );
55
  foreach ( $fields as $field ) :
56
  $field_id = absint( $field->field_id );
57
  $field_type = esc_html( $field->field_type );
58
+ $field_name = stripslashes( $field->field_name );
59
  $required_span = ( !empty( $field->field_required ) && $field->field_required === 'yes' ) ? ' <span>*</span>' : '';
60
  $required = ( !empty( $field->field_required ) && $field->field_required === 'yes' ) ? ' required' : '';
61
  $validation = ( !empty( $field->field_validation ) ) ? " $field->field_validation" : '';
62
  $css = ( !empty( $field->field_css ) ) ? " $field->field_css" : '';
63
+ $id_attr = 'vfb-' . esc_html( $field->field_key ) . '-' . $field_id;
64
  $size = ( !empty( $field->field_size ) ) ? " vfb-$field->field_size" : '';
65
  $layout = ( !empty( $field->field_layout ) ) ? " vfb-$field->field_layout" : '';
66
  $default = ( !empty( $field->field_default ) ) ? wp_specialchars_decode( esc_html( stripslashes( $field->field_default ) ), ENT_QUOTES ) : '';
93
  $field->field_key,
94
  $css,
95
  $id_attr,
96
+ $field_name
97
  );
98
 
99
  $open_fieldset = true;
105
  '<div class="vfb-section-div %1$s %2$s"><h4>%3$s</h4>',
106
  $id_attr,
107
  $css,
108
+ $field_name
109
  );
110
 
111
  // Save section ID for future comparison
125
  $columns_choice,
126
  $layout,
127
  $id_attr,
128
+ $field_name,
129
  $required_span
130
  );
131
  endif;
139
  $field->field_key,
140
  $css,
141
  $id_attr,
142
+ $field_name
143
  );
144
  endif;
145
 
204
 
205
  $form_item = sprintf(
206
  '<input type="%8$s" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text %4$s %5$s %6$s %7$s" />',
207
+ $field_id,
208
  $id_attr,
209
  $default,
210
  $size,
222
 
223
  $form_item = sprintf(
224
  '<textarea name="vfb-%1$d" id="%2$s" class="vfb-textarea %4$s %5$s %6$s">%3$s</textarea>',
225
+ $field_id,
226
  $id_attr,
227
  $default,
228
  $size,
246
 
247
  // Loop through each option and output
248
  foreach ( $field_options as $option => $value ) {
249
+ $options .= sprintf( '<option value="%1$s"%2$s>%1$s</option>', esc_attr(trim( stripslashes( $value ) ) ), selected( $default, ++$option, 0 ) );
250
  }
251
 
252
  $form_item = sprintf(
253
  '<select name="vfb-%1$d" id="%2$s" class="vfb-select %3$s %4$s %5$s">%6$s</select>',
254
+ $field_id,
255
  $id_attr,
256
  $size,
257
  $required,
271
 
272
  // Loop through each option and output
273
  foreach ( $field_options as $option => $value ) {
274
+ $option++;
275
+
276
  $options .= sprintf(
277
+ '<span><input type="radio" name="vfb-%1$d" id="%2$s-%3$d" value="%6$s" class="vfb-radio %4$s %5$s"%8$s /><label for="%2$s-%3$d" class="vfb-choice">%7$s</label></span>',
278
+ $field_id,
279
  $id_attr,
280
  $option,
281
  $required,
282
  $css,
283
+ esc_attr( trim( stripslashes( $value ) ) ),
284
+ wp_specialchars_decode( stripslashes( $value ) ),
285
+ checked( $default, $option, 0 )
286
  );
287
  }
288
 
305
  // Loop through each option and output
306
  foreach ( $field_options as $option => $value ) {
307
  $options .= sprintf(
308
+ '<span><input type="checkbox" name="vfb-%1$d[]" id="%2$s-%3$d" value="%6$s" class="vfb-checkbox %4$s %5$s"%8$s /><label for="%2$s-%3$d" class="vfb-choice">%7$s</label></span>',
309
+ $field_id,
310
  $id_attr,
311
  $option,
312
  $required,
313
  $css,
314
+ esc_attr( trim( stripslashes( $value ) ) ),
315
+ wp_specialchars_decode( stripslashes( $value ) ),
316
  checked( $default, ++$option, 0 )
317
  );
318
  }
375
 
376
  $address .= sprintf(
377
  '<span class="vfb-%3$s"><select name="vfb-%1$d[%4$s]" class="vfb-select %7$s %8$s" id="%2$s-%4$s">%6$s</select><label for="%2$s-%4$s">%5$s</label></span>',
378
+ $field_id,
379
  $id_attr,
380
  $part['layout'],
381
  $parts,
389
 
390
  $address .= sprintf(
391
  '<span class="vfb-%3$s"><input type="text" name="vfb-%1$d[%4$s]" id="%2$s-%4$s" maxlength="150" class="vfb-text vfb-medium %7$s %8$s" /><label for="%2$s-%4$s">%5$s</label></span>',
392
+ $field_id,
393
  $id_attr,
394
  $part['layout'],
395
  $parts,
411
 
412
  $form_item = sprintf(
413
  '<input type="text" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text vfb-date-picker %4$s %5$s %6$s" />',
414
+ $field_id,
415
  $id_attr,
416
  $default,
417
  $size,
452
  if ( $time_format == '12' ) {
453
  $ampm = sprintf(
454
  '<span class="vfb-time"><select name="vfb-%1$d[ampm]" id="%2$s-ampm" class="vfb-select %5$s %6$s"><option value="AM">AM</option><option value="PM">PM</option></select><label for="%2$s-ampm">AM/PM</label></span>',
455
+ $field_id,
456
  $id_attr,
457
  $hour,
458
  $minute,
465
  '<span class="vfb-time"><select name="vfb-%1$d[hour]" id="%2$s-hour" class="vfb-select %5$s %6$s">%3$s</select><label for="%2$s-hour">HH</label></span>' .
466
  '<span class="vfb-time"><select name="vfb-%1$d[min]" id="%2$s-min" class="vfb-select %5$s %6$s">%4$s</select><label for="%2$s-min">MM</label></span>' .
467
  '%7$s',
468
+ $field_id,
469
  $id_attr,
470
  $hour,
471
  $minute,
485
  $form_item = sprintf(
486
  '<script type="text/javascript">edToolbar("%2$s");</script>' .
487
  '<textarea name="vfb-%1$d" id="%2$s" class="vfb-textarea vfbEditor %4$s %5$s %6$s">%3$s</textarea>',
488
+ $field_id,
489
  $id_attr,
490
  $default,
491
  $size,
509
 
510
  $form_item = sprintf(
511
  '<input type="file" name="vfb-%1$d" id="%2$s" value="%3$s" class="vfb-text %4$s %5$s %6$s %7$s %8$s" />',
512
+ $field_id,
513
  $id_attr,
514
  $default,
515
  $size,
519
  $accept
520
  );
521
 
522
+ $output .= ( !empty( $description ) ) ? sprintf( '<span>%1$s<label>%2$s</label></span>', $form_item, $description ) : $form_item;
523
+
524
  break;
525
 
526
  case 'instructions' :
530
  break;
531
 
532
  case 'submit' :
 
533
  $submit = sprintf(
534
+ '<li class="vfb-item vfb-item-submit" id="%2$s">
535
+ <input type="submit" name="visual-form-builder-submit" id="sendmail" value="%3$s" class="vfb-submit %4$s" />
536
+ </li>',
537
+ $field_id,
538
  $id_attr,
539
+ wp_specialchars_decode( esc_html( $field_name ), ENT_QUOTES ),
540
  $css
541
  );
542
 
582
  $submit
583
  );
584
 
585
+ $output .= wp_referer_field( false );
586
 
587
  // Close the form out
588
  $output .= '</form>';
js/vfb-admin.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(g){if(window.VfbAdminPages){var f=VfbAdminPages.vfb_pages;if(pagenow==f.vfb){g(".if-js-closed").removeClass("if-js-closed").addClass("closed");postboxes.add_postbox_toggles(f.vfb)}}var c=null;g(document).on("mouseenter mouseleave",".vfb-tooltip",function(p){if(p.type=="mouseenter"){if(c){clearTimeout(c);c=null}var m=g(this).attr("title"),o=g(this).attr("rel"),n=g(this).width();g(this).append('<div class="tooltip"><h3>'+m+'</h3><p class="text">'+o+"</p></div>");g.data(this,"title",m);this.title="";g(this).find(".tooltip").css({left:n+22});c=setTimeout(function(){g(".tooltip").fadeIn(300)},500)}else{this.title=g.data(this,"title");g(".tooltip").fadeOut(500);g(this).children().remove()}});g(document).on("click","a.addOption",function(s){s.preventDefault();var n=g(this).parent().parent().find(".clonedOption").length;var r=n+1;var t=g(this).closest("div").attr("id");var q=g(this).closest("div").children("label").attr("for");var m=q.replace(new RegExp(/(\d+)$/g),"");var p=t.replace(new RegExp(/(\d+)$/g),"");var o=g("#"+t).clone().attr("id",p+r);o.children("label").attr("for",m+r);o.find('input[type="text"]').attr("id",m+r);o.find('input[type="radio"]').attr("value",r);g("#"+p+n).after(o)});g(document).on("click","a.deleteOption",function(n){n.preventDefault();var m=g(this).parent().parent().find(".clonedOption").length;if(m-1==0){alert("You must have at least one option.")}else{g(this).closest("div").remove()}});g(document).on("click","a.addEmail",function(s){s.preventDefault();var n=g(this).closest("#email-details").find(".clonedOption").length;var r=n+1;var t=g(this).closest("div").attr("id");var q=g(this).closest("div").find("label").attr("for");var m=q.replace(new RegExp(/(\d+)$/g),"");var p=t.replace(new RegExp(/(\d+)$/g),"");var o=g("#"+t).clone().attr("id",p+r);o.find("label").attr("for",m+r);o.find("input").attr("id",m+r);g("#"+p+n).after(o)});g(document).on("click","a.deleteEmail",function(n){n.preventDefault();var m=g(this).closest("#email-details").find(".clonedOption").length;if(m-1==0){alert("You must have at least one option.")}else{g(this).closest("div").remove()}});g('.option input[type="radio"]').mousedown(function(){g(this).attr("previousValue",g(this).prop("checked"))}).click(function(){var m=g(this).attr("previousValue");if(m=="true"){g(this).prop("checked",false)}});g(".menu-delete, .entry-delete").click(function(){var m=(g(this).hasClass("entry-delete"))?"entry":"form";var n=confirm("You are about to permanently delete this "+m+" and all of its data.\n'Cancel' to stop, 'OK' to delete.");if(n){return true}return false});g(document).on("click","a.item-edit",function(m){m.preventDefault();g(m.target).closest("li").children(".menu-item-settings").slideToggle("fast");g(this).toggleClass("opened")});function l(m){if("FIELDSET"!==m){g("#vfb-fieldset-first-warning").show()}else{g("#vfb-fieldset-first-warning").hide()}}g("#vfb-menu-to-edit").nestedSortable({listType:"ul",maxLevels:3,handle:".vfb-menu-item-handle",placeholder:"vfb-sortable-placeholder",forcePlaceholderSize:true,forceHelperSize:true,tolerance:"pointer",toleranceElement:"> dl",items:"li:not(.ui-state-disabled)",create:function(m,n){g(this).css("min-height",g(this).height())},start:function(m,n){n.placeholder.height(n.item.height())},stop:function(n,o){var m=g("#vfb-menu-to-edit .item-type:first").text();opts={url:ajaxurl,type:"POST",async:true,cache:false,dataType:"json",data:{action:"visual_form_builder_sort_field",order:g(this).nestedSortable("toArray")},success:function(p){g("#loading-animation").hide();l(m);return}};g.ajax(opts)}});g("#form-items .vfb-draggable-form-items").click(function(m){m.preventDefault();g(this).data("submit_value",g(this).text())});g("#form-items .vfb-draggable-form-items").click(function(o){o.preventDefault();var p=g(this).closest("form").serializeArray(),n=g(this).data("submit_value"),m=g("#vfb-menu-to-edit li.ui-state-disabled:first").attr("id").match(new RegExp(/(\d+)$/g))[0];g("img.waiting").show();g.post(ajaxurl,{action:"visual_form_builder_create_field",data:p,field_type:n,previous:m,page:pagenow,nonce:g("#_wpnonce").val()}).done(function(q){g("img.waiting").hide();g(q).hide().insertBefore("#vfb-menu-to-edit li.ui-state-disabled:first").fadeIn()})});g(document).on("click","a.item-delete",function(u){u.preventDefault();var q=childs=new Array(),y=0,n=g(this).attr("href"),m=n.split("&"),s=confirm("You are about to permanently delete this field.\n'Cancel' to stop, 'OK' to delete.");if(!s){return false}for(var r=0;r<m.length;r++){var w=m[r].indexOf("=");var v=m[r].substring(0,w);var x=m[r].substring(w+1);q[v]=x}var o=g(this).closest(".form-item").find("ul").children();var p=o.parent().html();o.each(function(t){childs[t]=g(this).attr("id").match(new RegExp(/(\d+)$/g))[0]});var z=g(this).closest("li.form-item").parents("li.form-item");if(z.length){y=z.attr("id").match(new RegExp(/(\d+)$/g))[0]}g.post(ajaxurl,{action:"visual_form_builder_delete_field",form:q.form,field:q.field,child_ids:childs,parent_id:y,page:pagenow,nonce:q._wpnonce}).done(function(t){g("#form_item_"+q.field).addClass("deleting").animate({opacity:0,height:0},350,function(){g(this).before(p).remove()})})});g("#form-settings-button").click(function(o){o.preventDefault();g(this).toggleClass("current");g("#form-settings").slideToggle();var m=g('input[name="form_id"]').val(),n=(g(this).hasClass("current"))?"opened":"closed";g.post(ajaxurl,{action:"visual_form_builder_form_settings",form:m,status:n,page:pagenow}).done(function(p){if(n=="closed"){g(".settings-links").removeClass("on");g(".settings-links:first").addClass("on");g(".form-details").slideUp("normal");g(".form-details:first").show("normal")}})});g(".settings-links").click(function(o){o.preventDefault();g(".settings-links").removeClass("on");g(".form-details").slideUp("normal");if(g(this).next("div").is(":hidden")==true){g(this).addClass("on");g(this).next().slideDown("normal")}var n=g('input[name="form_id"]').val(),m=this.hash.replace(/#/g,"");g.post(ajaxurl,{action:"visual_form_builder_form_settings",form:n,accordion:m,page:pagenow})});var b=false;g("#vfb-form-builder-management input, #vfb-form-builder-management select, #vfb-form-builder-management textarea").change(function(){i()});function i(){b=true}window.onbeforeunload=function(){if(b){return"The changes you made will be lost if you navigate away from this page."}};g(document).on("submit","#visual-form-builder-update",function(){window.onbeforeunload=null});if(g(".columns-2 #side-sortables").length>0){var a=g("#vfb_form_items_meta_box"),d=a.offset(),e=a.nextAll(),h=false;g(window).on("scroll",function(){if(g(window).scrollTop()>d.top){a.stop().css({top:55,position:"fixed","z-index":"999"});if(e.is(":visible")){h=true;e.stop().css({opacity:0.1})}}else{a.stop().css({top:0,position:"relative"});if(h){e.stop().css({opacity:1})}}})}var k=g(".form-success-type:checked").val();g("#form-success-message-"+k).show();g(".form-success-type").change(function(){var m=g(this).val();switch(m){case"text":g("#form-success-message-text").show();g("#form-success-message-page, #form-success-message-redirect").hide();break;case"page":g("#form-success-message-page").show();g("#form-success-message-text, #form-success-message-redirect").hide();break;case"redirect":g("#form-success-message-redirect").show();g("#form-success-message-text, #form-success-message-page").hide();break}});g(".vfb-field-types").click(function(n){n.preventDefault();g("#vfb-field-tabs li").removeClass("tabs");g(this).parent().addClass("tabs");g(".tabs-panel-active").removeClass("tabs-panel-active").addClass("tabs-panel-inactive");var m=this.hash;g(m).removeClass("tabs-panel-inactive").addClass("tabs-panel-active")});g("#visual-form-builder-update").validate({rules:{"form_email_to[]":{email:true},form_email_from:{email:true},form_success_message_redirect:{url:true},form_notification_email_name:{required:function(m){return g("#form-notification-setting").is(":checked")}},form_notification_email_from:{required:function(m){return g("#form-notification-setting").is(":checked")},email:true},form_notification_email:{required:function(m){return g("#form-notification-setting").is(":checked")}}},errorPlacement:function(m,n){m.insertAfter(n.parent())}});g("#visual-form-builder-new-form").validate();g("#form_email_from_name_override").change(function(){if(g("#form_email_from_name_override").val()==""){g("#form-email-sender-name").prop("readonly",false)}else{g("#form-email-sender-name").prop("readonly","readonly")}});g("#form_email_from_override").change(function(){if(g("#form_email_from_override").val()==""){g("#form-email-sender").prop("readonly",false)}else{g("#form-email-sender").prop("readonly","readonly")}});g("#notification-email").toggle(g("#form-notification-setting").prop("checked"));g("#form-notification-setting").change(function(){var m=g(this).is(":checked");if(m){g("#notification-email").show();g("#form-notification-email-name, #form-notification-email-from, #form-notification-email, #form-notification-subject, #form-notification-message, #form-notification-entry").prop("disabled",false)}else{g("#notification-email").hide();g("#form-notification-email-name, #form-notification-email-from, #form-notification-email, #form-notification-subject, #form-notification-message, #form-notification-entry").prop("disabled","disabled")}});g("#vfb-export-select-all").click(function(m){m.preventDefault();g('#vfb-export-entries-fields input[type="checkbox"]').prop("checked",true)});g("#vfb-export-entries-forms").change(function(){var n=g(this).val(),m=j(n);g("#vfb-export-entries-fields").html("Loading...");g.get(ajaxurl,{action:"visual_form_builder_export_load_options",id:n,count:m,page:pagenow}).done(function(o){g("#vfb-export-entries-fields").html(o)}).fail(function(o){g("#vfb-export-entries-fields").html("Error loading entry fields.")})});g("#vfb-export-entries-rows").change(function(){var n=g("#vfb-export-entries-forms").val();var m=g(this).val();g("#vfb-export-entries-fields").html("Loading...");g.get(ajaxurl,{action:"visual_form_builder_export_load_options",id:n,offset:m,page:pagenow}).done(function(o){g("#vfb-export-entries-fields").html(o)}).fail(function(o){g("#vfb-export-entries-fields").html("Error loading entry fields.")})});function j(n){var m="";g.ajax(ajaxurl,{async:false,data:{action:"visual_form_builder_export_entries_count",id:n,page:pagenow}}).done(function(o){if(o>1000){g("#vfb-export-entries-rows").empty();var q=Math.ceil(parseInt(o)/1000);for(var p=1;p<=q;p++){g("#vfb-export-entries-rows").append(g("<option></option>").attr("value",p).text(p))}g("#vfb-export-entries-pages").show()}else{g("#vfb-export-entries-pages").hide()}m=o}).fail(function(o){});return m}});
1
+ jQuery(document).ready(function(g){if(window.VfbAdminPages){var f=VfbAdminPages.vfb_pages;if(pagenow==f.vfb){g(".if-js-closed").removeClass("if-js-closed").addClass("closed");postboxes.add_postbox_toggles(f.vfb)}}var c=null;g(document).on("mouseenter mouseleave",".vfb-tooltip",function(p){if(p.type=="mouseenter"){if(c){clearTimeout(c);c=null}var m=g(this).attr("title"),o=g(this).attr("rel"),n=g(this).width();g(this).append('<div class="tooltip"><h3>'+m+'</h3><p class="text">'+o+"</p></div>");g.data(this,"title",m);this.title="";g(this).find(".tooltip").css({left:n+22});c=setTimeout(function(){g(".tooltip").fadeIn(300)},500)}else{this.title=g.data(this,"title");g(".tooltip").fadeOut(500);g(this).children().remove()}});g(document).on("click","a.addOption",function(s){s.preventDefault();var n=g(this).parent().parent().find(".clonedOption").length;var r=n+1;var t=g(this).closest("div").attr("id");var q=g(this).closest("div").children("label").attr("for");var m=q.replace(new RegExp(/(\d+)$/g),"");var p=t.replace(new RegExp(/(\d+)$/g),"");var o=g("#"+t).clone().attr("id",p+r);o.children("label").attr("for",m+r);o.find('input[type="text"]').attr("id",m+r);o.find('input[type="radio"]').attr("value",r);g("#"+p+n).after(o)});g(document).on("click","a.deleteOption",function(n){n.preventDefault();var m=g(this).parent().parent().find(".clonedOption").length;if(m-1==0){alert("You must have at least one option.")}else{g(this).closest("div").remove()}});g(document).on("click","a.addEmail",function(s){s.preventDefault();var n=g(this).closest("#email-details").find(".clonedOption").length;var r=n+1;var t=g(this).closest("div").attr("id");var q=g(this).closest("div").find("label").attr("for");var m=q.replace(new RegExp(/(\d+)$/g),"");var p=t.replace(new RegExp(/(\d+)$/g),"");var o=g("#"+t).clone().attr("id",p+r);o.find("label").attr("for",m+r);o.find("input").attr("id",m+r);g("#"+p+n).after(o)});g(document).on("click","a.deleteEmail",function(n){n.preventDefault();var m=g(this).closest("#email-details").find(".clonedOption").length;if(m-1==0){alert("You must have at least one option.")}else{g(this).closest("div").remove()}});g('.option input[type="radio"]').mousedown(function(){g(this).attr("previousValue",g(this).prop("checked"))}).click(function(){var m=g(this).attr("previousValue");if(m=="true"){g(this).prop("checked",false)}});g(".menu-delete").click(function(){var m=(g(this).hasClass("entry-delete"))?"entry":"form";var n=confirm("You are about to permanently delete this "+m+" and all of its data.\n'Cancel' to stop, 'OK' to delete.");if(n){return true}return false});g(document).on("click","a.item-edit",function(m){m.preventDefault();g(m.target).closest("li").children(".menu-item-settings").slideToggle("fast");g(this).toggleClass("opened")});function l(m){if("FIELDSET"!==m){g("#vfb-fieldset-first-warning").show()}else{g("#vfb-fieldset-first-warning").hide()}}g("#vfb-menu-to-edit").nestedSortable({listType:"ul",maxLevels:3,handle:".vfb-menu-item-handle",placeholder:"vfb-sortable-placeholder",forcePlaceholderSize:true,forceHelperSize:true,tolerance:"pointer",toleranceElement:"> dl",items:"li:not(.ui-state-disabled)",create:function(m,n){g(this).css("min-height",g(this).height())},start:function(m,n){n.placeholder.height(n.item.height())},stop:function(n,o){var m=g("#vfb-menu-to-edit .item-type:first").text();opts={url:ajaxurl,type:"POST",async:true,cache:false,dataType:"json",data:{action:"visual_form_builder_sort_field",order:g(this).nestedSortable("toArray")},success:function(p){g("#loading-animation").hide();l(m);return}};g.ajax(opts)}});g("#form-items .vfb-draggable-form-items").click(function(m){m.preventDefault();g(this).data("submit_value",g(this).text())});g("#form-items .vfb-draggable-form-items").click(function(o){o.preventDefault();var p=g(this).closest("form").serializeArray(),n=g(this).data("submit_value"),m=g("#vfb-menu-to-edit li.ui-state-disabled:first").attr("id").match(new RegExp(/(\d+)$/g))[0];g("img.waiting").show();g.post(ajaxurl,{action:"visual_form_builder_create_field",data:p,field_type:n,previous:m,page:pagenow,nonce:g("#_wpnonce").val()}).done(function(q){g("img.waiting").hide();g(q).hide().insertBefore("#vfb-menu-to-edit li.ui-state-disabled:first").fadeIn()})});g(document).on("click","a.item-delete",function(u){u.preventDefault();var q=childs=new Array(),y=0,n=g(this).attr("href"),m=n.split("&"),s=confirm("You are about to permanently delete this field.\n'Cancel' to stop, 'OK' to delete.");if(!s){return false}for(var r=0;r<m.length;r++){var w=m[r].indexOf("=");var v=m[r].substring(0,w);var x=m[r].substring(w+1);q[v]=x}var o=g(this).closest(".form-item").find("ul").children();var p=o.parent().html();o.each(function(t){childs[t]=g(this).attr("id").match(new RegExp(/(\d+)$/g))[0]});var z=g(this).closest("li.form-item").parents("li.form-item");if(z.length){y=z.attr("id").match(new RegExp(/(\d+)$/g))[0]}g.post(ajaxurl,{action:"visual_form_builder_delete_field",form:q.form,field:q.field,child_ids:childs,parent_id:y,page:pagenow,nonce:q._wpnonce}).done(function(t){g("#form_item_"+q.field).addClass("deleting").animate({opacity:0,height:0},350,function(){g(this).before(p).remove()})})});g("#form-settings-button").click(function(o){o.preventDefault();g(this).toggleClass("current");g("#form-settings").slideToggle();var m=g('input[name="form_id"]').val(),n=(g(this).hasClass("current"))?"opened":"closed";g.post(ajaxurl,{action:"visual_form_builder_form_settings",form:m,status:n,page:pagenow}).done(function(p){if(n=="closed"){g(".settings-links").removeClass("on");g(".settings-links:first").addClass("on");g(".form-details").slideUp("normal");g(".form-details:first").show("normal")}})});g(".settings-links").click(function(o){o.preventDefault();g(".settings-links").removeClass("on");g(".form-details").slideUp("normal");if(g(this).next("div").is(":hidden")==true){g(this).addClass("on");g(this).next().slideDown("normal")}var n=g('input[name="form_id"]').val(),m=this.hash.replace(/#/g,"");g.post(ajaxurl,{action:"visual_form_builder_form_settings",form:n,accordion:m,page:pagenow})});var b=false;g("#vfb-form-builder-management input, #vfb-form-builder-management select, #vfb-form-builder-management textarea").change(function(){i()});function i(){b=true}window.onbeforeunload=function(){if(b){return"The changes you made will be lost if you navigate away from this page."}};g(document).on("submit","#visual-form-builder-update",function(){window.onbeforeunload=null});if(g(".columns-2 #side-sortables").length>0){var a=g("#vfb_form_items_meta_box"),d=a.offset(),e=a.nextAll(),h=false;g(window).on("scroll",function(){if(g(window).scrollTop()>d.top){a.stop().css({top:55,position:"fixed","z-index":"999"});if(e.is(":visible")){h=true;e.stop().css({opacity:0.1})}}else{a.stop().css({top:0,position:"relative"});if(h){e.stop().css({opacity:1})}}})}var k=g(".form-success-type:checked").val();g("#form-success-message-"+k).show();g(".form-success-type").change(function(){var m=g(this).val();switch(m){case"text":g("#form-success-message-text").show();g("#form-success-message-page, #form-success-message-redirect").hide();break;case"page":g("#form-success-message-page").show();g("#form-success-message-text, #form-success-message-redirect").hide();break;case"redirect":g("#form-success-message-redirect").show();g("#form-success-message-text, #form-success-message-page").hide();break}});g(".vfb-field-types").click(function(n){n.preventDefault();g("#vfb-field-tabs li").removeClass("tabs");g(this).parent().addClass("tabs");g(".tabs-panel-active").removeClass("tabs-panel-active").addClass("tabs-panel-inactive");var m=this.hash;g(m).removeClass("tabs-panel-inactive").addClass("tabs-panel-active")});g("#visual-form-builder-update").validate({rules:{"form_email_to[]":{email:true},form_email_from:{email:true},form_success_message_redirect:{url:true},form_notification_email_name:{required:function(m){return g("#form-notification-setting").is(":checked")}},form_notification_email_from:{required:function(m){return g("#form-notification-setting").is(":checked")},email:true},form_notification_email:{required:function(m){return g("#form-notification-setting").is(":checked")}}},errorPlacement:function(m,n){m.insertAfter(n.parent())}});g("#visual-form-builder-new-form").validate();g("#form_email_from_name_override").change(function(){if(g("#form_email_from_name_override").val()==""){g("#form-email-sender-name").prop("readonly",false)}else{g("#form-email-sender-name").prop("readonly","readonly")}});g("#form_email_from_override").change(function(){if(g("#form_email_from_override").val()==""){g("#form-email-sender").prop("readonly",false)}else{g("#form-email-sender").prop("readonly","readonly")}});g("#notification-email").toggle(g("#form-notification-setting").prop("checked"));g("#form-notification-setting").change(function(){var m=g(this).is(":checked");if(m){g("#notification-email").show();g("#form-notification-email-name, #form-notification-email-from, #form-notification-email, #form-notification-subject, #form-notification-message, #form-notification-entry").prop("disabled",false)}else{g("#notification-email").hide();g("#form-notification-email-name, #form-notification-email-from, #form-notification-email, #form-notification-subject, #form-notification-message, #form-notification-entry").prop("disabled","disabled")}});g("#vfb-export-select-all").click(function(m){m.preventDefault();g('#vfb-export-entries-fields input[type="checkbox"]').prop("checked",true)});g("#vfb-export-entries-forms").change(function(){var n=g(this).val(),m=j(n);g("#vfb-export-entries-fields").html("Loading...");g.get(ajaxurl,{action:"visual_form_builder_export_load_options",id:n,count:m,page:pagenow}).done(function(o){g("#vfb-export-entries-fields").html(o)}).fail(function(o){g("#vfb-export-entries-fields").html("Error loading entry fields.")})});g("#vfb-export-entries-rows").change(function(){var n=g("#vfb-export-entries-forms").val();var m=g(this).val();g("#vfb-export-entries-fields").html("Loading...");g.get(ajaxurl,{action:"visual_form_builder_export_load_options",id:n,offset:m,page:pagenow}).done(function(o){g("#vfb-export-entries-fields").html(o)}).fail(function(o){g("#vfb-export-entries-fields").html("Error loading entry fields.")})});function j(n){var m="";g.ajax(ajaxurl,{async:false,data:{action:"visual_form_builder_export_entries_count",id:n,page:pagenow}}).done(function(o){if(o>1000){g("#vfb-export-entries-rows").empty();var q=Math.ceil(parseInt(o)/1000);for(var p=1;p<=q;p++){g("#vfb-export-entries-rows").append(g("<option></option>").attr("value",p).text(p))}g("#vfb-export-entries-pages").show()}else{g("#vfb-export-entries-pages").hide()}m=o}).fail(function(o){});return m}});
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=G87A9
4
  Tags: form, forms, contact form, contact forms, form, forms, form to email, email form, email, input, validation, jquery, shortcode, form builder, contact form builder, form manager, form creator
5
  Requires at least: 3.5
6
  Tested up to: 3.6
7
- Stable tag: 2.7.3
8
  License: GPLv2 or later
9
 
10
  Build beautiful, fully functional contact forms in only a few minutes without writing PHP, CSS, or HTML.
@@ -225,6 +225,16 @@ function my_scripts_method() {
225
 
226
  == Changelog ==
227
 
 
 
 
 
 
 
 
 
 
 
228
  **Version 2.7.3 — May 07, 2013**
229
 
230
  * Fix bug where referer URL was not compatible with certain permalink structures
@@ -523,6 +533,9 @@ function my_scripts_method() {
523
 
524
  == Upgrade Notice ==
525
 
 
 
 
526
  = 2.7.3 =
527
  Fix bug where referer URL was not compatible with certain permalink structures
528
 
4
  Tags: form, forms, contact form, contact forms, form, forms, form to email, email form, email, input, validation, jquery, shortcode, form builder, contact form builder, form manager, form creator
5
  Requires at least: 3.5
6
  Tested up to: 3.6
7
+ Stable tag: 2.7.4
8
  License: GPLv2 or later
9
 
10
  Build beautiful, fully functional contact forms in only a few minutes without writing PHP, CSS, or HTML.
225
 
226
  == Changelog ==
227
 
228
+ **Version 2.7.4 — May 08, 2013**
229
+
230
+ * Update Numbers field to allow either Digits or Number validation and sanitize as float instead of int
231
+ * Update Entries Detail "Delete" link to a "Trash" link
232
+ * Fix bug where referer URL did not match domains that prepended www
233
+ * Fix bug in form output where file uploads were not being sent
234
+ * Fix bug on Entries List to only display approved (i.e. untrashed) entries in All view
235
+ * Fix bug on Entries List to properly display Today's Entries
236
+ * Minor updates
237
+
238
  **Version 2.7.3 — May 07, 2013**
239
 
240
  * Fix bug where referer URL was not compatible with certain permalink structures
533
 
534
  == Upgrade Notice ==
535
 
536
+ = 2.7.4 =
537
+ Fix bug where referer URL did not match domains that prepended www. Fix bug where file uploads were not being sent. Other updates and fixes.
538
+
539
  = 2.7.3 =
540
  Fix bug where referer URL was not compatible with certain permalink structures
541
 
uninstall.php CHANGED
@@ -16,5 +16,5 @@
16
  delete_option( 'visual-form-builder-screen-options' );
17
  delete_option( 'vfb_dashboard_widget_options' );
18
 
19
- $wpdb->query( "DELETE FROM " . $wpdb->prefix . "usermeta WHERE meta_key IN ( 'vfb-form-settings', 'vfb_entries_per_page', 'managevisual-form-builder_page_vfb-entriescolumnshidden' )" );
20
  ?>
16
  delete_option( 'visual-form-builder-screen-options' );
17
  delete_option( 'vfb_dashboard_widget_options' );
18
 
19
+ $wpdb->query( "DELETE FROM " . $wpdb->prefix . "usermeta WHERE meta_key IN ( 'vfb-form-settings', 'vfb_entries_per_page', 'vfb_forms_per_page', 'managevisual-form-builder_page_vfb-entriescolumnshidden' )" );
20
  ?>
visual-form-builder.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Visual Form Builder
4
  Description: Dynamically build forms using a simple interface. Forms include jQuery validation, a basic logic-based verification system, and entry tracking.
5
  Author: Matthew Muro
6
  Author URI: http://matthewmuro.com
7
- Version: 2.7.3
8
  */
9
 
10
  /*
@@ -686,7 +686,7 @@ class Visual_Form_Builder{
686
  if ( !isset( $_REQUEST['action'] ) )
687
  return;
688
 
689
- if ( in_array( $_REQUEST['page'], array( 'visual-form-builder', 'vfb-add-new' ) ) ) :
690
  switch ( $_REQUEST['action'] ) :
691
  case 'create_form' :
692
 
@@ -977,6 +977,11 @@ class Visual_Form_Builder{
977
  }
978
 
979
  break;
 
 
 
 
 
980
  endswitch;
981
  endif;
982
  }
@@ -1452,11 +1457,14 @@ class Visual_Form_Builder{
1452
  <span class="vfb-tooltip" title="<?php esc_attr_e( 'About Validation', 'visual-form-builder' ); ?>" rel="<?php esc_attr_e( 'Ensures user-entered data is formatted properly. For more information on Validation, refer to the Help tab at the top of this page.', 'visual-form-builder' ); ?>">(?)</span>
1453
  <br />
1454
 
1455
- <?php if ( in_array( $field->field_type , array( 'text', 'time' ) ) ) : ?>
1456
  <select name="field_validation-<?php echo $field->field_id; ?>" class="widefat" id="edit-form-item-validation-<?php echo $field->field_id; ?>">
1457
  <?php if ( $field->field_type == 'time' ) : ?>
1458
  <option value="time-12" <?php selected( $field->field_validation, 'time-12' ); ?>><?php _e( '12 Hour Format' , 'visual-form-builder'); ?></option>
1459
  <option value="time-24" <?php selected( $field->field_validation, 'time-24' ); ?>><?php _e( '24 Hour Format' , 'visual-form-builder'); ?></option>
 
 
 
1460
  <?php else : ?>
1461
  <option value="" <?php selected( $field->field_validation, '' ); ?>><?php _e( 'None' , 'visual-form-builder'); ?></option>
1462
  <option value="email" <?php selected( $field->field_validation, 'email' ); ?>><?php _e( 'Email' , 'visual-form-builder'); ?></option>
@@ -1984,7 +1992,7 @@ class Visual_Form_Builder{
1984
  break;
1985
 
1986
  case 'number' :
1987
- return intval( $data );
1988
  break;
1989
 
1990
  case 'address' :
@@ -2028,10 +2036,12 @@ class Visual_Form_Builder{
2028
 
2029
  // Basic check for type when not set
2030
  if ( empty( $type ) ) :
2031
- if ( array_key_exists( 'address', $value ) )
2032
  $type = 'address';
2033
- elseif ( array_key_exists( 'hour', $value ) && array_key_exists( 'min', $value ) )
2034
  $type = 'time';
 
 
2035
  else
2036
  $type = 'default';
2037
  endif;
@@ -2081,9 +2091,15 @@ class Visual_Form_Builder{
2081
 
2082
  break;
2083
 
 
 
 
 
 
 
2084
  default :
2085
 
2086
- $output = ( isset( $value['other'] ) ) ? wp_specialchars_decode( stripslashes( esc_html( $value['other'] ) ), ENT_QUOTES, 'UTF-8' ) : esc_html( implode( ', ', $value ) );
2087
 
2088
  break;
2089
 
4
  Description: Dynamically build forms using a simple interface. Forms include jQuery validation, a basic logic-based verification system, and entry tracking.
5
  Author: Matthew Muro
6
  Author URI: http://matthewmuro.com
7
+ Version: 2.7.4
8
  */
9
 
10
  /*
686
  if ( !isset( $_REQUEST['action'] ) )
687
  return;
688
 
689
+ if ( in_array( $_REQUEST['page'], array( 'visual-form-builder', 'vfb-add-new', 'vfb-entries' ) ) ) :
690
  switch ( $_REQUEST['action'] ) :
691
  case 'create_form' :
692
 
977
  }
978
 
979
  break;
980
+
981
+ case 'trash_entry' :
982
+ $entry_id = absint( $_GET['entry'] );
983
+ $wpdb->update( $this->entries_table_name, array( 'entry_approved' => 'trash' ), array( 'entries_id' => $entry_id ) );
984
+ break;
985
  endswitch;
986
  endif;
987
  }
1457
  <span class="vfb-tooltip" title="<?php esc_attr_e( 'About Validation', 'visual-form-builder' ); ?>" rel="<?php esc_attr_e( 'Ensures user-entered data is formatted properly. For more information on Validation, refer to the Help tab at the top of this page.', 'visual-form-builder' ); ?>">(?)</span>
1458
  <br />
1459
 
1460
+ <?php if ( in_array( $field->field_type , array( 'text', 'time', 'number' ) ) ) : ?>
1461
  <select name="field_validation-<?php echo $field->field_id; ?>" class="widefat" id="edit-form-item-validation-<?php echo $field->field_id; ?>">
1462
  <?php if ( $field->field_type == 'time' ) : ?>
1463
  <option value="time-12" <?php selected( $field->field_validation, 'time-12' ); ?>><?php _e( '12 Hour Format' , 'visual-form-builder'); ?></option>
1464
  <option value="time-24" <?php selected( $field->field_validation, 'time-24' ); ?>><?php _e( '24 Hour Format' , 'visual-form-builder'); ?></option>
1465
+ <?php elseif ( in_array( $field->field_type, array( 'number' ) ) ) : ?>
1466
+ <option value="number" <?php selected( $field->field_validation, 'number' ); ?>><?php _e( 'Number' , 'visual-form-builder'); ?></option>
1467
+ <option value="digits" <?php selected( $field->field_validation, 'digits' ); ?>><?php _e( 'Digits' , 'visual-form-builder'); ?></option>
1468
  <?php else : ?>
1469
  <option value="" <?php selected( $field->field_validation, '' ); ?>><?php _e( 'None' , 'visual-form-builder'); ?></option>
1470
  <option value="email" <?php selected( $field->field_validation, 'email' ); ?>><?php _e( 'Email' , 'visual-form-builder'); ?></option>
1992
  break;
1993
 
1994
  case 'number' :
1995
+ return floatval( $data );
1996
  break;
1997
 
1998
  case 'address' :
2036
 
2037
  // Basic check for type when not set
2038
  if ( empty( $type ) ) :
2039
+ if ( is_array( $value ) && array_key_exists( 'address', $value ) )
2040
  $type = 'address';
2041
+ elseif ( is_array( $value ) && array_key_exists( 'hour', $value ) && array_key_exists( 'min', $value ) )
2042
  $type = 'time';
2043
+ elseif ( is_array( $value ) )
2044
+ $type = 'checkbox';
2045
  else
2046
  $type = 'default';
2047
  endif;
2091
 
2092
  break;
2093
 
2094
+ case 'checkbox' :
2095
+
2096
+ $output = esc_html( implode( ', ', $value ) );
2097
+
2098
+ break;
2099
+
2100
  default :
2101
 
2102
+ $output = wp_specialchars_decode( stripslashes( esc_html( $value ) ), ENT_QUOTES );
2103
 
2104
  break;
2105