OwlCyberSecurity - MANAGER
Edit File: Field.php
<?php namespace WPForms\Forms\Fields\Pagebreak; use WPForms\Forms\Fields\Traits\ProField as ProFieldTrait; use WPForms_Field; /** * Pagebreak field. * * @since 1.9.4 */ class Field extends WPForms_Field { use ProFieldTrait; /** * Default indicator color. * * @since 1.9.4 */ private const DEFAULT_INDICATOR_COLOR = [ 'classic' => '#72b239', 'modern' => '#066aab', ]; /** * Pages information. * * @since 1.9.4 * * @var array|bool */ protected $pagebreak; /** * Primary class constructor. * * @since 1.9.4 */ public function init() { // Define field type information. $this->name = esc_html__( 'Page Break', 'wpforms-lite' ); $this->keywords = esc_html__( 'progress bar, multi step, multi part', 'wpforms-lite' ); $this->type = 'pagebreak'; $this->icon = 'fa-files-o'; $this->order = 160; $this->group = 'fancy'; $this->init_pro_field(); $this->hooks(); } /** * Hooks. * * @since 1.9.4 */ protected function hooks() { add_filter( 'wpforms_field_preview_class', [ $this, 'preview_field_class' ], 10, 2 ); } /** * Field options panel inside the builder. * * @since 1.9.4 * * @param array $field Field data. */ public function field_options( $field ) { $position = ! empty( $field['position'] ) ? esc_attr( $field['position'] ) : ''; $position_class = ! empty( $field['position'] ) ? 'wpforms-pagebreak-' . $position : ''; $this->field_options_basic( $field, $position, $position_class ); $this->field_options_advanced( $field, $position, $position_class ); } /** * Advanced field options panel inside the builder. * * @since 1.9.4 * * @param array $field Field data. * @param string $position Position. * @param string $position_class Position CSS class. */ private function field_options_basic( array $field, string $position, string $position_class ): void { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh // Hidden field indicating the position. $this->field_element( 'text', $field, [ 'type' => 'hidden', 'slug' => 'position', 'value' => $position, 'class' => 'position', ] ); /* * Basic field options. */ // Options open markup. $this->field_option( 'basic-options', $field, [ 'markup' => 'open', 'class' => $position_class, 'after_title' => $this->get_field_options_notice(), ] ); $this->field_options_basic_top( $field, $position ); // Page Title, don't display for bottom pagebreaks. if ( $position !== 'bottom' ) { $lbl = $this->field_element( 'label', $field, [ 'slug' => 'title', 'value' => esc_html__( 'Page Title', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Enter text for the page title.', 'wpforms-lite' ), ], false ); $fld = $this->field_element( 'text', $field, [ 'slug' => 'title', 'value' => ! empty( $field['title'] ) ? esc_attr( $field['title'] ) : '', ], false ); $this->field_element( 'row', $field, [ 'slug' => 'title', 'content' => $lbl . $fld, ] ); } // Next label. if ( empty( $position ) ) { $lbl = $this->field_element( 'label', $field, [ 'slug' => 'next', 'value' => esc_html__( 'Next Label', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Enter text for Next page navigation button.', 'wpforms-lite' ), ], false ); $fld = $this->field_element( 'text', $field, [ 'slug' => 'next', 'value' => ! empty( $field['next'] ) ? esc_attr( $field['next'] ) : esc_html__( 'Next', 'wpforms-lite' ), ], false ); $this->field_element( 'row', $field, [ 'slug' => 'next', 'content' => $lbl . $fld, ] ); } // Options are not available to top pagebreaks. if ( $position !== 'top' ) { // Previous button toggle. $fld = $this->field_element( 'toggle', $field, [ 'slug' => 'prev_toggle', // Backward compatibility for forms that were created before the toggle was added. 'value' => ! empty( $field['prev_toggle'] ) || ! empty( $field['prev'] ), 'desc' => esc_html__( 'Display Previous', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Toggle displaying the Previous page navigation button.', 'wpforms-lite' ), ], false ); $this->field_element( 'row', $field, [ 'slug' => 'prev_toggle', 'content' => $fld, ] ); // Previous button label. $lbl = $this->field_element( 'label', $field, [ 'slug' => 'prev', 'value' => esc_html__( 'Previous Label', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Enter text for Previous page navigation button.', 'wpforms-lite' ), ], false ); $fld = $this->field_element( 'text', $field, [ 'slug' => 'prev', 'value' => ! empty( $field['prev'] ) ? esc_attr( $field['prev'] ) : '', ], false ); $this->field_element( 'row', $field, [ 'slug' => 'prev', 'content' => $lbl . $fld, 'class' => empty( $field['prev_toggle'] ) ? 'wpforms-hidden' : '', ] ); } // Options close markup. $this->field_option( 'basic-options', $field, [ 'markup' => 'close', ] ); } /** * Field options panel inside the builder. * * @since 1.9.4 * * @param array $field Field data. * @param string $position Position. */ private function field_options_basic_top( array $field, string $position ): void { // Options specific to the top pagebreak. if ( $position !== 'top' ) { return; } // Indicator themes. $themes = [ 'progress' => esc_html__( 'Progress Bar', 'wpforms-lite' ), 'circles' => esc_html__( 'Circles', 'wpforms-lite' ), 'connector' => esc_html__( 'Connector', 'wpforms-lite' ), 'none' => esc_html__( 'None', 'wpforms-lite' ), ]; /** * Filter the available Pagebreak Indicator themes. * * @since 1.6.6 * * @param array $themes Available themes. */ $themes = apply_filters( 'wpforms_pagebreak_indicator_themes', $themes ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName $lbl = $this->field_element( 'label', $field, [ 'slug' => 'indicator', 'value' => esc_html__( 'Progress Indicator', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Select theme for Page Indicator which is displayed at the top of the form.', 'wpforms-lite' ), ], false ); $fld = $this->field_element( 'select', $field, [ 'slug' => 'indicator', 'value' => ! empty( $field['indicator'] ) ? esc_attr( $field['indicator'] ) : 'progress', 'options' => $themes, ], false ); $this->field_element( 'row', $field, [ 'slug' => 'indicator', 'content' => $lbl . $fld, ] ); // Indicator color picker. $lbl = $this->field_element( 'label', $field, [ 'slug' => 'indicator_color', 'value' => esc_html__( 'Page Indicator Color', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Select the primary color for the Page Indicator theme.', 'wpforms-lite' ), ], false ); $indicator_color = isset( $field['indicator_color'] ) ? wpforms_sanitize_hex_color( $field['indicator_color'] ) : self::get_default_indicator_color(); $fld = $this->field_element( 'color', $field, [ 'slug' => 'indicator_color', 'value' => $indicator_color, 'data' => [ 'fallback-color' => $indicator_color, ], ], false ); $this->field_element( 'row', $field, [ 'slug' => 'indicator_color', 'content' => $lbl . $fld, 'class' => 'color-picker-row', ] ); } /** * Advanced field options panel inside the builder. * * @since 1.9.4 * * @param array $field Field data. * @param string $position Position. * @param string $position_class Position CSS class. */ private function field_options_advanced( array $field, string $position, string $position_class ): void { if ( $position === 'bottom' ) { return; } /** * Advanced field options. */ // Options open markup. $this->field_option( 'advanced-options', $field, [ 'markup' => 'open', 'class' => $position_class, ] ); // Navigation alignment, only available to the top. if ( $position === 'top' ) { $lbl = $this->field_element( 'label', $field, [ 'slug' => 'nav_align', 'value' => esc_html__( 'Page Navigation Alignment', 'wpforms-lite' ), 'tooltip' => esc_html__( 'Select the alignment for the Next/Previous page navigation buttons', 'wpforms-lite' ), ], false ); $fld = $this->field_element( 'select', $field, [ 'slug' => 'nav_align', 'value' => ! empty( $field['nav_align'] ) ? esc_attr( $field['nav_align'] ) : '', 'options' => [ 'left' => esc_html__( 'Left', 'wpforms-lite' ), 'right' => esc_html__( 'Right', 'wpforms-lite' ), '' => esc_html__( 'Center', 'wpforms-lite' ), 'split' => esc_html__( 'Split', 'wpforms-lite' ), ], ], false ); $this->field_element( 'row', $field, [ 'slug' => 'nav_align', 'content' => $lbl . $fld, ] ); // Scroll animation toggle. $fld = $this->field_element( 'toggle', $field, [ 'slug' => 'scroll_disabled', 'value' => ! empty( $field['scroll_disabled'] ), 'desc' => esc_html__( 'Disable Scroll Animation', 'wpforms-lite' ), 'tooltip' => esc_html__( 'By default, a user\'s view is pulled to the top of each form page. Set to ON to disable this animation.', 'wpforms-lite' ), ], false ); $this->field_element( 'row', $field, [ 'slug' => 'scroll_disabled', 'content' => $fld, ] ); } // Custom CSS classes. $this->field_option( 'css', $field ); // Options close markup. $this->field_option( 'advanced-options', $field, [ 'markup' => 'close', ] ); } /** * Field preview inside the builder. * * @since 1.9.4 * * @param array $field Field data. */ public function field_preview( $field ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.MaxExceeded $nav_align = 'wpforms-pagebreak-buttons-left'; $prev = ! empty( $field['prev'] ) ? $field['prev'] : esc_html__( 'Previous', 'wpforms-lite' ); $prev_class = empty( $field['prev'] ) && empty( $field['prev_toggle'] ) ? 'wpforms-hidden' : ''; $next = ! empty( $field['next'] ) ? $field['next'] : esc_html__( 'Next', 'wpforms-lite' ); $next_class = empty( $next ) ? 'wpforms-hidden' : ''; $position = ! empty( $field['position'] ) ? $field['position'] : 'normal'; $title = ! empty( $field['title'] ) ? $field['title'] : ''; $label = $position === 'top' ? esc_html__( 'First Page / Progress Indicator', 'wpforms-lite' ) : ''; $label = $position === 'normal' && empty( $label ) ? esc_html__( 'Page Break', 'wpforms-lite' ) : $label; /** * Fires before page break is displayed on the preview. * * @since 1.7.9 * * @param array $form_data Form data and settings. * @param array $field Field data. */ do_action( 'wpforms_field_page_break_field_preview_before', $this->form_data, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName if ( $position !== 'top' ) { if ( empty( $this->form_data ) ) { $this->form_data = wpforms()->obj( 'form' )->get( $this->form_id, [ 'content_only' => true ] ); } if ( empty( $this->pagebreak ) ) { $this->pagebreak = wpforms_get_pagebreak_details( $this->form_data ); } if ( ! empty( $this->pagebreak['top']['nav_align'] ) ) { $nav_align = 'wpforms-pagebreak-buttons-' . $this->pagebreak['top']['nav_align']; } echo '<div class="wpforms-pagebreak-buttons ' . sanitize_html_class( $nav_align ) . '">'; printf( '<button class="wpforms-pagebreak-button wpforms-pagebreak-prev %s">%s</button>', sanitize_html_class( $prev_class ), esc_html( $prev ) ); if ( $position !== 'bottom' ) { printf( '<button class="wpforms-pagebreak-button wpforms-pagebreak-next %s">%s</button>', sanitize_html_class( $next_class ), esc_html( $next ) ); if ( $next_class !== 'wpforms-hidden' ) { /** This action is documented in includes/class-frontend.php. */ do_action( 'wpforms_display_submit_after', $this->form_data, 'next' ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName } } echo '</div>'; } // Visual divider. echo '<div class="wpforms-pagebreak-divider">'; if ( $position !== 'bottom' ) { printf( '<span class="pagebreak-label">%1$s <span class="wpforms-pagebreak-title">%2$s</span>%3$s</span>', esc_html( $label ), esc_html( $title ), $this->get_field_preview_badge() // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ); } echo '<span class="line"></span>'; echo '</div>'; /** * Fires after page break is displayed on the preview. * * @since 1.7.9 * * @param array $form_data Form data and settings. * @param array $field Field data. */ do_action( 'wpforms_field_page_break_field_preview_after', $this->form_data, $field ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName } /** * Add class to the builder field preview. * * @since 1.9.4 * * @param string|mixed $css CSS classes. * @param array $field Field data and settings. * * @return string */ public function preview_field_class( $css, $field ): string { $css = (string) $css; if ( $field['type'] !== 'pagebreak' ) { return $css; } if ( ! empty( $field['position'] ) && $field['position'] === 'top' ) { $css .= ' wpforms-field-stick wpforms-pagebreak-top'; } elseif ( ! empty( $field['position'] ) && $field['position'] === 'bottom' ) { $css .= ' wpforms-field-stick wpforms-pagebreak-bottom'; } else { $css .= ' wpforms-pagebreak-normal'; } return $css; } /** * Field display on the form front-end. * * @since 1.9.4 * * @param array $field Field data and settings. * @param array $deprecated Field attributes. * @param array $form_data Form data and settings. */ public function field_display( $field, $deprecated, $form_data ) { } /** * Get the default indicator color. * * @since 1.9.4 * * @return string */ public static function get_default_indicator_color(): string { $render_engine = wpforms_get_render_engine(); return array_key_exists( $render_engine, self::DEFAULT_INDICATOR_COLOR ) ? self::DEFAULT_INDICATOR_COLOR[ $render_engine ] : self::DEFAULT_INDICATOR_COLOR['modern']; } }