Version Description
- New: Added a quick and easy Name field with options for First, Middle, and Last names.
- New: Added a more powerful spam protection using JavaScript. This can be turned on in the settings for each form.
- New: Added Honeypot options to form settings and changed the default Honeypot behaviour to avoid the false positives some people are seeing on mobile devices.
- New: Added a frm_process_honeypot filter for gracefully handling honeypot spam.
- Fix: A warning was getting logged when exporting a form as XML.
Download this release
Release Info
Developer | formidableforms |
Plugin | Formidable Forms – Form Builder for WordPress |
Version | 4.11 |
Comparing to | |
See all releases |
Code changes from version 4.10.03 to 4.11
- classes/controllers/FrmFormsController.php +28 -1
- classes/controllers/FrmHooksController.php +6 -0
- classes/factories/FrmFieldFactory.php +1 -0
- classes/helpers/FrmAppHelper.php +1 -1
- classes/helpers/FrmCSVExportHelper.php +21 -2
- classes/helpers/FrmFormsHelper.php +2 -0
- classes/helpers/FrmXMLHelper.php +3 -7
- classes/models/FrmAntiSpam.php +326 -0
- classes/models/FrmEntryValidate.php +34 -14
- classes/models/FrmField.php +18 -0
- classes/models/FrmHoneypot.php +83 -0
- classes/models/FrmUsage.php +2 -0
- classes/models/FrmValidate.php +55 -0
- classes/models/fields/FrmFieldCombo.php +466 -0
- classes/models/fields/FrmFieldName.php +227 -0
- classes/views/frm-entries/form.php +9 -17
- classes/views/frm-entries/new.php +2 -0
- classes/views/frm-fields/back-end/combo-field/sub-field-options.php +113 -0
- classes/views/frm-fields/back-end/name/primary-options.php +44 -0
- classes/views/frm-fields/front-end/combo-field/combo-field.php +93 -0
- classes/views/frm-forms/settings-advanced.php +1 -17
- classes/views/frm-forms/spam-settings/akismet.php +20 -0
- classes/views/frm-forms/spam-settings/antispam.php +11 -0
- classes/views/frm-forms/spam-settings/honeypot.php +15 -0
- css/frm_admin.css +14 -1
- formidable.php +1 -1
- images/icons.svg +1 -0
- js/formidable.js +39 -1
- js/formidable.min.js +15 -13
- js/formidable_admin.js +121 -2
- languages/formidable.pot +294 -226
- readme.txt +12 -1061
classes/controllers/FrmFormsController.php
CHANGED
@@ -136,13 +136,29 @@ class FrmFormsController {
|
|
136 |
|
137 |
do_action( 'frm_before_update_form_settings', $id );
|
138 |
|
|
|
|
|
139 |
FrmForm::update( $id, $_POST );
|
140 |
|
|
|
|
|
|
|
|
|
|
|
141 |
$message = __( 'Settings Successfully Updated', 'formidable' );
|
142 |
|
143 |
return self::get_settings_vars( $id, array(), compact( 'message', 'warnings' ) );
|
144 |
}
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
public static function update( $values = array() ) {
|
147 |
if ( empty( $values ) ) {
|
148 |
$values = $_POST;
|
@@ -1116,7 +1132,18 @@ class FrmFormsController {
|
|
1116 |
public static function advanced_settings( $values ) {
|
1117 |
$first_h3 = 'frm_first_h3';
|
1118 |
|
1119 |
-
include
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1120 |
}
|
1121 |
|
1122 |
/**
|
136 |
|
137 |
do_action( 'frm_before_update_form_settings', $id );
|
138 |
|
139 |
+
$antispam_was_on = self::antispam_was_on( $id );
|
140 |
+
|
141 |
FrmForm::update( $id, $_POST );
|
142 |
|
143 |
+
$antispam_is_on = ! empty( $_POST['options']['antispam'] );
|
144 |
+
if ( $antispam_is_on !== $antispam_was_on ) {
|
145 |
+
FrmAntiSpam::clear_caches();
|
146 |
+
}
|
147 |
+
|
148 |
$message = __( 'Settings Successfully Updated', 'formidable' );
|
149 |
|
150 |
return self::get_settings_vars( $id, array(), compact( 'message', 'warnings' ) );
|
151 |
}
|
152 |
|
153 |
+
/**
|
154 |
+
* @param int $form_id
|
155 |
+
* @return bool
|
156 |
+
*/
|
157 |
+
private static function antispam_was_on( $form_id ) {
|
158 |
+
$form = FrmForm::getOne( $form_id );
|
159 |
+
return ! empty( $form->options['antispam'] );
|
160 |
+
}
|
161 |
+
|
162 |
public static function update( $values = array() ) {
|
163 |
if ( empty( $values ) ) {
|
164 |
$values = $_POST;
|
1132 |
public static function advanced_settings( $values ) {
|
1133 |
$first_h3 = 'frm_first_h3';
|
1134 |
|
1135 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/settings-advanced.php';
|
1136 |
+
}
|
1137 |
+
|
1138 |
+
/**
|
1139 |
+
* @param array $values
|
1140 |
+
*/
|
1141 |
+
private static function render_spam_settings( $values ) {
|
1142 |
+
if ( function_exists( 'akismet_http_post' ) ) {
|
1143 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/akismet.php';
|
1144 |
+
}
|
1145 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/honeypot.php';
|
1146 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/spam-settings/antispam.php';
|
1147 |
}
|
1148 |
|
1149 |
/**
|
classes/controllers/FrmHooksController.php
CHANGED
@@ -84,6 +84,12 @@ class FrmHooksController {
|
|
84 |
|
85 |
add_filter( 'cron_schedules', 'FrmUsageController::add_schedules' );
|
86 |
add_action( 'formidable_send_usage', 'FrmUsageController::send_snapshot' );
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
}
|
88 |
|
89 |
public static function load_admin_hooks() {
|
84 |
|
85 |
add_filter( 'cron_schedules', 'FrmUsageController::add_schedules' );
|
86 |
add_action( 'formidable_send_usage', 'FrmUsageController::send_snapshot' );
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Make name field work with View.
|
90 |
+
* FrmProContent::replace_single_shortcode() applies this filter like 'frm_keep_' . $field->type . '_value_array'
|
91 |
+
*/
|
92 |
+
add_filter( 'frm_keep_name_value_array', '__return_true' );
|
93 |
}
|
94 |
|
95 |
public static function load_admin_hooks() {
|
classes/factories/FrmFieldFactory.php
CHANGED
@@ -99,6 +99,7 @@ class FrmFieldFactory {
|
|
99 |
'html' => 'FrmFieldHTML',
|
100 |
'hidden' => 'FrmFieldHidden',
|
101 |
'captcha' => 'FrmFieldCaptcha',
|
|
|
102 |
);
|
103 |
|
104 |
$class = isset( $type_classes[ $field_type ] ) ? $type_classes[ $field_type ] : '';
|
99 |
'html' => 'FrmFieldHTML',
|
100 |
'hidden' => 'FrmFieldHidden',
|
101 |
'captcha' => 'FrmFieldCaptcha',
|
102 |
+
'name' => 'FrmFieldName',
|
103 |
);
|
104 |
|
105 |
$class = isset( $type_classes[ $field_type ] ) ? $type_classes[ $field_type ] : '';
|
classes/helpers/FrmAppHelper.php
CHANGED
@@ -11,7 +11,7 @@ class FrmAppHelper {
|
|
11 |
/**
|
12 |
* @since 2.0
|
13 |
*/
|
14 |
-
public static $plug_version = '4.
|
15 |
|
16 |
/**
|
17 |
* @since 1.07.02
|
11 |
/**
|
12 |
* @since 2.0
|
13 |
*/
|
14 |
+
public static $plug_version = '4.11';
|
15 |
|
16 |
/**
|
17 |
* @since 1.07.02
|
classes/helpers/FrmCSVExportHelper.php
CHANGED
@@ -121,6 +121,11 @@ class FrmCSVExportHelper {
|
|
121 |
}
|
122 |
|
123 |
private static function field_headings( $col ) {
|
|
|
|
|
|
|
|
|
|
|
124 |
$field_headings = array();
|
125 |
$separate_values = array( 'user_id', 'file', 'data', 'date' );
|
126 |
if ( isset( $col->field_options['separate_value'] ) && $col->field_options['separate_value'] && ! in_array( $col->type, $separate_values, true ) ) {
|
@@ -154,9 +159,11 @@ class FrmCSVExportHelper {
|
|
154 |
}
|
155 |
|
156 |
$fields_by_repeater_id[ $repeater_id ][] = $col;
|
157 |
-
|
158 |
-
|
159 |
}
|
|
|
|
|
160 |
}
|
161 |
unset( $repeater_id, $col );
|
162 |
|
@@ -413,6 +420,18 @@ class FrmCSVExportHelper {
|
|
413 |
private static function add_array_values_to_columns( &$row, $atts ) {
|
414 |
if ( is_array( $atts['field_value'] ) ) {
|
415 |
foreach ( $atts['field_value'] as $key => $sub_value ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
416 |
$column_key = $atts['col']->id . '_' . $key;
|
417 |
if ( ! is_numeric( $key ) && isset( self::$headings[ $column_key ] ) ) {
|
418 |
$row[ $column_key ] = $sub_value;
|
121 |
}
|
122 |
|
123 |
private static function field_headings( $col ) {
|
124 |
+
$field_type_obj = FrmFieldFactory::get_field_factory( $col );
|
125 |
+
if ( ! empty( $field_type_obj->is_combo_field ) ) { // This is combo field.
|
126 |
+
return $field_type_obj->get_export_headings();
|
127 |
+
}
|
128 |
+
|
129 |
$field_headings = array();
|
130 |
$separate_values = array( 'user_id', 'file', 'data', 'date' );
|
131 |
if ( isset( $col->field_options['separate_value'] ) && $col->field_options['separate_value'] && ! in_array( $col->type, $separate_values, true ) ) {
|
159 |
}
|
160 |
|
161 |
$fields_by_repeater_id[ $repeater_id ][] = $col;
|
162 |
+
|
163 |
+
continue;
|
164 |
}
|
165 |
+
|
166 |
+
$headings += self::field_headings( $col );
|
167 |
}
|
168 |
unset( $repeater_id, $col );
|
169 |
|
420 |
private static function add_array_values_to_columns( &$row, $atts ) {
|
421 |
if ( is_array( $atts['field_value'] ) ) {
|
422 |
foreach ( $atts['field_value'] as $key => $sub_value ) {
|
423 |
+
if ( is_array( $sub_value ) ) {
|
424 |
+
// This is combo field inside repeater. The heading key has this format: [86_first[0]].
|
425 |
+
foreach ( $sub_value as $sub_key => $sub_sub_value ) {
|
426 |
+
$column_key = $atts['col']->id . '_' . $sub_key . '[' . $key . ']';
|
427 |
+
if ( ! is_numeric( $sub_key ) && isset( self::$headings[ $column_key ] ) ) {
|
428 |
+
$row[ $column_key ] = $sub_sub_value;
|
429 |
+
}
|
430 |
+
}
|
431 |
+
|
432 |
+
continue;
|
433 |
+
}
|
434 |
+
|
435 |
$column_key = $atts['col']->id . '_' . $key;
|
436 |
if ( ! is_numeric( $key ) && isset( self::$headings[ $column_key ] ) ) {
|
437 |
$row[ $column_key ] = $sub_value;
|
classes/helpers/FrmFormsHelper.php
CHANGED
@@ -365,6 +365,8 @@ class FrmFormsHelper {
|
|
365 |
'success_msg' => $frm_settings->success_msg,
|
366 |
'show_form' => 0,
|
367 |
'akismet' => '',
|
|
|
|
|
368 |
'no_save' => 0,
|
369 |
'ajax_load' => 0,
|
370 |
'js_validate' => 0,
|
365 |
'success_msg' => $frm_settings->success_msg,
|
366 |
'show_form' => 0,
|
367 |
'akismet' => '',
|
368 |
+
'honeypot' => 'basic',
|
369 |
+
'antispam' => 0,
|
370 |
'no_save' => 0,
|
371 |
'ajax_load' => 0,
|
372 |
'js_validate' => 0,
|
classes/helpers/FrmXMLHelper.php
CHANGED
@@ -1202,15 +1202,11 @@ class FrmXMLHelper {
|
|
1202 |
* @since 3.06
|
1203 |
*/
|
1204 |
private static function remove_defaults( $defaults, &$saved ) {
|
1205 |
-
$
|
1206 |
-
|
1207 |
-
|
1208 |
-
if ( $default == $saved[ $d ] ) {
|
1209 |
-
unset( $saved[ $d ] );
|
1210 |
}
|
1211 |
-
unset( $defaults[ $d ] );
|
1212 |
}
|
1213 |
-
$saved = array_diff_assoc( (array) $saved, $defaults );
|
1214 |
}
|
1215 |
|
1216 |
/**
|
1202 |
* @since 3.06
|
1203 |
*/
|
1204 |
private static function remove_defaults( $defaults, &$saved ) {
|
1205 |
+
foreach ( $saved as $key => $value ) {
|
1206 |
+
if ( isset( $defaults[ $key ] ) && $defaults[ $key ] === $value ) {
|
1207 |
+
unset( $saved[ $key ] );
|
|
|
|
|
1208 |
}
|
|
|
1209 |
}
|
|
|
1210 |
}
|
1211 |
|
1212 |
/**
|
classes/models/FrmAntiSpam.php
ADDED
@@ -0,0 +1,326 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Class FrmAntiSpam.
|
8 |
+
*
|
9 |
+
* This token class generates tokens that are used in our Anti-Spam checking.
|
10 |
+
*
|
11 |
+
* @since xx.xx
|
12 |
+
*/
|
13 |
+
class FrmAntiSpam extends FrmValidate {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @return string
|
17 |
+
*/
|
18 |
+
protected function get_option_key() {
|
19 |
+
return 'antispam';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @param int $form_id
|
24 |
+
*/
|
25 |
+
public static function maybe_init( $form_id ) {
|
26 |
+
$antispam = new self( $form_id );
|
27 |
+
if ( $antispam->run_antispam() ) {
|
28 |
+
$antispam->init();
|
29 |
+
}
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Initialise the actions for the Anti-spam.
|
34 |
+
*
|
35 |
+
* @since xx.xx
|
36 |
+
*/
|
37 |
+
public function init() {
|
38 |
+
add_filter( 'frm_form_attributes', array( $this, 'add_token_to_form' ), 10, 1 );
|
39 |
+
add_filter( 'frm_form_div_attributes', array( $this, 'add_token_to_form' ), 10, 1 );
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Return a valid token.
|
44 |
+
*
|
45 |
+
* @since xx.xx
|
46 |
+
*
|
47 |
+
* @param mixed $current True to use current time, otherwise a timestamp string.
|
48 |
+
*
|
49 |
+
* @return string Token.
|
50 |
+
*/
|
51 |
+
private function get( $current = true ) {
|
52 |
+
// If $current was not passed, or it is true, we use the current timestamp.
|
53 |
+
// If $current was passed in as a string, we'll use that passed in timestamp.
|
54 |
+
if ( $current !== true ) {
|
55 |
+
$time = $current;
|
56 |
+
} else {
|
57 |
+
$time = time();
|
58 |
+
}
|
59 |
+
|
60 |
+
// Format the timestamp to be less exact, as we want to deal in days.
|
61 |
+
// June 19th, 2020 would get formatted as: 1906202017125.
|
62 |
+
// Day of the month, month number, year, day number of the year, week number of the year.
|
63 |
+
$token_date = gmdate( 'dmYzW', $time );
|
64 |
+
|
65 |
+
// Combine our token date and our token salt, and md5 it.
|
66 |
+
$form_token_string = md5( $token_date . $this->get_antispam_secret_key() );
|
67 |
+
|
68 |
+
return $form_token_string;
|
69 |
+
}
|
70 |
+
|
71 |
+
private function get_antispam_secret_key() {
|
72 |
+
$secret_key = get_option( 'frm_antispam_secret_key' );
|
73 |
+
|
74 |
+
// If we already have the secret, send it back.
|
75 |
+
if ( false !== $secret_key ) {
|
76 |
+
return base64_decode( $secret_key ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
|
77 |
+
}
|
78 |
+
|
79 |
+
// We don't have a secret, so let's generate one.
|
80 |
+
$secret_key = is_callable( 'sodium_crypto_secretbox_keygen' ) ? sodium_crypto_secretbox_keygen() : wp_generate_password( 32, true, true );
|
81 |
+
add_option( 'frm_antispam_secret_key', base64_encode( $secret_key ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
|
82 |
+
|
83 |
+
return $secret_key;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Generate the array of valid tokens to check for. These include two days
|
88 |
+
* before the current date to account for long cache times.
|
89 |
+
*
|
90 |
+
* These two filters are available if a user wants to extend the times.
|
91 |
+
* 'frm_form_token_check_before_today'
|
92 |
+
* 'frm_form_token_check_after_today'
|
93 |
+
*
|
94 |
+
* @since xx.xx
|
95 |
+
*
|
96 |
+
* @return array Array of all valid tokens to check against.
|
97 |
+
*/
|
98 |
+
private function get_valid_tokens() {
|
99 |
+
$current_date = time();
|
100 |
+
|
101 |
+
// Create our array of times to check before today. A user with a longer
|
102 |
+
// cache time can extend this. A user with a shorter cache time can remove times.
|
103 |
+
$valid_token_times_before = apply_filters(
|
104 |
+
'frm_form_token_check_before_today',
|
105 |
+
array(
|
106 |
+
( 2 * DAY_IN_SECONDS ), // Two days ago.
|
107 |
+
( 1 * DAY_IN_SECONDS ), // One day ago.
|
108 |
+
)
|
109 |
+
);
|
110 |
+
|
111 |
+
// Mostly to catch edge cases like the form page loading and submitting on two different days.
|
112 |
+
// This probably won't be filtered by users too much, but they could extend it.
|
113 |
+
$valid_token_times_after = apply_filters(
|
114 |
+
'frm_form_token_check_after_today',
|
115 |
+
array(
|
116 |
+
( 45 * MINUTE_IN_SECONDS ), // Add in 45 minutes past today to catch some midnight edge cases.
|
117 |
+
)
|
118 |
+
);
|
119 |
+
|
120 |
+
// Built up our valid tokens.
|
121 |
+
$valid_tokens = array();
|
122 |
+
|
123 |
+
// Add in all the previous times we check.
|
124 |
+
foreach ( $valid_token_times_before as $time ) {
|
125 |
+
$valid_tokens[] = $this->get( $current_date - $time );
|
126 |
+
}
|
127 |
+
|
128 |
+
// Add in our current date.
|
129 |
+
$valid_tokens[] = $this->get( $current_date );
|
130 |
+
|
131 |
+
// Add in the times after our check.
|
132 |
+
foreach ( $valid_token_times_after as $time ) {
|
133 |
+
$valid_tokens[] = $this->get( $current_date + $time );
|
134 |
+
}
|
135 |
+
|
136 |
+
return $valid_tokens;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Check if the given token is valid or not.
|
141 |
+
*
|
142 |
+
* Tokens are valid for some period of time (see frm_token_validity_in_hours
|
143 |
+
* and frm_token_validity_in_days to extend the validation period).
|
144 |
+
* By default tokens are valid for day.
|
145 |
+
*
|
146 |
+
* @since xx.xx
|
147 |
+
*
|
148 |
+
* @param string $token Token to validate.
|
149 |
+
*
|
150 |
+
* @return bool Whether the token is valid or not.
|
151 |
+
*/
|
152 |
+
private function verify( $token ) {
|
153 |
+
// Check to see if our token is inside of the valid tokens.
|
154 |
+
return in_array( $token, $this->get_valid_tokens(), true );
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Add the token field to the form.
|
159 |
+
*
|
160 |
+
* @since xx.xx
|
161 |
+
*
|
162 |
+
* @param string $attributes
|
163 |
+
*
|
164 |
+
* @return string
|
165 |
+
*/
|
166 |
+
public function add_token_to_form( $attributes ) {
|
167 |
+
$attributes .= ' data-token="' . esc_attr( $this->get() ) . '"';
|
168 |
+
return $attributes;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* @param int $form_id
|
173 |
+
*/
|
174 |
+
public static function maybe_echo_token( $form_id ) {
|
175 |
+
$antispam = new self( $form_id );
|
176 |
+
if ( $antispam->run_antispam() ) {
|
177 |
+
echo 'data-token="' . esc_attr( $antispam->get() ) . '"';
|
178 |
+
}
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* @return bool
|
183 |
+
*/
|
184 |
+
public function run_antispam() {
|
185 |
+
return $this->is_option_on() && apply_filters( 'frm_run_antispam', true, $this->form_id );
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* Validate Anti-spam if enabled.
|
190 |
+
*
|
191 |
+
* @since xx.xx
|
192 |
+
*
|
193 |
+
* @return bool|string True or a string with the error.
|
194 |
+
*/
|
195 |
+
public function validate() {
|
196 |
+
if ( ! $this->run_antispam() ) {
|
197 |
+
return true;
|
198 |
+
}
|
199 |
+
|
200 |
+
$token = FrmAppHelper::get_param( 'antispam_token', '', 'post', 'sanitize_text_field' );
|
201 |
+
|
202 |
+
// If the antispam setting is enabled and we don't have a token, bail.
|
203 |
+
if ( ! $token ) {
|
204 |
+
if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) ) {
|
205 |
+
// add an exception for the entries page.
|
206 |
+
return true;
|
207 |
+
}
|
208 |
+
return $this->process_antispam_filter( $this->get_missing_token_message() );
|
209 |
+
}
|
210 |
+
|
211 |
+
// Verify the token.
|
212 |
+
if ( ! $this->verify( $token ) ) {
|
213 |
+
return $this->process_antispam_filter( $this->get_invalid_token_message() );
|
214 |
+
}
|
215 |
+
|
216 |
+
return $this->process_antispam_filter( true );
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* @return bool True if saving a draft.
|
221 |
+
*/
|
222 |
+
private function is_saving_a_draft() {
|
223 |
+
global $frm_vars;
|
224 |
+
if ( empty( $frm_vars['form_params'] ) ) {
|
225 |
+
return false;
|
226 |
+
}
|
227 |
+
$form_params = $frm_vars['form_params'];
|
228 |
+
if ( ! isset( $form_params[ $this->form_id ] ) ) {
|
229 |
+
return false;
|
230 |
+
}
|
231 |
+
$this_form_params = $form_params[ $this->form_id ];
|
232 |
+
return ! empty( $this_form_params['action'] ) && 'update' === $this_form_params['action'];
|
233 |
+
}
|
234 |
+
|
235 |
+
/**
|
236 |
+
* Helper to run our filter on all the responses for the antispam checks.
|
237 |
+
*
|
238 |
+
* @since xx.xx
|
239 |
+
*
|
240 |
+
* @param bool|string $is_valid Is valid entry or not.
|
241 |
+
*
|
242 |
+
* @return bool|string Is valid or message.
|
243 |
+
*/
|
244 |
+
private function process_antispam_filter( $is_valid ) {
|
245 |
+
return apply_filters( 'frm_process_antispam', $is_valid );
|
246 |
+
}
|
247 |
+
|
248 |
+
/**
|
249 |
+
* Helper to get the missing token message.
|
250 |
+
*
|
251 |
+
* @since xx.xx
|
252 |
+
*
|
253 |
+
* @return string missing token message.
|
254 |
+
*/
|
255 |
+
private function get_missing_token_message() {
|
256 |
+
return esc_html__( 'This page isn\'t loading JavaScript properly, and the form will not be able to submit.', 'formidable' ) . $this->maybe_get_support_text();
|
257 |
+
}
|
258 |
+
|
259 |
+
/**
|
260 |
+
* Helper to get the invalid token message.
|
261 |
+
*
|
262 |
+
* @since xx.xx
|
263 |
+
*
|
264 |
+
* @return string Invalid token message.
|
265 |
+
*/
|
266 |
+
private function get_invalid_token_message() {
|
267 |
+
return esc_html__( 'Form token is invalid. Please refresh the page.', 'formidable' ) . $this->maybe_get_support_text();
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* If a user is a super admin, add a support link to the message.
|
272 |
+
*
|
273 |
+
* @since xx.xx
|
274 |
+
*
|
275 |
+
* @return string Support text if super admin, empty string if not.
|
276 |
+
*/
|
277 |
+
private function maybe_get_support_text() {
|
278 |
+
// If user isn't a super admin, don't return any text.
|
279 |
+
if ( ! is_super_admin() ) {
|
280 |
+
return '';
|
281 |
+
}
|
282 |
+
|
283 |
+
// If the user is an admin, return text with a link to support.
|
284 |
+
// We add a space here to seperate the sentences, but outside of the localized
|
285 |
+
// text to avoid it being removed.
|
286 |
+
return ' ' . sprintf(
|
287 |
+
// translators: %1$s start link, %2$s end link.
|
288 |
+
esc_html__( 'Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue.', 'formidable' ),
|
289 |
+
'<a href="https://formidableforms.com/knowledgebase/add-spam-protection/">',
|
290 |
+
'</a>'
|
291 |
+
);
|
292 |
+
}
|
293 |
+
|
294 |
+
/**
|
295 |
+
* Clear third party cache plugins to avoid data-tokens missing or appearing when the antispam setting is changed.
|
296 |
+
*/
|
297 |
+
public static function clear_caches() {
|
298 |
+
self::clear_w3_total_cache();
|
299 |
+
self::clear_wp_fastest_cache();
|
300 |
+
self::clear_wp_super_cache();
|
301 |
+
self::clear_wp_optimize();
|
302 |
+
}
|
303 |
+
|
304 |
+
private static function clear_w3_total_cache() {
|
305 |
+
if ( is_callable( 'w3tc_flush_all' ) ) {
|
306 |
+
w3tc_flush_all();
|
307 |
+
}
|
308 |
+
}
|
309 |
+
|
310 |
+
private static function clear_wp_fastest_cache() {
|
311 |
+
do_action( 'wpfc_clear_all_cache' );
|
312 |
+
}
|
313 |
+
|
314 |
+
private static function clear_wp_super_cache() {
|
315 |
+
if ( function_exists( 'wp_cache_clean_cache' ) ) {
|
316 |
+
global $file_prefix;
|
317 |
+
wp_cache_clean_cache( $file_prefix, true );
|
318 |
+
}
|
319 |
+
}
|
320 |
+
|
321 |
+
private static function clear_wp_optimize() {
|
322 |
+
if ( class_exists( 'WP_Optimize' ) ) {
|
323 |
+
WP_Optimize()->get_page_cache()->purge();
|
324 |
+
}
|
325 |
+
}
|
326 |
+
}
|
classes/models/FrmEntryValidate.php
CHANGED
@@ -229,43 +229,63 @@ class FrmEntryValidate {
|
|
229 |
return;
|
230 |
}
|
231 |
|
232 |
-
|
|
|
|
|
|
|
233 |
$errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
|
234 |
-
}
|
235 |
-
|
236 |
-
if ( self::blacklist_check( $values ) ) {
|
237 |
$errors['spam'] = __( 'Your entry appears to be blocked spam!', 'formidable' );
|
238 |
-
}
|
239 |
-
|
240 |
-
if ( self::is_akismet_spam( $values ) ) {
|
241 |
-
if ( self::is_akismet_enabled_for_user( $values['form_id'] ) ) {
|
242 |
-
$errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
|
243 |
-
}
|
244 |
}
|
245 |
}
|
246 |
|
247 |
-
|
248 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
249 |
|
250 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
}
|
252 |
|
|
|
|
|
|
|
253 |
private static function is_spam_bot() {
|
254 |
$ip = FrmAppHelper::get_ip_address();
|
255 |
|
256 |
return empty( $ip );
|
257 |
}
|
258 |
|
|
|
|
|
|
|
|
|
259 |
private static function is_akismet_spam( $values ) {
|
260 |
global $wpcom_api_key;
|
261 |
|
262 |
return ( is_callable( 'Akismet::http_post' ) && ( get_option( 'wordpress_api_key' ) || $wpcom_api_key ) && self::akismet( $values ) );
|
263 |
}
|
264 |
|
|
|
|
|
|
|
|
|
265 |
private static function is_akismet_enabled_for_user( $form_id ) {
|
266 |
$form = FrmForm::getOne( $form_id );
|
267 |
|
268 |
-
return ( isset( $form->options['akismet'] ) && ! empty( $form->options['akismet'] ) && ( $form->options['akismet']
|
269 |
}
|
270 |
|
271 |
public static function blacklist_check( $values ) {
|
229 |
return;
|
230 |
}
|
231 |
|
232 |
+
$antispam_check = self::is_antispam_check( $values['form_id'] );
|
233 |
+
if ( is_string( $antispam_check ) ) {
|
234 |
+
$errors['spam'] = $antispam_check;
|
235 |
+
} elseif ( self::is_honeypot_spam( $values ) || self::is_spam_bot() ) {
|
236 |
$errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
|
237 |
+
} elseif ( self::blacklist_check( $values ) ) {
|
|
|
|
|
238 |
$errors['spam'] = __( 'Your entry appears to be blocked spam!', 'formidable' );
|
239 |
+
} elseif ( self::is_akismet_spam( $values ) && self::is_akismet_enabled_for_user( $values['form_id'] ) ) {
|
240 |
+
$errors['spam'] = __( 'Your entry appears to be spam!', 'formidable' );
|
|
|
|
|
|
|
|
|
241 |
}
|
242 |
}
|
243 |
|
244 |
+
/**
|
245 |
+
* @param int $form_id
|
246 |
+
* @return boolean
|
247 |
+
*/
|
248 |
+
private static function is_antispam_check( $form_id ) {
|
249 |
+
$aspm = new FrmAntiSpam( $form_id );
|
250 |
+
return $aspm->validate();
|
251 |
+
}
|
252 |
|
253 |
+
/**
|
254 |
+
* @param array $values
|
255 |
+
* @return boolean
|
256 |
+
*/
|
257 |
+
private static function is_honeypot_spam( $values ) {
|
258 |
+
$honeypot = new FrmHoneypot( $values['form_id'] );
|
259 |
+
return ! $honeypot->validate();
|
260 |
}
|
261 |
|
262 |
+
/**
|
263 |
+
* @return boolean
|
264 |
+
*/
|
265 |
private static function is_spam_bot() {
|
266 |
$ip = FrmAppHelper::get_ip_address();
|
267 |
|
268 |
return empty( $ip );
|
269 |
}
|
270 |
|
271 |
+
/**
|
272 |
+
* @param array $values
|
273 |
+
* @return boolean
|
274 |
+
*/
|
275 |
private static function is_akismet_spam( $values ) {
|
276 |
global $wpcom_api_key;
|
277 |
|
278 |
return ( is_callable( 'Akismet::http_post' ) && ( get_option( 'wordpress_api_key' ) || $wpcom_api_key ) && self::akismet( $values ) );
|
279 |
}
|
280 |
|
281 |
+
/**
|
282 |
+
* @param int $form_id
|
283 |
+
* @return bool
|
284 |
+
*/
|
285 |
private static function is_akismet_enabled_for_user( $form_id ) {
|
286 |
$form = FrmForm::getOne( $form_id );
|
287 |
|
288 |
+
return ( isset( $form->options['akismet'] ) && ! empty( $form->options['akismet'] ) && ( $form->options['akismet'] !== 'logged' || ! is_user_logged_in() ) );
|
289 |
}
|
290 |
|
291 |
public static function blacklist_check( $values ) {
|
classes/models/FrmField.php
CHANGED
@@ -42,6 +42,10 @@ class FrmField {
|
|
42 |
'name' => __( 'Number', 'formidable' ),
|
43 |
'icon' => 'frm_icon_font frm_hashtag_icon',
|
44 |
),
|
|
|
|
|
|
|
|
|
45 |
'phone' => array(
|
46 |
'name' => __( 'Phone', 'formidable' ),
|
47 |
'icon' => 'frm_icon_font frm_phone_icon',
|
@@ -1069,4 +1073,18 @@ class FrmField {
|
|
1069 |
*/
|
1070 |
return apply_filters( 'frm_is_field_type', $is_field_type, compact( 'field', 'is_type' ) );
|
1071 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1072 |
}
|
42 |
'name' => __( 'Number', 'formidable' ),
|
43 |
'icon' => 'frm_icon_font frm_hashtag_icon',
|
44 |
),
|
45 |
+
'name' => array(
|
46 |
+
'name' => __( 'Name', 'formidable' ),
|
47 |
+
'icon' => 'frm_icon_font frm_user_name_icon',
|
48 |
+
),
|
49 |
'phone' => array(
|
50 |
'name' => __( 'Phone', 'formidable' ),
|
51 |
'icon' => 'frm_icon_font frm_phone_icon',
|
1073 |
*/
|
1074 |
return apply_filters( 'frm_is_field_type', $is_field_type, compact( 'field', 'is_type' ) );
|
1075 |
}
|
1076 |
+
|
1077 |
+
/**
|
1078 |
+
* Checks if the given field array is a combo field.
|
1079 |
+
*
|
1080 |
+
* @since 4.10.02
|
1081 |
+
*
|
1082 |
+
* @param array $field Field array.
|
1083 |
+
* @return bool
|
1084 |
+
*/
|
1085 |
+
public static function is_combo_field( $field ) {
|
1086 |
+
$field_type_obj = FrmFieldFactory::get_field_factory( $field );
|
1087 |
+
|
1088 |
+
return ! empty( $field_type_obj->is_combo_field );
|
1089 |
+
}
|
1090 |
}
|
classes/models/FrmHoneypot.php
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
|
6 |
+
class FrmHoneypot extends FrmValidate {
|
7 |
+
|
8 |
+
/**
|
9 |
+
* @return string
|
10 |
+
*/
|
11 |
+
protected function get_option_key() {
|
12 |
+
return 'honeypot';
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @return bool
|
17 |
+
*/
|
18 |
+
public function validate() {
|
19 |
+
if ( ! $this->is_option_on() || ! $this->check_honeypot_filter() ) {
|
20 |
+
// never flag as honeypot spam if disabled.
|
21 |
+
return true;
|
22 |
+
}
|
23 |
+
return ! $this->is_honeypot_spam();
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* @return boolean
|
28 |
+
*/
|
29 |
+
private function is_honeypot_spam() {
|
30 |
+
$honeypot_value = FrmAppHelper::get_param( 'frm_verify', '', 'get', 'sanitize_text_field' );
|
31 |
+
$is_honeypot_spam = $honeypot_value !== '';
|
32 |
+
$form = $this->get_form();
|
33 |
+
$atts = compact( 'form' );
|
34 |
+
return apply_filters( 'frm_process_honeypot', $is_honeypot_spam, $atts );
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @return mixed either true, or false.
|
39 |
+
*/
|
40 |
+
private function check_honeypot_filter() {
|
41 |
+
$form = $this->get_form();
|
42 |
+
return apply_filters( 'frm_run_honeypot', true, compact( 'form' ) );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @return string
|
47 |
+
*/
|
48 |
+
private function check_honeypot_setting() {
|
49 |
+
$form = $this->get_form();
|
50 |
+
$key = $this->get_option_key();
|
51 |
+
return $form->options[ $key ];
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @param int $form_id
|
56 |
+
*/
|
57 |
+
public static function maybe_render_field( $form_id ) {
|
58 |
+
$honeypot = new self( $form_id );
|
59 |
+
if ( $honeypot->should_render_field() ) {
|
60 |
+
$honeypot->render_field();
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @return bool
|
66 |
+
*/
|
67 |
+
public function should_render_field() {
|
68 |
+
return $this->is_option_on() && $this->check_honeypot_filter();
|
69 |
+
}
|
70 |
+
|
71 |
+
public function render_field() {
|
72 |
+
$honeypot = $this->check_honeypot_setting();
|
73 |
+
$form = $this->get_form();
|
74 |
+
?>
|
75 |
+
<div class="frm_verify" <?php echo in_array( $honeypot, array( true, 'strict' ), true ) ? '' : 'aria-hidden="true"'; ?>>
|
76 |
+
<label for="frm_email_<?php echo esc_attr( $form->id ); ?>">
|
77 |
+
<?php esc_html_e( 'If you are human, leave this field blank.', 'formidable' ); ?>
|
78 |
+
</label>
|
79 |
+
<input type="<?php echo esc_attr( 'strict' === $honeypot ? 'email' : 'text' ); ?>" class="frm_verify" id="frm_email_<?php echo esc_attr( $form->id ); ?>" name="frm_verify" value="<?php echo esc_attr( FrmAppHelper::get_param( 'frm_verify', '', 'get', 'wp_kses_post' ) ); ?>" <?php FrmFormsHelper::maybe_hide_inline(); ?> />
|
80 |
+
</div>
|
81 |
+
<?php
|
82 |
+
}
|
83 |
+
}
|
classes/models/FrmUsage.php
CHANGED
@@ -215,6 +215,8 @@ class FrmUsage {
|
|
215 |
$settings = array(
|
216 |
'form_class',
|
217 |
'akismet',
|
|
|
|
|
218 |
'custom_style',
|
219 |
'success_action',
|
220 |
'show_form',
|
215 |
$settings = array(
|
216 |
'form_class',
|
217 |
'akismet',
|
218 |
+
'honeypot',
|
219 |
+
'antispam',
|
220 |
'custom_style',
|
221 |
'success_action',
|
222 |
'show_form',
|
classes/models/FrmValidate.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
|
6 |
+
abstract class FrmValidate {
|
7 |
+
|
8 |
+
/**
|
9 |
+
* @var int $form_id
|
10 |
+
*/
|
11 |
+
protected $form_id;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var object $form
|
15 |
+
*/
|
16 |
+
protected $form;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @param int $form_id
|
20 |
+
*/
|
21 |
+
public function __construct( $form_id ) {
|
22 |
+
$this->form_id = $form_id;
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @return object $form
|
27 |
+
*/
|
28 |
+
protected function get_form() {
|
29 |
+
if ( ! isset( $this->form ) ) {
|
30 |
+
$this->form = FrmForm::getOne( $this->form_id );
|
31 |
+
}
|
32 |
+
return $this->form;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @return bool
|
37 |
+
*/
|
38 |
+
protected function is_option_on() {
|
39 |
+
$form = $this->get_form();
|
40 |
+
$key = $this->get_option_key();
|
41 |
+
return ! empty( $form->options[ $key ] ) && 'off' !== $form->options[ $key ];
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @return bool
|
46 |
+
*/
|
47 |
+
abstract public function validate();
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Track the form option key used for is_option_on function.
|
51 |
+
*
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
abstract protected function get_option_key();
|
55 |
+
}
|
classes/models/fields/FrmFieldCombo.php
ADDED
@@ -0,0 +1,466 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Combo field - Field contains sub fields
|
4 |
+
*
|
5 |
+
* @package Formidable
|
6 |
+
* @since 4.11
|
7 |
+
*/
|
8 |
+
|
9 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
+
die( 'You are not allowed to call this page directly.' );
|
11 |
+
}
|
12 |
+
|
13 |
+
class FrmFieldCombo extends FrmFieldType {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Does the html for this field label need to include "for"?
|
17 |
+
*
|
18 |
+
* @var bool
|
19 |
+
* @since 3.0
|
20 |
+
*/
|
21 |
+
protected $has_for_label = false;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Sub fields.
|
25 |
+
*
|
26 |
+
* @var array
|
27 |
+
*/
|
28 |
+
protected $sub_fields = array();
|
29 |
+
|
30 |
+
/**
|
31 |
+
* This is used to check if field is combo field.
|
32 |
+
*
|
33 |
+
* @var bool
|
34 |
+
*/
|
35 |
+
public $is_combo_field = true;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Gets ALL subfields.
|
39 |
+
*
|
40 |
+
* @return array
|
41 |
+
*/
|
42 |
+
public function get_sub_fields() {
|
43 |
+
return $this->sub_fields;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Registers sub fields.
|
48 |
+
*
|
49 |
+
* @param array $sub_fields Sub fields. Accepts array or array or array of string.
|
50 |
+
*/
|
51 |
+
protected function register_sub_fields( array $sub_fields ) {
|
52 |
+
$defaults = $this->get_default_sub_field();
|
53 |
+
|
54 |
+
foreach ( $sub_fields as $name => $sub_field ) {
|
55 |
+
if ( empty( $sub_field ) ) {
|
56 |
+
continue;
|
57 |
+
}
|
58 |
+
|
59 |
+
if ( is_array( $sub_field ) ) {
|
60 |
+
$sub_field = wp_parse_args( $sub_field, $defaults );
|
61 |
+
$sub_field['name'] = $name;
|
62 |
+
$this->sub_fields[ $name ] = $sub_field;
|
63 |
+
continue;
|
64 |
+
}
|
65 |
+
|
66 |
+
if ( is_string( $sub_field ) ) {
|
67 |
+
$this->sub_fields[ $name ] = wp_parse_args(
|
68 |
+
array(
|
69 |
+
'name' => $name,
|
70 |
+
'label' => $sub_field,
|
71 |
+
),
|
72 |
+
$defaults
|
73 |
+
);
|
74 |
+
}
|
75 |
+
}
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Gets default sub field.
|
80 |
+
*
|
81 |
+
* @return array
|
82 |
+
*/
|
83 |
+
protected function get_default_sub_field() {
|
84 |
+
return array(
|
85 |
+
'type' => 'text',
|
86 |
+
'label' => '',
|
87 |
+
'classes' => '',
|
88 |
+
'wrapper_classes' => '',
|
89 |
+
'options' => array(
|
90 |
+
'default_value',
|
91 |
+
'placeholder',
|
92 |
+
'desc',
|
93 |
+
),
|
94 |
+
'optional' => false,
|
95 |
+
'atts' => array(),
|
96 |
+
);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Registers extra options for saving.
|
101 |
+
*
|
102 |
+
* @return array
|
103 |
+
*/
|
104 |
+
protected function extra_field_opts() {
|
105 |
+
$extra_options = parent::extra_field_opts();
|
106 |
+
|
107 |
+
// Register for sub field options.
|
108 |
+
foreach ( $this->sub_fields as $key => $sub_field ) {
|
109 |
+
if ( empty( $sub_field['options'] ) || ! is_array( $sub_field['options'] ) ) {
|
110 |
+
continue;
|
111 |
+
}
|
112 |
+
|
113 |
+
foreach ( $sub_field['options'] as $option ) {
|
114 |
+
if ( 'default_value' === $option ) { // We parse default value from field column.
|
115 |
+
continue;
|
116 |
+
}
|
117 |
+
|
118 |
+
if ( is_string( $option ) ) {
|
119 |
+
$extra_options[ $key . '_' . $option ] = '';
|
120 |
+
} elseif ( ! empty( $option['name'] ) ) {
|
121 |
+
$extra_options[ $key . '_' . $option['name'] ] = '';
|
122 |
+
}
|
123 |
+
}
|
124 |
+
}
|
125 |
+
|
126 |
+
return $extra_options;
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Include the settings for placeholder, default value, and sub labels for each
|
131 |
+
* of the individual field labels.
|
132 |
+
*
|
133 |
+
* @since 4.0
|
134 |
+
* @param array $args Includes 'field', 'display'.
|
135 |
+
*/
|
136 |
+
public function show_after_default( $args ) {
|
137 |
+
$field = (array) $args['field'];
|
138 |
+
$default_value = $this->get_default_value();
|
139 |
+
$processed_sub_fields = $this->get_processed_sub_fields();
|
140 |
+
|
141 |
+
foreach ( $this->sub_fields as $name => $sub_field ) {
|
142 |
+
$sub_field['name'] = $name;
|
143 |
+
$wrapper_classes = 'frm_grid_container frm_sub_field_options frm_sub_field_options-' . $sub_field['name'];
|
144 |
+
if ( ! isset( $processed_sub_fields[ $name ] ) ) {
|
145 |
+
// Options for this subfield should be hidden.
|
146 |
+
$wrapper_classes .= ' frm_hidden';
|
147 |
+
}
|
148 |
+
|
149 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/combo-field/sub-field-options.php';
|
150 |
+
}
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Gets default value of field.
|
155 |
+
* This should return an array of default value of sub fields.
|
156 |
+
*
|
157 |
+
* @return array
|
158 |
+
*/
|
159 |
+
protected function get_default_value() {
|
160 |
+
$default_value = $this->get_field_column( 'default_value' );
|
161 |
+
|
162 |
+
if ( is_array( $default_value ) ) {
|
163 |
+
return $default_value;
|
164 |
+
}
|
165 |
+
|
166 |
+
if ( is_object( $default_value ) ) {
|
167 |
+
return (array) $default_value;
|
168 |
+
}
|
169 |
+
|
170 |
+
if ( ! $default_value ) {
|
171 |
+
$default_value = array();
|
172 |
+
|
173 |
+
foreach ( $this->sub_fields as $name => $sub_field ) {
|
174 |
+
$default_value[ $name ] = '';
|
175 |
+
}
|
176 |
+
|
177 |
+
return $default_value;
|
178 |
+
}
|
179 |
+
|
180 |
+
return json_decode( $default_value, true ); // We store default value as JSON string in db.
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Gets labels for built-in options of fields or sub fields.
|
185 |
+
*
|
186 |
+
* @return array
|
187 |
+
*/
|
188 |
+
protected function get_built_in_option_labels() {
|
189 |
+
return array(
|
190 |
+
'default_value' => __( 'Default Value', 'formidable' ),
|
191 |
+
'placeholder' => __( 'Placeholder Text', 'formidable' ),
|
192 |
+
'desc' => __( 'Description', 'formidable' ),
|
193 |
+
);
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* Which built-in settings this field supports?
|
198 |
+
*
|
199 |
+
* @return array
|
200 |
+
*/
|
201 |
+
protected function field_settings_for_type() {
|
202 |
+
$settings = array(
|
203 |
+
'description' => false,
|
204 |
+
'default' => false,
|
205 |
+
'clear_on_focus' => false, // Don't use the regular placeholder option.
|
206 |
+
'logic' => true,
|
207 |
+
);
|
208 |
+
|
209 |
+
return $settings;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Shows field on the form builder.
|
214 |
+
*
|
215 |
+
* @param string $name Field name.
|
216 |
+
*/
|
217 |
+
public function show_on_form_builder( $name = '' ) {
|
218 |
+
$field = FrmFieldsHelper::setup_edit_vars( $this->field );
|
219 |
+
|
220 |
+
$field['default_value'] = $this->get_default_value();
|
221 |
+
$field['value'] = $field['default_value'];
|
222 |
+
|
223 |
+
$field_name = $this->html_name( $name );
|
224 |
+
|
225 |
+
$this->load_field_output( compact( 'field', 'field_name' ) );
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Gets processed sub fields.
|
230 |
+
* This should return the list of sub fields after sorting or show/hide based of some options.
|
231 |
+
*
|
232 |
+
* @return array
|
233 |
+
*/
|
234 |
+
protected function get_processed_sub_fields() {
|
235 |
+
return $this->sub_fields;
|
236 |
+
}
|
237 |
+
|
238 |
+
/**
|
239 |
+
* Shows field in the frontend.
|
240 |
+
*
|
241 |
+
* @param array $args Arguments.
|
242 |
+
* @param array $shortcode_atts Shortcode attributes.
|
243 |
+
* @return string
|
244 |
+
*/
|
245 |
+
public function front_field_input( $args, $shortcode_atts ) {
|
246 |
+
$field = (array) $this->field;
|
247 |
+
|
248 |
+
$field['default_value'] = $this->get_default_value();
|
249 |
+
if ( empty( $field['value'] ) ) {
|
250 |
+
$field['value'] = $field['default_value'];
|
251 |
+
}
|
252 |
+
|
253 |
+
$args['field'] = $field;
|
254 |
+
$args['shortcode_atts'] = $shortcode_atts;
|
255 |
+
|
256 |
+
ob_start();
|
257 |
+
$this->load_field_output( $args );
|
258 |
+
$input_html = ob_get_clean();
|
259 |
+
|
260 |
+
return $input_html;
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Loads field output.
|
265 |
+
*
|
266 |
+
* @param array $args {
|
267 |
+
* Arguments.
|
268 |
+
*
|
269 |
+
* @type array $field Field array.
|
270 |
+
* @type string $html_id HTML ID.
|
271 |
+
* @type string $field_name Field name attribute.
|
272 |
+
* @type array $shortcode_atts Shortcode attributes.
|
273 |
+
* @type array $errors Field errors.
|
274 |
+
* @type bool $remove_names Remove name attribute or not.
|
275 |
+
* }
|
276 |
+
*/
|
277 |
+
protected function load_field_output( $args ) {
|
278 |
+
if ( empty( $args['field'] ) ) {
|
279 |
+
return;
|
280 |
+
}
|
281 |
+
|
282 |
+
$this->process_args_for_field_output( $args );
|
283 |
+
|
284 |
+
$include_paths = array(
|
285 |
+
FrmAppHelper::plugin_path() . "/classes/views/frm-fields/front-end/{$args['field']['type']}-field/{$args['field']['type']}-field.php",
|
286 |
+
FrmAppHelper::plugin_path() . '/classes/views/frm-fields/front-end/combo-field/combo-field.php',
|
287 |
+
);
|
288 |
+
|
289 |
+
foreach ( $include_paths as $include_path ) {
|
290 |
+
if ( file_exists( $include_path ) ) {
|
291 |
+
include $include_path;
|
292 |
+
return;
|
293 |
+
}
|
294 |
+
}
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* Loads processed args for field output.
|
299 |
+
*
|
300 |
+
* @param array $args {
|
301 |
+
* Arguments.
|
302 |
+
*
|
303 |
+
* @type array $field Field array.
|
304 |
+
* @type string $html_id HTML ID.
|
305 |
+
* @type string $field_name Field name attribute.
|
306 |
+
* @type array $shortcode_atts Shortcode attributes.
|
307 |
+
* @type array $errors Field errors.
|
308 |
+
* @type bool $remove_names Remove name attribute or not.
|
309 |
+
* }
|
310 |
+
*/
|
311 |
+
protected function process_args_for_field_output( &$args ) {
|
312 |
+
$args['field'] = (array) $args['field'];
|
313 |
+
|
314 |
+
if ( ! isset( $args['html_id'] ) ) {
|
315 |
+
$args['html_id'] = $this->html_id();
|
316 |
+
}
|
317 |
+
|
318 |
+
if ( ! isset( $args['field_name'] ) ) {
|
319 |
+
$args['field_name'] = $this->html_name( $args['field']['name'] );
|
320 |
+
}
|
321 |
+
|
322 |
+
$args['sub_fields'] = $this->get_processed_sub_fields();
|
323 |
+
|
324 |
+
if ( ! isset( $args['shortcode_atts'] ) ) {
|
325 |
+
$args['shortcode_atts'] = array();
|
326 |
+
}
|
327 |
+
|
328 |
+
if ( ! isset( $args['errors'] ) ) {
|
329 |
+
$args['errors'] = array();
|
330 |
+
}
|
331 |
+
}
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Prints sub field input atts.
|
335 |
+
*
|
336 |
+
* @param array $args Arguments. Includes `field`, `sub_field`.
|
337 |
+
*/
|
338 |
+
protected function print_input_atts( $args ) {
|
339 |
+
$field = $args['field'];
|
340 |
+
$sub_field = $args['sub_field'];
|
341 |
+
$atts = array();
|
342 |
+
|
343 |
+
// Placeholder.
|
344 |
+
if ( in_array( 'placeholder', $sub_field['options'], true ) ) {
|
345 |
+
$placeholders = FrmField::get_option( $field, 'placeholder' );
|
346 |
+
if ( ! empty( $placeholders[ $sub_field['name'] ] ) ) {
|
347 |
+
$atts[] = 'placeholder="' . esc_attr( $placeholders[ $sub_field['name'] ] ) . '"';
|
348 |
+
}
|
349 |
+
}
|
350 |
+
|
351 |
+
// Add optional class.
|
352 |
+
$classes = isset( $sub_field['classes'] ) ? $sub_field['classes'] : '';
|
353 |
+
if ( is_array( $classes ) ) {
|
354 |
+
$classes = implode( ' ', $classes );
|
355 |
+
}
|
356 |
+
|
357 |
+
if ( ! empty( $sub_field['optional'] ) ) {
|
358 |
+
$classes .= ' frm_optional';
|
359 |
+
}
|
360 |
+
|
361 |
+
if ( $classes ) {
|
362 |
+
$atts[] = 'class="' . esc_attr( $classes ) . '"';
|
363 |
+
}
|
364 |
+
|
365 |
+
// Print custom attributes.
|
366 |
+
if ( ! empty( $sub_field['atts'] ) && is_array( $sub_field['atts'] ) ) {
|
367 |
+
foreach ( $sub_field['atts'] as $att_name => $att_value ) {
|
368 |
+
$atts[] = esc_attr( trim( $att_name ) ) . '="' . esc_attr( trim( $att_value ) ) . '"';
|
369 |
+
}
|
370 |
+
}
|
371 |
+
|
372 |
+
echo implode( ' ', $atts ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
373 |
+
}
|
374 |
+
|
375 |
+
/**
|
376 |
+
* Validate field.
|
377 |
+
*
|
378 |
+
* @param array $args Arguments. Includes `errors`, `value`.
|
379 |
+
* @return array Errors array.
|
380 |
+
*/
|
381 |
+
public function validate( $args ) {
|
382 |
+
$errors = isset( $args['errors'] ) ? $args['errors'] : array();
|
383 |
+
|
384 |
+
if ( ! $this->field->required ) {
|
385 |
+
return $errors;
|
386 |
+
}
|
387 |
+
|
388 |
+
if ( class_exists( 'FrmProEntryMeta' ) && FrmProEntryMeta::skip_required_validation( $this->field ) ) {
|
389 |
+
return $errors;
|
390 |
+
}
|
391 |
+
|
392 |
+
$blank_msg = FrmFieldsHelper::get_error_msg( $this->field, 'blank' );
|
393 |
+
|
394 |
+
$sub_fields = $this->get_processed_sub_fields();
|
395 |
+
|
396 |
+
// Validate not empty.
|
397 |
+
foreach ( $sub_fields as $name => $sub_field ) {
|
398 |
+
if ( empty( $sub_field['optional'] ) && empty( $args['value'][ $name ] ) ) {
|
399 |
+
$errors[ 'field' . $args['id'] . '-' . $name ] = '';
|
400 |
+
$errors[ 'field' . $args['id'] ] = $blank_msg;
|
401 |
+
}
|
402 |
+
}
|
403 |
+
|
404 |
+
return $errors;
|
405 |
+
}
|
406 |
+
|
407 |
+
/**
|
408 |
+
* Gets export headings.
|
409 |
+
*
|
410 |
+
* @return array
|
411 |
+
*/
|
412 |
+
public function get_export_headings() {
|
413 |
+
$headings = array();
|
414 |
+
$field_id = isset( $this->field->id ) ? $this->field->id : $this->field['id'];
|
415 |
+
$field_name = isset( $this->field->name ) ? $this->field->name : $this->field['name'];
|
416 |
+
$field_key = isset( $this->field->field_key ) ? $this->field->field_key : $this->field['field_key'];
|
417 |
+
$sub_fields = $this->get_processed_sub_fields();
|
418 |
+
foreach ( $sub_fields as $name => $sub_field ) {
|
419 |
+
$headings[ $field_id . '_' . $name ] = $field_name . ' (' . $field_key . ') - ' . $sub_field['label'];
|
420 |
+
}
|
421 |
+
|
422 |
+
return $headings;
|
423 |
+
}
|
424 |
+
|
425 |
+
/**
|
426 |
+
*
|
427 |
+
* Get a list of all field settings that should be translated
|
428 |
+
* on a multilingual site.
|
429 |
+
*
|
430 |
+
* @since 3.06.01
|
431 |
+
*
|
432 |
+
* @return array
|
433 |
+
*/
|
434 |
+
public function translatable_strings() {
|
435 |
+
$strings = parent::translatable_strings();
|
436 |
+
|
437 |
+
foreach ( $this->sub_fields as $name => $sub_field ) {
|
438 |
+
if ( in_array( 'desc', $sub_field['options'], true ) ) {
|
439 |
+
$strings[] = $name . '_desc';
|
440 |
+
}
|
441 |
+
}
|
442 |
+
|
443 |
+
return $strings;
|
444 |
+
}
|
445 |
+
|
446 |
+
/**
|
447 |
+
* Checks if should print hidden subfields and hide them. This is useful to use js to show or hide sub fields.
|
448 |
+
*
|
449 |
+
* @return bool
|
450 |
+
*/
|
451 |
+
protected function should_print_hidden_sub_fields() {
|
452 |
+
return false;
|
453 |
+
}
|
454 |
+
|
455 |
+
/**
|
456 |
+
* Gets inputs container attributes.
|
457 |
+
*
|
458 |
+
* @return array
|
459 |
+
*/
|
460 |
+
protected function get_inputs_container_attrs() {
|
461 |
+
return array(
|
462 |
+
'class' => 'frm_combo_inputs_container',
|
463 |
+
'id' => 'frm_combo_inputs_container_' . $this->field_id,
|
464 |
+
);
|
465 |
+
}
|
466 |
+
}
|
classes/models/fields/FrmFieldName.php
ADDED
@@ -0,0 +1,227 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Name field
|
4 |
+
*
|
5 |
+
* @package Formidable
|
6 |
+
* @since 4.11
|
7 |
+
*/
|
8 |
+
|
9 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
+
die( 'You are not allowed to call this page directly.' );
|
11 |
+
}
|
12 |
+
|
13 |
+
class FrmFieldName extends FrmFieldCombo {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Field name.
|
17 |
+
*
|
18 |
+
* @var string
|
19 |
+
* @since 3.0
|
20 |
+
*/
|
21 |
+
protected $type = 'name';
|
22 |
+
|
23 |
+
public function __construct( $field = '', $type = '' ) {
|
24 |
+
parent::__construct( $field, $type );
|
25 |
+
|
26 |
+
$this->register_sub_fields(
|
27 |
+
array(
|
28 |
+
'first' => __( 'First', 'formidable' ),
|
29 |
+
'middle' => __( 'Middle', 'formidable' ),
|
30 |
+
'last' => __( 'Last', 'formidable' ),
|
31 |
+
)
|
32 |
+
);
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Gets processed sub fields.
|
37 |
+
* This should return the list of sub fields after sorting or show/hide based of some options.
|
38 |
+
*
|
39 |
+
* @return array
|
40 |
+
*/
|
41 |
+
protected function get_processed_sub_fields() {
|
42 |
+
$name_layout = $this->get_name_layout();
|
43 |
+
$names = explode( '_', $name_layout );
|
44 |
+
$col_class = 'frm' . intval( 12 / count( $names ) );
|
45 |
+
|
46 |
+
$result = array();
|
47 |
+
|
48 |
+
foreach ( $names as $name ) {
|
49 |
+
if ( empty( $this->sub_fields[ $name ] ) ) {
|
50 |
+
continue;
|
51 |
+
}
|
52 |
+
|
53 |
+
if ( ! isset( $this->sub_fields[ $name ]['wrapper_classes'] ) ) {
|
54 |
+
$this->sub_fields[ $name ]['wrapper_classes'] = $col_class;
|
55 |
+
} elseif ( is_array( $this->sub_fields[ $name ]['wrapper_classes'] ) ) {
|
56 |
+
$this->sub_fields[ $name ]['wrapper_classes'] = implode( ' ', $this->sub_fields[ $name ]['wrapper_classes'] ) . ' ' . $col_class;
|
57 |
+
} else {
|
58 |
+
$this->sub_fields[ $name ]['wrapper_classes'] .= ' ' . $col_class;
|
59 |
+
}
|
60 |
+
|
61 |
+
$result[ $name ] = $this->sub_fields[ $name ];
|
62 |
+
}
|
63 |
+
|
64 |
+
return $result;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Gets name layout option value.
|
69 |
+
*
|
70 |
+
* @return string
|
71 |
+
*/
|
72 |
+
protected function get_name_layout() {
|
73 |
+
$name_layout = FrmField::get_option( $this->field, 'name_layout' );
|
74 |
+
if ( ! $name_layout ) {
|
75 |
+
$name_layout = 'first_last';
|
76 |
+
}
|
77 |
+
return $name_layout;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Gets extra field options.
|
82 |
+
*
|
83 |
+
* @return string[]
|
84 |
+
*/
|
85 |
+
protected function extra_field_opts() {
|
86 |
+
$extra_options = parent::extra_field_opts();
|
87 |
+
|
88 |
+
$extra_options['name_layout'] = 'first_last';
|
89 |
+
|
90 |
+
// Default desc.
|
91 |
+
foreach ( $this->sub_fields as $name => $sub_field ) {
|
92 |
+
$extra_options[ $name . '_desc' ] = $sub_field['label'];
|
93 |
+
}
|
94 |
+
|
95 |
+
return $extra_options;
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Shows primary options.
|
100 |
+
*
|
101 |
+
* @since 4.0
|
102 |
+
*
|
103 |
+
* @param array $args Includes 'field', 'display', and 'values'.
|
104 |
+
*/
|
105 |
+
public function show_primary_options( $args ) {
|
106 |
+
$field = (array) $args['field'];
|
107 |
+
include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/name/primary-options.php';
|
108 |
+
|
109 |
+
parent::show_primary_options( $args );
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Prepares the display value.
|
114 |
+
* This also handles the shortcode output. Support [id], [id show=first], [id show=last], [id show=middle].
|
115 |
+
*
|
116 |
+
* @param mixed $value Field value before processing.
|
117 |
+
* @param array $atts Shortcode attributes.
|
118 |
+
* @return string Most of cases, this will return string.
|
119 |
+
*/
|
120 |
+
protected function prepare_display_value( $value, $atts ) {
|
121 |
+
if ( ! is_array( $value ) ) {
|
122 |
+
return $value;
|
123 |
+
}
|
124 |
+
|
125 |
+
$name_layout = $this->get_name_layout();
|
126 |
+
|
127 |
+
if ( ! empty( $atts['show'] ) ) {
|
128 |
+
return isset( $value[ $atts['show'] ] ) ? $value[ $atts['show'] ] : '';
|
129 |
+
}
|
130 |
+
|
131 |
+
$value = wp_parse_args(
|
132 |
+
$value,
|
133 |
+
array(
|
134 |
+
'first' => '',
|
135 |
+
'middle' => '',
|
136 |
+
'last' => '',
|
137 |
+
)
|
138 |
+
);
|
139 |
+
|
140 |
+
switch ( $name_layout ) {
|
141 |
+
case 'last_first':
|
142 |
+
$value = $value['last'] . ' ' . $value['first'];
|
143 |
+
break;
|
144 |
+
|
145 |
+
case 'first_middle_last':
|
146 |
+
$value = $value['first'] . ' ' . $value['middle'] . ' ' . $value['last'];
|
147 |
+
break;
|
148 |
+
|
149 |
+
default:
|
150 |
+
$value = $value['first'] . ' ' . $value['last'];
|
151 |
+
}
|
152 |
+
|
153 |
+
return trim( $value );
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* @since 4.0.04
|
158 |
+
*/
|
159 |
+
public function sanitize_value( &$value ) {
|
160 |
+
FrmAppHelper::sanitize_value( 'sanitize_text_field', $value );
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Validate field.
|
165 |
+
*
|
166 |
+
* @param array $args Arguments. Includes `errors`, `value`.
|
167 |
+
* @return array Errors array.
|
168 |
+
*/
|
169 |
+
public function validate( $args ) {
|
170 |
+
/**
|
171 |
+
* If users fill just HTML tag, it passes the validation but value is empty in the database because of the
|
172 |
+
* sanitization. So we need to sanitize the value before validating.
|
173 |
+
*/
|
174 |
+
$this->sanitize_value( $args['value'] );
|
175 |
+
return parent::validate( $args );
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Loads processed args for field output.
|
180 |
+
*
|
181 |
+
* @param array $args {
|
182 |
+
* Arguments.
|
183 |
+
*
|
184 |
+
* @type array $field Field array.
|
185 |
+
* @type string $html_id HTML ID.
|
186 |
+
* @type string $field_name Field name attribute.
|
187 |
+
* @type array $shortcode_atts Shortcode attributes.
|
188 |
+
* @type array $errors Field errors.
|
189 |
+
* @type bool $remove_names Remove name attribute or not.
|
190 |
+
* }
|
191 |
+
*/
|
192 |
+
protected function process_args_for_field_output( &$args ) {
|
193 |
+
parent::process_args_for_field_output( $args );
|
194 |
+
|
195 |
+
// Show all subfields in form builder then use JS to show or hide them.
|
196 |
+
if ( $this->should_print_hidden_sub_fields() && count( $args['sub_fields'] ) !== count( $this->sub_fields ) ) {
|
197 |
+
$hidden_fields = array_diff_key( $this->sub_fields, $args['sub_fields'] );
|
198 |
+
$args['sub_fields'] = $this->sub_fields;
|
199 |
+
|
200 |
+
foreach ( $hidden_fields as $name => $hidden_field ) {
|
201 |
+
$args['sub_fields'][ $name ]['wrapper_classes'] .= ' frm_hidden';
|
202 |
+
}
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* Checks if should print hidden subfields and hide them. This is useful to use js to show or hide sub fields.
|
208 |
+
*
|
209 |
+
* @return bool
|
210 |
+
*/
|
211 |
+
protected function should_print_hidden_sub_fields() {
|
212 |
+
// phpcs:ignore WordPress.Security.NonceVerification.Missing
|
213 |
+
return FrmAppHelper::is_form_builder_page() || FrmAppHelper::doing_ajax() && isset( $_POST['action'] ) && 'frm_insert_field' === $_POST['action'];
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Gets inputs container attributes.
|
218 |
+
*
|
219 |
+
* @return array
|
220 |
+
*/
|
221 |
+
protected function get_inputs_container_attrs() {
|
222 |
+
$attrs = parent::get_inputs_container_attrs();
|
223 |
+
|
224 |
+
$attrs['data-name-layout'] = $this->get_name_layout();
|
225 |
+
return $attrs;
|
226 |
+
}
|
227 |
+
}
|
classes/views/frm-entries/form.php
CHANGED
@@ -50,24 +50,16 @@ if ( $values['fields'] ) {
|
|
50 |
$frm_settings = FrmAppHelper::get_settings();
|
51 |
if ( FrmAppHelper::is_admin() ) {
|
52 |
?>
|
53 |
-
<div class="frm_form_field form-field">
|
54 |
-
<label class="frm_primary_label"><?php esc_html_e( 'Entry Key', 'formidable' ); ?></label>
|
55 |
-
<input type="text" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
|
56 |
-
</div>
|
57 |
-
<?php } else { ?>
|
58 |
-
<input type="hidden" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
|
59 |
<?php
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
<?php esc_html_e( 'If you are human, leave this field blank.', 'formidable' ); ?>
|
66 |
-
</label>
|
67 |
-
<input type="email" class="frm_verify" id="frm_email_<?php echo esc_attr( $form->id ); ?>" name="frm_verify" value="<?php echo esc_attr( FrmAppHelper::get_param( 'frm_verify', '', 'get', 'wp_kses_post' ) ); ?>" <?php FrmFormsHelper::maybe_hide_inline(); ?> />
|
68 |
-
</div>
|
69 |
-
<?php
|
70 |
-
}
|
71 |
}
|
72 |
|
73 |
do_action( 'frm_entry_form', $form, $form_action, $errors );
|
50 |
$frm_settings = FrmAppHelper::get_settings();
|
51 |
if ( FrmAppHelper::is_admin() ) {
|
52 |
?>
|
53 |
+
<div class="frm_form_field form-field">
|
54 |
+
<label class="frm_primary_label"><?php esc_html_e( 'Entry Key', 'formidable' ); ?></label>
|
55 |
+
<input type="text" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
|
56 |
+
</div>
|
|
|
|
|
57 |
<?php
|
58 |
+
} else {
|
59 |
+
?>
|
60 |
+
<input type="hidden" name="item_key" value="<?php echo esc_attr( $values['item_key'] ); ?>" />
|
61 |
+
<?php
|
62 |
+
FrmHoneypot::maybe_render_field( $form->id );
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
}
|
64 |
|
65 |
do_action( 'frm_entry_form', $form, $form_action, $errors );
|
classes/views/frm-entries/new.php
CHANGED
@@ -2,6 +2,8 @@
|
|
2 |
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
die( 'You are not allowed to call this page directly.' );
|
4 |
}
|
|
|
|
|
5 |
?>
|
6 |
<div class="frm_forms <?php echo esc_attr( FrmFormsHelper::get_form_style_class( $values ) ); ?>" id="frm_form_<?php echo esc_attr( $form->id ); ?>_container" <?php echo wp_strip_all_tags( apply_filters( 'frm_form_div_attributes', '', $form ) ); // WPCS: XSS ok. ?>>
|
7 |
<?php if ( ! isset( $include_form_tag ) || $include_form_tag ) { ?>
|
2 |
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
die( 'You are not allowed to call this page directly.' );
|
4 |
}
|
5 |
+
|
6 |
+
FrmAntiSpam::maybe_init( $form->id );
|
7 |
?>
|
8 |
<div class="frm_forms <?php echo esc_attr( FrmFormsHelper::get_form_style_class( $values ) ); ?>" id="frm_form_<?php echo esc_attr( $form->id ); ?>_container" <?php echo wp_strip_all_tags( apply_filters( 'frm_form_div_attributes', '', $form ) ); // WPCS: XSS ok. ?>>
|
9 |
<?php if ( ! isset( $include_form_tag ) || $include_form_tag ) { ?>
|
classes/views/frm-fields/back-end/combo-field/sub-field-options.php
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Sub field options
|
4 |
+
*
|
5 |
+
* @package Formidable
|
6 |
+
* @since 4.10.02
|
7 |
+
*
|
8 |
+
* @var FrmFieldCombo $this Field type object.
|
9 |
+
* @var array $field Field array.
|
10 |
+
* @var array $sub_field Sub field array.
|
11 |
+
* @var array $default_value Default value of all sub fields.
|
12 |
+
* @var array $wrapper_classes CSS classes of wrapper element of subfield options.
|
13 |
+
*/
|
14 |
+
|
15 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
16 |
+
die( 'You are not allowed to call this page directly.' );
|
17 |
+
}
|
18 |
+
|
19 |
+
$field_id = $field['id'];
|
20 |
+
$field_key = $field['field_key'];
|
21 |
+
$uniq_str = $sub_field['name'] . '_' . $field_id;
|
22 |
+
$labels = $this->get_built_in_option_labels();
|
23 |
+
?>
|
24 |
+
<div
|
25 |
+
class="<?php echo esc_attr( $wrapper_classes ); ?>"
|
26 |
+
data-sub-field-name="<?php echo esc_attr( $sub_field['name'] ); ?>"
|
27 |
+
data-field-id="<?php echo intval( $field_id ); ?>"
|
28 |
+
>
|
29 |
+
<label id="<?php echo esc_attr( $uniq_str ); ?>" class="frm_primary_label">
|
30 |
+
<?php echo esc_html( $sub_field['label'] ); ?>
|
31 |
+
</label>
|
32 |
+
|
33 |
+
<?php
|
34 |
+
// Loop through $sub_field['options'] to show options.
|
35 |
+
foreach ( $sub_field['options'] as $option ) {
|
36 |
+
switch ( $option ) {
|
37 |
+
case 'default_value':
|
38 |
+
$input_name = sprintf( '%1$s_%2$s[%3$s]', $option, $field_id, $sub_field['name'] );
|
39 |
+
$input_id = $option . '_' . $uniq_str;
|
40 |
+
?>
|
41 |
+
<p class="frm6 frm_form_field">
|
42 |
+
<span class="frm-with-right-icon">
|
43 |
+
<?php
|
44 |
+
FrmAppHelper::icon_by_class(
|
45 |
+
'frm_icon_font frm_more_horiz_solid_icon frm-show-inline-modal',
|
46 |
+
array(
|
47 |
+
'data-open' => 'frm-smart-values-box',
|
48 |
+
)
|
49 |
+
);
|
50 |
+
?>
|
51 |
+
<input
|
52 |
+
type="text"
|
53 |
+
name="<?php echo esc_attr( $input_name ); ?>"
|
54 |
+
id="<?php echo esc_attr( $input_id ); ?>"
|
55 |
+
value="<?php echo esc_attr( isset( $default_value[ $sub_field['name'] ] ) ? $default_value[ $sub_field['name'] ] : '' ); ?>"
|
56 |
+
data-changeme="field_<?php echo esc_attr( $field_key . '_' . $sub_field['name'] ); ?>"
|
57 |
+
data-changeatt="value"
|
58 |
+
/>
|
59 |
+
</span>
|
60 |
+
<label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
|
61 |
+
<?php echo esc_html( $labels[ $option ] ); ?>
|
62 |
+
</label>
|
63 |
+
</p>
|
64 |
+
<?php
|
65 |
+
break;
|
66 |
+
|
67 |
+
// All simple text options with live update the form output can go here.
|
68 |
+
case 'placeholder':
|
69 |
+
$input_name = sprintf( 'field_options[%1$s_%2$s][%3$s]', $option, $field_id, $sub_field['name'] );
|
70 |
+
$input_id = 'field_options_' . $option . '_' . $uniq_str;
|
71 |
+
$input_value = FrmField::get_option( $field, $option );
|
72 |
+
?>
|
73 |
+
<p class="frm6 frm_form_field">
|
74 |
+
<input
|
75 |
+
type="text"
|
76 |
+
name="<?php echo esc_attr( $input_name ); ?>"
|
77 |
+
id="<?php echo esc_attr( $input_id ); ?>"
|
78 |
+
value="<?php echo esc_attr( isset( $input_value[ $sub_field['name'] ] ) ? $input_value[ $sub_field['name'] ] : '' ); ?>"
|
79 |
+
data-changeme="field_<?php echo esc_attr( $field_key . '_' . $sub_field['name'] ); ?>"
|
80 |
+
data-changeatt="<?php echo esc_attr( $option ); ?>"
|
81 |
+
/>
|
82 |
+
<label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
|
83 |
+
<?php echo esc_html( $labels[ $option ] ); ?>
|
84 |
+
</label>
|
85 |
+
</p>
|
86 |
+
<?php
|
87 |
+
break;
|
88 |
+
|
89 |
+
// All simple text options without live update the form output can go here.
|
90 |
+
case 'desc':
|
91 |
+
$input_name = sprintf( 'field_options[%1$s_%2$s_%3$s]', $sub_field['name'], $option, $field_id );
|
92 |
+
$input_id = 'field_options_' . $option . '_' . $uniq_str;
|
93 |
+
$input_value = FrmField::get_option( $field, $sub_field['name'] . '_' . $option );
|
94 |
+
?>
|
95 |
+
<p class="frm6 frm_form_field">
|
96 |
+
<input
|
97 |
+
type="text"
|
98 |
+
name="<?php echo esc_attr( $input_name ); ?>"
|
99 |
+
id="<?php echo esc_attr( $input_id ); ?>"
|
100 |
+
value="<?php echo esc_attr( $input_value ); ?>"
|
101 |
+
data-changeme="frm_field_<?php echo esc_attr( $field_id . '_' . $sub_field['name'] ); ?>_desc"
|
102 |
+
/>
|
103 |
+
<label class="frm_description" for="<?php echo esc_attr( $input_id ); ?>">
|
104 |
+
<?php echo esc_html( $labels[ $option ] ); ?>
|
105 |
+
</label>
|
106 |
+
</p>
|
107 |
+
<?php
|
108 |
+
break;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
?>
|
112 |
+
<div class="frm12"></div>
|
113 |
+
</div><!-- End .frm_sub_field_options -->
|
classes/views/frm-fields/back-end/name/primary-options.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Primary options for name field
|
4 |
+
*
|
5 |
+
* @package Formidable
|
6 |
+
* @since 4.10.02
|
7 |
+
*
|
8 |
+
* @var array $field Field array.
|
9 |
+
* @var array $args Includes 'field', 'display', and 'values'.
|
10 |
+
* @var FrmFieldName $this Field type object.
|
11 |
+
*/
|
12 |
+
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
die( 'You are not allowed to call this page directly.' );
|
15 |
+
}
|
16 |
+
|
17 |
+
// Options here need to be declared in FrmFieldName::extra_field_opts().
|
18 |
+
$field_id = $field['id'];
|
19 |
+
$name_layout = FrmField::get_option( $field, 'name_layout' );
|
20 |
+
?>
|
21 |
+
<p>
|
22 |
+
<label for="name_layout_<?php echo esc_attr( $field_id ); ?>">
|
23 |
+
<?php esc_html_e( 'Name layout', 'formidable' ); ?>
|
24 |
+
</label>
|
25 |
+
|
26 |
+
<select
|
27 |
+
name="field_options[name_layout_<?php echo esc_attr( $field_id ); ?>]"
|
28 |
+
id="name_layout_<?php echo esc_attr( $field_id ); ?>"
|
29 |
+
class="frm_name_layout_dropdown"
|
30 |
+
data-field-id="<?php echo intval( $field_id ); ?>"
|
31 |
+
data-changeme="frm_combo_inputs_container_<?php echo intval( $field_id ); ?>"
|
32 |
+
data-changeatt="data-name-layout"
|
33 |
+
>
|
34 |
+
<option value="first_last" <?php selected( $name_layout, 'first_last' ); ?>>
|
35 |
+
<?php esc_html_e( 'First Last', 'formidable' ); ?>
|
36 |
+
</option>
|
37 |
+
<option value="last_first" <?php selected( $name_layout, 'last_first' ); ?>>
|
38 |
+
<?php esc_html_e( 'Last First', 'formidable' ); ?>
|
39 |
+
</option>
|
40 |
+
<option value="first_middle_last" <?php selected( $name_layout, 'first_middle_last' ); ?>>
|
41 |
+
<?php esc_html_e( 'First Middle Last', 'formidable' ); ?>
|
42 |
+
</option>
|
43 |
+
</select>
|
44 |
+
</p>
|
classes/views/frm-fields/front-end/combo-field/combo-field.php
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Frontend template for combo field
|
4 |
+
*
|
5 |
+
* @package Formidable
|
6 |
+
* @since 4.10.02
|
7 |
+
*
|
8 |
+
* @var array $args Data passed to this view. See FrmFieldCombo::load_field_output().
|
9 |
+
* @var array $shortcode_atts Shortcode attributes.
|
10 |
+
* @var array $sub_fields Sub fields array.
|
11 |
+
* @var string $html_id HTML ID.
|
12 |
+
* @var string $field_name Field Name.
|
13 |
+
* @var array $errors Field errors.
|
14 |
+
* @var bool $remove_names Remove field name or not.
|
15 |
+
* @var FrmFieldCombo $this Field type object.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
19 |
+
die( 'You are not allowed to call this page directly.' );
|
20 |
+
}
|
21 |
+
|
22 |
+
$field = $args['field'];
|
23 |
+
$field_id = $field['id'];
|
24 |
+
$field_label = $field['name'];
|
25 |
+
$field_value = $field['value'];
|
26 |
+
$sub_fields = $args['sub_fields'];
|
27 |
+
$html_id = $args['html_id'];
|
28 |
+
$field_name = $args['field_name'];
|
29 |
+
$errors = $args['errors'];
|
30 |
+
|
31 |
+
$inputs_attrs = $this->get_inputs_container_attrs();
|
32 |
+
$inputs_attrs_str = '';
|
33 |
+
foreach ( $inputs_attrs as $key => $inputs_attr ) {
|
34 |
+
$inputs_attrs_str .= sprintf( ' %s="%s"', esc_attr( $key ), esc_attr( $inputs_attr ) );
|
35 |
+
}
|
36 |
+
?>
|
37 |
+
<fieldset aria-labelledby="<?php echo esc_attr( $html_id ); ?>_label">
|
38 |
+
<legend class="frm_screen_reader frm_hidden">
|
39 |
+
<?php echo esc_html( $field_label ); ?>
|
40 |
+
</legend>
|
41 |
+
|
42 |
+
<div<?php echo $inputs_attrs_str; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
|
43 |
+
<?php
|
44 |
+
foreach ( $sub_fields as $name => $sub_field ) {
|
45 |
+
$sub_field['name'] = $name;
|
46 |
+
$sub_field_class = "frm_form_field form-field frm_form_subfield-{$name} {$sub_field['wrapper_classes']}";
|
47 |
+
$sub_field_desc = FrmField::get_option( $field, $name . '_desc' );
|
48 |
+
|
49 |
+
if ( isset( $errors[ 'field' . $field_id . '-' . $name ] ) ) {
|
50 |
+
$sub_field_class .= ' frm_blank_field';
|
51 |
+
}
|
52 |
+
?>
|
53 |
+
<div
|
54 |
+
id="frm_field_<?php echo esc_attr( $field_id . '-' . $name ); ?>_container"
|
55 |
+
class="<?php echo esc_attr( $sub_field_class ); ?>"
|
56 |
+
data-sub-field-name="<?php echo esc_attr( $name ); ?>"
|
57 |
+
>
|
58 |
+
<label for="<?php echo esc_attr( $html_id . '_' . $name ); ?>" class="frm_screen_reader frm_hidden">
|
59 |
+
<?php echo esc_html( $sub_field_desc ? $sub_field_desc : $field_label ); ?>
|
60 |
+
</label>
|
61 |
+
|
62 |
+
<?php
|
63 |
+
switch ( $sub_field['type'] ) {
|
64 |
+
default:
|
65 |
+
?>
|
66 |
+
<input
|
67 |
+
type="<?php echo esc_attr( $sub_field['type'] ); ?>"
|
68 |
+
id="<?php echo esc_attr( $html_id . '_' . $name ); ?>"
|
69 |
+
value="<?php echo esc_attr( isset( $field_value[ $name ] ) ? $field_value[ $name ] : '' ); ?>"
|
70 |
+
<?php
|
71 |
+
if ( empty( $args['remove_names'] ) ) {
|
72 |
+
echo 'name="' . esc_attr( $field_name ) . '[' . esc_attr( $name ) . ']" ';
|
73 |
+
}
|
74 |
+
|
75 |
+
$this->print_input_atts( compact( 'field', 'sub_field' ) );
|
76 |
+
?>
|
77 |
+
/>
|
78 |
+
<?php
|
79 |
+
}
|
80 |
+
|
81 |
+
if ( $sub_field['label'] && ( $sub_field_desc || $this->should_print_hidden_sub_fields() ) ) {
|
82 |
+
echo '<div class="frm_description" id="frm_field_' . esc_attr( $field_id . '_' . $sub_field['name'] ) . '_desc">' . FrmAppHelper::kses( $sub_field_desc ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
83 |
+
}
|
84 |
+
|
85 |
+
// Don't show individual field errors when there is a combo field error.
|
86 |
+
if ( ! empty( $errors ) && isset( $errors[ 'field' . $field_id . '-' . $name ] ) && ! isset( $errors[ 'field' . $field_id ] ) ) {
|
87 |
+
?>
|
88 |
+
<div class="frm_error"><?php echo esc_html( $errors[ 'field' . $field_id . '-' . $name ] ); ?></div>
|
89 |
+
<?php } ?>
|
90 |
+
</div>
|
91 |
+
<?php } ?>
|
92 |
+
</div>
|
93 |
+
</fieldset>
|
classes/views/frm-forms/settings-advanced.php
CHANGED
@@ -118,23 +118,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
118 |
</label>
|
119 |
</td>
|
120 |
</tr>
|
121 |
-
<?php
|
122 |
-
<tr>
|
123 |
-
<td colspan="2"><?php esc_html_e( 'Use Akismet to check entries for spam for', 'formidable' ); ?>
|
124 |
-
<select name="options[akismet]">
|
125 |
-
<option value="">
|
126 |
-
<?php esc_html_e( 'no one', 'formidable' ); ?>
|
127 |
-
</option>
|
128 |
-
<option value="1" <?php selected( $values['akismet'], 1 ); ?>>
|
129 |
-
<?php esc_html_e( 'everyone', 'formidable' ); ?>
|
130 |
-
</option>
|
131 |
-
<option value="logged" <?php selected( $values['akismet'], 'logged' ); ?>>
|
132 |
-
<?php esc_html_e( 'visitors who are not logged in', 'formidable' ); ?>
|
133 |
-
</option>
|
134 |
-
</select>
|
135 |
-
</td>
|
136 |
-
</tr>
|
137 |
-
<?php } ?>
|
138 |
</table>
|
139 |
|
140 |
<!--AJAX Section-->
|
118 |
</label>
|
119 |
</td>
|
120 |
</tr>
|
121 |
+
<?php is_callable( 'self::render_spam_settings' ) && self::render_spam_settings( $values ); ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
</table>
|
123 |
|
124 |
<!--AJAX Section-->
|
classes/views/frm-forms/spam-settings/akismet.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
?>
|
6 |
+
<tr>
|
7 |
+
<td colspan="2"><?php esc_html_e( 'Use Akismet to check entries for spam for', 'formidable' ); ?>
|
8 |
+
<select name="options[akismet]">
|
9 |
+
<option value="">
|
10 |
+
<?php esc_html_e( 'no one', 'formidable' ); ?>
|
11 |
+
</option>
|
12 |
+
<option value="1" <?php selected( $values['akismet'], 1 ); ?>>
|
13 |
+
<?php esc_html_e( 'everyone', 'formidable' ); ?>
|
14 |
+
</option>
|
15 |
+
<option value="logged" <?php selected( $values['akismet'], 'logged' ); ?>>
|
16 |
+
<?php esc_html_e( 'visitors who are not logged in', 'formidable' ); ?>
|
17 |
+
</option>
|
18 |
+
</select>
|
19 |
+
</td>
|
20 |
+
</tr>
|
classes/views/frm-forms/spam-settings/antispam.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
?>
|
6 |
+
<tr>
|
7 |
+
<td colspan="2">
|
8 |
+
<input id="antispam" type="checkbox" name="options[antispam]" <?php checked( $values['antispam'], 1 ); ?> value="1" />
|
9 |
+
<label for="antispam"><?php esc_html_e( 'Check entries for spam using JavaScript', 'formidable' ); ?></label>
|
10 |
+
</td>
|
11 |
+
</tr>
|
classes/views/frm-forms/spam-settings/honeypot.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die( 'You are not allowed to call this page directly.' );
|
4 |
+
}
|
5 |
+
?>
|
6 |
+
<tr>
|
7 |
+
<td colspan="2">
|
8 |
+
<label for="honeypot"><?php esc_html_e( 'Use Honeypot to check entries for spam', 'formidable' ); ?></label>
|
9 |
+
<select id="honeypot" name="options[honeypot]">
|
10 |
+
<option value="off" <?php selected( $values['honeypot'], 'off' ); ?>><?php esc_html_e( 'Off', 'formidable' ); ?></option>
|
11 |
+
<option value="basic" <?php selected( ! empty( $values['honeypot'] ) && 'strict' !== $values['honeypot'], true ); ?>><?php esc_html_e( 'Basic', 'formidable' ); ?></option>
|
12 |
+
<option value="strict" <?php selected( $values['honeypot'], 'strict' ); ?>><?php esc_html_e( 'Strict', 'formidable' ); ?></option>
|
13 |
+
</select>
|
14 |
+
</td>
|
15 |
+
</tr>
|
css/frm_admin.css
CHANGED
@@ -3093,7 +3093,8 @@ input[type="checkbox"] {
|
|
3093 |
}
|
3094 |
|
3095 |
#new_fields .frm_primary_label + p,
|
3096 |
-
#new_fields .frm_primary_label + .frm6 + .frm6
|
|
|
3097 |
margin-top: 0;
|
3098 |
}
|
3099 |
|
@@ -6793,6 +6794,13 @@ input[disabled],
|
|
6793 |
font-size: 18px;
|
6794 |
}
|
6795 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6796 |
.frm_code_list a .frmsvg,
|
6797 |
.frm_code_list a i {
|
6798 |
margin: 0 5px 0 0;
|
@@ -8028,3 +8036,8 @@ Responsive Design
|
|
8028 |
.frm-admin-page-styles #frm-publishing #save_menu_header {
|
8029 |
display: inline-block;
|
8030 |
}
|
|
|
|
|
|
|
|
|
|
3093 |
}
|
3094 |
|
3095 |
#new_fields .frm_primary_label + p,
|
3096 |
+
#new_fields .frm_primary_label + .frm6 + .frm6,
|
3097 |
+
#new_fields .frm_primary_label + .frm6 + .frm-inline-modal + .frm6 {
|
3098 |
margin-top: 0;
|
3099 |
}
|
3100 |
|
6794 |
font-size: 18px;
|
6795 |
}
|
6796 |
|
6797 |
+
/* Icon for Name field is larger */
|
6798 |
+
.field_type_list li.frm_tname.frmbutton .frmsvg {
|
6799 |
+
width: 24px;
|
6800 |
+
height: 24px;
|
6801 |
+
padding-right: 11px;
|
6802 |
+
}
|
6803 |
+
|
6804 |
.frm_code_list a .frmsvg,
|
6805 |
.frm_code_list a i {
|
6806 |
margin: 0 5px 0 0;
|
8036 |
.frm-admin-page-styles #frm-publishing #save_menu_header {
|
8037 |
display: inline-block;
|
8038 |
}
|
8039 |
+
|
8040 |
+
/* Change the order of subfields of the Name field in the backend */
|
8041 |
+
.edit_form_item .frm_combo_inputs_container[data-name-layout="last_first"] .frm_form_subfield-first {
|
8042 |
+
order: 2;
|
8043 |
+
}
|
formidable.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
/*
|
3 |
Plugin Name: Formidable Forms
|
4 |
Description: Quickly and easily create drag-and-drop forms
|
5 |
-
Version: 4.
|
6 |
Plugin URI: https://formidableforms.com/
|
7 |
Author URI: https://formidableforms.com/
|
8 |
Author: Strategy11
|
2 |
/*
|
3 |
Plugin Name: Formidable Forms
|
4 |
Description: Quickly and easily create drag-and-drop forms
|
5 |
+
Version: 4.11
|
6 |
Plugin URI: https://formidableforms.com/
|
7 |
Author URI: https://formidableforms.com/
|
8 |
Author: Strategy11
|
images/icons.svg
CHANGED
@@ -932,5 +932,6 @@
|
|
932 |
<symbol id="frm_comment_icon" viewBox="0 0 36 36" fill="none"><path d="M28 23.3a2.6 2.6 0 01-2.6 2.6H11c-.6 0-1.1.2-1.5.6l-2.8 2.8a1 1 0 01-1.7-.7v-18A2.6 2.6 0 017.6 8h17.8a2.6 2.6 0 012.6 2.6v12.7z" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path><path d="M12.5 2.5a1 1 0 100 2v-2zM31 19a1 1 0 102 0h-2zM12.5 4.5H27v-2H12.5v2zm18.5 4V19h2V8.5h-2zm-4-4a4 4 0 014 4h2a6 6 0 00-6-6v2z" fill="currentColor" opacity=".6"></path></symbol>
|
933 |
<symbol id="frm_case_icon" viewBox="0 0 24 24"><path d="M15 6.5a1 1 0 01-1-1V4h-4v1.5a1 1 0 01-2 0V4c0-1.1.9-2 2-2h4a2 2 0 012 2v1.5c0 .6-.4 1-1 1zM18 12.5v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9h-9v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9H0v6.7C0 20.8 1.2 22 2.7 22h18.5c1.6 0 2.8-1.2 2.8-2.8v-6.7h-6zM21.3 5H2.7A2.7 2.7 0 000 7.8V11h6V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h9V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h6V7.7C24 6.2 22.8 5 21.3 5z" fill="currentColor"></path></symbol>
|
934 |
<symbol id="frm_smile_icon" viewBox="0 0 24 24"><path d="M12 0a12 12 0 100 24 12 12 0 000-24zM5 9c0-1.1.9-2 2-2a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2zm12.7 9a8 8 0 01-11.4 0 1 1 0 011.4-1.5 6 6 0 008.6 0 1 1 0 011.4 1.4zm-.7-7a2 2 0 01-2-2c0-1.1.9-2 2-2a2 2 0 010 4z" fill="currentColor"></path></symbol>
|
|
|
935 |
</defs>
|
936 |
</svg>
|
932 |
<symbol id="frm_comment_icon" viewBox="0 0 36 36" fill="none"><path d="M28 23.3a2.6 2.6 0 01-2.6 2.6H11c-.6 0-1.1.2-1.5.6l-2.8 2.8a1 1 0 01-1.7-.7v-18A2.6 2.6 0 017.6 8h17.8a2.6 2.6 0 012.6 2.6v12.7z" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path><path d="M12.5 2.5a1 1 0 100 2v-2zM31 19a1 1 0 102 0h-2zM12.5 4.5H27v-2H12.5v2zm18.5 4V19h2V8.5h-2zm-4-4a4 4 0 014 4h2a6 6 0 00-6-6v2z" fill="currentColor" opacity=".6"></path></symbol>
|
933 |
<symbol id="frm_case_icon" viewBox="0 0 24 24"><path d="M15 6.5a1 1 0 01-1-1V4h-4v1.5a1 1 0 01-2 0V4c0-1.1.9-2 2-2h4a2 2 0 012 2v1.5c0 .6-.4 1-1 1zM18 12.5v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9h-9v1c0 .3-.3.7-.8.7a.8.8 0 01-.7-.8v-.9H0v6.7C0 20.8 1.2 22 2.7 22h18.5c1.6 0 2.8-1.2 2.8-2.8v-6.7h-6zM21.3 5H2.7A2.7 2.7 0 000 7.8V11h6V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h9V9.8c0-.5.3-.8.8-.8.4 0 .7.3.7.8V11h6V7.7C24 6.2 22.8 5 21.3 5z" fill="currentColor"></path></symbol>
|
934 |
<symbol id="frm_smile_icon" viewBox="0 0 24 24"><path d="M12 0a12 12 0 100 24 12 12 0 000-24zM5 9c0-1.1.9-2 2-2a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2zm12.7 9a8 8 0 01-11.4 0 1 1 0 011.4-1.5 6 6 0 008.6 0 1 1 0 011.4 1.4zm-.7-7a2 2 0 01-2-2c0-1.1.9-2 2-2a2 2 0 010 4z" fill="currentColor"></path></symbol>
|
935 |
+
<symbol id="frm_user_name_icon" viewBox="0 0 24 24" fill="none"><path d="M3 21L21 21C22.1046 21 23 20.1046 23 19L23 16.75L23 13.5625L23 12.5L23 11.4375L23 8.25L23 6C23 4.89543 22.1046 4 21 4L15.1429 4L8.85714 4L3 4C1.89543 4 0.999998 4.89543 0.999998 6L0.999997 19C0.999997 20.1046 1.89543 21 3 21Z" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M11.9313 9.93864C11.9313 11.5916 10.5987 12.8773 8.99262 12.8773C7.34168 12.8773 6.05398 11.5896 6.05398 9.93864C6.05398 8.33253 7.33964 7 8.99262 7C10.6008 7 11.9313 8.33049 11.9313 9.93864ZM10.1619 9.93864C10.1619 9.32165 9.60961 8.76932 8.99262 8.76932C8.33687 8.76932 7.8233 9.31757 7.8233 9.93864C7.8233 10.5984 8.33283 11.108 8.99262 11.108C9.61369 11.108 10.1619 10.5944 10.1619 9.93864ZM4 17.4699C4 15.4783 5.58561 13.8466 7.6233 13.8466H10.3619C12.3552 13.8466 13.9852 15.4766 13.9852 17.4699C13.9852 17.9734 13.5453 18.3546 13.1006 18.3546C12.605 18.3546 12.2159 17.9655 12.2159 17.4699C12.2159 16.4678 11.3641 15.6159 10.3619 15.6159H7.6233C6.5811 15.6159 5.76932 16.4651 5.76932 17.4699C5.76932 17.9734 5.32934 18.3546 4.88466 18.3546C4.38908 18.3546 4 17.9655 4 17.4699Z" fill="#282F36" fill-opacity="0.45"/><line x1="15.75" y1="9.25" x2="19.25" y2="9.25" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5" stroke-linecap="round"/><line x1="15.75" y1="12.25" x2="19.25" y2="12.25" stroke="#282F36" stroke-opacity="0.45" stroke-width="1.5" stroke-linecap="round"/></symbol>
|
936 |
</defs>
|
937 |
</svg>
|
js/formidable.js
CHANGED
@@ -980,6 +980,31 @@ function frmFrontFormJS() {
|
|
980 |
}
|
981 |
}
|
982 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
983 |
return {
|
984 |
init: function() {
|
985 |
jQuery( document ).off( 'submit.formidable', '.frm-show-form' );
|
@@ -1005,6 +1030,9 @@ function frmFrontFormJS() {
|
|
1005 |
jQuery( document ).on( 'click', 'a[data-frmconfirm]', confirmClick );
|
1006 |
jQuery( 'a[data-frmtoggle]' ).on( 'click', toggleDiv );
|
1007 |
|
|
|
|
|
|
|
1008 |
// Add fallbacks for the beloved IE8
|
1009 |
addIndexOfFallbackForIE8();
|
1010 |
addTrimFallbackForIE8();
|
@@ -1097,8 +1125,18 @@ function frmFrontFormJS() {
|
|
1097 |
},
|
1098 |
|
1099 |
submitFormNow: function( object ) {
|
1100 |
-
var hasFileFields,
|
1101 |
classList = object.className.trim().split( /\s+/gi );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1102 |
if ( classList.indexOf( 'frm_ajax_submit' ) > -1 ) {
|
1103 |
hasFileFields = jQuery( object ).find( 'input[type="file"]' ).filter( function() {
|
1104 |
return !! this.value;
|
980 |
}
|
981 |
}
|
982 |
|
983 |
+
/**
|
984 |
+
* Focus on the first sub field when clicking to the primary label of combo field.
|
985 |
+
*
|
986 |
+
* @since 4.10.02
|
987 |
+
*/
|
988 |
+
function changeFocusWhenClickComboFieldLabel() {
|
989 |
+
let label;
|
990 |
+
|
991 |
+
const comboInputsContainer = document.querySelectorAll( '.frm_combo_inputs_container' );
|
992 |
+
comboInputsContainer.forEach( function( inputsContainer ) {
|
993 |
+
if ( ! inputsContainer.closest( '.frm_form_field' ) ) {
|
994 |
+
return;
|
995 |
+
}
|
996 |
+
|
997 |
+
label = inputsContainer.closest( '.frm_form_field' ).querySelector( '.frm_primary_label' );
|
998 |
+
if ( ! label ) {
|
999 |
+
return;
|
1000 |
+
}
|
1001 |
+
|
1002 |
+
label.addEventListener( 'click', function( e ) {
|
1003 |
+
inputsContainer.querySelector( '.frm_form_field:first-child input, .frm_form_field:first-child select, .frm_form_field:first-child textarea' ).focus();
|
1004 |
+
});
|
1005 |
+
});
|
1006 |
+
}
|
1007 |
+
|
1008 |
return {
|
1009 |
init: function() {
|
1010 |
jQuery( document ).off( 'submit.formidable', '.frm-show-form' );
|
1030 |
jQuery( document ).on( 'click', 'a[data-frmconfirm]', confirmClick );
|
1031 |
jQuery( 'a[data-frmtoggle]' ).on( 'click', toggleDiv );
|
1032 |
|
1033 |
+
// Focus on the first sub field when clicking to the primary label of combo field.
|
1034 |
+
changeFocusWhenClickComboFieldLabel();
|
1035 |
+
|
1036 |
// Add fallbacks for the beloved IE8
|
1037 |
addIndexOfFallbackForIE8();
|
1038 |
addTrimFallbackForIE8();
|
1125 |
},
|
1126 |
|
1127 |
submitFormNow: function( object ) {
|
1128 |
+
var hasFileFields, antispamInput,
|
1129 |
classList = object.className.trim().split( /\s+/gi );
|
1130 |
+
|
1131 |
+
if ( object.hasAttribute( 'data-token' ) && null === object.querySelector( '[name="antispam_token"]' ) ) {
|
1132 |
+
// include the antispam token on form submit.
|
1133 |
+
antispamInput = document.createElement( 'input' );
|
1134 |
+
antispamInput.type = 'hidden';
|
1135 |
+
antispamInput.name = 'antispam_token';
|
1136 |
+
antispamInput.value = object.getAttribute( 'data-token' );
|
1137 |
+
object.appendChild( antispamInput );
|
1138 |
+
}
|
1139 |
+
|
1140 |
if ( classList.indexOf( 'frm_ajax_submit' ) > -1 ) {
|
1141 |
hasFileFields = jQuery( object ).find( 'input[type="file"]' ).filter( function() {
|
1142 |
return !! this.value;
|
js/formidable.min.js
CHANGED
@@ -35,22 +35,24 @@ thisVal=$thisField.val().replace(/(\n|\r\n)/g,"\r");if("replace"===e){if(thisVal
|
|
35 |
entry_id:entryId,form_id:formId,nonce:frm_js.nonce},success:function(msg){var admin=document.getElementById("wpbody");if(admin===null)label.html(msg);else{label.html("");$link.after(msg)}}});return false}function confirmClick(){var message=jQuery(this).data("frmconfirm");return confirm(message)}function toggleDiv(){var div=jQuery(this).data("frmtoggle");if(jQuery(div).is(":visible"))jQuery(div).slideUp("fast");else jQuery(div).slideDown("fast");return false}function addIndexOfFallbackForIE8(){var len,
|
36 |
from;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(elt){len=this.length>>>0;from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++)if(from in this&&this[from]===elt)return from;return-1}}function addTrimFallbackForIE8(){if(typeof String.prototype.trim!=="function")String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}function addFilterFallbackForIE8(){var t,len,res,thisp,i,val;if(!Array.prototype.filter)Array.prototype.filter=
|
37 |
function(fun){if(this===void 0||this===null)throw new TypeError;t=Object(this);len=t.length>>>0;if(typeof fun!=="function")throw new TypeError;res=[];thisp=arguments[1];for(i=0;i<len;i++)if(i in t){val=t[i];if(fun.call(thisp,val,i,t))res.push(val)}return res}}function addKeysFallbackForIE8(){var keys,i;if(!Object.keys)Object.keys=function(obj){keys=[];for(i in obj)if(obj.hasOwnProperty(i))keys.push(i);return keys}}function onHoneypotFieldChange(){var css=jQuery(this).css("box-shadow");if(css.match(/inset/))this.parentNode.removeChild(this)}
|
|
|
38 |
return{init:function(){jQuery(document).off("submit.formidable",".frm-show-form");jQuery(document).on("submit.formidable",".frm-show-form",frmFrontForm.submitForm);jQuery(".frm-show-form input[onblur], .frm-show-form textarea[onblur]").each(function(){if(jQuery(this).val()==="")jQuery(this).trigger("blur")});jQuery(document).on("focus",".frm_toggle_default",clearDefault);jQuery(document).on("blur",".frm_toggle_default",replaceDefault);jQuery(".frm_toggle_default").trigger("blur");jQuery(document.getElementById("frm_resend_email")).on("click",
|
39 |
resendEmail);jQuery(document).on("change",'.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]',frmFrontForm.fieldValueChanged);jQuery(document).on("change keyup",".frm-show-form .frm_inside_container input, .frm-show-form .frm_inside_container select, .frm-show-form .frm_inside_container textarea",maybeShowLabel);jQuery(document).on("change","[id^=frm_email_]",onHoneypotFieldChange);jQuery(document).on("click","a[data-frmconfirm]",
|
40 |
-
confirmClick);jQuery("a[data-frmtoggle]").on("click",toggleDiv);addIndexOfFallbackForIE8();addTrimFallbackForIE8();addFilterFallbackForIE8();addKeysFallbackForIE8()},getFieldId:function(field,fullID){return getFieldId(field,fullID)},renderRecaptcha:function(captcha){var formID,recaptchaID,size=captcha.getAttribute("data-size"),rendered=captcha.getAttribute("data-rid")!==null,params={"sitekey":captcha.getAttribute("data-sitekey"),"size":size,"theme":captcha.getAttribute("data-theme")};
|
41 |
-
if(size==="invisible"){formID=jQuery(captcha).closest("form").find('input[name="form_id"]').val();jQuery(captcha).closest(".frm_form_field .frm_primary_label").hide();params.callback=function(token){frmFrontForm.afterRecaptcha(token,formID)}}recaptchaID=grecaptcha.render(captcha.id,params);captcha.setAttribute("data-rid",recaptchaID)},afterSingleRecaptcha:function(){var object=jQuery(".frm-show-form .g-recaptcha").closest("form")[0];frmFrontForm.submitFormNow(object)},afterRecaptcha:function(token,
|
42 |
formID){var object=jQuery("#frm_form_"+formID+"_container form")[0];frmFrontForm.submitFormNow(object)},submitForm:function(e){frmFrontForm.submitFormManual(e,this)},submitFormManual:function(e,object){var isPro,errors,invisibleRecaptcha=hasInvisibleRecaptcha(object),classList=object.className.trim().split(/\s+/gi);if(classList&&invisibleRecaptcha.length<1){isPro=classList.indexOf("frm_pro_form")>-1;if(!isPro)return}if(jQuery("body").hasClass("wp-admin")&&jQuery(object).closest(".frmapi-form").length<
|
43 |
-
1)return;e.preventDefault();if(typeof frmProForm!=="undefined"&&typeof frmProForm.submitAllowed==="function")if(!frmProForm.submitAllowed(object))return;if(invisibleRecaptcha.length){showLoadingIndicator(jQuery(object));executeInvisibleRecaptcha(invisibleRecaptcha)}else{errors=frmFrontForm.validateFormSubmit(object);if(Object.keys(errors).length===0){showSubmitLoading(jQuery(object));frmFrontForm.submitFormNow(object,classList)}}},submitFormNow:function(object){var hasFileFields,classList=
|
44 |
-
if(
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
if(typeof frmProForm!=="undefined")frmProForm.
|
52 |
-
|
53 |
-
|
|
|
54 |
function frmUpdateField(entryId,fieldId,value,message,num){jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).html('<span class="frm-loading-img"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_update_field_ajax",entry_id:entryId,field_id:fieldId,value:value,nonce:frm_js.nonce},success:function(){if(message.replace(/^\s+|\s+$/g,"")==="")jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).fadeOut("slow");else jQuery(document.getElementById("frm_update_field_"+
|
55 |
entryId+"_"+fieldId+"_"+num)).replaceWith(message)}})}
|
56 |
function frmDeleteEntry(entryId,prefix){console.warn("DEPRECATED: function frmDeleteEntry in v2.0.13 use frmFrontForm.deleteEntry");jQuery(document.getElementById("frm_delete_"+entryId)).replaceWith('<span class="frm-loading-img" id="frm_delete_'+entryId+'"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_destroy",entry:entryId,nonce:frm_js.nonce},success:function(html){if(html.replace(/^\s+|\s+$/g,"")==="success")jQuery(document.getElementById(prefix+entryId)).fadeOut("slow");
|
35 |
entry_id:entryId,form_id:formId,nonce:frm_js.nonce},success:function(msg){var admin=document.getElementById("wpbody");if(admin===null)label.html(msg);else{label.html("");$link.after(msg)}}});return false}function confirmClick(){var message=jQuery(this).data("frmconfirm");return confirm(message)}function toggleDiv(){var div=jQuery(this).data("frmtoggle");if(jQuery(div).is(":visible"))jQuery(div).slideUp("fast");else jQuery(div).slideDown("fast");return false}function addIndexOfFallbackForIE8(){var len,
|
36 |
from;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(elt){len=this.length>>>0;from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++)if(from in this&&this[from]===elt)return from;return-1}}function addTrimFallbackForIE8(){if(typeof String.prototype.trim!=="function")String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}function addFilterFallbackForIE8(){var t,len,res,thisp,i,val;if(!Array.prototype.filter)Array.prototype.filter=
|
37 |
function(fun){if(this===void 0||this===null)throw new TypeError;t=Object(this);len=t.length>>>0;if(typeof fun!=="function")throw new TypeError;res=[];thisp=arguments[1];for(i=0;i<len;i++)if(i in t){val=t[i];if(fun.call(thisp,val,i,t))res.push(val)}return res}}function addKeysFallbackForIE8(){var keys,i;if(!Object.keys)Object.keys=function(obj){keys=[];for(i in obj)if(obj.hasOwnProperty(i))keys.push(i);return keys}}function onHoneypotFieldChange(){var css=jQuery(this).css("box-shadow");if(css.match(/inset/))this.parentNode.removeChild(this)}
|
38 |
+
function changeFocusWhenClickComboFieldLabel(){var label;var comboInputsContainer=document.querySelectorAll(".frm_combo_inputs_container");comboInputsContainer.forEach(function(inputsContainer){if(!inputsContainer.closest(".frm_form_field"))return;label=inputsContainer.closest(".frm_form_field").querySelector(".frm_primary_label");if(!label)return;label.addEventListener("click",function(e){inputsContainer.querySelector(".frm_form_field:first-child input, .frm_form_field:first-child select, .frm_form_field:first-child textarea").focus()})})}
|
39 |
return{init:function(){jQuery(document).off("submit.formidable",".frm-show-form");jQuery(document).on("submit.formidable",".frm-show-form",frmFrontForm.submitForm);jQuery(".frm-show-form input[onblur], .frm-show-form textarea[onblur]").each(function(){if(jQuery(this).val()==="")jQuery(this).trigger("blur")});jQuery(document).on("focus",".frm_toggle_default",clearDefault);jQuery(document).on("blur",".frm_toggle_default",replaceDefault);jQuery(".frm_toggle_default").trigger("blur");jQuery(document.getElementById("frm_resend_email")).on("click",
|
40 |
resendEmail);jQuery(document).on("change",'.frm-show-form input[name^="item_meta"], .frm-show-form select[name^="item_meta"], .frm-show-form textarea[name^="item_meta"]',frmFrontForm.fieldValueChanged);jQuery(document).on("change keyup",".frm-show-form .frm_inside_container input, .frm-show-form .frm_inside_container select, .frm-show-form .frm_inside_container textarea",maybeShowLabel);jQuery(document).on("change","[id^=frm_email_]",onHoneypotFieldChange);jQuery(document).on("click","a[data-frmconfirm]",
|
41 |
+
confirmClick);jQuery("a[data-frmtoggle]").on("click",toggleDiv);changeFocusWhenClickComboFieldLabel();addIndexOfFallbackForIE8();addTrimFallbackForIE8();addFilterFallbackForIE8();addKeysFallbackForIE8()},getFieldId:function(field,fullID){return getFieldId(field,fullID)},renderRecaptcha:function(captcha){var formID,recaptchaID,size=captcha.getAttribute("data-size"),rendered=captcha.getAttribute("data-rid")!==null,params={"sitekey":captcha.getAttribute("data-sitekey"),"size":size,"theme":captcha.getAttribute("data-theme")};
|
42 |
+
if(rendered)return;if(size==="invisible"){formID=jQuery(captcha).closest("form").find('input[name="form_id"]').val();jQuery(captcha).closest(".frm_form_field .frm_primary_label").hide();params.callback=function(token){frmFrontForm.afterRecaptcha(token,formID)}}recaptchaID=grecaptcha.render(captcha.id,params);captcha.setAttribute("data-rid",recaptchaID)},afterSingleRecaptcha:function(){var object=jQuery(".frm-show-form .g-recaptcha").closest("form")[0];frmFrontForm.submitFormNow(object)},afterRecaptcha:function(token,
|
43 |
formID){var object=jQuery("#frm_form_"+formID+"_container form")[0];frmFrontForm.submitFormNow(object)},submitForm:function(e){frmFrontForm.submitFormManual(e,this)},submitFormManual:function(e,object){var isPro,errors,invisibleRecaptcha=hasInvisibleRecaptcha(object),classList=object.className.trim().split(/\s+/gi);if(classList&&invisibleRecaptcha.length<1){isPro=classList.indexOf("frm_pro_form")>-1;if(!isPro)return}if(jQuery("body").hasClass("wp-admin")&&jQuery(object).closest(".frmapi-form").length<
|
44 |
+
1)return;e.preventDefault();if(typeof frmProForm!=="undefined"&&typeof frmProForm.submitAllowed==="function")if(!frmProForm.submitAllowed(object))return;if(invisibleRecaptcha.length){showLoadingIndicator(jQuery(object));executeInvisibleRecaptcha(invisibleRecaptcha)}else{errors=frmFrontForm.validateFormSubmit(object);if(Object.keys(errors).length===0){showSubmitLoading(jQuery(object));frmFrontForm.submitFormNow(object,classList)}}},submitFormNow:function(object){var hasFileFields,antispamInput,classList=
|
45 |
+
object.className.trim().split(/\s+/gi);if(object.hasAttribute("data-token")&&null===object.querySelector('[name="antispam_token"]')){antispamInput=document.createElement("input");antispamInput.type="hidden";antispamInput.name="antispam_token";antispamInput.value=object.getAttribute("data-token");object.appendChild(antispamInput)}if(classList.indexOf("frm_ajax_submit")>-1){hasFileFields=jQuery(object).find('input[type="file"]').filter(function(){return!!this.value}).length;if(hasFileFields<1){action=
|
46 |
+
jQuery(object).find('input[name="frm_action"]').val();frmFrontForm.checkFormErrors(object,action)}else object.submit()}else object.submit()},validateFormSubmit:function(object){if(typeof tinyMCE!=="undefined"&&jQuery(object).find(".wp-editor-wrap").length)tinyMCE.triggerSave();jsErrors=[];if(shouldJSValidate(object)){frmFrontForm.getAjaxFormErrors(object);if(Object.keys(jsErrors).length)frmFrontForm.addAjaxFormErrors(object)}return jsErrors},getAjaxFormErrors:function(object){var customErrors,key;
|
47 |
+
jsErrors=validateForm(object);if(typeof frmThemeOverride_jsErrors==="function"){action=jQuery(object).find('input[name="frm_action"]').val();customErrors=frmThemeOverride_jsErrors(action,object);if(Object.keys(customErrors).length)for(key in customErrors)jsErrors[key]=customErrors[key]}return jsErrors},addAjaxFormErrors:function(object){var key,$fieldCont;removeAllErrors();for(key in jsErrors){$fieldCont=jQuery(object).find("#frm_field_"+key+"_container");if($fieldCont.length)addFieldError($fieldCont,
|
48 |
+
key,jsErrors);else delete jsErrors[key]}scrollToFirstField(object)},checkFormErrors:function(object,action){getFormErrors(object,action)},checkRequiredField:function(field,errors){return checkRequiredField(field,errors)},showSubmitLoading:function($object){showSubmitLoading($object)},removeSubmitLoading:function($object,enable,processesRunning){removeSubmitLoading($object,enable,processesRunning)},scrollToID:function(id){var object=jQuery(document.getElementById(id));frmFrontForm.scrollMsg(object,
|
49 |
+
false)},scrollMsg:function(id,object,animate){var newPos,m,b,screenTop,screenBottom,scrollObj="";if(typeof object==="undefined"){scrollObj=jQuery(document.getElementById("frm_form_"+id+"_container"));if(scrollObj.length<1)return}else if(typeof id==="string")scrollObj=jQuery(object).find("#frm_field_"+id+"_container");else scrollObj=id;jQuery(scrollObj).trigger("focus");newPos=scrollObj.offset().top;if(!newPos||frm_js.offset==="-1")return;newPos=newPos-frm_js.offset;m=jQuery("html").css("margin-top");
|
50 |
+
b=jQuery("body").css("margin-top");if(m||b)newPos=newPos-parseInt(m)-parseInt(b);if(newPos&&window.innerHeight){screenTop=document.documentElement.scrollTop||document.body.scrollTop;screenBottom=screenTop+window.innerHeight;if(newPos>screenBottom||newPos<screenTop){if(typeof animate==="undefined")jQuery(window).scrollTop(newPos);else jQuery("html,body").animate({scrollTop:newPos},500);return false}}},fieldValueChanged:function(e){var fieldId=frmFrontForm.getFieldId(this,false);if(!fieldId||typeof fieldId===
|
51 |
+
"undefined")return;if(e.frmTriggered&&e.frmTriggered==fieldId)return;jQuery(document).trigger("frmFieldChanged",[this,fieldId,e]);if(e.selfTriggered!==true)maybeValidateChange(fieldId,this)},savingDraft:function(object){console.warn("DEPRECATED: function frmFrontForm.savingDraft in v3.0 use frmProForm.savingDraft");if(typeof frmProForm!=="undefined")return frmProForm.savingDraft(object)},goingToPreviousPage:function(object){console.warn("DEPRECATED: function frmFrontForm.goingToPreviousPage in v3.0 use frmProForm.goingToPreviousPage");
|
52 |
+
if(typeof frmProForm!=="undefined")return frmProForm.goingToPreviousPage(object)},hideOrShowFields:function(){console.warn("DEPRECATED: function frmFrontForm.hideOrShowFields in v3.0 use frmProForm.hideOrShowFields");if(typeof frmProForm!=="undefined")frmProForm.hideOrShowFields()},hidePreviouslyHiddenFields:function(){console.warn("DEPRECATED: function frmFrontForm.hidePreviouslyHiddenFields in v3.0 use frmProForm.hidePreviouslyHiddenFields");if(typeof frmProForm!=="undefined")frmProForm.hidePreviouslyHiddenFields()},
|
53 |
+
checkDependentDynamicFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentDynamicFields in v3.0 use frmProForm.checkDependentDynamicFields");if(typeof frmProForm!=="undefined")frmProForm.checkDependentDynamicFields(ids)},checkDependentLookupFields:function(ids){console.warn("DEPRECATED: function frmFrontForm.checkDependentLookupFields in v3.0 use frmProForm.checkDependentLookupFields");if(typeof frmProForm!=="undefined")frmProForm.checkDependentLookupFields(ids)},loadGoogle:function(){console.warn("DEPRECATED: function frmFrontForm.loadGoogle in v3.0 use frmProForm.loadGoogle");
|
54 |
+
frmProForm.loadGoogle()},escapeHtml:function(text){return text.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},invisible:function(classes){jQuery(classes).css("visibility","hidden")},visible:function(classes){jQuery(classes).css("visibility","visible")}}}frmFrontForm=frmFrontFormJS();jQuery(document).ready(function(){frmFrontForm.init()});
|
55 |
+
function frmRecaptcha(){var c,cl,captchas=jQuery(".frm-g-recaptcha");for(c=0,cl=captchas.length;c<cl;c++)frmFrontForm.renderRecaptcha(captchas[c])}function frmAfterRecaptcha(token){frmFrontForm.afterSingleRecaptcha(token)}
|
56 |
function frmUpdateField(entryId,fieldId,value,message,num){jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).html('<span class="frm-loading-img"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_update_field_ajax",entry_id:entryId,field_id:fieldId,value:value,nonce:frm_js.nonce},success:function(){if(message.replace(/^\s+|\s+$/g,"")==="")jQuery(document.getElementById("frm_update_field_"+entryId+"_"+fieldId+"_"+num)).fadeOut("slow");else jQuery(document.getElementById("frm_update_field_"+
|
57 |
entryId+"_"+fieldId+"_"+num)).replaceWith(message)}})}
|
58 |
function frmDeleteEntry(entryId,prefix){console.warn("DEPRECATED: function frmDeleteEntry in v2.0.13 use frmFrontForm.deleteEntry");jQuery(document.getElementById("frm_delete_"+entryId)).replaceWith('<span class="frm-loading-img" id="frm_delete_'+entryId+'"></span>');jQuery.ajax({type:"POST",url:frm_js.ajax_url,data:{action:"frm_entries_destroy",entry:entryId,nonce:frm_js.nonce},success:function(html){if(html.replace(/^\s+|\s+$/g,"")==="success")jQuery(document.getElementById(prefix+entryId)).fadeOut("slow");
|
js/formidable_admin.js
CHANGED
@@ -2159,11 +2159,14 @@ function frmAdminBuildJS() {
|
|
2159 |
wp.media.model.settings.post.id = postID;
|
2160 |
|
2161 |
fileFrame = wp.media.frames.file_frame = wp.media({
|
2162 |
-
multiple: false
|
|
|
|
|
|
|
2163 |
});
|
2164 |
|
2165 |
fileFrame.on( 'select', function() {
|
2166 |
-
attachment = fileFrame.state().get( 'selection' ).first().toJSON();
|
2167 |
$imagePreview.find( 'img' ).attr( 'src', attachment.url );
|
2168 |
$imagePreview.find( '.frm_image_preview_frame' ).show();
|
2169 |
$imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
|
@@ -3556,11 +3559,15 @@ function frmAdminBuildJS() {
|
|
3556 |
|
3557 |
if ( classes.trim() === '' ) {
|
3558 |
replace = ' frmstart frmend ';
|
|
|
|
|
|
|
3559 |
replaceWith = ' frmstart ' + replaceWith.trim() + ' frmend ';
|
3560 |
} else {
|
3561 |
replace = classes.trim();
|
3562 |
replaceWith = replaceWith.trim();
|
3563 |
}
|
|
|
3564 |
field.className = field.className.replace( replace, replaceWith );
|
3565 |
}
|
3566 |
|
@@ -6570,6 +6577,117 @@ function frmAdminBuildJS() {
|
|
6570 |
return object;
|
6571 |
}
|
6572 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6573 |
function debounce( func, wait = 100 ) {
|
6574 |
let timeout;
|
6575 |
return function( ...args ) {
|
@@ -6831,6 +6949,7 @@ function frmAdminBuildJS() {
|
|
6831 |
hideEmptyEle();
|
6832 |
maybeDisableAddSummaryBtn();
|
6833 |
maybeHideQuantityProductFieldOption();
|
|
|
6834 |
},
|
6835 |
|
6836 |
settingsInit: function() {
|
2159 |
wp.media.model.settings.post.id = postID;
|
2160 |
|
2161 |
fileFrame = wp.media.frames.file_frame = wp.media({
|
2162 |
+
multiple: false,
|
2163 |
+
library: {
|
2164 |
+
type: [ 'image' ]
|
2165 |
+
}
|
2166 |
});
|
2167 |
|
2168 |
fileFrame.on( 'select', function() {
|
2169 |
+
const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
|
2170 |
$imagePreview.find( 'img' ).attr( 'src', attachment.url );
|
2171 |
$imagePreview.find( '.frm_image_preview_frame' ).show();
|
2172 |
$imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
|
3559 |
|
3560 |
if ( classes.trim() === '' ) {
|
3561 |
replace = ' frmstart frmend ';
|
3562 |
+
if ( -1 === field.className.indexOf( replace ) ) {
|
3563 |
+
replace = ' frmstart frmend ';
|
3564 |
+
}
|
3565 |
replaceWith = ' frmstart ' + replaceWith.trim() + ' frmend ';
|
3566 |
} else {
|
3567 |
replace = classes.trim();
|
3568 |
replaceWith = replaceWith.trim();
|
3569 |
}
|
3570 |
+
|
3571 |
field.className = field.className.replace( replace, replaceWith );
|
3572 |
}
|
3573 |
|
6577 |
return object;
|
6578 |
}
|
6579 |
|
6580 |
+
/**
|
6581 |
+
* Show, hide, and sort subfields of Name field on form builder.
|
6582 |
+
*
|
6583 |
+
* @since 4.11
|
6584 |
+
*/
|
6585 |
+
function handleNameFieldOnFormBuilder() {
|
6586 |
+
/**
|
6587 |
+
* Gets subfield element from cache.
|
6588 |
+
*
|
6589 |
+
* @param {String} fieldId Field ID.
|
6590 |
+
* @param {String} key Cache key.
|
6591 |
+
* @returns {HTMLElement|undefined} Return the element from cache or undefined if not found.
|
6592 |
+
*/
|
6593 |
+
const getSubFieldElFromCache = ( fieldId, key ) => {
|
6594 |
+
window.frmCachedSubFields = window.frmCachedSubFields || {};
|
6595 |
+
window.frmCachedSubFields[fieldId] = window.frmCachedSubFields[fieldId] || {};
|
6596 |
+
return window.frmCachedSubFields[fieldId][key];
|
6597 |
+
};
|
6598 |
+
|
6599 |
+
/**
|
6600 |
+
* Sets subfield element to cache.
|
6601 |
+
*
|
6602 |
+
* @param {String} fieldId Field ID.
|
6603 |
+
* @param {String} key Cache key.
|
6604 |
+
* @param {HTMLElement} el Element.
|
6605 |
+
*/
|
6606 |
+
const setSubFieldElToCache = ( fieldId, key, el ) => {
|
6607 |
+
window.frmCachedSubFields = window.frmCachedSubFields || {};
|
6608 |
+
window.frmCachedSubFields[fieldId] = window.frmCachedSubFields[fieldId] || {};
|
6609 |
+
window.frmCachedSubFields[fieldId][key] = el;
|
6610 |
+
};
|
6611 |
+
|
6612 |
+
/**
|
6613 |
+
* Gets column class from the number of columns.
|
6614 |
+
*
|
6615 |
+
* @param {Number} colCount Number of columns.
|
6616 |
+
* @returns {string}
|
6617 |
+
*/
|
6618 |
+
const getColClass = colCount => 'frm' + parseInt( 12 / colCount );
|
6619 |
+
|
6620 |
+
const colClasses = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ].map( num => 'frm' + num );
|
6621 |
+
|
6622 |
+
const allSubFieldNames = [ 'first', 'middle', 'last' ];
|
6623 |
+
|
6624 |
+
/**
|
6625 |
+
* Handles name layout change.
|
6626 |
+
*
|
6627 |
+
* @param {Event} event Event object.
|
6628 |
+
*/
|
6629 |
+
const onChangeLayout = event => {
|
6630 |
+
const value = event.target.value;
|
6631 |
+
const subFieldNames = value.split( '_' );
|
6632 |
+
const fieldId = event.target.dataset.fieldId;
|
6633 |
+
|
6634 |
+
/*
|
6635 |
+
* Live update form on the form builder.
|
6636 |
+
*/
|
6637 |
+
const container = document.querySelector( '#field_' + fieldId + '_inner_container .frm_combo_inputs_container' );
|
6638 |
+
const newColClass = getColClass( subFieldNames.length );
|
6639 |
+
|
6640 |
+
// Set all sub field elements to cache and hide all of them first.
|
6641 |
+
allSubFieldNames.forEach( name => {
|
6642 |
+
const subFieldEl = container.querySelector( '[data-sub-field-name="' + name + '"]' );
|
6643 |
+
if ( subFieldEl ) {
|
6644 |
+
subFieldEl.classList.add( 'frm_hidden' );
|
6645 |
+
subFieldEl.classList.remove( ...colClasses );
|
6646 |
+
setSubFieldElToCache( fieldId, name, subFieldEl );
|
6647 |
+
}
|
6648 |
+
});
|
6649 |
+
|
6650 |
+
subFieldNames.forEach( subFieldName => {
|
6651 |
+
const subFieldEl = getSubFieldElFromCache( fieldId, subFieldName );
|
6652 |
+
if ( ! subFieldEl ) {
|
6653 |
+
return;
|
6654 |
+
}
|
6655 |
+
|
6656 |
+
subFieldEl.classList.remove( 'frm_hidden' );
|
6657 |
+
subFieldEl.classList.add( newColClass );
|
6658 |
+
|
6659 |
+
container.append( subFieldEl );
|
6660 |
+
});
|
6661 |
+
|
6662 |
+
/*
|
6663 |
+
* Live update subfield options.
|
6664 |
+
*/
|
6665 |
+
// Hide all subfield options.
|
6666 |
+
allSubFieldNames.forEach( name => {
|
6667 |
+
const optionsEl = document.querySelector( '.frm_sub_field_options-' + name + '[data-field-id="' + fieldId + '"]' );
|
6668 |
+
if ( optionsEl ) {
|
6669 |
+
optionsEl.classList.add( 'frm_hidden' );
|
6670 |
+
setSubFieldElToCache( fieldId, name + '_options', optionsEl );
|
6671 |
+
}
|
6672 |
+
});
|
6673 |
+
|
6674 |
+
subFieldNames.forEach( subFieldName => {
|
6675 |
+
const optionsEl = getSubFieldElFromCache( fieldId, subFieldName + '_options' );
|
6676 |
+
if ( ! optionsEl ) {
|
6677 |
+
return;
|
6678 |
+
}
|
6679 |
+
optionsEl.classList.remove( 'frm_hidden' );
|
6680 |
+
});
|
6681 |
+
};
|
6682 |
+
|
6683 |
+
const dropdownSelector = '.frm_name_layout_dropdown';
|
6684 |
+
document.addEventListener( 'change', event => {
|
6685 |
+
if ( event.target.matches( dropdownSelector ) ) {
|
6686 |
+
onChangeLayout( event );
|
6687 |
+
}
|
6688 |
+
}, false );
|
6689 |
+
}
|
6690 |
+
|
6691 |
function debounce( func, wait = 100 ) {
|
6692 |
let timeout;
|
6693 |
return function( ...args ) {
|
6949 |
hideEmptyEle();
|
6950 |
maybeDisableAddSummaryBtn();
|
6951 |
maybeHideQuantityProductFieldOption();
|
6952 |
+
handleNameFieldOnFormBuilder();
|
6953 |
},
|
6954 |
|
6955 |
settingsInit: function() {
|
languages/formidable.pot
CHANGED
@@ -2,14 +2,14 @@
|
|
2 |
# This file is distributed under the same license as the Formidable Forms plugin.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: Formidable Forms 4.
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/formidable\n"
|
7 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"POT-Creation-Date: 2021-05-
|
13 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
"X-Generator: WP-CLI 2.4.0\n"
|
15 |
"X-Domain: formidable\n"
|
@@ -130,7 +130,7 @@ msgstr ""
|
|
130 |
|
131 |
#: classes/controllers/FrmAddonsController.php:22
|
132 |
#: classes/controllers/FrmAddonsController.php:23
|
133 |
-
#: classes/helpers/FrmFormsHelper.php:
|
134 |
#: classes/views/frm-fields/back-end/smart-values.php:16
|
135 |
#: classes/views/shared/admin-header.php:32
|
136 |
msgid "Upgrade"
|
@@ -191,7 +191,7 @@ msgstr ""
|
|
191 |
#: classes/controllers/FrmAppController.php:165
|
192 |
#: classes/controllers/FrmEntriesController.php:11
|
193 |
#: classes/controllers/FrmEntriesController.php:100
|
194 |
-
#: classes/controllers/FrmFormsController.php:
|
195 |
#: classes/controllers/FrmXMLController.php:259
|
196 |
#: classes/views/xml/import_form.php:121
|
197 |
msgid "Entries"
|
@@ -217,14 +217,14 @@ msgid "Build a Form"
|
|
217 |
msgstr ""
|
218 |
|
219 |
#: classes/controllers/FrmEntriesController.php:79
|
220 |
-
#: classes/controllers/FrmFormsController.php:
|
221 |
#: classes/views/frm-entries/form.php:54
|
222 |
#: classes/views/frm-entries/sidebar-shared.php:57
|
223 |
msgid "Entry Key"
|
224 |
msgstr ""
|
225 |
|
226 |
#: classes/controllers/FrmEntriesController.php:84
|
227 |
-
#: classes/controllers/FrmFormsController.php:
|
228 |
#: classes/views/xml/import_form.php:152
|
229 |
#: classes/widgets/FrmShowForm.php:59
|
230 |
msgid "Form"
|
@@ -235,7 +235,7 @@ msgid "Entry Name"
|
|
235 |
msgstr ""
|
236 |
|
237 |
#: classes/controllers/FrmEntriesController.php:86
|
238 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
239 |
msgid "Created By"
|
240 |
msgstr ""
|
241 |
|
@@ -314,7 +314,7 @@ msgid "You do not have permission to do that"
|
|
314 |
msgstr ""
|
315 |
|
316 |
#: classes/controllers/FrmFormsController.php:9
|
317 |
-
#: classes/controllers/FrmFormsController.php:
|
318 |
#: classes/controllers/FrmStylesController.php:51
|
319 |
#: classes/controllers/FrmXMLController.php:258
|
320 |
#: classes/views/frm-forms/list.php:10
|
@@ -333,111 +333,111 @@ msgstr ""
|
|
333 |
msgid "Add Conditional Logic"
|
334 |
msgstr ""
|
335 |
|
336 |
-
#: classes/controllers/FrmFormsController.php:
|
337 |
msgid "Settings Successfully Updated"
|
338 |
msgstr ""
|
339 |
|
340 |
-
#: classes/controllers/FrmFormsController.php:
|
341 |
-
#: classes/controllers/FrmFormsController.php:
|
342 |
msgid "Form was successfully updated."
|
343 |
msgstr ""
|
344 |
|
345 |
#. translators: %1$s: Start link HTML, %2$s: end link HTML
|
346 |
-
#: classes/controllers/FrmFormsController.php:
|
347 |
msgid "However, your form is very long and may be %1$sreaching server limits%2$s."
|
348 |
msgstr ""
|
349 |
|
350 |
-
#: classes/controllers/FrmFormsController.php:
|
351 |
#: deprecated/FrmDeprecated.php:414
|
352 |
msgid "Form template was Successfully Created"
|
353 |
msgstr ""
|
354 |
|
355 |
-
#: classes/controllers/FrmFormsController.php:
|
356 |
msgid "Form was Successfully Copied"
|
357 |
msgstr ""
|
358 |
|
359 |
-
#: classes/controllers/FrmFormsController.php:
|
360 |
msgid "There was a problem creating the new template."
|
361 |
msgstr ""
|
362 |
|
363 |
-
#: classes/controllers/FrmFormsController.php:
|
364 |
msgid "Form Preview"
|
365 |
msgstr ""
|
366 |
|
367 |
#. translators: %1$s: Number of forms
|
368 |
-
#: classes/controllers/FrmFormsController.php:
|
369 |
-
#: classes/controllers/FrmFormsController.php:
|
370 |
msgid "%1$s form restored from the Trash."
|
371 |
msgid_plural "%1$s forms restored from the Trash."
|
372 |
msgstr[0] ""
|
373 |
msgstr[1] ""
|
374 |
|
375 |
#. translators: %1$s: Number of forms, %2$s: Start link HTML, %3$s: End link HTML
|
376 |
-
#: classes/controllers/FrmFormsController.php:
|
377 |
-
#: classes/controllers/FrmFormsController.php:
|
378 |
msgid "%1$s form moved to the Trash. %2$sUndo%3$s"
|
379 |
msgid_plural "%1$s forms moved to the Trash. %2$sUndo%3$s"
|
380 |
msgstr[0] ""
|
381 |
msgstr[1] ""
|
382 |
|
383 |
#. translators: %1$s: Number of forms
|
384 |
-
#: classes/controllers/FrmFormsController.php:
|
385 |
msgid "%1$s Form Permanently Deleted"
|
386 |
msgid_plural "%1$s Forms Permanently Deleted"
|
387 |
msgstr[0] ""
|
388 |
msgstr[1] ""
|
389 |
|
390 |
#. translators: %1$s: Number of forms
|
391 |
-
#: classes/controllers/FrmFormsController.php:
|
392 |
-
#: classes/controllers/FrmFormsController.php:
|
393 |
msgid "%1$s form permanently deleted."
|
394 |
msgid_plural "%1$s forms permanently deleted."
|
395 |
msgstr[0] ""
|
396 |
msgstr[1] ""
|
397 |
|
398 |
-
#: classes/controllers/FrmFormsController.php:
|
399 |
msgid "There was an error creating a template."
|
400 |
msgstr ""
|
401 |
|
402 |
-
#: classes/controllers/FrmFormsController.php:
|
403 |
msgid "Add forms and content"
|
404 |
msgstr ""
|
405 |
|
406 |
-
#: classes/controllers/FrmFormsController.php:
|
407 |
#: classes/views/frm-forms/insert_form_popup.php:33
|
408 |
msgid "Insert a Form"
|
409 |
msgstr ""
|
410 |
|
411 |
-
#: classes/controllers/FrmFormsController.php:
|
412 |
msgid "Display form title"
|
413 |
msgstr ""
|
414 |
|
415 |
-
#: classes/controllers/FrmFormsController.php:
|
416 |
msgid "Display form description"
|
417 |
msgstr ""
|
418 |
|
419 |
-
#: classes/controllers/FrmFormsController.php:
|
420 |
msgid "Minimize form HTML"
|
421 |
msgstr ""
|
422 |
|
423 |
-
#: classes/controllers/FrmFormsController.php:
|
424 |
#: classes/views/frm-forms/new-form-overlay.php:46
|
425 |
msgid "Template Name"
|
426 |
msgstr ""
|
427 |
|
428 |
-
#: classes/controllers/FrmFormsController.php:
|
429 |
#: classes/views/xml/import_form.php:120
|
430 |
msgid "Type"
|
431 |
msgstr ""
|
432 |
|
433 |
-
#: classes/controllers/FrmFormsController.php:
|
434 |
-
#: classes/controllers/FrmFormsController.php:
|
435 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
436 |
#: classes/views/shared/mb_adv_info.php:98
|
437 |
msgid "Key"
|
438 |
msgstr ""
|
439 |
|
440 |
-
#: classes/controllers/FrmFormsController.php:
|
441 |
#: classes/controllers/FrmStylesController.php:394
|
442 |
#: classes/views/frm-forms/settings-advanced.php:13
|
443 |
#: classes/views/styles/manage.php:39
|
@@ -446,188 +446,188 @@ msgstr ""
|
|
446 |
msgid "Form Title"
|
447 |
msgstr ""
|
448 |
|
449 |
-
#: classes/controllers/FrmFormsController.php:
|
450 |
msgid "Shortcodes"
|
451 |
msgstr ""
|
452 |
|
453 |
-
#: classes/controllers/FrmFormsController.php:
|
454 |
-
#: classes/models/FrmField.php:
|
455 |
msgid "Date"
|
456 |
msgstr ""
|
457 |
|
458 |
-
#: classes/controllers/FrmFormsController.php:
|
459 |
-
#: classes/helpers/FrmFormsHelper.php:
|
460 |
msgid "My Templates"
|
461 |
msgstr ""
|
462 |
|
463 |
-
#: classes/controllers/FrmFormsController.php:
|
464 |
msgid "You are trying to edit a form that does not exist."
|
465 |
msgstr ""
|
466 |
|
467 |
#. translators: %1$s: Start link HTML, %2$s: End link HTML
|
468 |
-
#: classes/controllers/FrmFormsController.php:
|
469 |
msgid "You are trying to edit a child form. Please edit from %1$shere%2$s"
|
470 |
msgstr ""
|
471 |
|
472 |
-
#: classes/controllers/FrmFormsController.php:
|
473 |
msgid "Template was successfully updated."
|
474 |
msgstr ""
|
475 |
|
476 |
-
#: classes/controllers/FrmFormsController.php:
|
477 |
#: classes/controllers/FrmStylesController.php:393
|
478 |
msgid "General"
|
479 |
msgstr ""
|
480 |
|
481 |
-
#: classes/controllers/FrmFormsController.php:
|
482 |
msgid "General Form Settings"
|
483 |
msgstr ""
|
484 |
|
485 |
-
#: classes/controllers/FrmFormsController.php:
|
486 |
msgid "Actions & Notifications"
|
487 |
msgstr ""
|
488 |
|
489 |
-
#: classes/controllers/FrmFormsController.php:
|
490 |
-
#: classes/controllers/FrmFormsController.php:
|
491 |
msgid "Form Permissions"
|
492 |
msgstr ""
|
493 |
|
494 |
-
#: classes/controllers/FrmFormsController.php:
|
495 |
msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
|
496 |
msgstr ""
|
497 |
|
498 |
-
#: classes/controllers/FrmFormsController.php:
|
499 |
msgid "Form Scheduling"
|
500 |
msgstr ""
|
501 |
|
502 |
-
#: classes/controllers/FrmFormsController.php:
|
503 |
msgid "Form scheduling settings"
|
504 |
msgstr ""
|
505 |
|
506 |
-
#: classes/controllers/FrmFormsController.php:
|
507 |
msgid "Styling & Buttons"
|
508 |
msgstr ""
|
509 |
|
510 |
-
#: classes/controllers/FrmFormsController.php:
|
511 |
msgid "Customize HTML"
|
512 |
msgstr ""
|
513 |
|
514 |
-
#: classes/controllers/FrmFormsController.php:
|
515 |
msgid "Customize field values with the following parameters."
|
516 |
msgstr ""
|
517 |
|
518 |
-
#: classes/controllers/FrmFormsController.php:
|
519 |
msgid "Separator"
|
520 |
msgstr ""
|
521 |
|
522 |
-
#: classes/controllers/FrmFormsController.php:
|
523 |
msgid "Use a different separator for checkbox fields"
|
524 |
msgstr ""
|
525 |
|
526 |
-
#: classes/controllers/FrmFormsController.php:
|
527 |
msgid "Date Format"
|
528 |
msgstr ""
|
529 |
|
530 |
-
#: classes/controllers/FrmFormsController.php:
|
531 |
#: classes/views/frm-fields/back-end/settings.php:27
|
532 |
msgid "Field Label"
|
533 |
msgstr ""
|
534 |
|
535 |
-
#: classes/controllers/FrmFormsController.php:
|
536 |
msgid "No Auto P"
|
537 |
msgstr ""
|
538 |
|
539 |
-
#: classes/controllers/FrmFormsController.php:
|
540 |
msgid "Do not automatically add any paragraphs or line breaks"
|
541 |
msgstr ""
|
542 |
|
543 |
-
#: classes/controllers/FrmFormsController.php:
|
544 |
-
#: classes/models/FrmField.php:
|
545 |
msgid "User ID"
|
546 |
msgstr ""
|
547 |
|
548 |
-
#: classes/controllers/FrmFormsController.php:
|
549 |
msgid "First Name"
|
550 |
msgstr ""
|
551 |
|
552 |
-
#: classes/controllers/FrmFormsController.php:
|
553 |
msgid "Last Name"
|
554 |
msgstr ""
|
555 |
|
556 |
-
#: classes/controllers/FrmFormsController.php:
|
557 |
msgid "Display Name"
|
558 |
msgstr ""
|
559 |
|
560 |
-
#: classes/controllers/FrmFormsController.php:
|
561 |
msgid "User Login"
|
562 |
msgstr ""
|
563 |
|
564 |
-
#: classes/controllers/FrmFormsController.php:
|
565 |
#: classes/models/FrmField.php:34
|
566 |
msgid "Email"
|
567 |
msgstr ""
|
568 |
|
569 |
-
#: classes/controllers/FrmFormsController.php:
|
570 |
msgid "Avatar"
|
571 |
msgstr ""
|
572 |
|
573 |
-
#: classes/controllers/FrmFormsController.php:
|
574 |
msgid "Author Link"
|
575 |
msgstr ""
|
576 |
|
577 |
-
#: classes/controllers/FrmFormsController.php:
|
578 |
#: classes/views/frm-entries/sidebar-shared.php:51
|
579 |
msgid "Entry ID"
|
580 |
msgstr ""
|
581 |
|
582 |
-
#: classes/controllers/FrmFormsController.php:
|
583 |
msgid "Post ID"
|
584 |
msgstr ""
|
585 |
|
586 |
-
#: classes/controllers/FrmFormsController.php:
|
587 |
msgid "User IP"
|
588 |
msgstr ""
|
589 |
|
590 |
-
#: classes/controllers/FrmFormsController.php:
|
591 |
msgid "Entry created"
|
592 |
msgstr ""
|
593 |
|
594 |
-
#: classes/controllers/FrmFormsController.php:
|
595 |
msgid "Entry updated"
|
596 |
msgstr ""
|
597 |
|
598 |
-
#: classes/controllers/FrmFormsController.php:
|
599 |
msgid "Site URL"
|
600 |
msgstr ""
|
601 |
|
602 |
-
#: classes/controllers/FrmFormsController.php:
|
603 |
msgid "Site Name"
|
604 |
msgstr ""
|
605 |
|
606 |
-
#: classes/controllers/FrmFormsController.php:
|
607 |
msgid "Default Msg"
|
608 |
msgstr ""
|
609 |
|
610 |
-
#: classes/controllers/FrmFormsController.php:
|
611 |
msgid "Default HTML"
|
612 |
msgstr ""
|
613 |
|
614 |
-
#: classes/controllers/FrmFormsController.php:
|
615 |
msgid "Default Plain"
|
616 |
msgstr ""
|
617 |
|
618 |
-
#: classes/controllers/FrmFormsController.php:
|
619 |
msgid "No forms were specified"
|
620 |
msgstr ""
|
621 |
|
622 |
-
#: classes/controllers/FrmFormsController.php:
|
623 |
msgid "Abnormal HTML characters prevented your form from saving correctly"
|
624 |
msgstr ""
|
625 |
|
626 |
-
#: classes/controllers/FrmFormsController.php:
|
627 |
#: classes/helpers/FrmFormsHelper.php:57
|
628 |
#: classes/helpers/FrmFormsHelper.php:112
|
629 |
#: classes/helpers/FrmFormsHelper.php:166
|
630 |
-
#: classes/helpers/FrmFormsHelper.php:
|
631 |
#: classes/helpers/FrmFormsListHelper.php:315
|
632 |
#: classes/views/frm-forms/create-template-from-an-existing-form.php:25
|
633 |
#: classes/views/styles/manage.php:59
|
@@ -635,17 +635,17 @@ msgstr ""
|
|
635 |
msgid "(no title)"
|
636 |
msgstr ""
|
637 |
|
638 |
-
#: classes/controllers/FrmFormsController.php:
|
639 |
-
#: classes/controllers/FrmFormsController.php:
|
640 |
msgid "Please select a valid form"
|
641 |
msgstr ""
|
642 |
|
643 |
-
#: classes/controllers/FrmFormsController.php:
|
644 |
msgid "Please wait while you are redirected."
|
645 |
msgstr ""
|
646 |
|
647 |
#. translators: %1$s: Start link HTML, %2$s: End link HTML
|
648 |
-
#: classes/controllers/FrmFormsController.php:
|
649 |
msgid "%1$sClick here%2$s if you are not automatically redirected."
|
650 |
msgstr ""
|
651 |
|
@@ -700,7 +700,7 @@ msgid "Plugin Licenses"
|
|
700 |
msgstr ""
|
701 |
|
702 |
#: classes/controllers/FrmSettingsController.php:104
|
703 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
704 |
msgid "Miscellaneous"
|
705 |
msgstr ""
|
706 |
|
@@ -909,7 +909,7 @@ msgid "Your form styles have been saved."
|
|
909 |
msgstr ""
|
910 |
|
911 |
#: classes/controllers/FrmStylesController.php:395
|
912 |
-
#: classes/helpers/FrmFormsHelper.php:
|
913 |
#: classes/views/frm-forms/new-form-overlay.php:53
|
914 |
#: classes/views/frm-forms/new-form-overlay.php:54
|
915 |
#: classes/views/frm-forms/settings-advanced.php:27
|
@@ -921,7 +921,7 @@ msgid "Field Labels"
|
|
921 |
msgstr ""
|
922 |
|
923 |
#: classes/controllers/FrmStylesController.php:397
|
924 |
-
#: classes/helpers/FrmFormsHelper.php:
|
925 |
#: classes/views/frm-fields/back-end/field-description.php:8
|
926 |
msgid "Field Description"
|
927 |
msgstr ""
|
@@ -1154,7 +1154,7 @@ msgid "Remove"
|
|
1154 |
msgstr ""
|
1155 |
|
1156 |
#: classes/helpers/FrmAppHelper.php:2448
|
1157 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1158 |
#: classes/views/shared/mb_adv_info.php:95
|
1159 |
msgid "ID"
|
1160 |
msgstr ""
|
@@ -1333,7 +1333,7 @@ msgid "The parameter \"%s\" is reserved by WordPress. This may cause problems wh
|
|
1333 |
msgstr ""
|
1334 |
|
1335 |
#: classes/helpers/FrmAppHelper.php:2505
|
1336 |
-
#: classes/helpers/FrmFormsHelper.php:
|
1337 |
msgid "See the list of reserved words in WordPress."
|
1338 |
msgstr ""
|
1339 |
|
@@ -1622,45 +1622,45 @@ msgstr ""
|
|
1622 |
msgid "Renew Now"
|
1623 |
msgstr ""
|
1624 |
|
1625 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1626 |
msgid "(label)"
|
1627 |
msgstr ""
|
1628 |
|
1629 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1630 |
msgid "Comment"
|
1631 |
msgstr ""
|
1632 |
|
1633 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1634 |
msgid "Comment User"
|
1635 |
msgstr ""
|
1636 |
|
1637 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1638 |
msgid "Comment Date"
|
1639 |
msgstr ""
|
1640 |
|
1641 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1642 |
msgid "Timestamp"
|
1643 |
msgstr ""
|
1644 |
|
1645 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1646 |
msgid "Last Updated"
|
1647 |
msgstr ""
|
1648 |
|
1649 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1650 |
msgid "Updated By"
|
1651 |
msgstr ""
|
1652 |
|
1653 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1654 |
-
#: classes/helpers/FrmFormsHelper.php:
|
1655 |
#: classes/helpers/FrmFormsListHelper.php:342
|
1656 |
msgid "Draft"
|
1657 |
msgstr ""
|
1658 |
|
1659 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1660 |
msgid "IP"
|
1661 |
msgstr ""
|
1662 |
|
1663 |
-
#: classes/helpers/FrmCSVExportHelper.php:
|
1664 |
msgid "Parent ID"
|
1665 |
msgstr ""
|
1666 |
|
@@ -1737,7 +1737,7 @@ msgid "Permanently delete this entry?"
|
|
1737 |
msgstr ""
|
1738 |
|
1739 |
#: classes/helpers/FrmEntriesListHelper.php:309
|
1740 |
-
#: classes/helpers/FrmFormsHelper.php:
|
1741 |
#: classes/helpers/FrmFormsListHelper.php:133
|
1742 |
#: classes/views/frm-form-actions/form_action.php:25
|
1743 |
msgid "Delete"
|
@@ -2954,220 +2954,221 @@ msgstr ""
|
|
2954 |
msgid "(ID %d)"
|
2955 |
msgstr ""
|
2956 |
|
2957 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2958 |
msgid "Field ID"
|
2959 |
msgstr ""
|
2960 |
|
2961 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2962 |
#: classes/views/frm-fields/back-end/settings.php:294
|
2963 |
msgid "Field Key"
|
2964 |
msgstr ""
|
2965 |
|
2966 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2967 |
msgid "Field Name"
|
2968 |
msgstr ""
|
2969 |
|
2970 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2971 |
#: classes/views/frm-fields/back-end/settings.php:267
|
2972 |
msgid "Label Position"
|
2973 |
msgstr ""
|
2974 |
|
2975 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2976 |
msgid "Required Label"
|
2977 |
msgstr ""
|
2978 |
|
2979 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2980 |
msgid "Input Field"
|
2981 |
msgstr ""
|
2982 |
|
2983 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2984 |
msgid "Single Option"
|
2985 |
msgstr ""
|
2986 |
|
2987 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2988 |
msgid "Show a single radio or checkbox option by replacing 1 with the order of the option"
|
2989 |
msgstr ""
|
2990 |
|
2991 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2992 |
msgid "Hide Option Label"
|
2993 |
msgstr ""
|
2994 |
|
2995 |
-
#: classes/helpers/FrmFormsHelper.php:
|
2996 |
msgid "Required Class"
|
2997 |
msgstr ""
|
2998 |
|
2999 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3000 |
msgid "Add class name if field is required"
|
3001 |
msgstr ""
|
3002 |
|
3003 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3004 |
msgid "Error Class"
|
3005 |
msgstr ""
|
3006 |
|
3007 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3008 |
msgid "Add class name if field has an error on form submit"
|
3009 |
msgstr ""
|
3010 |
|
3011 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3012 |
#: classes/views/frm-forms/new-form-overlay.php:46
|
3013 |
#: classes/views/frm-forms/new-form-overlay.php:47
|
3014 |
msgid "Form Name"
|
3015 |
msgstr ""
|
3016 |
|
3017 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3018 |
#: classes/views/frm-forms/settings-advanced.php:20
|
3019 |
msgid "Form Key"
|
3020 |
msgstr ""
|
3021 |
|
3022 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3023 |
msgid "Delete Entry Link"
|
3024 |
msgstr ""
|
3025 |
|
3026 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3027 |
msgid "Button Label"
|
3028 |
msgstr ""
|
3029 |
|
3030 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3031 |
msgid "Button Hook"
|
3032 |
msgstr ""
|
3033 |
|
3034 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3035 |
msgid "Create Form from Template"
|
3036 |
msgstr ""
|
3037 |
|
3038 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3039 |
msgid "Duplicate Form"
|
3040 |
msgstr ""
|
3041 |
|
3042 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3043 |
msgid "Restore from Trash"
|
3044 |
msgstr ""
|
3045 |
|
3046 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3047 |
#: classes/helpers/FrmFormsListHelper.php:124
|
3048 |
msgid "Restore"
|
3049 |
msgstr ""
|
3050 |
|
3051 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3052 |
msgid "Move Form to Trash"
|
3053 |
msgstr ""
|
3054 |
|
3055 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3056 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3057 |
#: classes/helpers/FrmFormsListHelper.php:158
|
3058 |
msgid "Trash"
|
3059 |
msgstr ""
|
3060 |
|
3061 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3062 |
msgid "Do you want to move this form to the trash?"
|
3063 |
msgstr ""
|
3064 |
|
3065 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3066 |
#: classes/helpers/FrmFormsListHelper.php:128
|
3067 |
msgid "Delete Permanently"
|
3068 |
msgstr ""
|
3069 |
|
3070 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3071 |
msgid "Are you sure you want to delete this form and all its entries?"
|
3072 |
msgstr ""
|
3073 |
|
3074 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3075 |
msgid "This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?"
|
3076 |
msgstr ""
|
3077 |
|
3078 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3079 |
-
#: classes/models/FrmField.php:
|
3080 |
msgid "Total"
|
3081 |
msgstr ""
|
3082 |
|
3083 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3084 |
msgid "Add this to a read-only field to display the text in bold without a border or background."
|
3085 |
msgstr ""
|
3086 |
|
3087 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3088 |
msgid "Big Total"
|
3089 |
msgstr ""
|
3090 |
|
3091 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3092 |
msgid "Add this to a read-only field to display the text in large, bold text without a border or background."
|
3093 |
msgstr ""
|
3094 |
|
3095 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3096 |
msgid "Scroll Box"
|
3097 |
msgstr ""
|
3098 |
|
3099 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3100 |
msgid "If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field."
|
3101 |
msgstr ""
|
3102 |
|
3103 |
-
#: classes/helpers/FrmFormsHelper.php:
|
|
|
3104 |
msgid "First"
|
3105 |
msgstr ""
|
3106 |
|
3107 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3108 |
msgid "Add this to the first field in each row along with a width. ie frm_first frm4"
|
3109 |
msgstr ""
|
3110 |
|
3111 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3112 |
#: classes/helpers/FrmStylesHelper.php:113
|
3113 |
msgid "Right"
|
3114 |
msgstr ""
|
3115 |
|
3116 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3117 |
msgid "First Grid Row"
|
3118 |
msgstr ""
|
3119 |
|
3120 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3121 |
msgid "Even Grid Row"
|
3122 |
msgstr ""
|
3123 |
|
3124 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3125 |
msgid "Odd Grid Row"
|
3126 |
msgstr ""
|
3127 |
|
3128 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3129 |
msgid "Color Block"
|
3130 |
msgstr ""
|
3131 |
|
3132 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3133 |
msgid "Add a background color to the field or section."
|
3134 |
msgstr ""
|
3135 |
|
3136 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3137 |
msgid "Capitalize"
|
3138 |
msgstr ""
|
3139 |
|
3140 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3141 |
msgid "Automatically capitalize the first letter in each word."
|
3142 |
msgstr ""
|
3143 |
|
3144 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3145 |
msgid "Published"
|
3146 |
msgstr ""
|
3147 |
|
3148 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3149 |
msgid "Create Form"
|
3150 |
msgstr ""
|
3151 |
|
3152 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3153 |
msgid "Renew"
|
3154 |
msgstr ""
|
3155 |
|
3156 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3157 |
msgid "License plan required:"
|
3158 |
msgstr ""
|
3159 |
|
3160 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3161 |
msgid "Is this intentional?"
|
3162 |
msgstr ""
|
3163 |
|
3164 |
#. translators: %s: the name of a single parameter in the redirect URL
|
3165 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3166 |
msgid "The redirect URL is using the parameter \"%s\", which is reserved by WordPress. "
|
3167 |
msgstr ""
|
3168 |
|
3169 |
#. translators: %s: the names of two or more parameters in the redirect URL, separated by commas
|
3170 |
-
#: classes/helpers/FrmFormsHelper.php:
|
3171 |
msgid "The redirect URL is using the parameters \"%s\", which are reserved by WordPress. "
|
3172 |
msgstr ""
|
3173 |
|
@@ -3639,11 +3640,11 @@ msgstr[1] ""
|
|
3639 |
msgid "Go to imported form"
|
3640 |
msgstr ""
|
3641 |
|
3642 |
-
#: classes/helpers/FrmXMLHelper.php:
|
3643 |
msgid "Create Posts"
|
3644 |
msgstr ""
|
3645 |
|
3646 |
-
#: classes/helpers/FrmXMLHelper.php:
|
3647 |
msgid "Email Notification"
|
3648 |
msgstr ""
|
3649 |
|
@@ -3671,6 +3672,28 @@ msgstr ""
|
|
3671 |
msgid "Option 2"
|
3672 |
msgstr ""
|
3673 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3674 |
#: classes/models/fields/FrmFieldNumber.php:68
|
3675 |
msgid "Please select a higher number"
|
3676 |
msgstr ""
|
@@ -3767,6 +3790,19 @@ msgstr ""
|
|
3767 |
msgid "There was a %1$s error: %2$s"
|
3768 |
msgstr ""
|
3769 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3770 |
#: classes/models/FrmDb.php:447
|
3771 |
msgid "Use the query in an array format so it can be properly prepared."
|
3772 |
msgstr ""
|
@@ -3800,12 +3836,12 @@ msgstr ""
|
|
3800 |
msgid "There was a problem with your submission. Please try again."
|
3801 |
msgstr ""
|
3802 |
|
3803 |
-
#: classes/models/FrmEntryValidate.php:
|
3804 |
-
#: classes/models/FrmEntryValidate.php:
|
3805 |
msgid "Your entry appears to be spam!"
|
3806 |
msgstr ""
|
3807 |
|
3808 |
-
#: classes/models/FrmEntryValidate.php:
|
3809 |
msgid "Your entry appears to be blocked spam!"
|
3810 |
msgstr ""
|
3811 |
|
@@ -3847,115 +3883,119 @@ msgid "Number"
|
|
3847 |
msgstr ""
|
3848 |
|
3849 |
#: classes/models/FrmField.php:46
|
3850 |
-
msgid "
|
3851 |
msgstr ""
|
3852 |
|
3853 |
#: classes/models/FrmField.php:50
|
3854 |
-
msgid "
|
3855 |
msgstr ""
|
3856 |
|
3857 |
#: classes/models/FrmField.php:54
|
|
|
|
|
|
|
|
|
3858 |
msgid "Hidden"
|
3859 |
msgstr ""
|
3860 |
|
3861 |
-
#: classes/models/FrmField.php:
|
3862 |
msgid "reCAPTCHA"
|
3863 |
msgstr ""
|
3864 |
|
3865 |
-
#: classes/models/FrmField.php:
|
3866 |
msgid "File Upload"
|
3867 |
msgstr ""
|
3868 |
|
3869 |
-
#: classes/models/FrmField.php:
|
3870 |
msgid "Rich Text"
|
3871 |
msgstr ""
|
3872 |
|
3873 |
-
#: classes/models/FrmField.php:
|
3874 |
msgid "Time"
|
3875 |
msgstr ""
|
3876 |
|
3877 |
-
#: classes/models/FrmField.php:
|
3878 |
msgid "Scale"
|
3879 |
msgstr ""
|
3880 |
|
3881 |
-
#: classes/models/FrmField.php:
|
3882 |
msgid "Star Rating"
|
3883 |
msgstr ""
|
3884 |
|
3885 |
-
#: classes/models/FrmField.php:
|
3886 |
msgid "Slider"
|
3887 |
msgstr ""
|
3888 |
|
3889 |
-
#: classes/models/FrmField.php:
|
3890 |
msgid "Toggle"
|
3891 |
msgstr ""
|
3892 |
|
3893 |
-
#: classes/models/FrmField.php:
|
3894 |
msgid "Dynamic"
|
3895 |
msgstr ""
|
3896 |
|
3897 |
-
#: classes/models/FrmField.php:
|
3898 |
msgid "Lookup"
|
3899 |
msgstr ""
|
3900 |
|
3901 |
-
#: classes/models/FrmField.php:
|
3902 |
msgid "Repeater"
|
3903 |
msgstr ""
|
3904 |
|
3905 |
-
#: classes/models/FrmField.php:
|
3906 |
#: classes/models/FrmFormMigrator.php:302
|
3907 |
msgid "Section Buttons"
|
3908 |
msgstr ""
|
3909 |
|
3910 |
-
#: classes/models/FrmField.php:
|
3911 |
msgid "Section"
|
3912 |
msgstr ""
|
3913 |
|
3914 |
-
#: classes/models/FrmField.php:
|
3915 |
msgid "Page Break"
|
3916 |
msgstr ""
|
3917 |
|
3918 |
-
#: classes/models/FrmField.php:
|
3919 |
msgid "Embed Form"
|
3920 |
msgstr ""
|
3921 |
|
3922 |
-
#: classes/models/FrmField.php:
|
3923 |
msgid "Password"
|
3924 |
msgstr ""
|
3925 |
|
3926 |
-
#: classes/models/FrmField.php:
|
3927 |
msgid "Tags"
|
3928 |
msgstr ""
|
3929 |
|
3930 |
-
#: classes/models/FrmField.php:
|
3931 |
msgid "Credit Card"
|
3932 |
msgstr ""
|
3933 |
|
3934 |
-
#: classes/models/FrmField.php:
|
3935 |
msgid "Address"
|
3936 |
msgstr ""
|
3937 |
|
3938 |
-
#: classes/models/FrmField.php:
|
3939 |
msgid "Summary"
|
3940 |
msgstr ""
|
3941 |
|
3942 |
-
#: classes/models/FrmField.php:
|
3943 |
msgid "Signature"
|
3944 |
msgstr ""
|
3945 |
|
3946 |
-
#: classes/models/FrmField.php:
|
3947 |
msgid "Quiz Score"
|
3948 |
msgstr ""
|
3949 |
|
3950 |
-
#: classes/models/FrmField.php:
|
3951 |
msgid "Appointment"
|
3952 |
msgstr ""
|
3953 |
|
3954 |
-
#: classes/models/FrmField.php:
|
3955 |
msgid "Product"
|
3956 |
msgstr ""
|
3957 |
|
3958 |
-
#: classes/models/FrmField.php:
|
3959 |
msgid "Quantity"
|
3960 |
msgstr ""
|
3961 |
|
@@ -4011,6 +4051,10 @@ msgstr ""
|
|
4011 |
msgid "Default Form"
|
4012 |
msgstr ""
|
4013 |
|
|
|
|
|
|
|
|
|
4014 |
#: classes/models/FrmMigrate.php:564
|
4015 |
msgid "Sending"
|
4016 |
msgstr ""
|
@@ -4236,10 +4280,6 @@ msgstr ""
|
|
4236 |
msgid "You did not add any fields to your form. %1$sGo back%2$s and add some."
|
4237 |
msgstr ""
|
4238 |
|
4239 |
-
#: classes/views/frm-entries/form.php:65
|
4240 |
-
msgid "If you are human, leave this field blank."
|
4241 |
-
msgstr ""
|
4242 |
-
|
4243 |
#: classes/views/frm-entries/list.php:14
|
4244 |
#: classes/views/frm-entries/list.php:25
|
4245 |
msgid "Form Entries"
|
@@ -4441,6 +4481,22 @@ msgstr ""
|
|
4441 |
msgid "Max Characters"
|
4442 |
msgstr ""
|
4443 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4444 |
#: classes/views/frm-fields/back-end/number-range.php:7
|
4445 |
msgid "Set the number range the field validation should allow. Browsers that support the HTML5 number field require a number range to determine the numbers seen when clicking the arrows next to the field."
|
4446 |
msgstr ""
|
@@ -4525,14 +4581,6 @@ msgstr ""
|
|
4525 |
msgid "Advanced"
|
4526 |
msgstr ""
|
4527 |
|
4528 |
-
#: classes/views/frm-fields/back-end/settings.php:134
|
4529 |
-
msgid "Default Value"
|
4530 |
-
msgstr ""
|
4531 |
-
|
4532 |
-
#: classes/views/frm-fields/back-end/settings.php:180
|
4533 |
-
msgid "Placeholder Text"
|
4534 |
-
msgstr ""
|
4535 |
-
|
4536 |
#: classes/views/frm-fields/back-end/settings.php:214
|
4537 |
msgid "If this URL points to an image, show to image on the entries listing page."
|
4538 |
msgstr ""
|
@@ -5113,7 +5161,7 @@ msgid "Form Settings"
|
|
5113 |
msgstr ""
|
5114 |
|
5115 |
#: classes/views/frm-forms/settings-advanced.php:67
|
5116 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5117 |
msgid "On Submit"
|
5118 |
msgstr ""
|
5119 |
|
@@ -5141,51 +5189,35 @@ msgstr ""
|
|
5141 |
msgid "Do not store entries submitted from this form"
|
5142 |
msgstr ""
|
5143 |
|
5144 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5145 |
-
msgid "Use Akismet to check entries for spam for"
|
5146 |
-
msgstr ""
|
5147 |
-
|
5148 |
-
#: classes/views/frm-forms/settings-advanced.php:126
|
5149 |
-
msgid "no one"
|
5150 |
-
msgstr ""
|
5151 |
-
|
5152 |
-
#: classes/views/frm-forms/settings-advanced.php:129
|
5153 |
-
msgid "everyone"
|
5154 |
-
msgstr ""
|
5155 |
-
|
5156 |
-
#: classes/views/frm-forms/settings-advanced.php:132
|
5157 |
-
msgid "visitors who are not logged in"
|
5158 |
-
msgstr ""
|
5159 |
-
|
5160 |
-
#: classes/views/frm-forms/settings-advanced.php:141
|
5161 |
msgid "AJAX"
|
5162 |
msgstr ""
|
5163 |
|
5164 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5165 |
msgid "Make stuff happen in the background without a page refresh"
|
5166 |
msgstr ""
|
5167 |
|
5168 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5169 |
msgid "Load and save form builder page with AJAX"
|
5170 |
msgstr ""
|
5171 |
|
5172 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5173 |
msgid "Recommended for long forms."
|
5174 |
msgstr ""
|
5175 |
|
5176 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5177 |
msgid "Validate this form with javascript"
|
5178 |
msgstr ""
|
5179 |
|
5180 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5181 |
msgid "Required fields, email format, and number format can be checked instantly in your browser. You may want to turn this option off if you have any customizations to remove validation messages on certain fields."
|
5182 |
msgstr ""
|
5183 |
|
5184 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5185 |
msgid "Messages"
|
5186 |
msgstr ""
|
5187 |
|
5188 |
-
#: classes/views/frm-forms/settings-advanced.php:
|
5189 |
msgid "Set up your confirmation messages."
|
5190 |
msgstr ""
|
5191 |
|
@@ -5239,6 +5271,42 @@ msgstr ""
|
|
5239 |
msgid "Select a form:"
|
5240 |
msgstr ""
|
5241 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5242 |
#: classes/views/frm-forms/_no_forms.php:17
|
5243 |
msgid "Add New Form"
|
5244 |
msgstr ""
|
2 |
# This file is distributed under the same license as the Formidable Forms plugin.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: Formidable Forms 4.11\n"
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/formidable\n"
|
7 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"POT-Creation-Date: 2021-05-21T15:16:11+00:00\n"
|
13 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
"X-Generator: WP-CLI 2.4.0\n"
|
15 |
"X-Domain: formidable\n"
|
130 |
|
131 |
#: classes/controllers/FrmAddonsController.php:22
|
132 |
#: classes/controllers/FrmAddonsController.php:23
|
133 |
+
#: classes/helpers/FrmFormsHelper.php:1328
|
134 |
#: classes/views/frm-fields/back-end/smart-values.php:16
|
135 |
#: classes/views/shared/admin-header.php:32
|
136 |
msgid "Upgrade"
|
191 |
#: classes/controllers/FrmAppController.php:165
|
192 |
#: classes/controllers/FrmEntriesController.php:11
|
193 |
#: classes/controllers/FrmEntriesController.php:100
|
194 |
+
#: classes/controllers/FrmFormsController.php:772
|
195 |
#: classes/controllers/FrmXMLController.php:259
|
196 |
#: classes/views/xml/import_form.php:121
|
197 |
msgid "Entries"
|
217 |
msgstr ""
|
218 |
|
219 |
#: classes/controllers/FrmEntriesController.php:79
|
220 |
+
#: classes/controllers/FrmFormsController.php:1289
|
221 |
#: classes/views/frm-entries/form.php:54
|
222 |
#: classes/views/frm-entries/sidebar-shared.php:57
|
223 |
msgid "Entry Key"
|
224 |
msgstr ""
|
225 |
|
226 |
#: classes/controllers/FrmEntriesController.php:84
|
227 |
+
#: classes/controllers/FrmFormsController.php:673
|
228 |
#: classes/views/xml/import_form.php:152
|
229 |
#: classes/widgets/FrmShowForm.php:59
|
230 |
msgid "Form"
|
235 |
msgstr ""
|
236 |
|
237 |
#: classes/controllers/FrmEntriesController.php:86
|
238 |
+
#: classes/helpers/FrmCSVExportHelper.php:225
|
239 |
msgid "Created By"
|
240 |
msgstr ""
|
241 |
|
314 |
msgstr ""
|
315 |
|
316 |
#: classes/controllers/FrmFormsController.php:9
|
317 |
+
#: classes/controllers/FrmFormsController.php:782
|
318 |
#: classes/controllers/FrmStylesController.php:51
|
319 |
#: classes/controllers/FrmXMLController.php:258
|
320 |
#: classes/views/frm-forms/list.php:10
|
333 |
msgid "Add Conditional Logic"
|
334 |
msgstr ""
|
335 |
|
336 |
+
#: classes/controllers/FrmFormsController.php:148
|
337 |
msgid "Settings Successfully Updated"
|
338 |
msgstr ""
|
339 |
|
340 |
+
#: classes/controllers/FrmFormsController.php:184
|
341 |
+
#: classes/controllers/FrmFormsController.php:982
|
342 |
msgid "Form was successfully updated."
|
343 |
msgstr ""
|
344 |
|
345 |
#. translators: %1$s: Start link HTML, %2$s: end link HTML
|
346 |
+
#: classes/controllers/FrmFormsController.php:189
|
347 |
msgid "However, your form is very long and may be %1$sreaching server limits%2$s."
|
348 |
msgstr ""
|
349 |
|
350 |
+
#: classes/controllers/FrmFormsController.php:243
|
351 |
#: deprecated/FrmDeprecated.php:414
|
352 |
msgid "Form template was Successfully Created"
|
353 |
msgstr ""
|
354 |
|
355 |
+
#: classes/controllers/FrmFormsController.php:243
|
356 |
msgid "Form was Successfully Copied"
|
357 |
msgstr ""
|
358 |
|
359 |
+
#: classes/controllers/FrmFormsController.php:247
|
360 |
msgid "There was a problem creating the new template."
|
361 |
msgstr ""
|
362 |
|
363 |
+
#: classes/controllers/FrmFormsController.php:376
|
364 |
msgid "Form Preview"
|
365 |
msgstr ""
|
366 |
|
367 |
#. translators: %1$s: Number of forms
|
368 |
+
#: classes/controllers/FrmFormsController.php:421
|
369 |
+
#: classes/controllers/FrmFormsController.php:482
|
370 |
msgid "%1$s form restored from the Trash."
|
371 |
msgid_plural "%1$s forms restored from the Trash."
|
372 |
msgstr[0] ""
|
373 |
msgstr[1] ""
|
374 |
|
375 |
#. translators: %1$s: Number of forms, %2$s: Start link HTML, %3$s: End link HTML
|
376 |
+
#: classes/controllers/FrmFormsController.php:485
|
377 |
+
#: classes/controllers/FrmFormsController.php:510
|
378 |
msgid "%1$s form moved to the Trash. %2$sUndo%3$s"
|
379 |
msgid_plural "%1$s forms moved to the Trash. %2$sUndo%3$s"
|
380 |
msgstr[0] ""
|
381 |
msgstr[1] ""
|
382 |
|
383 |
#. translators: %1$s: Number of forms
|
384 |
+
#: classes/controllers/FrmFormsController.php:533
|
385 |
msgid "%1$s Form Permanently Deleted"
|
386 |
msgid_plural "%1$s Forms Permanently Deleted"
|
387 |
msgstr[0] ""
|
388 |
msgstr[1] ""
|
389 |
|
390 |
#. translators: %1$s: Number of forms
|
391 |
+
#: classes/controllers/FrmFormsController.php:550
|
392 |
+
#: classes/controllers/FrmFormsController.php:567
|
393 |
msgid "%1$s form permanently deleted."
|
394 |
msgid_plural "%1$s forms permanently deleted."
|
395 |
msgstr[0] ""
|
396 |
msgstr[1] ""
|
397 |
|
398 |
+
#: classes/controllers/FrmFormsController.php:613
|
399 |
msgid "There was an error creating a template."
|
400 |
msgstr ""
|
401 |
|
402 |
+
#: classes/controllers/FrmFormsController.php:657
|
403 |
msgid "Add forms and content"
|
404 |
msgstr ""
|
405 |
|
406 |
+
#: classes/controllers/FrmFormsController.php:674
|
407 |
#: classes/views/frm-forms/insert_form_popup.php:33
|
408 |
msgid "Insert a Form"
|
409 |
msgstr ""
|
410 |
|
411 |
+
#: classes/controllers/FrmFormsController.php:703
|
412 |
msgid "Display form title"
|
413 |
msgstr ""
|
414 |
|
415 |
+
#: classes/controllers/FrmFormsController.php:707
|
416 |
msgid "Display form description"
|
417 |
msgstr ""
|
418 |
|
419 |
+
#: classes/controllers/FrmFormsController.php:711
|
420 |
msgid "Minimize form HTML"
|
421 |
msgstr ""
|
422 |
|
423 |
+
#: classes/controllers/FrmFormsController.php:767
|
424 |
#: classes/views/frm-forms/new-form-overlay.php:46
|
425 |
msgid "Template Name"
|
426 |
msgstr ""
|
427 |
|
428 |
+
#: classes/controllers/FrmFormsController.php:768
|
429 |
#: classes/views/xml/import_form.php:120
|
430 |
msgid "Type"
|
431 |
msgstr ""
|
432 |
|
433 |
+
#: classes/controllers/FrmFormsController.php:769
|
434 |
+
#: classes/controllers/FrmFormsController.php:773
|
435 |
+
#: classes/helpers/FrmCSVExportHelper.php:230
|
436 |
#: classes/views/shared/mb_adv_info.php:98
|
437 |
msgid "Key"
|
438 |
msgstr ""
|
439 |
|
440 |
+
#: classes/controllers/FrmFormsController.php:771
|
441 |
#: classes/controllers/FrmStylesController.php:394
|
442 |
#: classes/views/frm-forms/settings-advanced.php:13
|
443 |
#: classes/views/styles/manage.php:39
|
446 |
msgid "Form Title"
|
447 |
msgstr ""
|
448 |
|
449 |
+
#: classes/controllers/FrmFormsController.php:774
|
450 |
msgid "Shortcodes"
|
451 |
msgstr ""
|
452 |
|
453 |
+
#: classes/controllers/FrmFormsController.php:777
|
454 |
+
#: classes/models/FrmField.php:86
|
455 |
msgid "Date"
|
456 |
msgstr ""
|
457 |
|
458 |
+
#: classes/controllers/FrmFormsController.php:897
|
459 |
+
#: classes/helpers/FrmFormsHelper.php:1271
|
460 |
msgid "My Templates"
|
461 |
msgstr ""
|
462 |
|
463 |
+
#: classes/controllers/FrmFormsController.php:956
|
464 |
msgid "You are trying to edit a form that does not exist."
|
465 |
msgstr ""
|
466 |
|
467 |
#. translators: %1$s: Start link HTML, %2$s: End link HTML
|
468 |
+
#: classes/controllers/FrmFormsController.php:961
|
469 |
msgid "You are trying to edit a child form. Please edit from %1$shere%2$s"
|
470 |
msgstr ""
|
471 |
|
472 |
+
#: classes/controllers/FrmFormsController.php:984
|
473 |
msgid "Template was successfully updated."
|
474 |
msgstr ""
|
475 |
|
476 |
+
#: classes/controllers/FrmFormsController.php:1048
|
477 |
#: classes/controllers/FrmStylesController.php:393
|
478 |
msgid "General"
|
479 |
msgstr ""
|
480 |
|
481 |
+
#: classes/controllers/FrmFormsController.php:1049
|
482 |
msgid "General Form Settings"
|
483 |
msgstr ""
|
484 |
|
485 |
+
#: classes/controllers/FrmFormsController.php:1054
|
486 |
msgid "Actions & Notifications"
|
487 |
msgstr ""
|
488 |
|
489 |
+
#: classes/controllers/FrmFormsController.php:1060
|
490 |
+
#: classes/controllers/FrmFormsController.php:1065
|
491 |
msgid "Form Permissions"
|
492 |
msgstr ""
|
493 |
|
494 |
+
#: classes/controllers/FrmFormsController.php:1066
|
495 |
msgid "Allow editing, protect forms and files, limit entries, and save drafts. Upgrade to get form and entry permissions."
|
496 |
msgstr ""
|
497 |
|
498 |
+
#: classes/controllers/FrmFormsController.php:1070
|
499 |
msgid "Form Scheduling"
|
500 |
msgstr ""
|
501 |
|
502 |
+
#: classes/controllers/FrmFormsController.php:1075
|
503 |
msgid "Form scheduling settings"
|
504 |
msgstr ""
|
505 |
|
506 |
+
#: classes/controllers/FrmFormsController.php:1079
|
507 |
msgid "Styling & Buttons"
|
508 |
msgstr ""
|
509 |
|
510 |
+
#: classes/controllers/FrmFormsController.php:1085
|
511 |
msgid "Customize HTML"
|
512 |
msgstr ""
|
513 |
|
514 |
+
#: classes/controllers/FrmFormsController.php:1205
|
515 |
msgid "Customize field values with the following parameters."
|
516 |
msgstr ""
|
517 |
|
518 |
+
#: classes/controllers/FrmFormsController.php:1242
|
519 |
msgid "Separator"
|
520 |
msgstr ""
|
521 |
|
522 |
+
#: classes/controllers/FrmFormsController.php:1243
|
523 |
msgid "Use a different separator for checkbox fields"
|
524 |
msgstr ""
|
525 |
|
526 |
+
#: classes/controllers/FrmFormsController.php:1246
|
527 |
msgid "Date Format"
|
528 |
msgstr ""
|
529 |
|
530 |
+
#: classes/controllers/FrmFormsController.php:1249
|
531 |
#: classes/views/frm-fields/back-end/settings.php:27
|
532 |
msgid "Field Label"
|
533 |
msgstr ""
|
534 |
|
535 |
+
#: classes/controllers/FrmFormsController.php:1252
|
536 |
msgid "No Auto P"
|
537 |
msgstr ""
|
538 |
|
539 |
+
#: classes/controllers/FrmFormsController.php:1253
|
540 |
msgid "Do not automatically add any paragraphs or line breaks"
|
541 |
msgstr ""
|
542 |
|
543 |
+
#: classes/controllers/FrmFormsController.php:1268
|
544 |
+
#: classes/models/FrmField.php:62
|
545 |
msgid "User ID"
|
546 |
msgstr ""
|
547 |
|
548 |
+
#: classes/controllers/FrmFormsController.php:1269
|
549 |
msgid "First Name"
|
550 |
msgstr ""
|
551 |
|
552 |
+
#: classes/controllers/FrmFormsController.php:1270
|
553 |
msgid "Last Name"
|
554 |
msgstr ""
|
555 |
|
556 |
+
#: classes/controllers/FrmFormsController.php:1271
|
557 |
msgid "Display Name"
|
558 |
msgstr ""
|
559 |
|
560 |
+
#: classes/controllers/FrmFormsController.php:1272
|
561 |
msgid "User Login"
|
562 |
msgstr ""
|
563 |
|
564 |
+
#: classes/controllers/FrmFormsController.php:1273
|
565 |
#: classes/models/FrmField.php:34
|
566 |
msgid "Email"
|
567 |
msgstr ""
|
568 |
|
569 |
+
#: classes/controllers/FrmFormsController.php:1274
|
570 |
msgid "Avatar"
|
571 |
msgstr ""
|
572 |
|
573 |
+
#: classes/controllers/FrmFormsController.php:1275
|
574 |
msgid "Author Link"
|
575 |
msgstr ""
|
576 |
|
577 |
+
#: classes/controllers/FrmFormsController.php:1288
|
578 |
#: classes/views/frm-entries/sidebar-shared.php:51
|
579 |
msgid "Entry ID"
|
580 |
msgstr ""
|
581 |
|
582 |
+
#: classes/controllers/FrmFormsController.php:1290
|
583 |
msgid "Post ID"
|
584 |
msgstr ""
|
585 |
|
586 |
+
#: classes/controllers/FrmFormsController.php:1291
|
587 |
msgid "User IP"
|
588 |
msgstr ""
|
589 |
|
590 |
+
#: classes/controllers/FrmFormsController.php:1292
|
591 |
msgid "Entry created"
|
592 |
msgstr ""
|
593 |
|
594 |
+
#: classes/controllers/FrmFormsController.php:1293
|
595 |
msgid "Entry updated"
|
596 |
msgstr ""
|
597 |
|
598 |
+
#: classes/controllers/FrmFormsController.php:1295
|
599 |
msgid "Site URL"
|
600 |
msgstr ""
|
601 |
|
602 |
+
#: classes/controllers/FrmFormsController.php:1296
|
603 |
msgid "Site Name"
|
604 |
msgstr ""
|
605 |
|
606 |
+
#: classes/controllers/FrmFormsController.php:1304
|
607 |
msgid "Default Msg"
|
608 |
msgstr ""
|
609 |
|
610 |
+
#: classes/controllers/FrmFormsController.php:1305
|
611 |
msgid "Default HTML"
|
612 |
msgstr ""
|
613 |
|
614 |
+
#: classes/controllers/FrmFormsController.php:1306
|
615 |
msgid "Default Plain"
|
616 |
msgstr ""
|
617 |
|
618 |
+
#: classes/controllers/FrmFormsController.php:1395
|
619 |
msgid "No forms were specified"
|
620 |
msgstr ""
|
621 |
|
622 |
+
#: classes/controllers/FrmFormsController.php:1507
|
623 |
msgid "Abnormal HTML characters prevented your form from saving correctly"
|
624 |
msgstr ""
|
625 |
|
626 |
+
#: classes/controllers/FrmFormsController.php:1622
|
627 |
#: classes/helpers/FrmFormsHelper.php:57
|
628 |
#: classes/helpers/FrmFormsHelper.php:112
|
629 |
#: classes/helpers/FrmFormsHelper.php:166
|
630 |
+
#: classes/helpers/FrmFormsHelper.php:1026
|
631 |
#: classes/helpers/FrmFormsListHelper.php:315
|
632 |
#: classes/views/frm-forms/create-template-from-an-existing-form.php:25
|
633 |
#: classes/views/styles/manage.php:59
|
635 |
msgid "(no title)"
|
636 |
msgstr ""
|
637 |
|
638 |
+
#: classes/controllers/FrmFormsController.php:1668
|
639 |
+
#: classes/controllers/FrmFormsController.php:1682
|
640 |
msgid "Please select a valid form"
|
641 |
msgstr ""
|
642 |
|
643 |
+
#: classes/controllers/FrmFormsController.php:1904
|
644 |
msgid "Please wait while you are redirected."
|
645 |
msgstr ""
|
646 |
|
647 |
#. translators: %1$s: Start link HTML, %2$s: End link HTML
|
648 |
+
#: classes/controllers/FrmFormsController.php:1940
|
649 |
msgid "%1$sClick here%2$s if you are not automatically redirected."
|
650 |
msgstr ""
|
651 |
|
700 |
msgstr ""
|
701 |
|
702 |
#: classes/controllers/FrmSettingsController.php:104
|
703 |
+
#: classes/views/frm-forms/settings-advanced.php:170
|
704 |
msgid "Miscellaneous"
|
705 |
msgstr ""
|
706 |
|
909 |
msgstr ""
|
910 |
|
911 |
#: classes/controllers/FrmStylesController.php:395
|
912 |
+
#: classes/helpers/FrmFormsHelper.php:511
|
913 |
#: classes/views/frm-forms/new-form-overlay.php:53
|
914 |
#: classes/views/frm-forms/new-form-overlay.php:54
|
915 |
#: classes/views/frm-forms/settings-advanced.php:27
|
921 |
msgstr ""
|
922 |
|
923 |
#: classes/controllers/FrmStylesController.php:397
|
924 |
+
#: classes/helpers/FrmFormsHelper.php:471
|
925 |
#: classes/views/frm-fields/back-end/field-description.php:8
|
926 |
msgid "Field Description"
|
927 |
msgstr ""
|
1154 |
msgstr ""
|
1155 |
|
1156 |
#: classes/helpers/FrmAppHelper.php:2448
|
1157 |
+
#: classes/helpers/FrmCSVExportHelper.php:229
|
1158 |
#: classes/views/shared/mb_adv_info.php:95
|
1159 |
msgid "ID"
|
1160 |
msgstr ""
|
1333 |
msgstr ""
|
1334 |
|
1335 |
#: classes/helpers/FrmAppHelper.php:2505
|
1336 |
+
#: classes/helpers/FrmFormsHelper.php:1502
|
1337 |
msgid "See the list of reserved words in WordPress."
|
1338 |
msgstr ""
|
1339 |
|
1622 |
msgid "Renew Now"
|
1623 |
msgstr ""
|
1624 |
|
1625 |
+
#: classes/helpers/FrmCSVExportHelper.php:132
|
1626 |
msgid "(label)"
|
1627 |
msgstr ""
|
1628 |
|
1629 |
+
#: classes/helpers/FrmCSVExportHelper.php:216
|
1630 |
msgid "Comment"
|
1631 |
msgstr ""
|
1632 |
|
1633 |
+
#: classes/helpers/FrmCSVExportHelper.php:217
|
1634 |
msgid "Comment User"
|
1635 |
msgstr ""
|
1636 |
|
1637 |
+
#: classes/helpers/FrmCSVExportHelper.php:218
|
1638 |
msgid "Comment Date"
|
1639 |
msgstr ""
|
1640 |
|
1641 |
+
#: classes/helpers/FrmCSVExportHelper.php:223
|
1642 |
msgid "Timestamp"
|
1643 |
msgstr ""
|
1644 |
|
1645 |
+
#: classes/helpers/FrmCSVExportHelper.php:224
|
1646 |
msgid "Last Updated"
|
1647 |
msgstr ""
|
1648 |
|
1649 |
+
#: classes/helpers/FrmCSVExportHelper.php:226
|
1650 |
msgid "Updated By"
|
1651 |
msgstr ""
|
1652 |
|
1653 |
+
#: classes/helpers/FrmCSVExportHelper.php:227
|
1654 |
+
#: classes/helpers/FrmFormsHelper.php:1229
|
1655 |
#: classes/helpers/FrmFormsListHelper.php:342
|
1656 |
msgid "Draft"
|
1657 |
msgstr ""
|
1658 |
|
1659 |
+
#: classes/helpers/FrmCSVExportHelper.php:228
|
1660 |
msgid "IP"
|
1661 |
msgstr ""
|
1662 |
|
1663 |
+
#: classes/helpers/FrmCSVExportHelper.php:232
|
1664 |
msgid "Parent ID"
|
1665 |
msgstr ""
|
1666 |
|
1737 |
msgstr ""
|
1738 |
|
1739 |
#: classes/helpers/FrmEntriesListHelper.php:309
|
1740 |
+
#: classes/helpers/FrmFormsHelper.php:1134
|
1741 |
#: classes/helpers/FrmFormsListHelper.php:133
|
1742 |
#: classes/views/frm-form-actions/form_action.php:25
|
1743 |
msgid "Delete"
|
2954 |
msgid "(ID %d)"
|
2955 |
msgstr ""
|
2956 |
|
2957 |
+
#: classes/helpers/FrmFormsHelper.php:459
|
2958 |
msgid "Field ID"
|
2959 |
msgstr ""
|
2960 |
|
2961 |
+
#: classes/helpers/FrmFormsHelper.php:463
|
2962 |
#: classes/views/frm-fields/back-end/settings.php:294
|
2963 |
msgid "Field Key"
|
2964 |
msgstr ""
|
2965 |
|
2966 |
+
#: classes/helpers/FrmFormsHelper.php:467
|
2967 |
msgid "Field Name"
|
2968 |
msgstr ""
|
2969 |
|
2970 |
+
#: classes/helpers/FrmFormsHelper.php:475
|
2971 |
#: classes/views/frm-fields/back-end/settings.php:267
|
2972 |
msgid "Label Position"
|
2973 |
msgstr ""
|
2974 |
|
2975 |
+
#: classes/helpers/FrmFormsHelper.php:479
|
2976 |
msgid "Required Label"
|
2977 |
msgstr ""
|
2978 |
|
2979 |
+
#: classes/helpers/FrmFormsHelper.php:483
|
2980 |
msgid "Input Field"
|
2981 |
msgstr ""
|
2982 |
|
2983 |
+
#: classes/helpers/FrmFormsHelper.php:487
|
2984 |
msgid "Single Option"
|
2985 |
msgstr ""
|
2986 |
|
2987 |
+
#: classes/helpers/FrmFormsHelper.php:488
|
2988 |
msgid "Show a single radio or checkbox option by replacing 1 with the order of the option"
|
2989 |
msgstr ""
|
2990 |
|
2991 |
+
#: classes/helpers/FrmFormsHelper.php:492
|
2992 |
msgid "Hide Option Label"
|
2993 |
msgstr ""
|
2994 |
|
2995 |
+
#: classes/helpers/FrmFormsHelper.php:496
|
2996 |
msgid "Required Class"
|
2997 |
msgstr ""
|
2998 |
|
2999 |
+
#: classes/helpers/FrmFormsHelper.php:497
|
3000 |
msgid "Add class name if field is required"
|
3001 |
msgstr ""
|
3002 |
|
3003 |
+
#: classes/helpers/FrmFormsHelper.php:501
|
3004 |
msgid "Error Class"
|
3005 |
msgstr ""
|
3006 |
|
3007 |
+
#: classes/helpers/FrmFormsHelper.php:502
|
3008 |
msgid "Add class name if field has an error on form submit"
|
3009 |
msgstr ""
|
3010 |
|
3011 |
+
#: classes/helpers/FrmFormsHelper.php:507
|
3012 |
#: classes/views/frm-forms/new-form-overlay.php:46
|
3013 |
#: classes/views/frm-forms/new-form-overlay.php:47
|
3014 |
msgid "Form Name"
|
3015 |
msgstr ""
|
3016 |
|
3017 |
+
#: classes/helpers/FrmFormsHelper.php:515
|
3018 |
#: classes/views/frm-forms/settings-advanced.php:20
|
3019 |
msgid "Form Key"
|
3020 |
msgstr ""
|
3021 |
|
3022 |
+
#: classes/helpers/FrmFormsHelper.php:519
|
3023 |
msgid "Delete Entry Link"
|
3024 |
msgstr ""
|
3025 |
|
3026 |
+
#: classes/helpers/FrmFormsHelper.php:524
|
3027 |
msgid "Button Label"
|
3028 |
msgstr ""
|
3029 |
|
3030 |
+
#: classes/helpers/FrmFormsHelper.php:528
|
3031 |
msgid "Button Hook"
|
3032 |
msgstr ""
|
3033 |
|
3034 |
+
#: classes/helpers/FrmFormsHelper.php:994
|
3035 |
msgid "Create Form from Template"
|
3036 |
msgstr ""
|
3037 |
|
3038 |
+
#: classes/helpers/FrmFormsHelper.php:1000
|
3039 |
msgid "Duplicate Form"
|
3040 |
msgstr ""
|
3041 |
|
3042 |
+
#: classes/helpers/FrmFormsHelper.php:1121
|
3043 |
msgid "Restore from Trash"
|
3044 |
msgstr ""
|
3045 |
|
3046 |
+
#: classes/helpers/FrmFormsHelper.php:1122
|
3047 |
#: classes/helpers/FrmFormsListHelper.php:124
|
3048 |
msgid "Restore"
|
3049 |
msgstr ""
|
3050 |
|
3051 |
+
#: classes/helpers/FrmFormsHelper.php:1126
|
3052 |
msgid "Move Form to Trash"
|
3053 |
msgstr ""
|
3054 |
|
3055 |
+
#: classes/helpers/FrmFormsHelper.php:1127
|
3056 |
+
#: classes/helpers/FrmFormsHelper.php:1230
|
3057 |
#: classes/helpers/FrmFormsListHelper.php:158
|
3058 |
msgid "Trash"
|
3059 |
msgstr ""
|
3060 |
|
3061 |
+
#: classes/helpers/FrmFormsHelper.php:1130
|
3062 |
msgid "Do you want to move this form to the trash?"
|
3063 |
msgstr ""
|
3064 |
|
3065 |
+
#: classes/helpers/FrmFormsHelper.php:1133
|
3066 |
#: classes/helpers/FrmFormsListHelper.php:128
|
3067 |
msgid "Delete Permanently"
|
3068 |
msgstr ""
|
3069 |
|
3070 |
+
#: classes/helpers/FrmFormsHelper.php:1136
|
3071 |
msgid "Are you sure you want to delete this form and all its entries?"
|
3072 |
msgstr ""
|
3073 |
|
3074 |
+
#: classes/helpers/FrmFormsHelper.php:1138
|
3075 |
msgid "This will permanently delete the form and all its entries. This is irreversible. Are you sure you want to continue?"
|
3076 |
msgstr ""
|
3077 |
|
3078 |
+
#: classes/helpers/FrmFormsHelper.php:1149
|
3079 |
+
#: classes/models/FrmField.php:193
|
3080 |
msgid "Total"
|
3081 |
msgstr ""
|
3082 |
|
3083 |
+
#: classes/helpers/FrmFormsHelper.php:1150
|
3084 |
msgid "Add this to a read-only field to display the text in bold without a border or background."
|
3085 |
msgstr ""
|
3086 |
|
3087 |
+
#: classes/helpers/FrmFormsHelper.php:1153
|
3088 |
msgid "Big Total"
|
3089 |
msgstr ""
|
3090 |
|
3091 |
+
#: classes/helpers/FrmFormsHelper.php:1154
|
3092 |
msgid "Add this to a read-only field to display the text in large, bold text without a border or background."
|
3093 |
msgstr ""
|
3094 |
|
3095 |
+
#: classes/helpers/FrmFormsHelper.php:1157
|
3096 |
msgid "Scroll Box"
|
3097 |
msgstr ""
|
3098 |
|
3099 |
+
#: classes/helpers/FrmFormsHelper.php:1158
|
3100 |
msgid "If you have many checkbox or radio button options, you may add this class to allow your user to easily scroll through the options. Or add a scrolling area around content in an HTML field."
|
3101 |
msgstr ""
|
3102 |
|
3103 |
+
#: classes/helpers/FrmFormsHelper.php:1161
|
3104 |
+
#: classes/models/fields/FrmFieldName.php:28
|
3105 |
msgid "First"
|
3106 |
msgstr ""
|
3107 |
|
3108 |
+
#: classes/helpers/FrmFormsHelper.php:1162
|
3109 |
msgid "Add this to the first field in each row along with a width. ie frm_first frm4"
|
3110 |
msgstr ""
|
3111 |
|
3112 |
+
#: classes/helpers/FrmFormsHelper.php:1164
|
3113 |
#: classes/helpers/FrmStylesHelper.php:113
|
3114 |
msgid "Right"
|
3115 |
msgstr ""
|
3116 |
|
3117 |
+
#: classes/helpers/FrmFormsHelper.php:1165
|
3118 |
msgid "First Grid Row"
|
3119 |
msgstr ""
|
3120 |
|
3121 |
+
#: classes/helpers/FrmFormsHelper.php:1166
|
3122 |
msgid "Even Grid Row"
|
3123 |
msgstr ""
|
3124 |
|
3125 |
+
#: classes/helpers/FrmFormsHelper.php:1167
|
3126 |
msgid "Odd Grid Row"
|
3127 |
msgstr ""
|
3128 |
|
3129 |
+
#: classes/helpers/FrmFormsHelper.php:1169
|
3130 |
msgid "Color Block"
|
3131 |
msgstr ""
|
3132 |
|
3133 |
+
#: classes/helpers/FrmFormsHelper.php:1170
|
3134 |
msgid "Add a background color to the field or section."
|
3135 |
msgstr ""
|
3136 |
|
3137 |
+
#: classes/helpers/FrmFormsHelper.php:1173
|
3138 |
msgid "Capitalize"
|
3139 |
msgstr ""
|
3140 |
|
3141 |
+
#: classes/helpers/FrmFormsHelper.php:1174
|
3142 |
msgid "Automatically capitalize the first letter in each word."
|
3143 |
msgstr ""
|
3144 |
|
3145 |
+
#: classes/helpers/FrmFormsHelper.php:1231
|
3146 |
msgid "Published"
|
3147 |
msgstr ""
|
3148 |
|
3149 |
+
#: classes/helpers/FrmFormsHelper.php:1315
|
3150 |
msgid "Create Form"
|
3151 |
msgstr ""
|
3152 |
|
3153 |
+
#: classes/helpers/FrmFormsHelper.php:1323
|
3154 |
msgid "Renew"
|
3155 |
msgstr ""
|
3156 |
|
3157 |
+
#: classes/helpers/FrmFormsHelper.php:1387
|
3158 |
msgid "License plan required:"
|
3159 |
msgstr ""
|
3160 |
|
3161 |
+
#: classes/helpers/FrmFormsHelper.php:1501
|
3162 |
msgid "Is this intentional?"
|
3163 |
msgstr ""
|
3164 |
|
3165 |
#. translators: %s: the name of a single parameter in the redirect URL
|
3166 |
+
#: classes/helpers/FrmFormsHelper.php:1511
|
3167 |
msgid "The redirect URL is using the parameter \"%s\", which is reserved by WordPress. "
|
3168 |
msgstr ""
|
3169 |
|
3170 |
#. translators: %s: the names of two or more parameters in the redirect URL, separated by commas
|
3171 |
+
#: classes/helpers/FrmFormsHelper.php:1517
|
3172 |
msgid "The redirect URL is using the parameters \"%s\", which are reserved by WordPress. "
|
3173 |
msgstr ""
|
3174 |
|
3640 |
msgid "Go to imported form"
|
3641 |
msgstr ""
|
3642 |
|
3643 |
+
#: classes/helpers/FrmXMLHelper.php:1298
|
3644 |
msgid "Create Posts"
|
3645 |
msgstr ""
|
3646 |
|
3647 |
+
#: classes/helpers/FrmXMLHelper.php:1427
|
3648 |
msgid "Email Notification"
|
3649 |
msgstr ""
|
3650 |
|
3672 |
msgid "Option 2"
|
3673 |
msgstr ""
|
3674 |
|
3675 |
+
#: classes/models/fields/FrmFieldCombo.php:190
|
3676 |
+
#: classes/views/frm-fields/back-end/settings.php:134
|
3677 |
+
msgid "Default Value"
|
3678 |
+
msgstr ""
|
3679 |
+
|
3680 |
+
#: classes/models/fields/FrmFieldCombo.php:191
|
3681 |
+
#: classes/views/frm-fields/back-end/settings.php:180
|
3682 |
+
msgid "Placeholder Text"
|
3683 |
+
msgstr ""
|
3684 |
+
|
3685 |
+
#: classes/models/fields/FrmFieldCombo.php:192
|
3686 |
+
msgid "Description"
|
3687 |
+
msgstr ""
|
3688 |
+
|
3689 |
+
#: classes/models/fields/FrmFieldName.php:29
|
3690 |
+
msgid "Middle"
|
3691 |
+
msgstr ""
|
3692 |
+
|
3693 |
+
#: classes/models/fields/FrmFieldName.php:30
|
3694 |
+
msgid "Last"
|
3695 |
+
msgstr ""
|
3696 |
+
|
3697 |
#: classes/models/fields/FrmFieldNumber.php:68
|
3698 |
msgid "Please select a higher number"
|
3699 |
msgstr ""
|
3790 |
msgid "There was a %1$s error: %2$s"
|
3791 |
msgstr ""
|
3792 |
|
3793 |
+
#: classes/models/FrmAntiSpam.php:256
|
3794 |
+
msgid "This page isn't loading JavaScript properly, and the form will not be able to submit."
|
3795 |
+
msgstr ""
|
3796 |
+
|
3797 |
+
#: classes/models/FrmAntiSpam.php:267
|
3798 |
+
msgid "Form token is invalid. Please refresh the page."
|
3799 |
+
msgstr ""
|
3800 |
+
|
3801 |
+
#. translators: %1$s start link, %2$s end link.
|
3802 |
+
#: classes/models/FrmAntiSpam.php:288
|
3803 |
+
msgid "Please check out our %1$stroubleshooting guide%2$s for details on resolving this issue."
|
3804 |
+
msgstr ""
|
3805 |
+
|
3806 |
#: classes/models/FrmDb.php:447
|
3807 |
msgid "Use the query in an array format so it can be properly prepared."
|
3808 |
msgstr ""
|
3836 |
msgid "There was a problem with your submission. Please try again."
|
3837 |
msgstr ""
|
3838 |
|
3839 |
+
#: classes/models/FrmEntryValidate.php:236
|
3840 |
+
#: classes/models/FrmEntryValidate.php:240
|
3841 |
msgid "Your entry appears to be spam!"
|
3842 |
msgstr ""
|
3843 |
|
3844 |
+
#: classes/models/FrmEntryValidate.php:238
|
3845 |
msgid "Your entry appears to be blocked spam!"
|
3846 |
msgstr ""
|
3847 |
|
3883 |
msgstr ""
|
3884 |
|
3885 |
#: classes/models/FrmField.php:46
|
3886 |
+
msgid "Name"
|
3887 |
msgstr ""
|
3888 |
|
3889 |
#: classes/models/FrmField.php:50
|
3890 |
+
msgid "Phone"
|
3891 |
msgstr ""
|
3892 |
|
3893 |
#: classes/models/FrmField.php:54
|
3894 |
+
msgid "HTML"
|
3895 |
+
msgstr ""
|
3896 |
+
|
3897 |
+
#: classes/models/FrmField.php:58
|
3898 |
msgid "Hidden"
|
3899 |
msgstr ""
|
3900 |
|
3901 |
+
#: classes/models/FrmField.php:66
|
3902 |
msgid "reCAPTCHA"
|
3903 |
msgstr ""
|
3904 |
|
3905 |
+
#: classes/models/FrmField.php:77
|
3906 |
msgid "File Upload"
|
3907 |
msgstr ""
|
3908 |
|
3909 |
+
#: classes/models/FrmField.php:82
|
3910 |
msgid "Rich Text"
|
3911 |
msgstr ""
|
3912 |
|
3913 |
+
#: classes/models/FrmField.php:90
|
3914 |
msgid "Time"
|
3915 |
msgstr ""
|
3916 |
|
3917 |
+
#: classes/models/FrmField.php:94
|
3918 |
msgid "Scale"
|
3919 |
msgstr ""
|
3920 |
|
3921 |
+
#: classes/models/FrmField.php:99
|
3922 |
msgid "Star Rating"
|
3923 |
msgstr ""
|
3924 |
|
3925 |
+
#: classes/models/FrmField.php:103
|
3926 |
msgid "Slider"
|
3927 |
msgstr ""
|
3928 |
|
3929 |
+
#: classes/models/FrmField.php:107
|
3930 |
msgid "Toggle"
|
3931 |
msgstr ""
|
3932 |
|
3933 |
+
#: classes/models/FrmField.php:111
|
3934 |
msgid "Dynamic"
|
3935 |
msgstr ""
|
3936 |
|
3937 |
+
#: classes/models/FrmField.php:116
|
3938 |
msgid "Lookup"
|
3939 |
msgstr ""
|
3940 |
|
3941 |
+
#: classes/models/FrmField.php:121
|
3942 |
msgid "Repeater"
|
3943 |
msgstr ""
|
3944 |
|
3945 |
+
#: classes/models/FrmField.php:126
|
3946 |
#: classes/models/FrmFormMigrator.php:302
|
3947 |
msgid "Section Buttons"
|
3948 |
msgstr ""
|
3949 |
|
3950 |
+
#: classes/models/FrmField.php:130
|
3951 |
msgid "Section"
|
3952 |
msgstr ""
|
3953 |
|
3954 |
+
#: classes/models/FrmField.php:134
|
3955 |
msgid "Page Break"
|
3956 |
msgstr ""
|
3957 |
|
3958 |
+
#: classes/models/FrmField.php:139
|
3959 |
msgid "Embed Form"
|
3960 |
msgstr ""
|
3961 |
|
3962 |
+
#: classes/models/FrmField.php:143
|
3963 |
msgid "Password"
|
3964 |
msgstr ""
|
3965 |
|
3966 |
+
#: classes/models/FrmField.php:147
|
3967 |
msgid "Tags"
|
3968 |
msgstr ""
|
3969 |
|
3970 |
+
#: classes/models/FrmField.php:151
|
3971 |
msgid "Credit Card"
|
3972 |
msgstr ""
|
3973 |
|
3974 |
+
#: classes/models/FrmField.php:156
|
3975 |
msgid "Address"
|
3976 |
msgstr ""
|
3977 |
|
3978 |
+
#: classes/models/FrmField.php:160
|
3979 |
msgid "Summary"
|
3980 |
msgstr ""
|
3981 |
|
3982 |
+
#: classes/models/FrmField.php:165
|
3983 |
msgid "Signature"
|
3984 |
msgstr ""
|
3985 |
|
3986 |
+
#: classes/models/FrmField.php:170
|
3987 |
msgid "Quiz Score"
|
3988 |
msgstr ""
|
3989 |
|
3990 |
+
#: classes/models/FrmField.php:175
|
3991 |
msgid "Appointment"
|
3992 |
msgstr ""
|
3993 |
|
3994 |
+
#: classes/models/FrmField.php:183
|
3995 |
msgid "Product"
|
3996 |
msgstr ""
|
3997 |
|
3998 |
+
#: classes/models/FrmField.php:188
|
3999 |
msgid "Quantity"
|
4000 |
msgstr ""
|
4001 |
|
4051 |
msgid "Default Form"
|
4052 |
msgstr ""
|
4053 |
|
4054 |
+
#: classes/models/FrmHoneypot.php:77
|
4055 |
+
msgid "If you are human, leave this field blank."
|
4056 |
+
msgstr ""
|
4057 |
+
|
4058 |
#: classes/models/FrmMigrate.php:564
|
4059 |
msgid "Sending"
|
4060 |
msgstr ""
|
4280 |
msgid "You did not add any fields to your form. %1$sGo back%2$s and add some."
|
4281 |
msgstr ""
|
4282 |
|
|
|
|
|
|
|
|
|
4283 |
#: classes/views/frm-entries/list.php:14
|
4284 |
#: classes/views/frm-entries/list.php:25
|
4285 |
msgid "Form Entries"
|
4481 |
msgid "Max Characters"
|
4482 |
msgstr ""
|
4483 |
|
4484 |
+
#: classes/views/frm-fields/back-end/name/primary-options.php:23
|
4485 |
+
msgid "Name layout"
|
4486 |
+
msgstr ""
|
4487 |
+
|
4488 |
+
#: classes/views/frm-fields/back-end/name/primary-options.php:35
|
4489 |
+
msgid "First Last"
|
4490 |
+
msgstr ""
|
4491 |
+
|
4492 |
+
#: classes/views/frm-fields/back-end/name/primary-options.php:38
|
4493 |
+
msgid "Last First"
|
4494 |
+
msgstr ""
|
4495 |
+
|
4496 |
+
#: classes/views/frm-fields/back-end/name/primary-options.php:41
|
4497 |
+
msgid "First Middle Last"
|
4498 |
+
msgstr ""
|
4499 |
+
|
4500 |
#: classes/views/frm-fields/back-end/number-range.php:7
|
4501 |
msgid "Set the number range the field validation should allow. Browsers that support the HTML5 number field require a number range to determine the numbers seen when clicking the arrows next to the field."
|
4502 |
msgstr ""
|
4581 |
msgid "Advanced"
|
4582 |
msgstr ""
|
4583 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4584 |
#: classes/views/frm-fields/back-end/settings.php:214
|
4585 |
msgid "If this URL points to an image, show to image on the entries listing page."
|
4586 |
msgstr ""
|
5161 |
msgstr ""
|
5162 |
|
5163 |
#: classes/views/frm-forms/settings-advanced.php:67
|
5164 |
+
#: classes/views/frm-forms/settings-advanced.php:161
|
5165 |
msgid "On Submit"
|
5166 |
msgstr ""
|
5167 |
|
5189 |
msgid "Do not store entries submitted from this form"
|
5190 |
msgstr ""
|
5191 |
|
5192 |
+
#: classes/views/frm-forms/settings-advanced.php:125
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5193 |
msgid "AJAX"
|
5194 |
msgstr ""
|
5195 |
|
5196 |
+
#: classes/views/frm-forms/settings-advanced.php:126
|
5197 |
msgid "Make stuff happen in the background without a page refresh"
|
5198 |
msgstr ""
|
5199 |
|
5200 |
+
#: classes/views/frm-forms/settings-advanced.php:133
|
5201 |
msgid "Load and save form builder page with AJAX"
|
5202 |
msgstr ""
|
5203 |
|
5204 |
+
#: classes/views/frm-forms/settings-advanced.php:134
|
5205 |
msgid "Recommended for long forms."
|
5206 |
msgstr ""
|
5207 |
|
5208 |
+
#: classes/views/frm-forms/settings-advanced.php:143
|
5209 |
msgid "Validate this form with javascript"
|
5210 |
msgstr ""
|
5211 |
|
5212 |
+
#: classes/views/frm-forms/settings-advanced.php:144
|
5213 |
msgid "Required fields, email format, and number format can be checked instantly in your browser. You may want to turn this option off if you have any customizations to remove validation messages on certain fields."
|
5214 |
msgstr ""
|
5215 |
|
5216 |
+
#: classes/views/frm-forms/settings-advanced.php:155
|
5217 |
msgid "Messages"
|
5218 |
msgstr ""
|
5219 |
|
5220 |
+
#: classes/views/frm-forms/settings-advanced.php:156
|
5221 |
msgid "Set up your confirmation messages."
|
5222 |
msgstr ""
|
5223 |
|
5271 |
msgid "Select a form:"
|
5272 |
msgstr ""
|
5273 |
|
5274 |
+
#: classes/views/frm-forms/spam-settings/akismet.php:7
|
5275 |
+
msgid "Use Akismet to check entries for spam for"
|
5276 |
+
msgstr ""
|
5277 |
+
|
5278 |
+
#: classes/views/frm-forms/spam-settings/akismet.php:10
|
5279 |
+
msgid "no one"
|
5280 |
+
msgstr ""
|
5281 |
+
|
5282 |
+
#: classes/views/frm-forms/spam-settings/akismet.php:13
|
5283 |
+
msgid "everyone"
|
5284 |
+
msgstr ""
|
5285 |
+
|
5286 |
+
#: classes/views/frm-forms/spam-settings/akismet.php:16
|
5287 |
+
msgid "visitors who are not logged in"
|
5288 |
+
msgstr ""
|
5289 |
+
|
5290 |
+
#: classes/views/frm-forms/spam-settings/antispam.php:9
|
5291 |
+
msgid "Check entries for spam using JavaScript"
|
5292 |
+
msgstr ""
|
5293 |
+
|
5294 |
+
#: classes/views/frm-forms/spam-settings/honeypot.php:8
|
5295 |
+
msgid "Use Honeypot to check entries for spam"
|
5296 |
+
msgstr ""
|
5297 |
+
|
5298 |
+
#: classes/views/frm-forms/spam-settings/honeypot.php:10
|
5299 |
+
msgid "Off"
|
5300 |
+
msgstr ""
|
5301 |
+
|
5302 |
+
#: classes/views/frm-forms/spam-settings/honeypot.php:11
|
5303 |
+
msgid "Basic"
|
5304 |
+
msgstr ""
|
5305 |
+
|
5306 |
+
#: classes/views/frm-forms/spam-settings/honeypot.php:12
|
5307 |
+
msgid "Strict"
|
5308 |
+
msgstr ""
|
5309 |
+
|
5310 |
#: classes/views/frm-forms/_no_forms.php:17
|
5311 |
msgid "Add New Form"
|
5312 |
msgstr ""
|
readme.txt
CHANGED
@@ -5,7 +5,7 @@ Tags: forms, contact form, form builder, survey, form maker, form creator, paypa
|
|
5 |
Requires at least: 4.7
|
6 |
Tested up to: 5.7.2
|
7 |
Requires PHP: 5.6
|
8 |
-
Stable tag: 4.
|
9 |
|
10 |
The most advanced WordPress forms plugin. Go beyond contact forms with our drag & drop form builder for surveys, quizzes, and more.
|
11 |
|
@@ -436,6 +436,13 @@ Using our Zapier integration, you can easily connect Formidable with over 1000+
|
|
436 |
See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
|
437 |
|
438 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
439 |
= 4.10.03 =
|
440 |
* New: Improved the performance of the style editor preview.
|
441 |
* New: You can now sign up for free form templates directly from your inbox.
|
@@ -444,7 +451,7 @@ See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zap
|
|
444 |
* Fix: Actions would occasionally conflict if multiple were added too quickly.
|
445 |
|
446 |
= 4.10.02 =
|
447 |
-
* New: Added support for in-theme previews for more themes including Twenty Twenty and
|
448 |
|
449 |
= 4.10.01 =
|
450 |
* New: Include the full email header when an email is sent using the mail function.
|
@@ -454,1071 +461,15 @@ See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zap
|
|
454 |
= 4.10 =
|
455 |
* Fix: Some fields, including signatures, were not properly detecting duplicate entries.
|
456 |
* Fix: Zeros were not appearing when used as a placeholder value.
|
457 |
-
* Fix: Prevent a warning when previewing a form with no fields.
|
458 |
|
459 |
= 4.09.08 =
|
460 |
-
* New: If you add or remove an action
|
461 |
* Fix: The style editor save button was hidden in WordPress 5.7.
|
462 |
* Fix: There were a couple of words misspelled on the welcome page.
|
463 |
|
464 |
= 4.09.07 =
|
465 |
-
* Fix: Duplicated
|
466 |
* Fix: Fields for controlling radio options in the form builder were not using unique id attribute values.
|
467 |
|
468 |
-
= 4.09.06 =
|
469 |
-
* New: Added a new welcome screen to introduce new users to Formidable.
|
470 |
-
* Fix: Make sure that Site Health exists when upgrading.
|
471 |
-
* Fix: Invalid message data was occasionally appearing in the Inbox.
|
472 |
-
* Fix: Excluded checkbox options were not properly toggling for Action Taxonomies.
|
473 |
-
* Fix: Some pop ups were occasionally including outdated text.
|
474 |
-
|
475 |
-
= 4.09.05 =
|
476 |
-
* Fix: Autofill was flagging form submissions as spam with Honeypot in some browsers.
|
477 |
-
* Fix: Important security update that adds better escaping when text is used from attribute data.
|
478 |
-
|
479 |
-
= 4.09.04 =
|
480 |
-
* Fix: The form builder page wasn't always loading all fields correctly when loaded with ajax.
|
481 |
-
* New: frm_global_switch_fields and frm_maybe_switch_field_ids hooks for changing field ids in a form action when a form is duplicated.
|
482 |
-
|
483 |
-
= 4.09.03 =
|
484 |
-
* New: Added frm_run_honeypot hook to turn off honeypot. Return false to disable or 'limit' to hide from screenreader.
|
485 |
-
* Moved honeypot back to front of form to catch more spam.
|
486 |
-
* Fix: dropdown fields were cut off in the admin area in WordPress 5.6.
|
487 |
-
* Fix: Update a few deprecated jQuery functions.
|
488 |
-
* Fix: Prevent some duplicate database queries on the back end.
|
489 |
-
|
490 |
-
= 4.09.02 =
|
491 |
-
* Show a warning when leaving the form settings page with unsaved changes.
|
492 |
-
* Make the process for using free form templates more clear.
|
493 |
-
|
494 |
-
= 4.09.01 =
|
495 |
-
* Don't include a link in the entries list to the form page when the user doesn't have permission to see anything there.
|
496 |
-
|
497 |
-
= 4.09 =
|
498 |
-
* New: Updated the UX for creating a new blank form or from a template.
|
499 |
-
* Fix: Duplicating a closed form action didn't copy correctly.
|
500 |
-
* Fix: PHP warnings showed on the add-ons page on some sites.
|
501 |
-
|
502 |
-
= 4.08 =
|
503 |
-
* New: Added confirmation before forms are deleted in bulk.
|
504 |
-
* Allow a value to pass validation if the entered value matches the placeholder setting.
|
505 |
-
* Fix: Email addresses were not being sent to Akismet for logged out users, and resulting in some false positive spam.
|
506 |
-
* Fix: Some sites have been getting duplicate entries days apart. This issue should be fixed.
|
507 |
-
* Fix: Searching when switching between forms no longer triggers the confirmation message when leaving the page.
|
508 |
-
|
509 |
-
= 4.07.01 =
|
510 |
-
* New: Show a warning when leaving the form builder page with unsaved changes.
|
511 |
-
* Fix: Make any multiselect dropdowns in admin settings accessible.
|
512 |
-
* Fix: aria-invalid attribute was missing on form elements for accessibility.
|
513 |
-
|
514 |
-
= 4.07 =
|
515 |
-
* New: Use frm_inline_success for the form class in the customized HTML to move the success message next to the submit button. "frm_inline_success frm_alignright_success" will right-align the message.
|
516 |
-
* Tweak: Improve the form listing page and entry listings page when nothing has been created.
|
517 |
-
* Fix: Update the recaptcha for better reliability to catch more spam.
|
518 |
-
|
519 |
-
= 4.06.03 =
|
520 |
-
* More consistent dropdown styling with multiselect dropdowns.
|
521 |
-
* Prepare the code for handling permissions options as an array of roles.
|
522 |
-
* Fix: WP 5.5 - Email subject lines were coming through encoded.
|
523 |
-
* Fix: WP 5.5 - When WP Mail SMTP was installed, the Formidable SMTP page has an error.
|
524 |
-
|
525 |
-
= 4.06.02 =
|
526 |
-
* New: Added frm_field_value_object hook for making adjustments to the field before it's label and value is displayed.
|
527 |
-
* New: Added frm_xml_response hook for altering the message/response when an XML file is imported.
|
528 |
-
* Fix: Updated deprecated blacklist functions in WP 5.5.
|
529 |
-
* Fix: Add more checks to the installation triggers to prevent them from being triggered at unintended times.
|
530 |
-
* Show a more helpful error message in some cases when the XML import fails.
|
531 |
-
|
532 |
-
= 4.06.01 =
|
533 |
-
* Remove the top level nav notification for inbox notifications.
|
534 |
-
* Use the frm_display_value hook for each different case where values are displayed (entries list table, view an entry, summary field...)
|
535 |
-
* Fix: Left and right margin setting on buttons was being ignored. Use something like "10px 10px" in the button margin setting to show margins on the sides.
|
536 |
-
* Fix: Prevent a js error in some cases when the ajax response isn't json.
|
537 |
-
|
538 |
-
= 4.06 =
|
539 |
-
* New: Better accessibility for honeypot field and message after submit.
|
540 |
-
* New: Add a Dismiss all button in the inbox.
|
541 |
-
* New: Add 'frm_user_id_display' hook for showing something other than the dispay name by default in user ID fields.
|
542 |
-
* Set the default styling to use grids since most browsers support it now.
|
543 |
-
* Fix: On some sites, permissions were preventing a form from being created from a template.
|
544 |
-
* Fix: The button colors were overriding eachother with some settings.
|
545 |
-
|
546 |
-
= 4.05.02 =
|
547 |
-
* New: Added frm_message_placement hook to show the form message below the form
|
548 |
-
* New: New classes that can be used in the 'form class' setting: frm_plain_success (Removes styling from the success message) and frm_below_success (Movs the success message below the form).
|
549 |
-
* Add Formidable back to the admin bar. This is now a setting if the default WordPress v5.2+ behavior is desired.
|
550 |
-
* Fix: Reiew requests were added to the inbox too frequently with sites with multiple admins.
|
551 |
-
* Fix: Elementor conflict by using the glost $post in the admin area.
|
552 |
-
* Fix: The color picker position in the styling settings was off for some options.
|
553 |
-
|
554 |
-
= 4.05.01 =
|
555 |
-
* Fix: The entry list wasn't always showing the entries.
|
556 |
-
* Better sync between review requests in inbox and message.
|
557 |
-
|
558 |
-
= 4.05 =
|
559 |
-
* Updates to the default form styling.
|
560 |
-
* New: Added an inbox as a centralized place for notices and communication.
|
561 |
-
* New: Added frm_color_block and frm_total_big classes for more beautiful forms.
|
562 |
-
* Help prevent common email issues by showing a warning in the email settings when the from and to email addresses are the same.
|
563 |
-
* Fix: Forms edited after export and reimported were losing the required indicator in some cases.
|
564 |
-
|
565 |
-
= 4.04.05 =
|
566 |
-
* When some styling settings are blank, allow inheritance from theme styling.
|
567 |
-
* Allow a form action to be updated during form migration.
|
568 |
-
* Code: Update javascript codestyling.
|
569 |
-
|
570 |
-
= 4.04.04 =
|
571 |
-
* Increased WP version requirement to 4.7.
|
572 |
-
* Added more options on Import/Export page depending on what other plugins are installed.
|
573 |
-
* More reliably add new options in fields when also reordering.
|
574 |
-
* Fix: When a newly added option is set as the default value, save it correctly.
|
575 |
-
* Added an easy way to install and SMTP plugin for better email deliverability.
|
576 |
-
|
577 |
-
= 4.04.03 =
|
578 |
-
* Add option to Import forms on the form listing page and in the new form process.
|
579 |
-
* Improve performance on the form settings page when default values are used in fields.
|
580 |
-
* Update the base migrator class for more flexibility.
|
581 |
-
* Fix: Prevent a few PHP warnings.
|
582 |
-
|
583 |
-
= 4.04.02 =
|
584 |
-
* Don't load the front end form js in the builder/settings.
|
585 |
-
* Fix: Some database prefixes weren't working correctly with many database calls: "rm", "fr", "_".
|
586 |
-
* Fix: Remove incorrect instructions for input masks and allow uppercase characters with 'a' in the input mask.
|
587 |
-
* Fix: Save value as array when single box is checked. This resolves a conflict when used with ACF.
|
588 |
-
* Fix: The 5/6th class was the wrong size when CSS grids are turned off.
|
589 |
-
* Fix: More accurately set the default options to fade in fields and use CSS grids.
|
590 |
-
* Fix: Sort country list by the current locale.
|
591 |
-
|
592 |
-
= 4.04.01 =
|
593 |
-
* Performance: Improve speed when creating a unique entry key.
|
594 |
-
* Performance: Always return a single result with FrmDb::get_var().
|
595 |
-
* Fix: Resolve php warning showing on form builder with some fields.
|
596 |
-
* Fix: Fix deprecated implode() strings for PHP 7.4.
|
597 |
-
* Fix: Prevent possibility of extra entry being deleted when switching forms right after deleting an entry.
|
598 |
-
* Fix: In some cases, a PHP warning was shown when redirecting after submit.
|
599 |
-
|
600 |
-
= 4.04 =
|
601 |
-
* New: Show a warning if a WordPress parameter is used in the redirect URL to prevent unintented results.
|
602 |
-
* New: Added frm_is_field_type hook to set if an individual field is shown as radio or checkbox
|
603 |
-
* New: Show the new pricing fields in the builder for product education.
|
604 |
-
|
605 |
-
= 4.03.07 =
|
606 |
-
* Project Delight: Make admin-side tooltips more enjoyable and helpful.
|
607 |
-
* Add several missing countries to the country list.
|
608 |
-
* Fix: Prevent duplicate localization strings from showing in the page source.
|
609 |
-
|
610 |
-
= 4.03.06 =
|
611 |
-
* New: Use autocomplete for settings for selecting a WordPress page for faster load time on sites with many pages.
|
612 |
-
* Fix: When saving conditional logic settings in WP 5.3.1, there was a PHP error message showing on some sites.
|
613 |
-
* Fix: Custom CSS was being sanitized incorrectly and > was switched to &rt;
|
614 |
-
|
615 |
-
= 4.03.05 =
|
616 |
-
* New: Add a center alignment option for section headings.
|
617 |
-
* Keep the add field & field options links fixed to prevent extra scrolling to add more fields.
|
618 |
-
* Add live searching on the add-ons page.
|
619 |
-
* Fix: When only one box was selected for the default value in a checkbox field, it wasn't being checked.
|
620 |
-
* Fix: Recaptcha labels are included for accessibility.
|
621 |
-
|
622 |
-
= 4.03.04 =
|
623 |
-
* Better compatibility with WP 5.3.
|
624 |
-
* Switch from using date to gmdate per WP codestyling recommendations.
|
625 |
-
* Fix: Prevent undefined get_plugins error on some sites.
|
626 |
-
|
627 |
-
= 4.03.03 =
|
628 |
-
* Fix: There was an error on form submit when Pro was not installed.
|
629 |
-
|
630 |
-
= 4.03.02 =
|
631 |
-
* Add 'frm_form_object' hook run when a form is fetched from the database.
|
632 |
-
* Include more education about field types, including the new Appointments field.
|
633 |
-
* Fix: Dropdown fields weren't saving HTML values correctly.
|
634 |
-
|
635 |
-
= 4.03.01 =
|
636 |
-
* Add an option to filter form templates by category.
|
637 |
-
* Add the refresh downloads link on the add-ons and form templates pages.
|
638 |
-
* Fix: If HTML entities are intentionally saved in a field, keep it that way rather than converting to the value.
|
639 |
-
* Fix: Prevent a js error with some plugins when the WP editor is loaded on a custom page.
|
640 |
-
|
641 |
-
= 4.03 =
|
642 |
-
* New: Add an easier way to upgrade to the Pro version.
|
643 |
-
* New: When the default Contact form is created, use the email address in the form as the Reply to address.
|
644 |
-
* Fix: On some sites, the Formidable js wasn't loading correctly and causing errors.
|
645 |
-
* Fix: Don't include generated css with plugin. Some sites weren't updating it.
|
646 |
-
* New: Added frm_before_create_field hook while a field is being created from the builder. This allows extra fields to be included at once.
|
647 |
-
|
648 |
-
= 4.02.04 =
|
649 |
-
* Add a bit more in-plugin education and guidance for using Styles.
|
650 |
-
* Add styling for Stripe credit card fields.
|
651 |
-
* Fix: Prevent the localized javascript info from being duplicated in the page source.
|
652 |
-
* Fix: Use the current date for the auto-created contact form.
|
653 |
-
* Remove a bit of unused code.
|
654 |
-
|
655 |
-
= 4.02.03 =
|
656 |
-
* Security: Don't unserialize values posted in field options in admin area.
|
657 |
-
* Start switching any data saved with serializing to json, including cache keys and default values.
|
658 |
-
* Save styling settings with json instead of serialized array.
|
659 |
-
|
660 |
-
= 4.02.02 =
|
661 |
-
* Security: Correctly escape values on the View Entry page.
|
662 |
-
* Include a message on the Entries page about how to prevent spam.
|
663 |
-
* Show the reCaptcha badge for invisible recaptcha since it's required by their terms.
|
664 |
-
* Fix: Show the correct labels on template buttons (Upgrade vs Renew)
|
665 |
-
|
666 |
-
= 4.02.01 =
|
667 |
-
* Security: Fix vulnerability with unserializing.
|
668 |
-
* Code: Refactor field settings to make it easier to add a section for field options/choices.
|
669 |
-
|
670 |
-
= 4.02 =
|
671 |
-
* New: Adjust the process and layout of starting a new form.
|
672 |
-
* New: Separate custom templates from downloadable templates.
|
673 |
-
* New: Add frm_modify_posted_field_value hook or adjusting a posted value.
|
674 |
-
* UX: Don't show the style template option if the Formidable styling is turned off.
|
675 |
-
* Fix: Always include form styling when previewing forms in the theme.
|
676 |
-
|
677 |
-
= 4.01.02 =
|
678 |
-
* Fix: Prevent the frm_alignright class from affecting the layout on the form builder page
|
679 |
-
* Fix: Importing in Windows was failing and not finding the file
|
680 |
-
* Tweak: When inserting smart default values, use a comma between values by default for checkbox fields
|
681 |
-
* Code: Set the field classes in a more generalizable way so other areas can set a separator and exclude shortcode brackets (use data-sep=" " and data-shortcode="0" in add-ons)
|
682 |
-
|
683 |
-
= 4.01.01 =
|
684 |
-
* Use svgs for admin menu and admin bar so icon font doesn't need to be loaded admin-wide.
|
685 |
-
* Optimize a few SVGs.
|
686 |
-
* Fix: Load the css a bit earlier on the page when it isn't set to load in the header. This solves issues with styling ajax multi-page forms.
|
687 |
-
* Fix: Changing settings in the styler was causing font icon not found warnings in the console.
|
688 |
-
|
689 |
-
= 4.01 =
|
690 |
-
* New: Prevent a flash of unstyled form when form styling is set to load only on applicable pages.
|
691 |
-
* New: Search by field id or key on the form listing page.
|
692 |
-
* Hide more notices from other plugins when on a Formidable page.
|
693 |
-
* Fix: The colorpicker box in the form styler was off screen on some sites.
|
694 |
-
|
695 |
-
= 4.0.04 =
|
696 |
-
* New: Added several missing countries to the default options in the bulk countries list.
|
697 |
-
* New: Include form ids in the form switcher dropdown. Searching here will also search the form key.
|
698 |
-
* New: Double click on a field in the form builder to auto-expend the advanced options section.
|
699 |
-
* New: Show more of the form title in the builder and include a tooltip when it's cut off.
|
700 |
-
* Give the builder sidebar a bit more space.
|
701 |
-
* Improve the way &, <, and > are sanitized and saved in the database. Strip them out in the fields that should not have them.
|
702 |
-
* Fix: Some custom created field types were showing as text fields when created.
|
703 |
-
* Fix: The form actions trigger options box was closing automatically when a box was checked.
|
704 |
-
* Added frm_admin_full_screen_class hook for preventing collapsed admin menu. This is not supported, and is not the best experience with using the Formidable form builder.
|
705 |
-
|
706 |
-
= 4.0.03 =
|
707 |
-
* Reduce builder layout and styling conflicts with themes that don't like to keep their messages and css to themselves. This hides messages and junk from other plugins on Formidable pages. It also removes the .description class from the builder page.
|
708 |
-
* Use a textarea for the placeholder setting in paragraph fields.
|
709 |
-
* Fix: CSV import was returning an error message.
|
710 |
-
|
711 |
-
= 4.0.02 =
|
712 |
-
* Include the WordPress admin bar in full screen mode.
|
713 |
-
* Replace field icons in builder with svg sprite to prevent browser caching issues.
|
714 |
-
* Update the field ids in more of the form action settings when a form is duplicated.
|
715 |
-
* Live update for default values.
|
716 |
-
* Click on a field description on the form builder page to be taken directly to the setting.
|
717 |
-
* Allow apostrophes in an email address.
|
718 |
-
* Save a few clicks. Move the layout classes out of the advanced section and auto open the fields class list on click. Also select the search box when the form switcher is selected.
|
719 |
-
* Fix: The WordPress menu was collapsed when editing a post. Oops!
|
720 |
-
* Fix: Trim whitespace from radio/checkbox/dropdown options when they are changed.
|
721 |
-
* Fix: Automatically hide and show the field box more accurately when clicking in and out of settings that use it.
|
722 |
-
* Fix: Include field selection box on the redirect url setting.
|
723 |
-
* Fix: Adjust the show entry page for small screens.
|
724 |
-
* Fix: After an entry was deleted from the entry listing page, the page no longer scrolled.
|
725 |
-
* Fix: Backslashes were removed in the Custom CSS on save.
|
726 |
-
* Fix: In some cases, the default value was showing as a placeholder.
|
727 |
-
* Fix: Fix a PHP 5.4 error. If you are running a version less than 5.6, you'll see a reminder message to get up to date.
|
728 |
-
* Code: Added a trigger for use after an ajax call. The frmElementAdded trigger allows add-ons to add the field box menu to newly added settings.
|
729 |
-
* Show a message if Internet Explorer is being used. This browser is no longer supported in the form builder.
|
730 |
-
|
731 |
-
= 4.0.01 =
|
732 |
-
* Automatically open the field options box on the form settings page.
|
733 |
-
* Clean up, size down, and reposition the request for reviews.
|
734 |
-
* Use collapsed admin menu in full screen mode.
|
735 |
-
* Show a form title in the top bar on hover if truncated.
|
736 |
-
* Show a message if 4.0 Lite is installed without the matching Pro version.
|
737 |
-
* Fix: The link to print an entry wasn't responding.
|
738 |
-
* Fix: The full screen entries page was only scrolling if the menu label was 'Forms'
|
739 |
-
* Fix: Sometimes the field classes and inline shortcodes were appearing on the wrong setting.
|
740 |
-
* Fix: 1Password was conflicting with some fields with the inline popup.
|
741 |
-
|
742 |
-
= 4.0 =
|
743 |
-
* We've added a new, full screen builder for a faster and more enjoyable form building experience.
|
744 |
-
* Moved all settings into the sidebar instead of expanding/collapsing under each field.
|
745 |
-
* Faster way of adding new radio/select/checkbox options with drag and drop reordering.
|
746 |
-
* Added a separate placeholder option to make it easier to use, and to allow for both a placeholder and a default value. Existing placeholders will be automatically moved to the new setting.
|
747 |
-
* Added placeholder setting for dropdown fields, and allow the field label to be used as a placeholder.
|
748 |
-
* Long forms are easier to edit and save since only the fields settings that have been viewed will be saved.
|
749 |
-
* Replaced the form builder sidebar panel with in-field modals that include the possible values to insert.
|
750 |
-
* Added a way to more easily see and find all possible add-ons in the form actions.
|
751 |
-
* Add link to imported form in the import success message.
|
752 |
-
* Removed a few unused settings including the option to disable HTML5.
|
753 |
-
* New hooks: frm_after_field_choices, frm_field_options, frm_after_field_options, frm_[type]_primary_field_options, Added hooks for each tab in the global settings: frm_[section name]_settings_form, frm_default_value_setting
|
754 |
-
* Added better confirmation messages before deleting fields, forms, form actions, and entries.
|
755 |
-
* Change default settings to fade in forms and use css grids for new installs.
|
756 |
-
|
757 |
-
= 3.06.06 =
|
758 |
-
* Remove complete Spanish translations
|
759 |
-
* Increase PHP requirements to 5.6
|
760 |
-
* Increase minimum WP version to 4.6
|
761 |
-
|
762 |
-
= 3.06.05 =
|
763 |
-
* When getting IP addresses, use the end use IP rather than the proxy IP with services like Cloudflare.
|
764 |
-
* On new installations, allow multiple reCaptchas on a page by default.
|
765 |
-
* Remove admin email address from user tracking in order to keep it 100% anonymous.
|
766 |
-
* Fix: When a license is saved, properly clear the local caches in order to get access to new add-ons and form templates after renewing or upgrading.
|
767 |
-
|
768 |
-
= 3.06.04 =
|
769 |
-
* New: Added an option to opt into usage tracking. This will allow us to simplify settings in a future release and better cater to the majority of use cases.
|
770 |
-
* Fix: Replace old field ids in the field description and HTML field after duplication or import.
|
771 |
-
|
772 |
-
= 3.06.03 =
|
773 |
-
* Fix: The required indicator for a field was blank after importing a form.
|
774 |
-
* Fix: Only include the id of the error message once in aria-describedby for linking the error message for screen readers.
|
775 |
-
* Fix: Prevent a couple PHP warning messages with certain settings.
|
776 |
-
|
777 |
-
= 3.06.02 =
|
778 |
-
* New: More WCAG improvements. Link the error messages to the field for screenreaders.
|
779 |
-
* Fix: When resending emails, don't send emails that are toggled off.
|
780 |
-
* Fix: Prevent other plugins from adding messages on the form templates and new form pages.
|
781 |
-
* Fix: Prevent front-end styles from loading on back-end pages.
|
782 |
-
* Fix: When the screen settings are changed after filtering the entry list, stay on the filtered list.
|
783 |
-
|
784 |
-
= 3.06.01 =
|
785 |
-
* Notice: The default HTML for field types with multiple inputs now use div instead of label for the field label for WCAG compliance. This will only affect new fields.
|
786 |
-
* New: When saving a form, check if it is too long for the server settings. If so, show a notice along with information on how to fix it.
|
787 |
-
* New: Better WCAG compliance. Added aria-required to required fields and aria-invalid when javascript validation is turned on.
|
788 |
-
* New: Add functions to get a list of field, form, and global settings to translate for multilingual add-ons. This will make maintaining strings much easier without a delay.
|
789 |
-
* New: Added frm_form_strings, frm_global_setting, frm_global_invalid_msg, frm_global_failed_msg, and frm_global_login_msg hooks for making adjustments to messages.
|
790 |
-
* New: Add frm_field filter when a field is fetched individually with FrmField::getOne( x, true )
|
791 |
-
* New: Allow the frm_scroll_box class to work on HTML fields instead of only accepting frm_html_scroll_box
|
792 |
-
* Fix: The pagination lost styling in WP 5.1.
|
793 |
-
* Fix: The saved CSS string was being autoloaded by WordPress since the transient didn't have an expiration.
|
794 |
-
* Fix: Prevent the invisible recaptcha from adding empty space in some forms.
|
795 |
-
* Fix: Form layouts with a long section of options in a radio or checkbox were adding extra spacing.
|
796 |
-
* Fix: The templates page was showing a blank tile for expired licenses.
|
797 |
-
* Fix: Submit button remained disabled after when the invisible reCaptcha validation failed.
|
798 |
-
|
799 |
-
= 3.06 =
|
800 |
-
* New: Add one-click form creation from a form template and adjust the way a new form is created
|
801 |
-
* New: Add a new process for creating a custom form template
|
802 |
-
* Tweak: Create smaller XML fiels when exporting forms
|
803 |
-
* Tweak: Use the name of the form for XML exports when a single form is exported
|
804 |
-
* Tweak: Don't limit the width of the color picker in the form styler to avoid conflicts with some color picker plugins
|
805 |
-
* Fix: Prevent the 'Advanced' section from hiding on non-Formidable blocks
|
806 |
-
* Fix: Some users were seeing PHP error messages in PHP 5.2
|
807 |
-
* Fix: XML form exports set to use the default style were not correctly setting the style on import
|
808 |
-
|
809 |
-
= 3.05 =
|
810 |
-
* New: Add a new Forms block for use with the new WP editor
|
811 |
-
* Fix: A false number was showing for number of plugin updates available when add-ons were not installed
|
812 |
-
|
813 |
-
= 3.04.03 =
|
814 |
-
* New: Improved autoupdating and installation for form add-ons
|
815 |
-
* Tweak: Only show the form add-ons page to those who can activate plugins
|
816 |
-
* Fix: Radio button shadows had a box around them in some browsers
|
817 |
-
* Fix: Don't mark an entry as a duplicate when the second entry includes more fields than the first
|
818 |
-
* Code: Move deprecated code to its own folder
|
819 |
-
|
820 |
-
= 3.04.02 =
|
821 |
-
* New: When HTML5 is used, auto add the http in a url field if it is omitted by the user
|
822 |
-
|
823 |
-
= 3.04.01 =
|
824 |
-
* New: When a form includes a user ID field, include helpers in the Advanced tab to get data from the user profile for use in emails and other form actions.
|
825 |
-
* Code: Refactor and clean up the code for the Advanced tab in the form settings sidebar
|
826 |
-
* Code: Add frm_advanced_helpers hook to move some Advanced shortcode examples to Pro
|
827 |
-
* Code: Add frm_field_code_tab hook to add extra shortcodes in the customization sidebar for a single field
|
828 |
-
* Update translations
|
829 |
-
|
830 |
-
= 3.04 =
|
831 |
-
* New: Add option to duplicate a form action
|
832 |
-
* New: Add option to turn form actions on or off
|
833 |
-
* New: Add frm_is_multiple_select hook
|
834 |
-
|
835 |
-
= 3.03.03 =
|
836 |
-
* Improve the appearance of the import/export page
|
837 |
-
* Move the admin menu position below the post comments
|
838 |
-
* Remove unused CSS including CSS for login forms in the user registration plugin
|
839 |
-
* Override theme styling for box shadows on inputs
|
840 |
-
* Add a new migrator class that will serve as a base for migrations from other form builder plugins
|
841 |
-
* Add a prepare_field_value function for altering the value show inside a form field that can be overridden in extension classes for fields
|
842 |
-
|
843 |
-
= 3.03.02 =
|
844 |
-
* Fix: When syntax highlighting was turned off in the user profile, the custom CSS box didn't appear.
|
845 |
-
* Fix: Allow 'aside' tags in the form widget. Don't remove it when sanitizing.
|
846 |
-
* Fix: When a form includes a reCaptcha, the loading indicator on the submit button wasn't triggered on submit.
|
847 |
-
* Fix: The reCaptcha label was orphaned and didn't pass WCAG compliance. This fix applies to new reCaptcha fields. For existing fields, delete it and add it again.
|
848 |
-
* Fix: Automatically scroll the form builder window when a field is dragged and dropped in the form.
|
849 |
-
* Fix: Use a percentage for left labels instead of a fixed with to ensure the margin isn't too big for small spaces.
|
850 |
-
|
851 |
-
= 3.03.01 =
|
852 |
-
* Fix: Allow the section html in the form widget. Don't remove it when sanitizing.
|
853 |
-
* Fix: Show the scrollbar for the list of fields in Chrome on the form builder. Some devices don't allow scrolling without it.
|
854 |
-
|
855 |
-
= 3.03 =
|
856 |
-
* Fix: Custom css like #frm_field_196_container > label was being sanitized and preventing the > from working correctly
|
857 |
-
* Fix: Allow <i icon="something"> to pass sanitization in checkbox and radio field options
|
858 |
-
* Fix: A warning message in the form style builder was sometimes appearing multiple times and not closing
|
859 |
-
* Move datepicker css and images to Pro form builder
|
860 |
-
|
861 |
-
= 3.02.02 =
|
862 |
-
* Update PO file for translation
|
863 |
-
|
864 |
-
= 3.02.01 =
|
865 |
-
* Fix: Allow the heading class and ids to stay for the sidebar form widget. The headings were missing a class and not the same as other headings in some themes.
|
866 |
-
* Fix: If all form templates are deleted, keep the 'templates' nav item so new templates can still be created.
|
867 |
-
* Fix: When creating a new form, don't include trashed form templates in the form template options
|
868 |
-
* Fix: Remove outdated sslverify references
|
869 |
-
* Fix: The sample form for the form styler didn't have a great layout when CSS grids were turned on
|
870 |
-
|
871 |
-
= 3.02 =
|
872 |
-
* New: Add support for WordPress export and erase personal data options for easier GDPR support
|
873 |
-
* Fix: HTML was getting stripped in field labels when a form was edited on the form builder page
|
874 |
-
* Fix: If a field option includes HTML, allow the HTML rather than sanitizing it with entities
|
875 |
-
* Fix: When the 'add option' button on the form builder is clicked multiple times, add the options correctly if the previous option isn't yes showing in the form maker
|
876 |
-
* Fix: The HTML for the link to the user profile was showing in the sidebar when editing or viewing an entry
|
877 |
-
* Code change: Move input classes into the field object class so it can be more easily overridden and amended. The FrmFieldType->get_input_class() function can be overridden in sub classes
|
878 |
-
|
879 |
-
= 3.01.03 =
|
880 |
-
* Fix: Add responsive styling for the .frm_four_col class when grids are disabled
|
881 |
-
* Fix: Fix number field HTML5 min, max, and step. This code was still in the pro form builder
|
882 |
-
* Fix: More escaping for translated strings, and whitelist false positives for code security tools
|
883 |
-
* Fix: When form builder is loaded with ajax, prevent errors when the default value is an array
|
884 |
-
* Fix: Add a nonce check when updating settings for a form
|
885 |
-
* Removed: Get rid of the start tour. We will add this back in a less annoying way.
|
886 |
-
|
887 |
-
= 3.01.02 =
|
888 |
-
* New: Add frm_sanitize_shortcodes hook. This hook allows shortcodes in field values to be processed rather than shown on the page.
|
889 |
-
* Fix: Stylesheets weren't saving correctly when multiple styles were used for forms
|
890 |
-
|
891 |
-
= 3.01.01 =
|
892 |
-
* New: Replace the jQuery colorpicker with the WordPress colorpicker in the visual form styler
|
893 |
-
* New: Process shortcodes in the redirect url after form submission
|
894 |
-
* New: frm_override_default_styles and frm_default_style_settings hooks
|
895 |
-
* Fix: Prevent shortcodes inside field values from being processed in more places including the redirect url. This is a security precaution.
|
896 |
-
* Fix: A default contact form was being added with each update. This update ensures the contact form is only generated once.
|
897 |
-
* Fix: Allow the visual form styler to show instant changes to the sample contact form since server limits of url size were being hit in some cases.
|
898 |
-
* Fix: HTML was being stripped from some form field settings on the form creator page like validation messages
|
899 |
-
|
900 |
-
= 3.01 =
|
901 |
-
* New: Added frm_js_location hook for saving the combined javascript file in a different location
|
902 |
-
* New: Added frm_include_field_in_content hook for excluding fields in the default email message
|
903 |
-
* Tweak: Process shortcodes inside the form validation messages
|
904 |
-
* Tweak: Reduce page load time by not autoloading the saved form styling from the database. In most cases, this data is saved in the CSS file, and doesn't need to be retrieved from the database.
|
905 |
-
* Fix: The Invisible reCaptcha wasn't being validated correctly in contact forms when the Pro version was not running.
|
906 |
-
* Fix: Run the server-side form validation on a number field that uses 0 for the minimum value. This was being skipped.
|
907 |
-
* Fix: Show the label above a dropdown field if the label position is set to inside since dropdown placeholders are not yet supported. Plus, don't show the Inside label position option for any fields that don't allow placeholders.
|
908 |
-
* Fix: If there is an error during a database update, make sure it can try again in the future
|
909 |
-
* Fix: Prevent more conflicts with Divi when editing some posts with forms
|
910 |
-
* Fix: Form fields without CSS grids were not aligning correctly with left, right, or inline labels
|
911 |
-
|
912 |
-
= 3.0.06 =
|
913 |
-
* New: Include the option to duplicate a form in the free form maker
|
914 |
-
* Fix: If the reply to address in the email is not specified, use only the from email without the from name to increase receivability
|
915 |
-
* Fix: Improve form styling without CSS grids when using left, right, and inline labels
|
916 |
-
* Fix: Make the frmFrontForm.fieldValueChanged function public in the javascript so it can be triggered by scripts in other plugins
|
917 |
-
|
918 |
-
= 3.0.05 =
|
919 |
-
* Fix: The visual form styler didn't look good when CSS grids were turned off
|
920 |
-
* Fix: Prevent past database migrations from being run again. This was making some field sizes much larger.
|
921 |
-
* Fix: If field sizes are extra long, reverse them because it most likely happened in the last release.
|
922 |
-
* Fix: Sort by a number field on the entries page was ordering by text instead of number
|
923 |
-
* Fix: The export page was showing weird styling for the form selector on some sites
|
924 |
-
* Fix: If CSS grids are off, don't force the width to 100% for form fields like before
|
925 |
-
|
926 |
-
= 3.0.04 =
|
927 |
-
* Fix required validation: URL and number fields were requiring a value when the field was not required
|
928 |
-
* Fix double recaptcha validation which was causing it to fail validation
|
929 |
-
|
930 |
-
= 3.0.03 =
|
931 |
-
* Enhancement: Use relative path in the form css now that the css is inside the plugin. Now font icons will continue working without a style save when the site url is changed.
|
932 |
-
* Fix: Save a different stylesheet file for each site in a network to prevent them from saving over eachother
|
933 |
-
* Fix: Use auto field height when grids are off to prevent tiny form fields on some sites
|
934 |
-
* Fix: Correctly set default email message to 100% width
|
935 |
-
* Fix: Fields with a layout class and labels set to right or left were not aligned right with CSS grids off
|
936 |
-
* Fix: Some field shortcodes weren't being processed when the whitespace was abnormal from some cases of copy/paste
|
937 |
-
* Fix: Set the width of the box with field types on form builder page a bit differently to prevent it from being too small when the page includes a lot of admin notices at the top
|
938 |
-
* Remove a few 100% translations from the plugin so WordPress can handle it
|
939 |
-
|
940 |
-
= 3.0.02 =
|
941 |
-
* Tweak: Move the forms css inside the plugin rather than saving it in the uploads folder so it will always be reset after updates
|
942 |
-
* New: Add frm_fields_container_class hook for changing the new form container class attributes
|
943 |
-
* Fix: More form styling fixes for css grids. Fixes cover layouts with frm_alignright and smoother responsive layouts.
|
944 |
-
* Fix: Combine the old and new form css, and include the old layout CSS by default
|
945 |
-
* Fix: Trigger the activation install right when the plugin is installed
|
946 |
-
* Fix: Don't add label position styling to fields that don't include the option to change the label position
|
947 |
-
* Fix: Correctly limit the number of fields returned when using the FrmField::get_all_for_form function with a limit set
|
948 |
-
|
949 |
-
= 3.0.01 =
|
950 |
-
* Fix: Trigger style update when a form is loaded instead of only when an admin page is visited
|
951 |
-
* Fix: A few various form styling and layout fixes
|
952 |
-
* Fix: Prevent screenreader text for accessibility from showing on sites with older cached css
|
953 |
-
* Fix: Prevent conflict with Divi when a form shortcode with a recaptcha is included in page editor
|
954 |
-
* Fix: Use 'readfile' instead of 'include' for css files for extra safety precautions
|
955 |
-
* Fix: Load the field options before frm_new_fields_vars hook for reverse compatibility
|
956 |
-
|
957 |
-
= 3.0 =
|
958 |
-
* Move features into the free form builder: redirect and show page after save, javascript validation, field format options with HTML5 pattern validation, and phone number, number, user ID, hidden field, and HTML fields
|
959 |
-
* Possibly breaking change: Remove code that has been deprecated since before v2.02
|
960 |
-
* Save a combined js file to use on the front-end with a fallback if the file fails to generate. This file is updated when the plugin is activated or updated.
|
961 |
-
* A UI pick-me-up in preparation of things to come in 4.0.
|
962 |
-
* New: Use CSS grids for better layouts. If you would like your column layouts to show in Internet Explorer, you'll need to turn on the old styling in the Formidable -> Global settings. The grids use a 12-column layout with classes that range from frm1 (1 column of 12) to frm12 (span all 12 columns). (Thanks for the feedback from our feedback group!)
|
963 |
-
* New: Search for fields by name, id, and key in the customization panel
|
964 |
-
* Improved RTL styling in backend
|
965 |
-
* Enhancement: Add frm_rtl class to forms with styles set to RTL for easier styling.
|
966 |
-
* Enhancement: Customize the invalid message when a custom format is set on text fields
|
967 |
-
* Better a11y/WCAG support: hidden labels where required, "for" tag on most labels, and link the field to its description for screenreaders.
|
968 |
-
* Move form shortcodes from the sidebar to the form settings page
|
969 |
-
* Change "field options" to "field settings" on the form builder page
|
970 |
-
* Update the Print styling for the entries page
|
971 |
-
* Remove frm_text_block class and do it by default. Radio buttons and checkboxes with wrapping text should look good by default.
|
972 |
-
* Add a link in the footer to review Formidable
|
973 |
-
* New: field object class to make it easy to make new field types. We don't have docs yet, but developers can take a look at the FrmFieldType class. But we've gone to great efforts to make sure fields done the old way will continue to function.
|
974 |
-
* New hook: Add frm_output_single_style hook to add extra css into the generated stylesheet
|
975 |
-
* New hook: Add frm_before_get_form hook for enqueueing form scripts
|
976 |
-
* New hook: Add frm_enqueue_builder_scripts hook to load extra scripts on the form builder page
|
977 |
-
* New hook: Add frm_show_entry_defaults hook to add extra atts to the frm_show_entry shortcode
|
978 |
-
* Tweak: Include 'original_default' in the field array for new entries so we can compare and prevent double processing later
|
979 |
-
* Fix: quotation marks were being escaped in frm_form_attributes and frm_form_div_attributes hooks
|
980 |
-
* Removed: The preview page option in the global settings is no longer used. The form preview page is now generated.
|
981 |
-
* Removed: The placeholder fallback javascript for old versions of IE is gone. No need to give everyone extra scripts to load.
|
982 |
-
* Deprecated the accordion javascript checkbox in global settings since it isn't used by the plugin. If you had this box checked, you'll still see it. Once you uncheck it the option will no longer appear.
|
983 |
-
|
984 |
-
= 2.05.09 =
|
985 |
-
* Fix: Read only background and border colors weren't showing in the form correctly
|
986 |
-
* Fix: A PHP warning was showing with validation messages in the form
|
987 |
-
|
988 |
-
= 2.05.08 =
|
989 |
-
* Fix: Hide extra columns on the Formidable -> Entries page more accurately
|
990 |
-
* Fix: Prevent WP confirmation messages from showing when saving a form
|
991 |
-
* Fix: Some tooltips were partially covered by the admin menu
|
992 |
-
|
993 |
-
= 2.05.07 =
|
994 |
-
* New: Limit the number of field columns in the entry listing page to a max of 11 fields
|
995 |
-
* Security Fix: Fix an SQL injection vulnerability on the Form listing page on the backend. Vulnerability discovered by the static code analysis solution RIPS (www.ripstech.com)
|
996 |
-
|
997 |
-
= 2.05.06 =
|
998 |
-
* Tweak: Move database functions from FrmAppHelper to FrmDb
|
999 |
-
* Tweak: Move install/update/migrate functions from FrmDb to FrmMigrate
|
1000 |
-
* Tweak: Remove unused check_cache_and_transient function
|
1001 |
-
* Fix: Rename ja_JP translation to ja
|
1002 |
-
|
1003 |
-
= 2.05.05 =
|
1004 |
-
* Fix: When form actions were added at the same time with non-alphabetical naming, a new addon was replacing the first one
|
1005 |
-
|
1006 |
-
= 2.05.04 =
|
1007 |
-
* Tweak: Remove recaptcha and website fields from sample Contact us form template since most people don't need them
|
1008 |
-
* Fix: Updates for WP 4.9 compatibility. This includes preventing double filtering on contact form widgets and using the WordPress Codemirror scripts for the form CSS page.
|
1009 |
-
* Fix: Prevent "are you sure" message that has started occuring from WordPress when saving a WordPress form
|
1010 |
-
* Fix: Correctly validate form fields with an Inside field label when HTML5 forms are not enabled
|
1011 |
-
* Fix: Set the background color on loading form submit button. Depending on the hover button covers, the loading spinner may have been the same color as the button
|
1012 |
-
* Fix: Additional security checks when getting POST or GET values in some places
|
1013 |
-
* Fix: Return int rather than string from FrmForm::getIdByKey
|
1014 |
-
|
1015 |
-
= 2.05.03 =
|
1016 |
-
* Enhancement: Clean up BCC and CC email buttons on small screens
|
1017 |
-
* Security enhancement: Use wp_kses instead of wp_kses_post for showing entries
|
1018 |
-
* Enhancement: Add more HTML options to the wp_kses filters
|
1019 |
-
* Fix: Correctly show the list of trashed forms after one is permanently deleted
|
1020 |
-
|
1021 |
-
= 2.05.02 =
|
1022 |
-
* New: Add frm_affiliate_id hook for theme author affiliates
|
1023 |
-
* Fix: XSS vulnerability on form preview page. Don't check POST values before displaying the form
|
1024 |
-
* Enhancement: Speed up the Formidable > Entries listing page for large forms
|
1025 |
-
* Fix: Don't add slashes to default field values
|
1026 |
-
* Fix: Replace the arrows in the settings sections that disappeared in WP 4.8
|
1027 |
-
|
1028 |
-
= 2.05.01 =
|
1029 |
-
* Fix: Let the new label position option override the setting in the styles
|
1030 |
-
* Fix: Trigger an update for the styling settings so a manual save isn't required to get new updates
|
1031 |
-
* Fix: Prevent an undefined php warning when viewing the form page
|
1032 |
-
|
1033 |
-
= 2.05 =
|
1034 |
-
* New: Add option to not save IP address with entries for GDPR compliant forms
|
1035 |
-
* New: Add a new label position option: Inside. This option automatically uses the field labels as placeholders.
|
1036 |
-
* Enhancement: Prevent jumping when selecting field to edit on form builder.
|
1037 |
-
* Enhancement: Trigger frm_after_entry_processed hook after save when the action is set to show a message. This affects deleting entries automatically.
|
1038 |
-
* Enhancement: Allow text colors like "red" in frm-show-entry.
|
1039 |
-
* Enhancement: Increase minimum WP version requirement to 4.0.
|
1040 |
-
* Enhancement: Add array_key option to entry shortcode to set whether an ID or key is used when an array is returned.
|
1041 |
-
* Fix: Restore Default Plain button for filling email content.
|
1042 |
-
* Fix: Set dependency on reCaptcha script to ensure it loads after the Formidable script when defer fails.
|
1043 |
-
* Fix: Add frm_entries_list_query hook to filter queries on the Formidable -> Entries page.
|
1044 |
-
* Fix: Improve field duplication on form builder.
|
1045 |
-
* Fix: Remove deprecated notification settings on import.
|
1046 |
-
* Fix: Allow multiple invisible recaptchas to work on the same page.
|
1047 |
-
* Fix: Make sure licenses tab loads if navigating to it directly.
|
1048 |
-
|
1049 |
-
= 2.04.01 =
|
1050 |
-
* Fix: Prevent php warning when 'show' attr is missing.
|
1051 |
-
|
1052 |
-
= 2.04 =
|
1053 |
-
* New: Add FrmEntryValues and FrmFieldValue classes, which should be widely reusable.
|
1054 |
-
* New: Add ready-to-use contact form. Use it anywhere with [formidable id=contact-form]. It will only be created on new installs.
|
1055 |
-
* Enhancement: Load global settings tabs with AJAX to improve the load speed.
|
1056 |
-
* Enhancement: Add form and entry to frm_email_message filter.
|
1057 |
-
* Fix: Changed blank title processing in the form widget to match WordPress core widgets.
|
1058 |
-
|
1059 |
-
= 2.03.10 =
|
1060 |
-
* New: Add <a href="https://formidableforms.com/wordpress-anti-spam-invisible-recaptcha/">invisible recaptcha to your WordPress forms</a>
|
1061 |
-
* New: Add frm_form_div_attributes action hook
|
1062 |
-
* Enhancement: Replace is_super_admin calls per WordPress recommendations
|
1063 |
-
* Enhancement: Add duplicated field right below original instead of at the end of the form for easier drag and drop form building with long forms
|
1064 |
-
* Fix: When importing entries, save the IP from the imported CSV rather than the IP of the person running the import
|
1065 |
-
* Fix: Fix duplicate frm_verify ID HTML vaildation error in forms
|
1066 |
-
* Fix: Fix squished customization panel showing up when clicking into some field settings
|
1067 |
-
* Fix: Run frm_validate_entry when there are errors
|
1068 |
-
|
1069 |
-
= 2.03.09 =
|
1070 |
-
* New: Add frmStartFormLoading and frmEndFormLoading jQuery events.
|
1071 |
-
|
1072 |
-
= 2.03.08 =
|
1073 |
-
* New: Add frm_label_justify CSS layout class to justify text in long labels
|
1074 |
-
* Fix: Prevent XSS error messages in Chrome when saving a form on the back-end
|
1075 |
-
* Fix: Remove extra space between textarea and description.
|
1076 |
-
* Fix: Resolve errors in frm_entries_footer_scripts action call.
|
1077 |
-
* Fix: Decrease size of file path for automatic updates to avoid hitting file path limits on Windows servers.
|
1078 |
-
* Fix: Improve checkbox and radio styling with Bootstrap active.
|
1079 |
-
* Fix: Remove Bootstrap error class with js validation.
|
1080 |
-
|
1081 |
-
= 2.03.07 =
|
1082 |
-
* New: Add frm_after_import_view hook.
|
1083 |
-
* New: Add frmPageChanged, frmFormComplete, and frmFormErrors jQuery events.
|
1084 |
-
* Fix: Include full where query in cache key to avoid identical keys for different queries.
|
1085 |
-
* Fix: Show entries from all forms on the entry listing page.
|
1086 |
-
* Fix: Remove IE8-specific CSS causing errors in stylesheet.
|
1087 |
-
|
1088 |
-
= 2.03.05 =
|
1089 |
-
* New: Add <a href="https://formidableforms.com/defeat-spambots-honeypot-spam-protection/">Honeypot spam protection to your WordPress forms</a>
|
1090 |
-
* Enhancement: Add frm_form_attributes hook
|
1091 |
-
* Enhancement: Make field value dropdown code available in the free form builder plugin
|
1092 |
-
* Enhancement: Add deprecated notice for old globals such as $frm_form, $frm_entry, $frm_entry_meta, and $frmdb
|
1093 |
-
* Fix: Set default menu name to Formidable
|
1094 |
-
* Fix: Allow Date column to be toggled on form listing page
|
1095 |
-
|
1096 |
-
= 2.03.04 =
|
1097 |
-
* Fix: Allow quotes within shortcodes in email settings
|
1098 |
-
* Fix: Check if an option is "other" a little more reliably. Instead of checking for 'other' anywhere in the option key, check for other_ at the beginning.
|
1099 |
-
* Fix: Correctly use default version number for jquery ui URL if query string is not included
|
1100 |
-
* Fix: Increase room for ids in the database. Increase from 11 to 20 to match the WordPress DB fields
|
1101 |
-
* Fix: Resolve a conflict with themes adding display:block; as the default for all input elements that is causing checkboxes and radio buttons to look bad
|
1102 |
-
* Code: Email code refactoring
|
1103 |
-
|
1104 |
-
= 2.03.03 =
|
1105 |
-
* Fix: Update the minified JS to match the non-minified version. This fixes issues with calculations.
|
1106 |
-
* Fix: Allow the first form action label to be clickable
|
1107 |
-
|
1108 |
-
= 2.03.02 =
|
1109 |
-
* Fix: javascript error in Safari in form builder
|
1110 |
-
* Fix: Prevent null values from leaving a white space on the entries listing page
|
1111 |
-
* Fix: Form shortcode parameters were also affecting the forms in a widget
|
1112 |
-
* Fix: Prevent action trigger options from getting cut off at the bottom of the page
|
1113 |
-
|
1114 |
-
= 2.03.01 =
|
1115 |
-
* Fix: Some colors were not being used correctly in the visual form styler settings
|
1116 |
-
|
1117 |
-
= 2.03 =
|
1118 |
-
* New: Add a combined list of all entries on the Formidable -> Entries page instead of defaulting to the first form
|
1119 |
-
* New: Replace submit input with button HTML for new forms. This allows us to show the loading indicator on top of the button instead of outside. This applies to new forms only. Existing forms will need the submit button HTML adjusted to see this new styling. But we decided it was best for reverse compatibility if we don't change it automatically
|
1120 |
-
* New: Add frm_after_title hook for inserting content between the title and form fields
|
1121 |
-
* Enhancement: Speed up adding and editing field options and conditional logic in the form builder
|
1122 |
-
* Enhancement: Don't save the field options until the whole form is saved
|
1123 |
-
* Tweak: Pass error array in frm_get_paged_fields instead of true/false. If you are using the frm_get_paged_fields hook, it's possible your code may need to be adjusted.
|
1124 |
-
* Fix: styling issue when select field moves when changing between a blank and not blank option
|
1125 |
-
* Fix: Make sure "Activate" button for add-ons is specific to subsite in multisite network
|
1126 |
-
* Removed: pro fields and styling options from the visual styler, extra pro version css, and registering pro scripts. We don't need unused options.
|
1127 |
-
|
1128 |
-
= 2.02.13 =
|
1129 |
-
* New: Add frm_send_separate_emails filter. If there are multiple emails in the "to" box, this hook will send one email per address.
|
1130 |
-
* Fixed: Prevent field option reset when a style is included with the imported form
|
1131 |
-
|
1132 |
-
= 2.02.12 =
|
1133 |
-
* Fixed: PHP 7.1 illegal string offset warnings addressed.
|
1134 |
-
|
1135 |
-
= 2.02.11 =
|
1136 |
-
* New: Added frm_create_default_email_action hook to prevent default email action creation.
|
1137 |
-
* New: Added frm_inline_submit CSS Layout Class to use in the form generator.
|
1138 |
-
* Improved: Include IP for checking comment blacklist.
|
1139 |
-
* Improved: Load minified themepicker js and placeholder js when possible.
|
1140 |
-
* Improved: Better spam checking with Akismet.
|
1141 |
-
* Improved: Update placeholder JS for old browsers to v2.3.1.
|
1142 |
-
* Fixed: Don’t force fields created by a add-on to a text field when Pro is not installed.
|
1143 |
-
* Fixed: Style success message text color now applies to nested paragraph tags.
|
1144 |
-
* Fixed: Prevent PHP warning messages some sites are seeing during cache key retrieval.
|
1145 |
-
* Fixed: -1 offset in frm_scroll_offset hook now stops auto-scrolling.
|
1146 |
-
* Fixed: Invalid Portuguese translation for field is invalid message.
|
1147 |
-
* Fixed: A few HTML errors on form Settings page are resolved.
|
1148 |
-
* Fixed: Set default margin on checkbox and radio divs. This resolves conflicts with Bootstrap styling and frm_two_col and frm_three_col classes.
|
1149 |
-
* Fixed: If same form is published multiple times on the same page, make sure success message shows with the right occurrence of the form. Auto-scroll to the correct form as well.
|
1150 |
-
|
1151 |
-
= 2.02.10 =
|
1152 |
-
* Add frm_form_error_class hook
|
1153 |
-
* Fix db error when updating title in some forms
|
1154 |
-
* Fix unclickable keys in Customization Panel
|
1155 |
-
* Fix print styling on entries page
|
1156 |
-
* Clear entry cache after delete all entries
|
1157 |
-
|
1158 |
-
= 2.02.09 =
|
1159 |
-
* Add frm_before_install hook
|
1160 |
-
* Trigger a database update to flush permalinks
|
1161 |
-
* Fix PHP 5.4 syntax error
|
1162 |
-
|
1163 |
-
= 2.02.08 =
|
1164 |
-
* Fix recaptcha error (change default to normal)
|
1165 |
-
* Prevent double submit clicks
|
1166 |
-
* Make sure recaptcha English language setting applies
|
1167 |
-
* Add placeholder color CSS
|
1168 |
-
* Add frm_after_import_form action hook
|
1169 |
-
* Add frm_send_email hook for stopping the email
|
1170 |
-
* Add frm_upgrade_page hook
|
1171 |
-
* Include field object in frm_prepare_data_before_db hook
|
1172 |
-
* Fix nav errors when trying to edit form that doesn't exist
|
1173 |
-
* Replace specific cache key deletion with group cache delete for more cache clearing fixes
|
1174 |
-
|
1175 |
-
= 2.02.07 =
|
1176 |
-
* Improve cache clearing in order to make Formidable compatible with persistent object caching
|
1177 |
-
* Add vertical-align:baseline to radio and checkboxes to prevent styling conflicts
|
1178 |
-
* Add hook for invalid form entry error message
|
1179 |
-
* Add form id to 'frm_include_meta_keys' hook
|
1180 |
-
* Fix IE11 and Edge form builder issues with editing field options
|
1181 |
-
* Allow localhost to pass URL validation
|
1182 |
-
* Remove frm_field_input_html calls for fields on form builder page
|
1183 |
-
|
1184 |
-
= 2.02.06 =
|
1185 |
-
* Prevent styling conflict with field buttons on form builder
|
1186 |
-
|
1187 |
-
= 2.02.05 =
|
1188 |
-
* Clear caching when updating styling settings
|
1189 |
-
* Add frm_field_div_classes hook
|
1190 |
-
* Remove deprecated safe_mode check
|
1191 |
-
* Warning added for invalid height/padding styling combination
|
1192 |
-
|
1193 |
-
= 2.02.04 =
|
1194 |
-
* Add field description margin option
|
1195 |
-
* Fixes for submitting forms in IE10
|
1196 |
-
|
1197 |
-
= 2.02.03 =
|
1198 |
-
* Update translations
|
1199 |
-
|
1200 |
-
= 2.02.02 =
|
1201 |
-
* Fix clicking the undo link after bulk trash forms
|
1202 |
-
* Add submitFormManual function for custom scripts
|
1203 |
-
* HTML5 error fields now have styling
|
1204 |
-
|
1205 |
-
= 2.02 =
|
1206 |
-
* Improve user role dropdowns in global settings
|
1207 |
-
* Remove some deprecated functions
|
1208 |
-
* More output escaping
|
1209 |
-
* Move file creation for stylesheet to its own file for an easier API
|
1210 |
-
|
1211 |
-
= 2.01.02 =
|
1212 |
-
* Increased minimum required WordPress version to 3.8
|
1213 |
-
* Added frm_skip_form_action hook. This hook can be used to change whether the action is skipped or not
|
1214 |
-
* Added border radius settings to success and error messages
|
1215 |
-
* Fixed issue allowing a trashed form shortcode to still show the form
|
1216 |
-
* Fixed issue causing & to show instead of & when editing paragraph fields
|
1217 |
-
* Removes French and Swedish translations since they are complete online
|
1218 |
-
* Update for better cache deletion in WP 4.0+
|
1219 |
-
* Allow a specific field type to change the value for emails and entry array
|
1220 |
-
* Prevent errors with Redis cache plugin
|
1221 |
-
* Improve styling for submit buttons on mobile devices
|
1222 |
-
* Don't let imported style override default
|
1223 |
-
* Add frm_clean_[field-type-here]_field_options_before_update hook
|
1224 |
-
* Fix &, >, and other character comparison issues
|
1225 |
-
|
1226 |
-
= 2.01.01 =
|
1227 |
-
* Use a different email regex to allow more characters, and longer TLDs
|
1228 |
-
* Only load custom styles on the styler. Don't include it on the manage styles, or custom css tabs. Bad custom css can make the page uneditable.
|
1229 |
-
* Fix issue preventing the option to Allow the multiple recaptchas to be turned off
|
1230 |
-
* Fixed issue with white space allowed in field options when bulk editing
|
1231 |
-
* Use javascript instead of jQuery to scroll after submit
|
1232 |
-
* Add missing styling to make inline labels work with checkbox/radio fields
|
1233 |
-
|
1234 |
-
= 2.01.0 =
|
1235 |
-
* Allow shortcodes for the submit button label
|
1236 |
-
* Increase the timeout for activating a license
|
1237 |
-
* Add a couple static functions to use in add-ons with form actions
|
1238 |
-
* Don't show templates on the add-ons page
|
1239 |
-
* Add frm_switch_field_types hook for specifying which fields can be switched to/from
|
1240 |
-
* Add Authorize, Stripe, WOO, and copy icons
|
1241 |
-
* Some back-end styling improvements
|
1242 |
-
* Additional bug fixes
|
1243 |
-
|
1244 |
-
= 2.0.25 =
|
1245 |
-
* Add an option to allow multiple recaptchas. This is off by default to avoid new conflicts.
|
1246 |
-
* Use the recaptcha size setting when displaying multiple recaptchas per page.
|
1247 |
-
* Add frm_after_field_is_imported and frm_prepare_single_field_for_duplication hooks
|
1248 |
-
* Add property="stylesheet" to the stylehsheets when HTML5 is enabled
|
1249 |
-
|
1250 |
-
= 2.0.24 =
|
1251 |
-
* Add option to use the dark reCaptcha
|
1252 |
-
* Show a helpful error message when recaptcha communication fails
|
1253 |
-
* Fix the clear on focus setting to not switch to the default blank
|
1254 |
-
|
1255 |
-
= 2.0.23 =
|
1256 |
-
* Add support for multiple reCaptchas on a page
|
1257 |
-
* Make sure the screen options for the form listings only shows when needed
|
1258 |
-
* Make sure a value is selected when it includes an &
|
1259 |
-
* Load grid CSS on the back-end entries and form builder pages
|
1260 |
-
* Allow transparent background color on fields and form
|
1261 |
-
* Don't update clear on click options until whole form is saved
|
1262 |
-
* Don't force an array to be a string before going through get_display_value function
|
1263 |
-
* Added frm_trigger_create_action hook to alter action triggering
|
1264 |
-
* Added frm_csv_format hook for changing the exported CSV format
|
1265 |
-
* Added frm_is_field_required hook for allowing a field to be conditionally required
|
1266 |
-
* Added frm_field_options_to_update hook for setting more field options to update
|
1267 |
-
* Added frm_display_FIELDTYPE_value_custom hook
|
1268 |
-
* Added frm_get_FIELDTYPE_display_value
|
1269 |
-
* Added frm_csv_field_columns hook. Once the columns are added, if a field value is an array, it will automatically fill added csv columns
|
1270 |
-
|
1271 |
-
= 2.0.22 =
|
1272 |
-
* Add an upgrade banner when affiliate links are active
|
1273 |
-
* Add permission checks in addition to nonce for several actions for extra security
|
1274 |
-
* Don't allow javascript to be saved in field choices
|
1275 |
-
* Include the admin_url params inside the function to resolve a conflict with WPML
|
1276 |
-
* Prevent XML breaking with US character
|
1277 |
-
* Fix rand() error with float some users are seeing with PHP7
|
1278 |
-
|
1279 |
-
= 2.0.21 =
|
1280 |
-
* Add a timestamp to the css file instead of plugin version number to improve issues with styling caching
|
1281 |
-
* Add pro tips & upgrade calls
|
1282 |
-
* Fix bug with importing old forms with no custom style
|
1283 |
-
|
1284 |
-
= 2.0.20 =
|
1285 |
-
* Added more styling options: box-shadow, font-weight, Form Title, and Form Description
|
1286 |
-
* Fixed a couple issues with activating and deactivating licences
|
1287 |
-
* A few improvements for importing styles
|
1288 |
-
* Add a hook for approved theme authors to add affiliate links. If the free version is packaged with a theme, the theme author can get commissions on upgrades.
|
1289 |
-
|
1290 |
-
= 2.0.19 =
|
1291 |
-
* Add CSV export to free version
|
1292 |
-
* Add page with list of add-ons
|
1293 |
-
* Set up base for allowing affiliate links inside the free version
|
1294 |
-
|
1295 |
-
= 2.0.18 =
|
1296 |
-
* PHP 7 updates
|
1297 |
-
* Add frm_field_extra_html hook
|
1298 |
-
* Prevent specific html entity from breaking email message
|
1299 |
-
* Add filter for removing wpautop from form success message
|
1300 |
-
* Fix HTML error on form builder page
|
1301 |
-
* Change the "Licenses" submenu to "Plugin Licenses"
|
1302 |
-
|
1303 |
-
= 2.0.16 =
|
1304 |
-
* Escape font family correctly for quotation marks
|
1305 |
-
* Only check for updates every 24 hours
|
1306 |
-
* Allow emails to be separated by a space
|
1307 |
-
* Prevent old versions of Akismet from causing errors
|
1308 |
-
* Add unit tests for XML import
|
1309 |
-
* Styling updates for WP 4.4
|
1310 |
-
* Save form action settings even if they aren't in the default options
|
1311 |
-
* More contrast on form builder page
|
1312 |
-
* Use normal font weight for from builder
|
1313 |
-
|
1314 |
-
= 2.0.15 =
|
1315 |
-
* Send plugin updates through formidableforms.com
|
1316 |
-
* Update Swedish translation
|
1317 |
-
* Use media_buttons hook instead of deprecated media_buttons_context hook
|
1318 |
-
* Unit test updates
|
1319 |
-
* Fix Portuguese translation error
|
1320 |
-
* Allow more characters in field description
|
1321 |
-
* Prevent plugin styling conflict with user roles dropdown
|
1322 |
-
* Fix installing when the plugin is activated
|
1323 |
-
* Get rid of ambiguity in FrmField::getAll function
|
1324 |
-
* Fix the plugin url when used in the mu-plugins folder
|
1325 |
-
* Make selected values show on form builder page before refresh
|
1326 |
-
* Minor styling changes to frm_total class
|
1327 |
-
* Update stylesheet after import
|
1328 |
-
* Make long text wrap in Chrome cb/radio fields
|
1329 |
-
* Add 'compact' option to Recaptcha
|
1330 |
-
|
1331 |
-
= 2.0.14 =
|
1332 |
-
* Stripslashes in Other field
|
1333 |
-
* Prevent collapse icon from being inserted inside of section
|
1334 |
-
* Make sure roles dropdowns show correctly after clicking update (in Global Settings)
|
1335 |
-
* Make form listing and entry listing pages responsive
|
1336 |
-
* Don't truncate form name in excerpt mode
|
1337 |
-
* Fix validating embedded forms
|
1338 |
-
* Fix filtering by repeating fields in Dynamic Views > Detail Page
|
1339 |
-
* Fix dependent Dynamic autocomplete fields with default values
|
1340 |
-
* Fix logic on embedded forms and multiselect dd
|
1341 |
-
* Some readonly field fixes
|
1342 |
-
* Read-only improvements for multiselect dropdown
|
1343 |
-
* Improve JavaScript for multiple forms on a page
|
1344 |
-
* Use the minified css for jQuery UI styling
|
1345 |
-
* Allow view filtering with time fields using NOW
|
1346 |
-
* Allow times to be formatted with [25 format='g:i A']
|
1347 |
-
|
1348 |
-
= 2.0.13 =
|
1349 |
-
* Allow recaptcha to be conditionally hidden on previous pages of form
|
1350 |
-
* Fix error with embedded form on a conditionally hidden page
|
1351 |
-
* Show the editlink after an entry is edited in place
|
1352 |
-
* Make sure collapsible section icons show regardless of characters in the section title
|
1353 |
-
* Don't require conditionally hidden dynamic category fields
|
1354 |
-
* Add fields attribute to [editlink] shortcode
|
1355 |
-
* Fix calculations using repeating checkboxes
|
1356 |
-
* Prevent double click on Add button in repeating section
|
1357 |
-
* Clear conditionally hidden fields even if they aren't visible
|
1358 |
-
* Make sure pro form templates get imported in multisite
|
1359 |
-
* Use separate values by default for post status fields
|
1360 |
-
* Make sure the separate values option is allows for post status fields
|
1361 |
-
* Show the frmcal-week-end class consistently
|
1362 |
-
* Fix default values in repeating Dynamic fields
|
1363 |
-
* Make Private Views show up in shortcode builder
|
1364 |
-
* Don't do calculations in conditionally hidden repeating fields
|
1365 |
-
* Do calcs in repeating fields when adding a row
|
1366 |
-
* Improve JS for IE8
|
1367 |
-
* Fix unique time error
|
1368 |
-
* Fix default date in jQuery calendar
|
1369 |
-
* Allow entry key with frm-field-value shortcode
|
1370 |
-
* Fix unique time error
|
1371 |
-
* Improve calculations across page breaks
|
1372 |
-
* Prevent clearing default values when hiding/showing sections
|
1373 |
-
* Run calculations in collapsible sections
|
1374 |
-
* Fix duplicating regular sections
|
1375 |
-
* Add post ID View filter
|
1376 |
-
* Fix empty graphs
|
1377 |
-
* Allow frm-entry-update-field, editlink, and deletelink inside foreach loop
|
1378 |
-
* Fix importing parent_form_id on child forms
|
1379 |
-
* Allow css file updating if FTP creds are present
|
1380 |
-
* A few jshint fixes
|
1381 |
-
* Add 'frm_ajax_url' hook
|
1382 |
-
* Allow layout classes to be used with submit button
|
1383 |
-
* Remove frm_last class
|
1384 |
-
* Prevent get_filesystem_method error in multisite after update
|
1385 |
-
* Conditionally use ssl for the ajax url for form submission
|
1386 |
-
|
1387 |
-
|
1388 |
-
= 2.0.12 =
|
1389 |
-
* Add option to center form on page
|
1390 |
-
* Improve styling classes for more consistency across different field classes, and make all classes responsive
|
1391 |
-
* Added a few more styling classes: frm_three_fourths, frm_two_fifths, frm_three_fifths
|
1392 |
-
* Remove in-place-editing from the field keys on the form builder page
|
1393 |
-
* Add 'frm_after_update_field_name' hook for changing a field name during editing
|
1394 |
-
* Update Bootstrap multiselect to v0.9.13
|
1395 |
-
* Add license page to prepare for add-ons. Big things are coming.
|
1396 |
-
* Fix: Prevent loading icon from being huge in some themes
|
1397 |
-
* Fix: When the jQuery UI css is loaded by another plugin on the form builder page, the required icon looked the same whether required or not. This styling conflict is resolved.
|
1398 |
-
* Fix: Make sure the form description size can be changed in the styling settings.
|
1399 |
-
|
1400 |
-
= 2.0.11 =
|
1401 |
-
* Fix issue with clearing array keys when sanitizing an array when displaying entry values
|
1402 |
-
* When the email "reply to" value uses the "from" setting, only use the email address without the name
|
1403 |
-
* Switch the form action events to dropdown instead of checkboxes
|
1404 |
-
* Shrink the reCaptcha on small screens
|
1405 |
-
* Add font-weight 100-900 options to styler
|
1406 |
-
* Add frm_email_message filter
|
1407 |
-
* Fixes for javascript errors while form building in IE8
|
1408 |
-
* Only load font.css for the admin bar when user can edit forms
|
1409 |
-
* Add frm_include_form_tag filter for using div instead of form tag
|
1410 |
-
* Add frm_show_submit_button filter for hiding and showing the submit button
|
1411 |
-
* Fix date calculations using date formats that begin with the year
|
1412 |
-
* Allow classes to be included on a hidden input
|
1413 |
-
* Process the entry a little sooner (wp_loaded instead of wp)
|
1414 |
-
* Add frm_capitalize layout class
|
1415 |
-
* Make frm_customize class work for more field types
|
1416 |
-
|
1417 |
-
= 2.0.10 =
|
1418 |
-
* Add frm_action_triggers hook for adding custom triggers into the actions
|
1419 |
-
* Add frm_{action name here}_action_options hook so any action can be altered
|
1420 |
-
* Prevent extra form actions when a form is duplicated
|
1421 |
-
* Load correct version of formidable.js based on wp-config debugging constant (Thanks @naomicbush for the contributions!)
|
1422 |
-
* Revert get_sortable_columns changes for < WP 4.0 support
|
1423 |
-
|
1424 |
-
= 2.0.09 =
|
1425 |
-
* Add frm_time_to_check duplicate entries filter
|
1426 |
-
* Allow custom JavaScript validation
|
1427 |
-
* Add frm_do_html_shortcodes fiter
|
1428 |
-
* Fix the duplicate entry check
|
1429 |
-
* Include get_columns function in list tables for 4.3
|
1430 |
-
* Use relative URLs in the stylesheet
|
1431 |
-
* Make frm_fifth classes responsive
|
1432 |
-
* Allow 0 to be saved in a checkbox field
|
1433 |
-
* Fix saving forms as drafts
|
1434 |
-
|
1435 |
-
= 2.0.08 =
|
1436 |
-
* Fix security vulnerability allowing shortcodes to be excuted inside a form https://research.g0blin.co.uk/?p=618&d=i4ziyggqao0oz0L0vpUTd8KZwrO2P9Mw
|
1437 |
-
* Added frm_filter_final_form hook. This will need to be used to cover shortcodes that span multiple blocks of field HTML since we can't do a general shortcode replacement on the rendered form
|
1438 |
-
* Revert change that prevented scripts from firing in the form success message
|
1439 |
-
* Fix timestamp timezone on view/edit entry page
|
1440 |
-
* Added frm_entries_{$col_name}_column hook to allow custom columns on the entries listing page
|
1441 |
-
|
1442 |
-
= 2.0.07 =
|
1443 |
-
* Don't escape urls in ajax
|
1444 |
-
* Correctly save all the options on the form settings page
|
1445 |
-
|
1446 |
-
= 2.0.06 =
|
1447 |
-
* Fix an XSS vulnerability in the lite version. When the pro version is active, the vulnerability was resolved.
|
1448 |
-
* Increased security
|
1449 |
-
* Fix the shortcode display on form listing page
|
1450 |
-
* Add frm_helper_shortcode filter
|
1451 |
-
* Prevent javascript error on form settings page when WooThemes Helper plugin is active
|
1452 |
-
* Prevent conflict from unknown plugin/theme that was modifying the post excerpt in form actions, which prevented them from showing
|
1453 |
-
* Only scroll to the errored field and success message if they are not already in view
|
1454 |
-
* Make sure admins always have permission to view menus
|
1455 |
-
|
1456 |
-
= 2.0.05 =
|
1457 |
-
* Remove deprecated jQuery toggle() calls
|
1458 |
-
* Add html ids to hidden fields
|
1459 |
-
* Make sure the entry name doesn't exceed allowed database field size
|
1460 |
-
* Adjust user agent displayed values
|
1461 |
-
* Update Bootstrap javascript to v3.3.4
|
1462 |
-
* Clear more caching for forms, fields, and entries when changes are made
|
1463 |
-
* Lite only: Remove the entry search box on the entries page since the functionality is in pro
|
1464 |
-
|
1465 |
-
= 2.0.04 =
|
1466 |
-
* Fix XSS vulnerability from add_query_args and remove_query_args
|
1467 |
-
* Remove unneeded options from the form widget and switch old styling setting width from 400px to 100%
|
1468 |
-
* Fix the new form class box in the customizable HTML
|
1469 |
-
* Remove WP support for v3.5 and lower
|
1470 |
-
* Don't require the captcha if the keys haven't been configured
|
1471 |
-
* Styling enhancements for left and right label settings
|
1472 |
-
* Deactivate plugin after uninstall to prevent tables from being added back
|
1473 |
-
* Add frm_text_block class to Layout tab
|
1474 |
-
* Fix migration of email settigns that haven't been updated in over two years
|
1475 |
-
* Fix emailing from only a multiple word name with no email
|
1476 |
-
* Send emails for WordPress default if trying to send from Yahoo
|
1477 |
-
|
1478 |
-
= 2.0.03 =
|
1479 |
-
* Use frm_clear instead of clear to minimize conflicts
|
1480 |
-
* Add js fallback for database update on sites without CURL
|
1481 |
-
* Fix issues with emails migrating to actions in php 5.3, and t showing in some emails after updating settings
|
1482 |
-
|
1483 |
-
= 2.0.02 =
|
1484 |
-
* Make sure frm_to_email hook is reverse compatible
|
1485 |
-
* Fix php example in the shortcode examples
|
1486 |
-
* Add styling for frm_half classes combined with left or right labels
|
1487 |
-
* Add a fallback if dbDelta is missing
|
1488 |
-
* Remove inline js from the draft button in the default HTML to prevent 404/403 errors on some servers. This change only applies to new forms
|
1489 |
-
* Move the legend tag into the customizable HTML, but without a migration so it won't be added to existing forms
|
1490 |
-
* Move the "before fields" HTML into the fieldset to it will be parallell with the "After fields" HTML
|
1491 |
-
* Make sure partial form transients aren't saved for long forms. Make sure it's all or nothing.
|
1492 |
-
* Make sure the parent_form_id column was added, and try to add it again if it's not there
|
1493 |
-
|
1494 |
-
= 2.0.01 =
|
1495 |
-
* Break transients into chunks for large forms ( > 200 fields )
|
1496 |
-
* Remove the upgrade link and perform the upgrade automatically
|
1497 |
-
* Allow upgrades to be done automatically in WordPress multisite with the 'Upgrade Network' option
|
1498 |
-
* Updated translations
|
1499 |
-
* Only add one line in the email headers for cc and bcc
|
1500 |
-
* Added frm_include_meta_keys hook for including the previously included meta values referenced by field key
|
1501 |
-
* Delete transients with uninstall
|
1502 |
-
* Make sure the legend stays hidden after opening form in a popup
|
1503 |
-
|
1504 |
-
= 2.0 =
|
1505 |
-
* Move visual form styler into the free WordPress form plugin
|
1506 |
-
* Added multiple emails to free version
|
1507 |
-
* Added BCC, CC, and reply to options to emails
|
1508 |
-
* Replaced the reCaptcha with the new no-captcha recaptcha
|
1509 |
-
* Allow multiple roles to be selected for the permissions on the global settings page
|
1510 |
-
* Updated the UI
|
1511 |
-
* Added a trash can for forms as well as draft forms
|
1512 |
-
* Extra security with sanitizing output and prepare database queries extra just to be sure
|
1513 |
-
* Switch to frm_first frm_last frm_half classes for more flexibility
|
1514 |
-
* Added more responsiveness to the styling classes
|
1515 |
-
* Change the field width option from characters to pixels
|
1516 |
-
* Change the user browser info into a more easily readable format, and include it in the lite version
|
1517 |
-
* Add (hidden) legend tag for accessibility
|
1518 |
-
* Fix preview page with 2015 theme
|
1519 |
-
* Reduce duplicate entry check to 1 minute
|
1520 |
-
* Remove a bunch of upgrade messages in the lite version
|
1521 |
-
* Reduce size of indexed db columns for utf8mb4 in WordPress 4.2
|
1522 |
-
* Fixed a SQL vulnerability. Thanks @KacperSzurek for finding it!
|
1523 |
-
|
1524 |
<a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>
|
5 |
Requires at least: 4.7
|
6 |
Tested up to: 5.7.2
|
7 |
Requires PHP: 5.6
|
8 |
+
Stable tag: 4.11
|
9 |
|
10 |
The most advanced WordPress forms plugin. Go beyond contact forms with our drag & drop form builder for surveys, quizzes, and more.
|
11 |
|
436 |
See all <a href="https://zapier.com/apps/formidable/integrations">Formidable Zapier Integrations</a>.
|
437 |
|
438 |
== Changelog ==
|
439 |
+
= 4.11 =
|
440 |
+
* New: Added a quick and easy Name field with options for First, Middle, and Last names.
|
441 |
+
* New: Added a more powerful spam protection using JavaScript. This can be turned on in the settings for each form.
|
442 |
+
* New: Added Honeypot options to form settings and changed the default Honeypot behaviour to avoid the false positives some people are seeing on mobile devices.
|
443 |
+
* New: Added a frm_process_honeypot filter for gracefully handling honeypot spam.
|
444 |
+
* Fix: A warning was getting logged when exporting a form as XML.
|
445 |
+
|
446 |
= 4.10.03 =
|
447 |
* New: Improved the performance of the style editor preview.
|
448 |
* New: You can now sign up for free form templates directly from your inbox.
|
451 |
* Fix: Actions would occasionally conflict if multiple were added too quickly.
|
452 |
|
453 |
= 4.10.02 =
|
454 |
+
* New: Added support for in-theme previews for more themes including Twenty Twenty, Customizr, and more.
|
455 |
|
456 |
= 4.10.01 =
|
457 |
* New: Include the full email header when an email is sent using the mail function.
|
461 |
= 4.10 =
|
462 |
* Fix: Some fields, including signatures, were not properly detecting duplicate entries.
|
463 |
* Fix: Zeros were not appearing when used as a placeholder value.
|
464 |
+
* Fix: Prevent a warning when previewing a contact form with no fields.
|
465 |
|
466 |
= 4.09.08 =
|
467 |
+
* New: If you add or remove an action and try to leave the page without saving, there will be a warning.
|
468 |
* Fix: The style editor save button was hidden in WordPress 5.7.
|
469 |
* Fix: There were a couple of words misspelled on the welcome page.
|
470 |
|
471 |
= 4.09.07 =
|
472 |
+
* Fix: Duplicated fields would occasionally generate long field keys that were preventing fields from being created.
|
473 |
* Fix: Fields for controlling radio options in the form builder were not using unique id attribute values.
|
474 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
475 |
<a href="https://raw.githubusercontent.com/Strategy11/formidable-forms/master/changelog.txt">See changelog for all versions</a>
|