diff --git a/classes/models/fields/FrmFieldType.php b/classes/models/fields/FrmFieldType.php index 552312ed08..5249443dd7 100644 --- a/classes/models/fields/FrmFieldType.php +++ b/classes/models/fields/FrmFieldType.php @@ -1451,7 +1451,11 @@ public function get_display_value( $value, $atts = array() ) { $this->fill_default_atts( $atts ); if ( $this->should_strip_most_html_before_preparing_display_value( $atts ) ) { + $unsanitized_value = $value; + FrmAppHelper::sanitize_value( 'FrmAppHelper::strip_most_html', $value ); + + $value = $this->maintain_option_values( $value, $unsanitized_value ); } $value = $this->prepare_display_value( $value, $atts ); @@ -1651,7 +1655,61 @@ protected function fill_values( &$value, $defaults ) { * @since 4.0.04 */ public function sanitize_value( &$value ) { + $unsanitized_value = $value; + FrmAppHelper::sanitize_with_html( $value ); + + $value = $this->maintain_option_values( $value, $unsanitized_value ); + } + + /** + * Allow a tags (and other things that normally get stripped) in user input, if there is an option match. + * + * @since x.x + * + * @param array|string $value + * @param array|string $unsanitized_value + * @return array|string + */ + private function maintain_option_values( $value, $unsanitized_value ) { + if ( $value === $unsanitized_value ) { + // Nothing was stripped, so return early. + return $value; + } + + $options = $this->get_options( array() ); + if ( ! $options || ! is_array( $options ) ) { + // No options to match, so return early. + return $value; + } + + if ( is_array( $value ) ) { + if ( ! is_array( $unsanitized_value ) ) { + return $value; + } + + $return_value = array(); + foreach ( $unsanitized_value as $v ) { + foreach ( $options as $option ) { + $option_value = is_array( $option ) ? $option['value'] : $option; + if ( $v === $option_value ) { + $return_value[] = $option_value; + break; + } + } + } + return $return_value; + } + + // $value is a string. + foreach ( $options as $option ) { + $option_value = is_array( $option ) ? $option['value'] : $option; + if ( $unsanitized_value === $option_value ) { + return $option_value; + } + } + + return $value; } /**