namespace WPForms\Forms\Fields\Rating;
use WPForms\Forms\Fields\Traits\ProField as ProFieldTrait;
class Field extends WPForms_Field {
protected const DEFAULT_ICON_COLOR = [
* Primary class constructor.
// Define field type information.
$this->name = esc_html__( 'Rating', 'wpforms-lite' );
$this->keywords = esc_html__( 'review, emoji, star', 'wpforms-lite' );
$this->default_settings = [
'icon_color' => $this->get_default_icon_color(),
protected function hooks(): void {
add_action( 'wpforms_builder_enqueues', [ $this, 'builder_enqueues' ] );
public function builder_enqueues(): void {
$min = wpforms_get_min_suffix();
WPFORMS_PLUGIN_URL . "assets/js/admin/builder/fields/rating{$min}.js",
[ 'wpforms-builder', 'wpforms-utils' ],
* Field options panel inside the builder.
* @param array $field Field settings.
* @noinspection PackedHashtableOptimizationInspection
public function field_options( $field ) {
'after_title' => $this->get_field_options_notice(),
$this->field_option( 'label', $field );
$this->field_option( 'description', $field );
$lbl = $this->field_element(
'value' => esc_html__( 'Scale', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select rating scale', 'wpforms-lite' ),
$fld = $this->field_element(
'value' => ! empty( $field['scale'] ) ? esc_attr( $field['scale'] ) : '5',
'content' => $lbl . $fld,
$this->field_option( 'required', $field );
* Advanced field options.
$lbl = $this->field_element(
'value' => esc_html__( 'Icon', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select icon to display', 'wpforms-lite' ),
$fld = $this->field_element(
'value' => ! empty( $field['icon'] ) ? esc_attr( $field['icon'] ) : 'star',
'star' => esc_html__( 'Star', 'wpforms-lite' ),
'heart' => esc_html__( 'Heart', 'wpforms-lite' ),
'thumb' => esc_html__( 'Thumb', 'wpforms-lite' ),
'smiley' => esc_html__( 'Smiley Face', 'wpforms-lite' ),
'content' => $lbl . $fld,
$lbl = $this->field_element(
'value' => esc_html__( 'Icon Size', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select the size of the rating icon', 'wpforms-lite' ),
$fld = $this->field_element(
'value' => ! empty( $field['icon_size'] ) ? esc_attr( $field['icon_size'] ) : 'medium',
'small' => esc_html__( 'Small', 'wpforms-lite' ),
'medium' => esc_html__( 'Medium', 'wpforms-lite' ),
'large' => esc_html__( 'Large', 'wpforms-lite' ),
'content' => $lbl . $fld,
$this->score_labels( $field );
$lbl = $this->field_element(
'value' => esc_html__( 'Icon Color', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select the color for the rating icon', 'wpforms-lite' ),
$icon_color = isset( $field['icon_color'] ) ? wpforms_sanitize_hex_color( $field['icon_color'] ) : '';
$icon_color = empty( $icon_color ) ? $this->get_default_icon_color() : $icon_color;
$fld = $this->field_element(
'fallback-color' => $icon_color,
'content' => $lbl . $fld,
'class' => 'color-picker-row',
$this->field_option( 'css', $field );
$this->field_option( 'label_hide', $field );
* @param array $field Field settings.
private function score_labels( array $field ): void {
$lowest_label = $this->field_element(
'slug' => 'lowest_label',
'value' => esc_html__( 'Lowest Score Label', 'wpforms-lite' ),
'tooltip' => esc_html__( 'This label indicates the lowest score on the scale.', 'wpforms-lite' ),
$lowest_field = $this->field_element(
'slug' => 'lowest_label',
'value' => $field['lowest_label'] ?? '',
'slug' => 'lowest_label',
'content' => $lowest_label . $lowest_field,
$highest_label = $this->field_element(
'slug' => 'highest_label',
'value' => esc_html__( 'Highest Score Label', 'wpforms-lite' ),
'tooltip' => esc_html__( 'This label indicates the highest score on the scale.', 'wpforms-lite' ),
$highest_field = $this->field_element(
'slug' => 'highest_label',
'value' => $field['highest_label'] ?? '',
'slug' => 'highest_label',
'content' => $highest_label . $highest_field,
$label_position = $this->field_element(
'slug' => 'label_position',
'value' => esc_html__( 'Label Position', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select the position of the label', 'wpforms-lite' ),
$select_position = $this->field_element(
'slug' => 'label_position',
'value' => ! empty( $field['label_position'] ) ? esc_attr( $field['label_position'] ) : 'below',
'above' => esc_html__( 'Above', 'wpforms-lite' ),
'below' => esc_html__( 'Below', 'wpforms-lite' ),
'slug' => 'label_position',
'content' => $label_position . $select_position,
* Field preview inside the builder.
* @param array $field Field settings.
public function field_preview( $field ): void {
$this->field_preview_option(
'label_badge' => $this->get_field_preview_badge(),
echo '<div class="wpforms-rating-field">';
$this->get_field_preview_icons( $field );
$this->get_field_preview_labels( $field );
$this->field_preview_option( 'description', $field );
* Get field preview icons.
* @param array $field Field settings.
private function get_field_preview_icons( array $field ): void {
$scale = ! empty( $field['scale'] ) ? esc_attr( $field['scale'] ) : 5;
$icon = ! empty( $field['icon'] ) ? esc_attr( $field['icon'] ) : 'star';
$icon_size = ! empty( $field['icon_size'] ) ? esc_attr( $field['icon_size'] ) : 'medium';
$icon_color = ! empty( $field['icon_color'] ) ? esc_attr( $field['icon_color'] ) : $this->get_default_icon_color();
$icon_class = $this->get_preview_icon_class( $icon );
$icon_size_css = $this->get_icon_size_css( $icon_size );
echo '<div class="wpforms-rating-field-icons">';
for ( $i = 1; $i <= 10; $i++ ) {
'<i class="fa %s %s rating-icon" aria-hidden="true" style="color:%s; display:%s; font-size:%dpx;"></i>',
$i <= $scale ? 'inline-block' : 'none',
esc_attr( $icon_size_css )
* Get preview icon class based on the selected icon.
* @param string $icon Selected icon.
* @return string Icon class.
private function get_preview_icon_class( string $icon ): string {
$icon_class = 'fa-heart';