'true', 'field_label' => '', 'field_name' => '', 'field_placeholder' => '', 'field_default_value' => '', 'field_instruction' => '', 'prepend' => '', 'append' => '', 'custom_fields_save' => 'post', ); } /** * Is meta field. * * Check if the field is a meta field. * * @since 1.0.0 */ public function is_meta_field(){ return true; } /** * * Get meta name. * * Retrieve the meta name of the field. * * @since 1.0.0 */ public function get_meta_name(){ return 'base_field'; } /** * Get widget title. * * Retrieve acf ele form widget title. * * @since 1.0.0 * @access public * * @return string Widget title. */ public function get_title() { return __( 'Base Field', 'frontend-admin' ); } /** * Get widget icon. * * Retrieve acf ele form widget icon. * * @since 1.0.0 * @access public * * @return string Widget icon. */ public function get_icon() { return 'eicon-form-horizontal frontend-icon'; } /** * Get widget keywords. * * Retrieve the list of keywords the widget belongs to. * * @since 2.1.0 * @access public * * @return array Widget keywords. */ public function get_keywords() { return array( 'frontend editing', 'fields', 'acf', 'acf form', ); } /** * Get widget categories. * * Retrieve the list of categories the acf ele form widget belongs to. * * @since 1.0.0 * @access public * * @return array Widget categories. */ public function get_categories() { return array( 'frontend-admin-fields' ); } /** * Register acf ele form widget controls. * * Adds different input fields to allow the user to change and customize the widget settings. * * @since 1.0.0 * @access protected */ protected function register_controls() { $this->register_field_section(); $this->register_validation_section(); $this->register_style_tab_controls(); do_action( 'frontend_admin/styles_controls', $this ); } protected function register_field_section() { $this->start_controls_section( 'fields_section', array( 'label' => __( 'Field', 'frontend-admin' ), 'tab' => Controls_Manager::TAB_CONTENT, ) ); $this->add_control( 'field_label_on', array( 'label' => __( 'Show Label', 'frontend-admin' ), 'type' => Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'frontend-admin' ), 'label_off' => __( 'No', 'frontend-admin' ), 'return_value' => 'true', 'default' => 'true', ) ); $defualt_label = str_replace( ' Field', '', $this->get_title() ); $this->add_control( 'field_label', array( 'label' => __( 'Label', 'frontend-admin' ), 'type' => Controls_Manager::TEXT, 'label_block' => true, 'placeholder' => __( 'Field Label', 'frontend-admin' ), 'dynamic' => array( 'active' => true, ), 'default' => $defualt_label ?? '', ) ); if( $this->is_meta_field() ){ $meta_name = $this->get_meta_name(); $this->add_control( 'field_name', array( 'label' => __( 'Meta Name', 'frontend-admin' ), 'type' => Controls_Manager::TEXT, 'name' => 'field_name', 'default' => $meta_name, 'label_block' => true, 'instructions' => 'This is the name of the field in the meta table in the database. It should be unique and not contain spaces. Use underscores instead of spaces. For example: text_field', 'placeholder' => $meta_name, ) ); } //required $this->add_control( 'field_required', array( 'label' => __( 'Required', 'frontend-admin' ), 'type' => Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'frontend-admin' ), 'label_off' => __( 'No', 'frontend-admin' ), 'return_value' => 'true', 'default' => '', ) ); //display mode $this->add_control( 'field_display_mode', array( 'label' => __( 'Display Mode', 'frontend-admin' ), 'type' => Controls_Manager::SELECT, 'default' => 'edit', 'options' => array( 'edit' => __( 'Edit', 'frontend-admin' ), 'read_only' => __( 'Read Only', 'frontend-admin' ), 'hidden' => __( 'Hidden', 'frontend-admin' ), ) ) ); //if read only, add "allow edit" option $this->add_control( 'field_inline_edit', array( 'label' => __( 'Inline Edit', 'frontend-admin' ), 'type' => Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'frontend-admin' ), 'label_off' => __( 'No', 'frontend-admin' ), 'return_value' => 'true', 'default' => '', 'condition' => array( 'field_display_mode' => 'read_only', ), ) ); //no value placeholder textarea $this->add_control( 'no_values_message', array( 'label' => __( 'No Value Message', 'frontend-admin' ), 'type' => Controls_Manager::TEXTAREA, 'label_block' => true, 'placeholder' => __( 'Undefined Value', 'frontend-admin' ), 'dynamic' => array( 'active' => true, ), 'condition' => array( 'field_display_mode' => 'read_only', ), ) ); $this->add_control( 'field_instruction', array( 'label' => __( 'Instructions', 'frontend-admin' ), 'type' => Controls_Manager::TEXT, 'label_block' => true, 'placeholder' => __( 'Field Instruction', 'frontend-admin' ), 'dynamic' => array( 'active' => true, ), ) ); $this->field_specific_controls(); if( $this->is_meta_field() ){ $this->custom_fields_control(); } $this->end_controls_section(); } public function field_specific_controls(){ // Override in child class } public function field_specific_validation(){ // Override in child class } protected function register_validation_section() { $this->start_controls_section( 'validation_section', array( 'label' => __( 'Validation', 'frontend-admin' ), 'tab' => Controls_Manager::TAB_CONTENT, ) ); //whether to show error message $this->add_control( 'show_error_message', array( 'label' => __( 'Show Error Message', 'frontend-admin' ), 'type' => Controls_Manager::SWITCHER, 'label_on' => __( 'Yes', 'frontend-admin' ), 'label_off' => __( 'No', 'frontend-admin' ), 'return_value' => 'true', 'default' => 'true', ) ); //message to show if field is required $this->add_control( 'field_required_message', array( 'label' => __( 'Required Message', 'frontend-admin' ), 'type' => Controls_Manager::TEXT, 'label_block' => true, 'placeholder' => __( 'Field is required', 'frontend-admin' ), 'dynamic' => array( 'active' => true, ), ) ); //message to show if other validation fails $this->add_control( 'field_validation_message', array( 'label' => __( 'Validation Message', 'frontend-admin' ), 'type' => Controls_Manager::TEXT, 'label_block' => true, 'placeholder' => __( 'Field is invalid', 'frontend-admin' ), 'dynamic' => array( 'active' => true, ), ) ); $this->field_specific_validation(); $this->end_controls_section(); } public function custom_fields_control( $repeater = false ) { $controls_settings = array( 'label' => __( 'Save Custom Fields to...', 'frontend-admin' ), 'type' => Controls_Manager::SELECT, 'default' => 'post', ); $custom_fields_options = array( '' => __( 'Form Default', 'frontend-admin' ), 'submission' => __( 'Submission', 'frontend-admin' ), 'post' => __( 'Post', 'frontend-admin' ), 'user' => __( 'User', 'frontend-admin' ), 'term' => __( 'Term', 'frontend-admin' ), ); if ( ! empty( fea_instance()->pro_features ) ) { $custom_fields_options['options'] = __( 'Site Options', 'frontend-admin' ); if ( class_exists( 'woocommerce' ) ) { $custom_fields_options['product'] = __( 'Product', 'frontend-admin' ); } } $controls_settings['options'] = $custom_fields_options; $this->add_control( 'custom_fields_save', $controls_settings ); } public function register_style_tab_controls() { if ( empty( fea_instance()->pro_features ) ) { $this->start_controls_section( 'style_promo_section', array( 'label' => __( 'Styles', 'frontend-admin' ), 'tab' => Controls_Manager::TAB_STYLE, ) ); $this->add_control( 'styles_promo', array( 'type' => Controls_Manager::RAW_HTML, 'raw' => __( '

