PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.0
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.0
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/models/FrmField.php +167 -578 6.255.0 View file →
@@ -4,259 +4,199 @@
4 4 }
5 5
6 6 class FrmField {
7 7
8 - public static $use_cache = true;
8 + public static $use_cache = true;
9 9 public static $transient_size = 200;
10 10
11 11 public static function field_selection() {
12 12 $fields = array(
13 - 'text' => array(
13 + 'text' => array(
14 14 'name' => __( 'Text', 'formidable' ),
15 15 'icon' => 'frm_icon_font frm_text2_icon',
16 16 ),
17 - 'textarea' => array(
17 + 'textarea' => array(
18 18 'name' => __( 'Paragraph', 'formidable' ),
19 19 'icon' => 'frm_icon_font frm_paragraph_icon',
20 20 ),
21 - 'checkbox' => array(
21 + 'checkbox' => array(
22 22 'name' => __( 'Checkboxes', 'formidable' ),
23 23 'icon' => 'frm_icon_font frm_check_square_icon',
24 24 ),
25 - 'radio' => array(
25 + 'radio' => array(
26 26 'name' => __( 'Radio Buttons', 'formidable' ),
27 27 'icon' => 'frm_icon_font frm_radio_checked_icon',
28 28 ),
29 - 'select' => array(
29 + 'select' => array(
30 30 'name' => __( 'Dropdown', 'formidable' ),
31 - 'icon' => 'frm_icon_font frm_dropdown_icon',
31 + 'icon' => 'frm_icon_font frm_caret_square_down_icon',
32 32 ),
33 - 'email' => array(
33 + 'email' => array(
34 34 'name' => __( 'Email', 'formidable' ),
35 - 'icon' => 'frm_icon_font frm_email2_icon',
35 + 'icon' => 'frm_icon_font frm_email_icon',
36 36 ),
37 - 'url' => array(
37 + 'url' => array(
38 38 'name' => __( 'Website/URL', 'formidable' ),
39 - 'icon' => 'frm_icon_font frm_link2_icon',
39 + 'icon' => 'frm_icon_font frm_link_icon',
40 40 ),
41 - 'number' => array(
41 + 'number' => array(
42 42 'name' => __( 'Number', 'formidable' ),
43 43 'icon' => 'frm_icon_font frm_hashtag_icon',
44 44 ),
45 - 'name' => array(
45 + 'name' => array(
46 46 'name' => __( 'Name', 'formidable' ),
47 47 'icon' => 'frm_icon_font frm_user_name_icon',
48 48 ),
49 - 'phone' => array(
49 + 'phone' => array(
50 50 'name' => __( 'Phone', 'formidable' ),
51 51 'icon' => 'frm_icon_font frm_phone_icon',
52 52 ),
53 - 'html' => array(
53 + 'html' => array(
54 54 'name' => __( 'HTML', 'formidable' ),
55 - 'icon' => 'frm_icon_font frm_code2_icon',
55 + 'icon' => 'frm_icon_font frm_code_icon',
56 56 ),
57 - 'hidden' => array(
57 + 'hidden' => array(
58 58 'name' => __( 'Hidden', 'formidable' ),
59 - 'icon' => 'frm_icon_font frm_eye_slash2_icon',
59 + 'icon' => 'frm_icon_font frm_eye_slash_icon',
60 60 ),
61 - 'user_id' => array(
61 + 'user_id' => array(
62 62 'name' => __( 'User ID', 'formidable' ),
63 - 'icon' => 'frm_icon_font frm_user2_icon',
63 + 'icon' => 'frm_icon_font frm_user_icon',
64 64 ),
65 - 'captcha' => array(
66 - 'name' => self::get_captcha_field_name(),
67 - 'icon' => 'frm_icon_font frm_shield_check2_icon',
65 + 'captcha' => array(
66 + 'name' => __( 'reCAPTCHA', 'formidable' ),
67 + 'icon' => 'frm_icon_font frm_shield_check_icon',
68 68 ),
69 - 'credit_card' => array(
70 - 'name' => __( 'Payment', 'formidable' ),
71 - 'icon' => 'frm_icon_font frm_credit_card2_icon',
72 - ),
73 - FrmSubmitHelper::FIELD_TYPE => array(
74 - 'name' => __( 'Submit', 'formidable' ),
75 - 'hide' => true,
76 - ),
77 - FrmFieldGdprHelper::FIELD_TYPE => array(
78 - 'name' => __( 'GDPR', 'formidable' ),
79 - 'icon' => 'frm_icon_font frm-gdpr-icon',
80 - 'hide' => FrmFieldGdprHelper::hide_gdpr_field(),
81 - ),
82 69 );
83 70
84 - /**
85 - * @param array $fields
86 - */
87 71 return apply_filters( 'frm_available_fields', $fields );
88 72 }
89 73
90 - /**
91 - * Get the name of the Captcha field based on the global Captcha setting.
92 - *
93 - * @return string
94 - */
95 - private static function get_captcha_field_name() {
96 - return 'Captcha';
97 - }
98 -
99 74 public static function pro_field_selection() {
100 - $images_url = FrmAppHelper::plugin_url() . '/images/';
101 - $fields = array(
102 - 'file' => array(
103 - 'name' => __( 'File Upload', 'formidable' ),
104 - 'icon' => 'frm_icon_font frm_upload3_icon',
105 - 'message' => __( 'Add file uploads to save time and cut down on back-and-forth. Upgrade to Pro to get Upload fields and more.', 'formidable' ),
75 + $fields = array(
76 + 'file' => array(
77 + 'name' => __( 'File Upload', 'formidable' ),
78 + 'icon' => 'frm_icon_font frm_upload_icon',
79 + 'message' => 'Add file uploads to save time and cut down on back-and-forth. Upgrade to Pro to get Upload fields and more.',
106 80 ),
107 - 'ranking' => array(),
108 - 'rte' => array(
81 + 'rte' => array(
109 82 'name' => __( 'Rich Text', 'formidable' ),
110 83 'icon' => 'frm_icon_font frm_align_right_icon',
111 84 ),
112 - 'date' => array(
85 + 'date' => array(
113 86 'name' => __( 'Date', 'formidable' ),
114 - 'icon' => 'frm_icon_font frm_calendar2_icon',
87 + 'icon' => 'frm_icon_font frm_calendar_icon',
115 88 ),
116 - 'time' => array(
89 + 'time' => array(
117 90 'name' => __( 'Time', 'formidable' ),
118 91 'icon' => 'frm_icon_font frm_clock_icon',
119 92 ),
120 - 'scale' => array(
121 - 'name' => __( 'Scale', 'formidable' ),
122 - 'icon' => 'frm_icon_font frm_linear_scale_icon',
123 - 'message' => esc_html__( 'Add a set of radio buttons with whatever range you choose.', 'formidable' ) . '<img src="' . esc_url( $images_url ) . 'scale_field.png" alt="' . esc_attr__( 'Scale Field', 'formidable' ) . '" />',
93 + 'scale' => array(
94 + 'name' => __( 'Scale', 'formidable' ),
95 + 'icon' => 'frm_icon_font frm_linear_scale_icon',
96 + 'message' => 'Add a set of radio buttons with whatever range you choose. <img src="https://s3.amazonaws.com/fp.strategy11.com/images/knowledgebase/scale_field.png" alt="Scale Field" />',
124 97 ),
125 - 'star' => array(
98 + 'star' => array(
126 99 'name' => __( 'Star Rating', 'formidable' ),
127 - 'icon' => 'frm_icon_font frm_star2_icon',
100 + 'icon' => 'frm_icon_font frm_star_icon',
128 101 ),
129 - 'range' => array(
102 + 'range' => array(
130 103 'name' => __( 'Slider', 'formidable' ),
131 104 'icon' => 'frm_icon_font frm_code_commit_icon',
132 105 ),
133 - 'toggle' => array(
106 + 'toggle' => array(
134 107 'name' => __( 'Toggle', 'formidable' ),
135 108 'icon' => 'frm_icon_font frm_toggle_on_icon',
136 109 ),
137 - 'data' => array(
138 - 'name' => __( 'Dynamic', 'formidable' ),
139 - 'icon' => 'frm_icon_font frm_dynamic_icon',
140 - 'message' => __( 'Create relationships between multiple forms. You can link a member to a team, a rating to a product, a comment to a submission, and much more.', 'formidable' ),
110 + 'data' => array(
111 + 'name' => __( 'Dynamic', 'formidable' ),
112 + 'icon' => 'frm_icon_font frm_sitemap_icon',
113 + 'message' => 'Create relationships between multiple forms. You can link a member to a team, a rating to a product, a comment to a submission, and much more.',
141 114 ),
142 - 'lookup' => array(
143 - 'name' => __( 'Lookup', 'formidable' ),
144 - 'icon' => 'frm_icon_font frm_search_icon',
145 - 'message' => esc_html__( 'Filter the options in the next field and automatically add values to other fields. Upgrade to Pro to get Lookup fields and more.', 'formidable' ) . ' <img src="' . esc_url( $images_url ) . 'look-up_year-make-model.gif" alt="' . esc_attr__( 'cascading lookup fields', 'formidable' ) . '" />',
115 + 'lookup' => array(
116 + 'name' => __( 'Lookup', 'formidable' ),
117 + 'icon' => 'frm_icon_font frm_search_icon',
118 + 'message' => 'Filter the options in the next field and automatically add values to other fields. Upgrade to Pro to get Lookup fields and more. <img src="https://s3.amazonaws.com/fp.strategy11.com/images/knowledgebase/look-up_year-make-model.gif" alt="cascading lookup fields" />',
146 119 ),
147 - 'divider|repeat' => array(
148 - 'name' => __( 'Repeater', 'formidable' ),
149 - 'icon' => 'frm_icon_font frm_refresh_icon',
150 - 'message' => esc_html__( 'Allow your visitors to add new sets of fields while filling out forms. Increase conversions while saving building time and server resources.', 'formidable' ) . ' <img src="' . esc_url( $images_url ) . 'repeatable-section_frontend.gif" alt="' . esc_attr__( 'Dynamically Add Form Fields with repeatable sections', 'formidable' ) . '" />',
120 + 'divider|repeat' => array(
121 + 'name' => __( 'Repeater', 'formidable' ),
122 + 'icon' => 'frm_icon_font frm_repeater_icon',
123 + 'message' => 'Allow your visitors to add new sets of fields while filling out forms. Increase conversions while saving building time and server resources. <img src="https://s3.amazonaws.com/fp.strategy11.com/images/knowledgebase/repeatable-section_frontend.gif" alt="Dynamically Add Form Fields with repeatable sections" />',
151 124 ),
152 - 'end_divider' => array(
125 + 'end_divider' => array(
153 126 'name' => __( 'Section Buttons', 'formidable' ),
154 127 'switch_from' => 'divider',
155 128 ),
156 - 'divider' => array(
129 + 'divider' => array(
157 130 'name' => __( 'Section', 'formidable' ),
158 131 'icon' => 'frm_icon_font frm_header_icon',
159 132 ),
160 - 'break' => array(
161 - 'name' => __( 'Page Break', 'formidable' ),
162 - 'icon' => 'frm_icon_font frm_page_break_icon',
163 - 'message' => __( 'Get multi-paged forms with progress bars. Did you know you can upgrade to PRO to unlock multi-step forms with more awesome features?', 'formidable' ),
133 + 'break' => array(
134 + 'name' => __( 'Page Break', 'formidable' ),
135 + 'icon' => 'frm_icon_font frm_page_break_icon',
136 + 'message' => 'Get multi-paged forms with progress bars. Did you know you can upgrade to PRO to unlock multi-step forms with more awesome features?',
164 137 ),
165 - 'form' => array(
138 + 'form' => array(
166 139 'name' => __( 'Embed Form', 'formidable' ),
167 - 'icon' => 'frm_icon_font frm_file_text2_icon',
140 + 'icon' => 'frm_icon_font frm_file_text_icon',
168 141 ),
169 - 'likert' => array(
170 - 'name' => __( 'Likert Scale', 'formidable' ),
171 - 'icon' => 'frm_icon_font frm_likert_scale frm_show_upgrade',
172 - 'addon' => 'surveys',
173 - ),
174 - 'nps' => array(
175 - 'name' => __( 'NPS', 'formidable' ),
176 - 'icon' => 'frm_icon_font frm_nps frm_show_upgrade',
177 - 'addon' => 'surveys',
178 - ),
179 - 'password' => array(
142 + 'password' => array(
180 143 'name' => __( 'Password', 'formidable' ),
181 - 'icon' => 'frm_icon_font frm_lock_closed2_icon',
144 + 'icon' => 'frm_icon_font frm_lock_open_icon',
182 145 ),
183 - 'tag' => array(
146 + 'tag' => array(
184 147 'name' => __( 'Tags', 'formidable' ),
185 - 'icon' => 'frm_icon_font frm_price_tags2_icon',
148 + 'icon' => 'frm_icon_font frm_price_tags_icon',
186 149 ),
187 - // This is no longer a Pro field, but without this here, Pro triggers "undefined index" notices.
188 - // Right now it leaves a gap. Maybe we can skip anything without a name or something.
189 - 'credit_card' => array(
190 - 'name' => '',
191 - 'icon' => '',
150 + 'credit_card' => array(
151 + 'name' => __( 'Credit Card', 'formidable' ),
152 + 'icon' => 'frm_icon_font frm_credit_card_icon frm_show_upgrade',
153 + 'addon' => 'stripe',
192 154 ),
193 - 'address' => array(
155 + 'address' => array(
194 156 'name' => __( 'Address', 'formidable' ),
195 - 'icon' => 'frm_icon_font frm_location2_icon',
157 + 'icon' => 'frm_icon_font frm_location_icon',
196 158 ),
197 - 'summary' => array(
198 - 'name' => __( 'Summary', 'formidable' ),
199 - 'icon' => 'frm_icon_font frm_file_text3_icon',
200 - 'message' => __( 'Allow visitors to review their responses before a form is submitted. Upgrade to Pro to get Summary fields and more.', 'formidable' ),
159 + 'summary' => array(
160 + 'name' => __( 'Summary', 'formidable' ),
161 + 'icon' => 'frm_icon_font frm_file_text_icon',
162 + 'message' => 'Allow visitors to review their responses before a form is submitted. Upgrade to Pro to get Summary fields and more.',
201 163 ),
202 - 'signature' => array(
164 + 'signature' => array(
203 165 'name' => __( 'Signature', 'formidable' ),
204 166 'icon' => 'frm_icon_font frm_signature_icon frm_show_upgrade',
205 167 'addon' => 'signature',
206 168 ),
207 - 'ai' => array(
208 - 'name' => __( 'AI', 'formidable' ),
209 - 'icon' => 'frm_icon_font frm-ai-icon frm_show_upgrade',
210 - 'addon' => 'ai',
211 - 'message' => __( 'Streamline workflows and reclaim valuable time with the power of AI. You can effortlessly respond to your visitors in real-time with ChatGPT as your automated assistant. Upgrade to Pro and unlock AI-powered fields.', 'formidable' ),
169 + 'quiz_score' => array(
170 + 'name' => __( 'Quiz Score', 'formidable' ),
171 + 'icon' => 'frm_icon_font frm_percent_icon frm_show_upgrade',
172 + 'addon' => 'quizzes',
212 173 ),
213 174 'ssa-appointment' => array(
214 175 'name' => __( 'Appointment', 'formidable' ),
215 - 'icon' => 'frm_icon_font frm_schedule_icon frm_show_upgrade',
176 + 'icon' => 'frm_icon_font frm_calendar_icon frm_show_upgrade',
216 177 'require' => 'Simply Schedule Appointments',
217 - 'message' => sprintf(
218 - /* translators: %1$s: Link opening HTML, %2$s: Link tag closing */
219 - esc_html__( 'Appointment fields are an integration with %1$sSimply Schedule Appointments%2$s. Get started now to schedule appointments directly from your forms.', 'formidable' ),
220 - '<a href="https://simplyscheduleappointments.com/meet/formidable/">',
221 - '</a>'
222 - ) . '<img src="' . esc_url( $images_url ) . 'appointments.png" alt="' . esc_attr__( 'Scheduling', 'formidable' ) . '" />',
178 + 'message' => 'Appointment fields are an integration with <a href="https://simplyscheduleappointments.com/meet/formidable/">Simply Schedule Appointments</a>. Get started now to schedule appointments directly from your forms.
179 + <img src="https://s3.amazonaws.com/fp.strategy11.com/images/appointments/appointments.png" alt="Scheduling" />',
223 180 'link' => 'https://simplyscheduleappointments.com/meet/formidable/',
224 181 ),
225 - 'product' => array(
182 + 'product' => array(
226 183 'name' => __( 'Product', 'formidable' ),
227 - 'icon' => 'frm_icon_font frm_product2_icon',
184 + 'icon' => 'frm_icon_font frm_product_icon',
228 185 'section' => 'pricing',
229 186 ),
230 - 'quantity' => array(
187 + 'quantity' => array(
231 188 'name' => __( 'Quantity', 'formidable' ),
232 189 'icon' => 'frm_icon_font frm_quantity_icon',
233 190 'section' => 'pricing',
234 191 ),
235 - 'total' => array(
192 + 'total' => array(
236 193 'name' => __( 'Total', 'formidable' ),
237 - 'icon' => 'frm_icon_font frm_total2_icon',
194 + 'icon' => 'frm_icon_font frm_total_icon',
238 195 'section' => 'pricing',
239 196 ),
240 197 );
241 198
242 - if ( self::include_ranking_fields() ) {
243 - $fields['ranking'] = array(
244 - 'name' => __( 'Ranking', 'formidable' ),
245 - 'icon' => 'frm_icon_font frm_chart_bar_icon frm_show_upgrade',
246 - 'message' => __( 'Now you can effortlessly gather insights, preferences, and opinions by allowing users to rank options.', 'formidable' ),
247 - 'upsell_image' => esc_url( $images_url ) . 'ranking-field.svg',
248 - 'addon' => 'surveys',
249 - 'is_new' => self::field_is_new( 'ranking' ),
250 - );
251 - } else {
252 - unset( $fields['ranking'] );
253 - }
254 -
255 - if ( ! FrmAppHelper::show_new_feature( 'ai' ) ) {
256 - unset( $fields['ai'] );
257 - }
258 -
259 199 // Since the signature field may be in a different section, don't show it twice.
260 200 $lite_fields = self::field_selection();
261 201 if ( isset( $lite_fields['signature'] ) ) {
262 202 unset( $fields['signature'] );
@@ -265,102 +205,9 @@
265 205 return apply_filters( 'frm_pro_available_fields', $fields );
266 206 }
267 207
268 208 /**
269 - * Check if we should show ranking fields in the builder.
270 - * This is based on the active version coming from our API data.
271 - * If Surveys v1.1 is not released yet, we don't want to display ranking fields yet.
272 - *
273 - * @since 6.8.3
274 - *
275 - * @return bool
276 - */
277 - private static function include_ranking_fields() {
278 - if ( class_exists( 'FrmSurveys\models\fields\Ranking' ) ) {
279 - // Always return true if Ranking fields exist.
280 - return true;
281 - }
282 -
283 - $plugin = 'formidable-surveys/formidable-surveys.php';
284 - $expected_version = '1.1';
285 -
286 - return self::installed_plugin_meets_version( $plugin, $expected_version ) || self::api_meets_version( $plugin, $expected_version );
287 - }
288 -
289 - /**
290 - * @since 6.8.3
291 - *
292 - * @param string $plugin
293 - * @param string $expected_version
294 - * @return bool
295 - */
296 - private static function installed_plugin_meets_version( $plugin, $expected_version ) {
297 - $installed_version = self::get_installed_version( $plugin );
298 - return $installed_version && version_compare( $installed_version, $expected_version, '>=' );
299 - }
300 -
301 - /**
302 - * @since 6.8.3
303 - *
304 - * @param string $plugin
305 - * @return false|string String version. False if the plugin is not installed.
306 - */
307 - private static function get_installed_version( $plugin ) {
308 - if ( ! function_exists( 'get_plugins' ) ) {
309 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
310 - }
311 - $plugins = get_plugins();
312 - if ( isset( $plugins[ $plugin ] ) && ! empty( $plugins[ $plugin ]['Version'] ) ) {
313 - return $plugins[ $plugin ]['Version'];
314 - }
315 - return false;
316 - }
317 -
318 - /**
319 - * @since 6.8.3
320 - *
321 - * @param string $plugin
322 - * @param string $expected_version
323 - * @return bool
324 - */
325 - private static function api_meets_version( $plugin, $expected_version ) {
326 - $api = new FrmFormApi();
327 - $addons = $api->get_api_info();
328 - $matches = wp_list_filter( $addons, array( 'plugin' => $plugin ) );
329 - if ( ! $matches ) {
330 - return false;
331 - }
332 -
333 - $match = reset( $matches );
334 - if ( empty( $match['new_version'] ) ) {
335 - return false;
336 - }
337 -
338 - $api_version = $match['new_version'];
339 - return version_compare( $api_version, $expected_version, '>=' );
340 - }
341 -
342 - /**
343 - * Consider a field new for 90 days after the release date.
344 - *
345 - * @since 6.8.3
346 - *
347 - * @param string $type
348 - * @return bool
349 - */
350 - private static function field_is_new( $type ) {
351 - if ( 'ranking' === $type ) {
352 - $ranking_release_date = '2024-03-12';
353 - $three_months_after_release = gmdate( 'Y-m-d', strtotime( $ranking_release_date . ' + 90 days' ) );
354 - return gmdate( 'Y-m-d' ) < $three_months_after_release;
355 - }
356 - return false;
357 - }
358 -
359 - /**
360 209 * @since 4.0
361 - *
362 - * @return array
363 210 */
364 211 public static function all_field_selection() {
365 212 $pro_field_selection = self::pro_field_selection();
366 213 return array_merge( $pro_field_selection, self::field_selection() );
@@ -365,31 +212,21 @@
365 212 $pro_field_selection = self::pro_field_selection();
366 213 return array_merge( $pro_field_selection, self::field_selection() );
367 214 }
368 215
369 - /**
370 - * Create a field.
371 - *
372 - * @param array $values
373 - * @param bool $return
374 - * @return false|int
375 - */
376 216 public static function create( $values, $return = true ) {
377 217 global $wpdb, $frm_duplicate_ids;
378 218
379 219 $new_values = array();
380 - $key = $values['field_key'] ?? $values['name'];
220 + $key = isset( $values['field_key'] ) ? $values['field_key'] : $values['name'];
381 221 $new_values['field_key'] = FrmAppHelper::get_unique_key( $key, $wpdb->prefix . 'frm_fields', 'field_key' );
382 222
383 - $values = FrmAppHelper::maybe_filter_array( $values, array( 'name', 'description' ) );
384 -
385 223 foreach ( array( 'name', 'description', 'type', 'default_value' ) as $col ) {
386 - if ( isset( $values[ $col ] ) ) {
387 - $new_values[ $col ] = $values[ $col ];
388 - }
224 + $new_values[ $col ] = $values[ $col ];
389 225 }
390 226
391 - $new_values['options'] = self::maybe_filter_options( $values['options'] );
227 + $new_values['options'] = $values['options'];
228 +
392 229 $new_values['field_order'] = isset( $values['field_order'] ) ? (int) $values['field_order'] : null;
393 230 $new_values['required'] = isset( $values['required'] ) ? (int) $values['required'] : 0;
394 231 $new_values['form_id'] = isset( $values['form_id'] ) ? (int) $values['form_id'] : null;
395 232 $new_values['field_options'] = $values['field_options'];
@@ -412,151 +249,31 @@
412 249 }
413 250 unset( $k, $v );
414 251 }
415 252
253 + //if(isset($values['id']) and is_numeric($values['id']))
254 + // $new_values['id'] = $values['id'];
255 +
416 256 $query_results = $wpdb->insert( $wpdb->prefix . 'frm_fields', $new_values );
417 -
418 - if ( ! $query_results ) {
419 - return false;
257 + $new_id = 0;
258 + if ( $query_results ) {
259 + self::delete_form_transient( $new_values['form_id'] );
260 + $new_id = $wpdb->insert_id;
420 261 }
421 262
422 - self::delete_form_transient( $new_values['form_id'] );
423 - $new_id = $wpdb->insert_id;
424 -
425 263 if ( ! $return ) {
426 264 return false;
427 265 }
428 266
429 - if ( isset( $values['id'] ) ) {
430 - $frm_duplicate_ids[ $values['id'] ] = $new_id;
431 - }
267 + if ( $query_results ) {
268 + if ( isset( $values['id'] ) ) {
269 + $frm_duplicate_ids[ $values['id'] ] = $new_id;
270 + }
432 271
433 - return $new_id;
434 - }
435 -
436 - /**
437 - * Maybe filter HTML in field options data.
438 - * HTML is only filtered when unsafe HTML is disallowed.
439 - * See FrmAppHelper::allow_unfiltered_html.
440 - *
441 - * @since 5.0.08
442 - *
443 - * @param array $options
444 - * @return array
445 - */
446 - private static function maybe_filter_options( $options ) {
447 - $options = FrmAppHelper::maybe_filter_array( $options, array( 'custom_html' ) );
448 -
449 - if ( ! empty( $options['custom_html'] ) ) {
450 - $options['custom_html'] = self::maybe_filter_custom_html_input_attributes( $options['custom_html'] );
451 - }
452 -
453 - if ( ! empty( $options['classes'] ) ) {
454 - $options['classes'] = implode( ' ', array_map( 'FrmFormsHelper::sanitize_layout_class', explode( ' ', $options['classes'] ) ) );
455 - }
456 -
457 - return $options;
458 - }
459 -
460 - /**
461 - * Prevent users who do not have permission to insert JavaScript attributes in input elements.
462 - * This is triggered when a field is updated.
463 - *
464 - * @since 6.11.2
465 - *
466 - * @param string $html
467 - * @return string
468 - */
469 - private static function maybe_filter_custom_html_input_attributes( $html ) {
470 - if ( FrmAppHelper::allow_unfiltered_html() ) {
471 - return $html;
472 - }
473 -
474 - $pattern = get_shortcode_regex( array( 'input' ) );
475 - return preg_replace_callback(
476 - "/$pattern/",
477 - /**
478 - * @param array $match Shortcode data.
479 - * @return string
480 - */
481 - function ( $match ) {
482 - $attr = shortcode_parse_atts( $match[3] );
483 -
484 - if ( ! is_array( $attr ) ) {
485 - // In old versions of WordPress (older than 6.5), this might not be an array.
486 - return '[input]';
487 - }
488 -
489 - $safe_atts = array();
490 - foreach ( $attr as $attr_key => $att ) {
491 - if ( ! is_numeric( $attr_key ) ) {
492 - // opt=1 without parentheses for example is mapped like 'opt' => 1.
493 - $key = $attr_key;
494 - $value = $att;
495 - } else {
496 - // Some data is mapped like 0 => 'placeholder="Placeholder"'.
497 - $split = explode( '=', $att, 2 );
498 - if ( 2 !== count( $split ) ) {
499 - continue;
500 - }
501 - $key = trim( $split[0] );
502 - $value = trim( $split[1], '"' );
503 - }
504 -
505 - if ( FrmAppHelper::input_key_is_safe( $key, 'update' ) ) {
506 - $safe_atts[ $key ] = $value;
507 - }
508 - }
509 -
510 - if ( ! $safe_atts ) {
511 - return '[input]';
512 - }
513 -
514 - return '[input ' . FrmAppHelper::array_to_html_params( $safe_atts ) . ']';
515 - },
516 - $html
517 - );
518 - }
519 -
520 - /**
521 - * Process the field duplication.
522 - *
523 - * @since 5.0.05
524 - */
525 - public static function duplicate_single_field( $field_id, $form_id ) {
526 - $copy_field = self::getOne( $field_id );
527 - if ( ! $copy_field ) {
272 + return $new_id;
273 + } else {
528 274 return false;
529 275 }
530 -
531 - do_action( 'frm_duplicate_field', $copy_field, $form_id );
532 - do_action( 'frm_duplicate_field_' . $copy_field->type, $copy_field, $form_id );
533 -
534 - $values = array(
535 - 'id' => $copy_field->id,
536 - );
537 - FrmFieldsHelper::fill_field( $values, $copy_field, $copy_field->form_id );
538 - $values = apply_filters( 'frm_prepare_single_field_for_duplication', $values );
539 -
540 - $field_id = self::create( $values );
541 -
542 - /**
543 - * Fires after duplicating a field.
544 - *
545 - * @since 5.0.04
546 - *
547 - * @param array $args {
548 - * The arguments.
549 - *
550 - * @type int $field_id New field ID.
551 - * @type array $values Values before inserting.
552 - * @type object $copy_field Copy field data.
553 - * @type int $form_id Form ID.
554 - * }
555 - */
556 - do_action( 'frm_after_duplicate_field', compact( 'field_id', 'values', 'copy_field', 'form_id' ) );
557 -
558 - return compact( 'field_id', 'values' );
559 276 }
560 277
561 278 public static function duplicate( $old_form_id, $form_id, $copy_keys = false, $blog_id = false ) {
562 279 global $frm_duplicate_ids;
@@ -609,21 +326,15 @@
609 326 $new_id = self::create( $values );
610 327 $frm_duplicate_ids[ $field->id ] = $new_id;
611 328 $frm_duplicate_ids[ $field->field_key ] = $new_id;
612 329 unset( $field );
613 - }//end foreach
330 + }
614 331 }
615 332
616 - /**
617 - * @param int|string $id
618 - * @param array $values
619 - * @return false|int
620 - */
621 333 public static function update( $id, $values ) {
622 334 global $wpdb;
623 335
624 - $id = absint( $id );
625 - $values = FrmAppHelper::maybe_filter_array( $values, array( 'name', 'description' ) );
336 + $id = absint( $id );
626 337
627 338 if ( isset( $values['field_key'] ) ) {
628 339 $values['field_key'] = FrmAppHelper::get_unique_key( $values['field_key'], $wpdb->prefix . 'frm_fields', 'field_key', $id );
629 340 }
@@ -634,23 +345,11 @@
634 345
635 346 self::preserve_format_option_backslashes( $values );
636 347
637 348 if ( isset( $values['type'] ) ) {
638 - if ( 'dropdown' === $values['type'] ) {
639 - // To avoid conflicts with security plugins the value "dropdown" is sent for select fields.
640 - // This is because "select" gets matched for SQL injection attempts.
641 - $values['type'] = 'select';
642 - }
349 + $values = apply_filters( 'frm_clean_' . $values['type'] . '_field_options_before_update', $values );
643 350
644 - /**
645 - * @since 6.9 The Field ID param was added.
646 - *
647 - * @param array $values
648 - * @param int $id Field ID.
649 - */
650 - $values = apply_filters( 'frm_clean_' . $values['type'] . '_field_options_before_update', $values, $id );
651 -
652 - if ( $values['type'] === 'hidden' && isset( $values['field_options'] ) && isset( $values['field_options']['clear_on_focus'] ) ) {
351 + if ( $values['type'] == 'hidden' && isset( $values['field_options'] ) && isset( $values['field_options']['clear_on_focus'] ) ) {
653 352 // don't keep the old placeholder setting for hidden fields
654 353 $values['field_options']['clear_on_focus'] = 0;
655 354 }
656 355 }
@@ -657,11 +356,8 @@
657 356
658 357 // serialize array values
659 358 foreach ( array( 'field_options', 'options' ) as $opt ) {
660 359 if ( isset( $values[ $opt ] ) && is_array( $values[ $opt ] ) ) {
661 - if ( 'field_options' === $opt ) {
662 - $values[ $opt ] = self::maybe_filter_options( $values[ $opt ] );
663 - }
664 360 $values[ $opt ] = serialize( $values[ $opt ] );
665 361 }
666 362 }
667 363 if ( isset( $values['default_value'] ) && is_array( $values['default_value'] ) ) {
@@ -696,9 +392,9 @@
696 392 * Keep backslashes in the phone format option
697 393 *
698 394 * @since 2.0.8
699 395 *
700 - * @param array $values Pass by reference.
396 + * @param $values array - pass by reference
701 397 */
702 398 private static function preserve_format_option_backslashes( &$values ) {
703 399 if ( isset( $values['field_options']['format'] ) ) {
704 400 $values['field_options']['format'] = FrmAppHelper::preserve_backslashes( $values['field_options']['format'] );
@@ -742,11 +438,8 @@
742 438 }
743 439
744 440 /**
745 441 * If $field is numeric, get the field object
746 - *
747 - * @param int|object|string $field
748 - * @return void
749 442 */
750 443 public static function maybe_get_field( &$field ) {
751 444 if ( ! is_object( $field ) ) {
752 445 $field = self::getOne( $field );
@@ -753,10 +446,10 @@
753 446 }
754 447 }
755 448
756 449 /**
757 - * @param int|string $id The field id or key.
758 - * @param bool $filter When true, run the frm_field filter.
450 + * @param string|int $id The field id or key.
451 + * @param bool $filter When true, run the frm_field filter.
759 452 */
760 453 public static function getOne( $id, $filter = false ) {
761 454 if ( empty( $id ) ) {
762 455 return null;
@@ -764,9 +457,9 @@
764 457
765 458 global $wpdb;
766 459
767 460 $where = is_numeric( $id ) ? 'id=%d' : 'field_key=%s';
768 - $query = $wpdb->prepare( 'SELECT * FROM ' . $wpdb->prefix . 'frm_fields WHERE ' . $where, $id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
461 + $query = $wpdb->prepare( 'SELECT * FROM ' . $wpdb->prefix . 'frm_fields WHERE ' . $where, $id ); // WPCS: unprepared SQL ok.
769 462
770 463 $results = FrmDb::check_cache( $id, 'frm_field', $query, 'get_row', 0 );
771 464
772 465 if ( empty( $results ) ) {
@@ -802,10 +495,10 @@
802 495
803 496 /**
804 497 * Get the field type by key or id
805 498 *
806 - * @param int|string $id The field id or key.
807 - * @param mixed $col The name of the column in the fields database table.
499 + * @param int|string The field id or key
500 + * @param mixed $col The name of the column in the fields database table
808 501 */
809 502 public static function get_type( $id, $col = 'type' ) {
810 503 $field = FrmDb::check_cache( $id, 'frm_field' );
811 504 if ( $field ) {
@@ -810,25 +503,19 @@
810 503 $field = FrmDb::check_cache( $id, 'frm_field' );
811 504 if ( $field ) {
812 505 $type = $field->{$col};
813 506 } else {
814 - if ( is_numeric( $id ) ) {
815 - $where = array( 'id' => $id );
816 - } else {
817 - $where = array( 'field_key' => $id );
818 - }
819 - $type = FrmDb::get_var( 'frm_fields', $where, $col );
507 + $where = array(
508 + 'or' => 1,
509 + 'id' => $id,
510 + 'field_key' => $id,
511 + );
512 + $type = FrmDb::get_var( 'frm_fields', $where, $col );
820 513 }
821 514
822 515 return $type;
823 516 }
824 517
825 - /**
826 - * @param int|string $form_id
827 - * @param string $type
828 - * @param int|string $limit
829 - * @param string $inc_sub
830 - */
831 518 public static function get_all_types_in_form( $form_id, $type, $limit = '', $inc_sub = 'exclude' ) {
832 519 if ( ! $form_id ) {
833 520 return array();
834 521 }
@@ -848,9 +535,9 @@
848 535 continue;
849 536 }
850 537
851 538 $fields[ $result->id ] = $result;
852 - ++$count;
539 + $count ++;
853 540 if ( $limit == 1 ) {
854 541 $fields = $result;
855 542 break;
856 543 }
@@ -862,9 +549,9 @@
862 549 unset( $result );
863 550 }
864 551
865 552 return wp_unslash( $fields );
866 - }//end if
553 + }
867 554
868 555 self::$use_cache = false;
869 556
870 557 $where = array(
@@ -878,15 +565,8 @@
878 565
879 566 return $results;
880 567 }
881 568
882 - /**
883 - * @param int|string $form_id
884 - * @param int|string $limit
885 - * @param string $inc_embed
886 - * @param string $inc_repeat
887 - * @return array
888 - */
889 569 public static function get_all_for_form( $form_id, $limit = '', $inc_embed = 'exclude', $inc_repeat = 'include' ) {
890 570 if ( ! (int) $form_id ) {
891 571 return array();
892 572 }
@@ -899,9 +579,9 @@
899 579
900 580 $fields = array();
901 581 $count = 0;
902 582 foreach ( $results as $result ) {
903 - ++$count;
583 + $count ++;
904 584 $fields[ $result->id ] = $result;
905 585 if ( ! empty( $limit ) && $count >= $limit ) {
906 586 break;
907 587 }
@@ -930,12 +610,12 @@
930 610 /**
931 611 * If repeating fields should be included, adjust $where accordingly
932 612 *
933 613 * @param string $inc_repeat
934 - * @param array $where Pass by reference.
614 + * @param array $where - pass by reference
935 615 */
936 616 private static function maybe_include_repeating_fields( $inc_repeat, &$where ) {
937 - if ( $inc_repeat === 'include' ) {
617 + if ( $inc_repeat == 'include' ) {
938 618 $form_id = $where['fi.form_id'];
939 619 $where[] = array(
940 620 'or' => 1,
941 621 'fi.form_id' => $form_id,
@@ -950,9 +630,9 @@
950 630 if ( 'include' != $inc_embed || $no_sub_forms ) {
951 631 return;
952 632 }
953 633
954 - $form_fields = $results;
634 + $form_fields = $results;
955 635 $should_get_subforms = ( $type !== 'all' && $type !== 'form' && ! empty( $form_id ) );
956 636 if ( $should_get_subforms ) {
957 637 $form_fields = self::get_all_types_in_form( $form_id, 'form' );
958 638 }
@@ -962,9 +642,9 @@
962 642 if ( 'form' != $field->type || ! isset( $field->field_options['form_select'] ) ) {
963 643 continue;
964 644 }
965 645
966 - if ( $type === 'all' ) {
646 + if ( $type == 'all' ) {
967 647 $sub_fields = self::get_all_for_form( $field->field_options['form_select'] );
968 648 } else {
969 649 $sub_fields = self::get_all_types_in_form( $field->field_options['form_select'], $type );
970 650 }
@@ -969,9 +649,9 @@
969 649 $sub_fields = self::get_all_types_in_form( $field->field_options['form_select'], $type );
970 650 }
971 651
972 652 if ( ! empty( $sub_fields ) ) {
973 - $index = $k + $index_offset;
653 + $index = $k + $index_offset;
974 654 $index_offset += count( $sub_fields );
975 655 array_splice( $results, $index, 0, $sub_fields );
976 656 }
977 657 unset( $field, $sub_fields );
@@ -1010,10 +690,10 @@
1010 690 }
1011 691
1012 692 $limit = FrmDb::esc_limit( $limit );
1013 693
1014 - $query = "SELECT fi.*, fr.name as form_name FROM {$table_name} fi JOIN {$form_table_name} fr ON fi.form_id=fr.id";
1015 - $query_type = $limit === ' LIMIT 1' || $limit == 1 ? 'row' : 'results';
694 + $query = "SELECT fi.*, fr.name as form_name FROM {$table_name} fi LEFT OUTER JOIN {$form_table_name} fr ON fi.form_id=fr.id";
695 + $query_type = ( $limit == ' LIMIT 1' || $limit == 1 ) ? 'row' : 'results';
1016 696
1017 697 if ( is_array( $where ) ) {
1018 698 $args = array(
1019 699 'order_by' => $order_by,
@@ -1018,14 +698,14 @@
1018 698 $args = array(
1019 699 'order_by' => $order_by,
1020 700 'limit' => $limit,
1021 701 );
1022 - $results = FrmDb::get_var( $table_name . ' fi JOIN ' . $form_table_name . ' fr ON fi.form_id=fr.id', $where, 'fi.*, fr.name as form_name', $args, '', $query_type );
702 + $results = FrmDb::get_var( $table_name . ' fi LEFT OUTER JOIN ' . $form_table_name . ' fr ON fi.form_id=fr.id', $where, 'fi.*, fr.name as form_name', $args, '', $query_type );
1023 703 } else {
1024 704 // if the query is not an array, then it has already been prepared
1025 705 $query .= FrmDb::prepend_and_or_where( ' WHERE ', $where ) . $order_by . $limit;
1026 706
1027 - $function_name = $query_type === 'row' ? 'get_row' : 'get_results';
707 + $function_name = ( $query_type == 'row' ) ? 'get_row' : 'get_results';
1028 708 $results = $wpdb->$function_name( $query );
1029 709 }
1030 710 unset( $where );
1031 711
@@ -1041,10 +721,8 @@
1041 721 */
1042 722 private static function format_field_results( &$results ) {
1043 723 if ( is_array( $results ) ) {
1044 724 foreach ( $results as $r_key => $result ) {
1045 - self::add_slashes_to_format_before_setting_field_cache( $result );
1046 -
1047 725 FrmDb::set_cache( $result->id, $result, 'frm_field' );
1048 726 FrmDb::set_cache( $result->field_key, $result, 'frm_field' );
1049 727
1050 728 self::prepare_options( $result );
@@ -1062,26 +740,8 @@
1062 740 }
1063 741 }
1064 742
1065 743 /**
1066 - * When $result->field_options is an array and not a serialized string there is only a single backslash.
1067 - * Cached results are unslashed in FrmField::getAll, so we need to make sure that the cached object has an extra backslash.
1068 - * Otherwise the backslash is stripped away on load.
1069 - *
1070 - * @since 6.15
1071 - *
1072 - * @param stdClass $result
1073 - * @return void
1074 - */
1075 - private static function add_slashes_to_format_before_setting_field_cache( $result ) {
1076 - if ( ! isset( $result->field_options ) || ! is_array( $result->field_options ) || empty( $result->field_options['format'] ) ) {
1077 - return;
1078 - }
1079 -
1080 - $result->field_options['format'] = addslashes( $result->field_options['format'] );
1081 - }
1082 -
1083 - /**
1084 744 * Unserialize all the serialized field data
1085 745 *
1086 746 * @since 2.0
1087 747 */
@@ -1090,21 +750,16 @@
1090 750 FrmAppHelper::unserialize_or_decode( $results->options );
1091 751
1092 752 // Allow a single box to be checked for the default value.
1093 753 $before = $results->default_value;
1094 -
1095 - $field_object = FrmFieldFactory::get_field_type( $results->type );
1096 -
1097 - if ( $field_object->should_unserialize_value() ) {
1098 - FrmAppHelper::unserialize_or_decode( $results->default_value );
1099 - if ( $before === $results->default_value && is_string( $before ) && strpos( $before, '["' ) === 0 ) {
1100 - $results->default_value = FrmAppHelper::maybe_json_decode( $results->default_value );
1101 - }
754 + FrmAppHelper::unserialize_or_decode( $results->default_value );
755 + if ( $before === $results->default_value && ! is_array( $before ) && strpos( $before, '["' ) === 0 ) {
756 + $results->default_value = FrmAppHelper::maybe_json_decode( $results->default_value );
1102 757 }
1103 758 }
1104 759
1105 760 /**
1106 - * If a form has too many fields, they won't all save into a single transient.
761 + * If a form has too many fields, thay won't all save into a single transient.
1107 762 * We'll break them into groups of 200
1108 763 *
1109 764 * @since 2.0.1
1110 765 */
@@ -1128,9 +783,9 @@
1128 783 $fields = array_merge( $fields, $next_fields );
1129 784
1130 785 if ( count( $next_fields ) >= self::$transient_size ) {
1131 786 // if this transient is full, check for another
1132 - ++$next;
787 + $next ++;
1133 788 self::get_next_transient( $fields, $base_name, $next );
1134 789 }
1135 790 }
1136 791 }
@@ -1149,9 +804,9 @@
1149 804 $set = set_transient( $name, $field, 60 * 60 * 6 );
1150 805 if ( ! $set ) {
1151 806 // the transient didn't save
1152 807 if ( $name != $base_name ) {
1153 - // if the first saved an others fail, this will show an incomplete form
808 + // if the first saved an others fail, this will show an incmoplete form
1154 809 self::delete_form_transient( $form_id );
1155 810 }
1156 811
1157 812 return;
@@ -1156,25 +811,18 @@
1156 811
1157 812 return;
1158 813 }
1159 814
1160 - ++$next;
815 + $next ++;
1161 816 }
1162 817 }
1163 818
1164 - /**
1165 - * @param string $type
1166 - * @return bool
1167 - */
1168 819 public static function is_no_save_field( $type ) {
1169 - return in_array( $type, self::no_save_fields(), true );
820 + return in_array( $type, self::no_save_fields() );
1170 821 }
1171 822
1172 - /**
1173 - * @return string[]
1174 - */
1175 823 public static function no_save_fields() {
1176 - return array( 'divider', 'end_divider', 'captcha', 'break', 'html', 'form', 'summary', FrmSubmitHelper::FIELD_TYPE );
824 + return array( 'divider', 'end_divider', 'captcha', 'break', 'html', 'form', 'summary' );
1177 825 }
1178 826
1179 827 /**
1180 828 * Check if this field can hold an array of values
@@ -1182,9 +830,9 @@
1182 830 * @since 2.0.9
1183 831 *
1184 832 * @param array|object $field
1185 833 *
1186 - * @return bool
834 + * @return boolean
1187 835 */
1188 836 public static function is_field_with_multiple_values( $field ) {
1189 837 if ( ! $field ) {
1190 838 return false;
@@ -1193,9 +841,9 @@
1193 841 $field_type = self::get_original_field_type( $field );
1194 842
1195 843 $is_multi_value_field = (
1196 844 self::is_checkbox( $field ) ||
1197 - $field_type === 'address' ||
845 + $field_type == 'address' ||
1198 846 self::is_multiple_select( $field )
1199 847 );
1200 848
1201 849 return $is_multi_value_field;
@@ -1202,9 +850,8 @@
1202 850 }
1203 851
1204 852 /**
1205 853 * @since 3.0
1206 - * @param array|object $field
1207 854 * @return string
1208 855 */
1209 856 public static function get_field_type( $field ) {
1210 857 return is_array( $field ) ? $field['type'] : $field->type;
@@ -1218,10 +865,9 @@
1218 865 $field_type = self::get_field_type( $field );
1219 866 $original_type = self::get_option( $field, 'original_type' );
1220 867
1221 868 if ( ! empty( $original_type ) && $original_type != $field_type ) {
1222 - // Check the original type for arrays.
1223 - $field_type = $original_type;
869 + $field_type = $original_type; // check the original type for arrays
1224 870 }
1225 871
1226 872 return $field_type;
1227 873 }
@@ -1229,9 +875,9 @@
1229 875 /**
1230 876 * Check if this is a multiselect dropdown field
1231 877 *
1232 878 * @since 2.0.9
1233 - * @return bool
879 + * @return boolean
1234 880 */
1235 881 public static function is_multiple_select( $field ) {
1236 882 $field_type = self::get_field_type( $field );
1237 883 $is_multiple = self::is_option_true( $field, 'multiple' ) && self::is_field_type( $field, 'select' ) && $field_type !== 'hidden';
@@ -1243,104 +889,63 @@
1243 889 * Check if a field is read only. Read only can be set in the field options,
1244 890 * but disabled with the shortcode options
1245 891 *
1246 892 * @since 2.0.9
1247 - *
1248 - * @param array|object $field
1249 - * @return bool
1250 893 */
1251 894 public static function is_read_only( $field ) {
1252 895 global $frm_vars;
1253 - return self::is_option_true( $field, 'read_only' ) && ( ! isset( $frm_vars['readonly'] ) || $frm_vars['readonly'] !== 'disabled' );
896 +
897 + return ( self::is_option_true( $field, 'read_only' ) && ( ! isset( $frm_vars['readonly'] ) || $frm_vars['readonly'] != 'disabled' ) );
1254 898 }
1255 899
1256 900 /**
1257 901 * @since 2.0.9
1258 - *
1259 - * @param array $field
1260 - * @return bool
1261 902 */
1262 903 public static function is_required( $field ) {
1263 - $required = $field['required'] != '0';
904 + $required = ( $field['required'] != '0' );
905 + $required = apply_filters( 'frm_is_field_required', $required, $field );
1264 906
1265 - /**
1266 - * @param bool $required
1267 - * @param array $field
1268 - */
1269 - $required = (bool) apply_filters( 'frm_is_field_required', $required, $field );
1270 -
1271 907 return $required;
1272 908 }
1273 909
1274 910 /**
1275 911 * @since 2.0.9
1276 - *
1277 - * @param array|object $field
1278 - * @param string $option
1279 - * @return bool
1280 912 */
1281 913 public static function is_option_true( $field, $option ) {
1282 914 if ( is_array( $field ) ) {
1283 915 return self::is_option_true_in_array( $field, $option );
916 + } else {
917 + return self::is_option_true_in_object( $field, $option );
1284 918 }
1285 - return self::is_option_true_in_object( $field, $option );
1286 919 }
1287 920
1288 921 /**
1289 922 * @since 2.0.9
1290 - *
1291 - * @param array|object $field
1292 - * @param string $option
1293 - * @return bool
1294 923 */
1295 924 public static function is_option_empty( $field, $option ) {
1296 925 if ( is_array( $field ) ) {
1297 926 return self::is_option_empty_in_array( $field, $option );
927 + } else {
928 + return self::is_option_empty_in_object( $field, $option );
1298 929 }
1299 - return self::is_option_empty_in_object( $field, $option );
1300 930 }
1301 931
1302 - /**
1303 - * @param array $field
1304 - * @param string $option
1305 - * @return bool
1306 - */
1307 932 public static function is_option_true_in_array( $field, $option ) {
1308 - return ! empty( $field[ $option ] );
933 + return isset( $field[ $option ] ) && $field[ $option ];
1309 934 }
1310 935
1311 - /**
1312 - * @param object $field
1313 - * @param string $option
1314 - * @return bool
1315 - */
1316 936 public static function is_option_true_in_object( $field, $option ) {
1317 937 return isset( $field->field_options[ $option ] ) && $field->field_options[ $option ];
1318 938 }
1319 939
1320 - /**
1321 - * @param array $field
1322 - * @param string $option
1323 - * @return bool
1324 - */
1325 940 public static function is_option_empty_in_array( $field, $option ) {
1326 - return empty( $field[ $option ] );
941 + return ! isset( $field[ $option ] ) || empty( $field[ $option ] );
1327 942 }
1328 943
1329 - /**
1330 - * @param object $field
1331 - * @param string $option
1332 - * @return bool
1333 - */
1334 944 public static function is_option_empty_in_object( $field, $option ) {
1335 - return empty( $field->field_options[ $option ] );
945 + return ! isset( $field->field_options[ $option ] ) || empty( $field->field_options[ $option ] );
1336 946 }
1337 947
1338 - /**
1339 - * @param stdClass $field
1340 - * @param string $option
1341 - * @return bool
1342 - */
1343 948 public static function is_option_value_in_object( $field, $option ) {
1344 949 return isset( $field->field_options[ $option ] ) && $field->field_options[ $option ] != '';
1345 950 }
1346 951
@@ -1345,12 +950,8 @@
1345 950 }
1346 951
1347 952 /**
1348 953 * @since 2.0.18
1349 - *
1350 - * @param array|object $field
1351 - * @param string $option
1352 - * @return mixed
1353 954 */
1354 955 public static function get_option( $field, $option ) {
1355 956 if ( is_array( $field ) ) {
1356 957 $option = self::get_option_in_array( $field, $option );
@@ -1360,14 +961,10 @@
1360 961
1361 962 return $option;
1362 963 }
1363 964
1364 - /**
1365 - * @param array $field
1366 - * @param string $option
1367 - * @return mixed
1368 - */
1369 965 public static function get_option_in_array( $field, $option ) {
966 +
1370 967 if ( isset( $field[ $option ] ) ) {
1371 968 $this_option = $field[ $option ];
1372 969 } elseif ( isset( $field['field_options'] ) && is_array( $field['field_options'] ) && isset( $field['field_options'][ $option ] ) ) {
1373 970 $this_option = $field['field_options'][ $option ];
@@ -1377,31 +974,23 @@
1377 974
1378 975 return $this_option;
1379 976 }
1380 977
1381 - /**
1382 - * @param object $field
1383 - * @param string $option
1384 - * @return mixed
1385 - */
1386 978 public static function get_option_in_object( $field, $option ) {
1387 - return $field->field_options[ $option ] ?? '';
979 + return isset( $field->field_options[ $option ] ) ? $field->field_options[ $option ] : '';
1388 980 }
1389 981
1390 982 /**
1391 983 * @since 2.0.09
1392 - *
1393 - * @param array|object $field
1394 - * @return bool
1395 984 */
1396 985 public static function is_repeating_field( $field ) {
1397 986 if ( is_array( $field ) ) {
1398 - $is_repeating_field = ( 'divider' === $field['type'] );
987 + $is_repeating_field = ( 'divider' == $field['type'] );
1399 988 } else {
1400 - $is_repeating_field = ( 'divider' === $field->type );
989 + $is_repeating_field = ( 'divider' == $field->type );
1401 990 }
1402 991
1403 - return $is_repeating_field && self::is_option_true( $field, 'repeat' );
992 + return ( $is_repeating_field && self::is_option_true( $field, 'repeat' ) );
1404 993 }
1405 994
1406 995 /**
1407 996 * @param string $key
@@ -1416,9 +1005,9 @@
1416 1005
1417 1006 /**
1418 1007 * @param string $id
1419 1008 *
1420 - * @return string|null
1009 + * @return string
1421 1010 */
1422 1011 public static function get_key_by_id( $id ) {
1423 1012 return FrmDb::get_var( 'frm_fields', array( 'id' => $id ), 'field_key' );
1424 1013 }
@@ -1425,9 +1014,9 @@
1425 1014
1426 1015 public static function is_image( $field ) {
1427 1016 $type = self::get_field_type( $field );
1428 1017
1429 - return ( $type === 'url' && self::get_option( $field, 'show_image' ) );
1018 + return ( $type == 'url' && self::get_option( $field, 'show_image' ) );
1430 1019 }
1431 1020
1432 1021 /**
1433 1022 * Check if field is radio or Dynamic radio
@@ -1435,9 +1024,9 @@
1435 1024 * @since 3.0
1436 1025 *
1437 1026 * @param array|object $field
1438 1027 *
1439 - * @return bool true if field type is radio or Dynamic radio
1028 + * @return boolean true if field type is radio or Dynamic radio
1440 1029 */
1441 1030 public static function is_radio( $field ) {
1442 1031 return self::is_field_type( $field, 'radio' );
1443 1032 }
@@ -1448,9 +1037,9 @@
1448 1037 * @since 3.0
1449 1038 *
1450 1039 * @param array|object $field
1451 1040 *
1452 - * @return bool true if field type is checkbox or Dynamic checkbox
1041 + * @return boolean true if field type is checkbox or Dynamic checkbox
1453 1042 */
1454 1043 public static function is_checkbox( $field ) {
1455 1044 return self::is_field_type( $field, 'checkbox' );
1456 1045 }
@@ -1460,11 +1049,11 @@
1460 1049 *
1461 1050 * @since 3.0
1462 1051 *
1463 1052 * @param array|object $field
1464 - * @param string $is_type Options include radio, checkbox, text.
1053 + * @param string $is_type Options include radio, checkbox, text
1465 1054 *
1466 - * @return bool true if field type is checkbox or Dynamic checkbox
1055 + * @return boolean true if field type is checkbox or Dynamic checkbox
1467 1056 */
1468 1057 public static function is_field_type( $field, $is_type ) {
1469 1058 $field_type = self::get_original_field_type( $field );
1470 1059 $data_type = self::get_option( $field, 'data_type' );