From eb6df9794045d4ecdc0510a21396b7f98b9cf17e Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 8 Aug 2025 13:31:56 +0300 Subject: [PATCH 01/10] Improve form errors accessibility --- classes/helpers/FrmFormsHelper.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index d496d523eb..36c7f875a1 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -263,6 +263,12 @@ public static function get_invalid_error_message( $args ) { $frm_settings = FrmAppHelper::get_settings( $settings_args ); $invalid_msg = do_shortcode( $frm_settings->invalid_msg ); + $field_error_messages = ''; + foreach ( $args['errors'] as $field_id => $error ) { + $field = (array) FrmField::getOne( str_replace( 'field', '', $field_id ) ); + $field_error_messages .= '
  • ' . $error . '
  • '; + } + $invalid_msg .= $field_error_messages ? '' : ''; return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args ); } From 88c94349489b17978ec8791d138d4bac83caf610 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 8 Aug 2025 14:40:53 +0300 Subject: [PATCH 02/10] Move logic that creates field error messages with links to a new function --- classes/helpers/FrmFormsHelper.php | 51 +++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index 36c7f875a1..fe16dbcf41 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -263,15 +263,56 @@ public static function get_invalid_error_message( $args ) { $frm_settings = FrmAppHelper::get_settings( $settings_args ); $invalid_msg = do_shortcode( $frm_settings->invalid_msg ); - $field_error_messages = ''; - foreach ( $args['errors'] as $field_id => $error ) { - $field = (array) FrmField::getOne( str_replace( 'field', '', $field_id ) ); - $field_error_messages .= '
  • ' . $error . '
  • '; - } + $field_error_messages = self::get_field_error_messages( $args ); $invalid_msg .= $field_error_messages ? '' : ''; return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args ); } + /** + * @since x.x + * + * @param array $args + * @return string + */ + private static function get_field_error_messages( $args ) { + $field_error_messages = ''; + if ( empty( $args['errors'] ) ) { + return $field_error_messages; + } + $field_ids = array_map( + function ( $field_plus_id ) { + $field_id = str_replace( 'field', '', $field_plus_id ); + if ( strpos( $field_id, '-' ) !== false ) { + $field_id = explode( '-', $field_id )[0]; + } + return $field_id; + }, + array_keys( $args['errors'] ) + ); + $field_keys = FrmDb::get_results( 'frm_fields', array( 'id' => $field_ids ), 'id,field_key,type' ); + foreach ( $args['errors'] as $field_plus_id => $error ) { + $field_id = str_replace( 'field', '', $field_plus_id ); + $row = ''; + if ( strpos( $field_id, '-' ) !== false ) { + $field_id_parts = explode( '-', $field_id ); + if ( count( $field_id_parts ) === 3 ) { + $field_id = $field_id_parts[0]; + $row = '-' . $field_id_parts[2]; + } + } + $index = array_search( $field_id, array_column( $field_keys, 'id' ), true ); + if ( false === $index ) { + continue; + } + $html_id = 'field_' . $field_keys[ $index ]->field_key . $row; + if ( in_array( $field_keys[ $index ]->type, array( 'checkbox', 'radio' ), true ) ) { + $html_id .= '-0'; // Focus on the first option. + } + $field_error_messages .= '
  • ' . $error . '
  • '; + } + return $field_error_messages; + } + /** * @param array $atts { * The success message details. From 924ccf8b0f2433bba1e3c3b5cd2d378ee0d44e93 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 8 Aug 2025 14:45:30 +0300 Subject: [PATCH 03/10] Fix PHPCS errpr --- classes/helpers/FrmFormsHelper.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index fe16dbcf41..ab3adfca7f 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -306,10 +306,11 @@ function ( $field_plus_id ) { } $html_id = 'field_' . $field_keys[ $index ]->field_key . $row; if ( in_array( $field_keys[ $index ]->type, array( 'checkbox', 'radio' ), true ) ) { - $html_id .= '-0'; // Focus on the first option. + // Focus on the first option. + $html_id .= '-0'; } $field_error_messages .= '
  • ' . $error . '
  • '; - } + }//end foreach return $field_error_messages; } From d79ac345403b8933fef6e1673aa39f8fc8a5f306 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 8 Aug 2025 15:43:29 +0300 Subject: [PATCH 04/10] Fix equal sign alignment --- classes/helpers/FrmFormsHelper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index ab3adfca7f..04f040063b 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -263,8 +263,9 @@ public static function get_invalid_error_message( $args ) { $frm_settings = FrmAppHelper::get_settings( $settings_args ); $invalid_msg = do_shortcode( $frm_settings->invalid_msg ); + $field_error_messages = self::get_field_error_messages( $args ); - $invalid_msg .= $field_error_messages ? '' : ''; + $invalid_msg .= $field_error_messages ? '' : ''; return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args ); } From ce3144c0e4022bcd77370f6a7c21e4d205b7b025 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:45:24 +0300 Subject: [PATCH 05/10] Add comment to function --- classes/helpers/FrmFormsHelper.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index 04f040063b..e8bfd13fc6 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -264,18 +264,20 @@ public static function get_invalid_error_message( $args ) { $frm_settings = FrmAppHelper::get_settings( $settings_args ); $invalid_msg = do_shortcode( $frm_settings->invalid_msg ); - $field_error_messages = self::get_field_error_messages( $args ); + $field_error_messages = self::get_clickable_field_error_messages( $args ); $invalid_msg .= $field_error_messages ? '' : ''; return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args ); } /** + * Get clickable field error messages. + * * @since x.x * * @param array $args * @return string */ - private static function get_field_error_messages( $args ) { + private static function get_clickable_field_error_messages( $args ) { $field_error_messages = ''; if ( empty( $args['errors'] ) ) { return $field_error_messages; @@ -307,7 +309,7 @@ function ( $field_plus_id ) { } $html_id = 'field_' . $field_keys[ $index ]->field_key . $row; if ( in_array( $field_keys[ $index ]->type, array( 'checkbox', 'radio' ), true ) ) { - // Focus on the first option. + // Needed to focus on the first option when error link is clicked. $html_id .= '-0'; } $field_error_messages .= '
  • ' . $error . '
  • '; From e7df4102bc058d1f09ec9f5953668b1afec53eae Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:19:01 +0300 Subject: [PATCH 06/10] Add CSS rules for form errors list --- classes/helpers/FrmFormsHelper.php | 2 +- css/_single_theme.css.php | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index e8bfd13fc6..5d26f507bf 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -262,7 +262,7 @@ public static function get_invalid_error_message( $args ) { } $frm_settings = FrmAppHelper::get_settings( $settings_args ); - $invalid_msg = do_shortcode( $frm_settings->invalid_msg ); + $invalid_msg = '' . do_shortcode( $frm_settings->invalid_msg ) . ''; $field_error_messages = self::get_clickable_field_error_messages( $args ); $invalid_msg .= $field_error_messages ? '' : ''; diff --git a/css/_single_theme.css.php b/css/_single_theme.css.php index 7c45459cc5..d5b9d5ee3d 100644 --- a/css/_single_theme.css.php +++ b/css/_single_theme.css.php @@ -379,6 +379,23 @@ margin-bottom:; } +. .frm_error_style span{ + font-weight: bold;; +} + +. .frm_error_style ul{ + list-style: inside;; + color: ; +} + +. .frm_error_style ul li a{ + color: ; +} + +. .frm_error_style ul li a:hover{ + text-decoration: underline;; +} + . #frm_loading .progress-striped .progress-bar{ background-image:linear-gradient(45deg, 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, 50%, 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); } From ba68f4aed709ff813617b0bade547fc747ed7014 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:23:55 +0300 Subject: [PATCH 07/10] Fix PHP CS errors --- classes/helpers/FrmFormsHelper.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index 4eeb7fb66a..11c106c261 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -312,16 +312,20 @@ public static function get_invalid_error_message( $args ) { * @since x.x * * @param array $args + * * @return string */ private static function get_clickable_field_error_messages( $args ) { $field_error_messages = ''; + if ( empty( $args['errors'] ) ) { return $field_error_messages; } + $field_ids = array_map( function ( $field_plus_id ) { $field_id = str_replace( 'field', '', $field_plus_id ); + if ( strpos( $field_id, '-' ) !== false ) { $field_id = explode( '-', $field_id )[0]; } @@ -330,25 +334,33 @@ function ( $field_plus_id ) { array_keys( $args['errors'] ) ); $field_keys = FrmDb::get_results( 'frm_fields', array( 'id' => $field_ids ), 'id,field_key,type' ); + foreach ( $args['errors'] as $field_plus_id => $error ) { $field_id = str_replace( 'field', '', $field_plus_id ); $row = ''; + if ( strpos( $field_id, '-' ) !== false ) { $field_id_parts = explode( '-', $field_id ); + if ( count( $field_id_parts ) === 3 ) { $field_id = $field_id_parts[0]; $row = '-' . $field_id_parts[2]; } } + $index = array_search( $field_id, array_column( $field_keys, 'id' ), true ); + if ( false === $index ) { continue; } + $html_id = 'field_' . $field_keys[ $index ]->field_key . $row; + if ( in_array( $field_keys[ $index ]->type, array( 'checkbox', 'radio' ), true ) ) { // Needed to focus on the first option when error link is clicked. $html_id .= '-0'; } + $field_error_messages .= '
  • ' . $error . '
  • '; }//end foreach return $field_error_messages; From 401b972e88d30a3659ce141b49d519771d2d1000 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:14:40 +0300 Subject: [PATCH 08/10] Make code more readable --- classes/helpers/FrmFormsHelper.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index 11c106c261..a538fb60df 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -299,10 +299,13 @@ public static function get_invalid_error_message( $args ) { } $frm_settings = FrmAppHelper::get_settings( $settings_args ); - $invalid_msg = '' . do_shortcode( $frm_settings->invalid_msg ) . ''; $field_error_messages = self::get_clickable_field_error_messages( $args ); - $invalid_msg .= $field_error_messages ? '' : ''; + + $invalid_msg = '' . do_shortcode( $frm_settings->invalid_msg ) . ''; + if ( $field_error_messages ) { + $invalid_msg .= ""; + } return apply_filters( 'frm_invalid_error_message', $invalid_msg, $args ); } From 4a03c7da951c6a7eca4a071a1a016e6f132c3280 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 5 Dec 2025 20:15:15 +0300 Subject: [PATCH 09/10] Fix PHP CS errors --- classes/helpers/FrmFormsHelper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/helpers/FrmFormsHelper.php b/classes/helpers/FrmFormsHelper.php index a538fb60df..34c71f5df5 100644 --- a/classes/helpers/FrmFormsHelper.php +++ b/classes/helpers/FrmFormsHelper.php @@ -303,6 +303,7 @@ public static function get_invalid_error_message( $args ) { $field_error_messages = self::get_clickable_field_error_messages( $args ); $invalid_msg = '' . do_shortcode( $frm_settings->invalid_msg ) . ''; + if ( $field_error_messages ) { $invalid_msg .= ""; } From b2603a4d9912aa7a1de639804900dc28f8206466 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 5 Dec 2025 20:35:25 +0300 Subject: [PATCH 10/10] Show field errors summary for ajax submit --- classes/controllers/FrmEntriesAJAXSubmitController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/classes/controllers/FrmEntriesAJAXSubmitController.php b/classes/controllers/FrmEntriesAJAXSubmitController.php index 33b1af4b17..91c4fc99ba 100644 --- a/classes/controllers/FrmEntriesAJAXSubmitController.php +++ b/classes/controllers/FrmEntriesAJAXSubmitController.php @@ -96,7 +96,12 @@ public static function ajax_create() { } $response['errors'] = $obj; - $invalid_msg = FrmFormsHelper::get_invalid_error_message( array( 'form' => $form ) ); + $invalid_msg = FrmFormsHelper::get_invalid_error_message( + array( + 'form' => $form, + 'errors' => $errors, + ) + ); $response['error_message'] = FrmFormsHelper::get_success_message( array( 'message' => $invalid_msg,