Go Pro to unlock styles.

', 'frontend-admin' ), 'content_classes' => 'acf-fields-note', ) ); $this->end_controls_section(); } else { do_action( 'frontend_admin/style_tab_settings', $this ); } } /** * Prepare fields widget output on the frontend. * * @since 1.0.0 * @access protected */ public function prepare_field( $key = false ) { global $fea_form, $fea_instance; $wg_id = $this->get_id(); $settings = $this->get_settings_for_display(); $form_display = $fea_instance->form_display; $current_id = $fea_instance->elementor->get_current_post_id(); $key = $key ? $key : $current_id . '_elementor_' . $this->get_id(); $field = array( 'label' => $settings['field_label'], 'field_label_hide' => !$settings['field_label_on'], 'name' => $settings['field_name'] ?? $this->get_meta_name(), '_name' => $settings['field_name'] ?? $this->get_meta_name(), 'instructions' => $settings['field_instruction'], 'key' => $key, 'required' => 'true' == $settings['field_required'], 'required_message' => $settings['field_required_message'], 'no_error_message' => 'true' !== $settings['show_error_message'], 'validation_message' => $settings['field_validation_message'], 'custom_fields_save' => $settings['custom_fields_save'] ?? 'post', ); $field = $this->get_field_data( $field ); $field['builder'] = 'elementor'; $field = $form_display->get_field_data_type( $field, $fea_form ); if( ! $field ) return false; if ( ! isset( $field['value'] ) || $field['value'] === null ) { $field = $form_display->get_field_value( $field, $fea_form ); } if( $fea_form ){ $fea_form['fields'][$key] = $field; } if( 'read_only' == $settings['field_display_mode'] ){ $field['frontend_admin_display_mode'] = 'read_only'; $field['no_values_message'] = $settings['no_values_message']; $field['with_edit'] = 'true' == $settings['field_inline_edit']; $field['wrapper'] = [ 'class' => 'fea-read-only-field', ]; } return $field; } /** * Render fields widget output on the frontend. * * @since 1.0.0 * @access protected */ protected function render(){ global $fea_instance, $fea_form; $form_display = $fea_instance->form_display; $settings = $this->get_settings_for_display(); $field = $this->prepare_field(); if( ! $field ) return; if( $settings['field_display_mode'] == 'read_only' ){ //$source = $fea_instance->elementor->get_current_post_id(); echo $fea_instance->dynamic_values->render_field_display( $field ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- rendered field markup, escaped where it is built. }else{ $form_display->render_field_wrap( $field ); if($fea_form) $fea_form['rendered_field'] = true; } } /** * Get field data. * * Retrieve the field data. * * @since 1.0.0 * @access protected * * @param array $field Field data. * * @return array Field data. */ protected function get_field_data( $field ) { return $field; } }