class_directory ) ) {
$reflection = new ReflectionClass( $this );
$this->class_directory = dirname( $reflection->getFileName() );
}
return $this->class_directory;
}
/**
* Render field output on the frontend.
*
* @param array $args
* @param array $settings
* @param Form $form
*
* @return void
*/
public function render_field( array $args, array &$settings, Form $form ): void {
foreach ( $args as $key => $value ) {
$$key = $value;
}
require $this->get_class_directory() . DIRECTORY_SEPARATOR . 'render.php';
}
/**
* Update form field controls.
* @param $args
*
* @return void
*/
public function update_field_controls( $args ): void {
foreach ( $args as $key => $value ) {
$$key = $value;
}
if ( $this->showContentTab ) {
require $this->get_class_directory() . DIRECTORY_SEPARATOR . 'controls' . DIRECTORY_SEPARATOR . 'content.php';
}
if ( $this->showStyleTab ) {
require $this->get_class_directory() . DIRECTORY_SEPARATOR . 'controls' . DIRECTORY_SEPARATOR . 'style.php';
}
if ( $this->showAdvancedTab ) {
require $this->get_class_directory() . DIRECTORY_SEPARATOR . 'controls' . DIRECTORY_SEPARATOR . 'advanced.php';
}
}
/**
* Get main ID
* @return int
*/
public static function get_main_id(): int {
if ( empty( self::$main_id ) ) {
self::$main_id = \Elementor\Plugin::instance()->documents->get_current()->get_main_id();
}
return self::$main_id;
}
public function kses_allowed_html( $allowed_html ): array {
return array_merge( $allowed_html, Helper::getAllowedSvgTags() );
}
public function optional_data(): array {
if ( ! self::$optionalData ) {
self::$optionalData = [
'restUrl' => rest_url(),
'nonce' => wp_create_nonce( 'wp_rest' ),
];
}
return self::$optionalData;
}
/**
* Field markup
* @param $item
* @param $item_index
* @param $form
*
* @return void
*/
public function render( $item, $item_index, $form ): void {
$type = $this->get_type();
$settings = [];
$args = [
'type' => $type,
'item' => $item,
'prefix' => $type . '_',
'item_index' => $item_index,
'mainId' => self::get_main_id(),
'formId' => $form->get_id(),
'itemId' => $item['_id'],
];
$args = array_merge( $args, $this->optional_data() );
$settingsKey = "{$args['prefix']}{$args['mainId']}_{$args['formId']}_{$args['itemId']}";
$args['key'] = $settingsKey;
add_filter( 'wp_kses_allowed_html', [ $this,'kses_allowed_html' ] );
$this->render_field( $args, $settings, $form );
remove_filter( 'wp_kses_allowed_html', [ $this,'kses_allowed_html' ] );
if ( $settings ) {
$settings['freemius']['can_use_premium_code'] = hulk_affef_fs()->can_use_premium_code();
$settings['freemius']['get_upgrade_url'] = hulk_affef_fs()->get_upgrade_url();
echo /** @lang text */ "';
}
}
/**
* Field controls
* @param $widget
*
* @return void
*/
public function update_controls( $widget ): void {
$elementor = Plugin::elementor();
$control_data = $elementor->controls_manager->get_control_from_stack( $widget->get_unique_name(), 'form_fields' );
if ( is_wp_error( $control_data ) ) {
return;
}
$field = new Repeater();
$type = $this->get_type();
$widget_id = $widget->get_id();
$args = [
'type' => $type,
'prefix' => $type . '_',
'widget_id' => $widget_id,
'field' => $field,
];
$controls = [];
if ( $this->showStyleTab ) {
$controls[ $args['prefix'] . 'form_fields_style_tab' ] = [
'type' => 'tab',
'tab' => 'content',
'label' => esc_attr__( 'Style', 'advanced-fields-for-elementor-forms' ),
'condition' =>
[
'field_type' => $type,
],
'tabs_wrapper' => 'form_fields_tabs',
'name' => $args['prefix'] . 'form_fields_style_tab',
];
}
$this->update_field_controls( $args );
$field_controls = $field->get_controls();
if ( is_array( $field_controls ) ) {
$controls = array_merge( $controls, $field_controls );
}
if ( isset( $controls['_id'] ) ) {
unset( $controls['_id'] );
}
foreach ( $controls as &$control ) {
if ( isset( $control['type'] ) && $control['type'] === 'popover_toggle' ) {
$control['control_tab'] = 'style';
}
if ( isset( $control['control_tab'] ) && $control['control_tab'] === Controls_Manager::TAB_CONTENT ) {
$control['condition']['field_type'] = $type;
$control['tab'] = 'content';
$control['inner_tab'] = 'form_fields_content_tab';
$control['tabs_wrapper'] = 'form_fields_tabs';
} elseif ( isset( $control['control_tab'] ) && $control['control_tab'] === Controls_Manager::TAB_STYLE ) {
$control['condition']['field_type'] = $type;
$control['tab'] = 'style';
$control['inner_tab'] = $args['prefix'] . 'form_fields_style_tab';
$control['tabs_wrapper'] = 'form_fields_tabs';
} elseif ( isset( $control['control_tab'] ) && $control['control_tab'] === Controls_Manager::TAB_ADVANCED ) {
$control['condition']['field_type'] = $type;
$control['tab'] = 'advanced';
$control['inner_tab'] = 'form_fields_advanced_tab';
$control['tabs_wrapper'] = 'form_fields_tabs';
}
}
unset( $control );
$control_data['fields'] = $this->inject_field_controls( $control_data['fields'], $controls );
$this->update_field_control_data( $control_data );
$widget->update_control( 'form_fields', $control_data );
}
/**
* Enqueue script and style if elementor cache is enabled
* @return void
*/
public function get_builder_content(): void {
foreach ( $this->get_style_depends() as $style ) {
wp_enqueue_style( $style );
}
foreach ( $this->get_script_depends() as $script ) {
wp_enqueue_script( $script );
}
}
/**
* Widget style controls
*
* @param Form $form
*
* @return void
*/
public function widget_style_controls( Form $form ): void {
if ( $this->showWidgetControls ) {
$type = $this->get_type();
$prefix = $type . '_';
require $this->get_class_directory() . '/controls/widget.php';
}
}
/**
* Get field settings by ID
*
* @param array $fields
* @param string $id
*
* @return array|mixed
*/
protected function get_field_settings( array $fields, string $id ) {
if ( empty( $this->fieldSettings[ $id ] ) ) {
foreach ( $fields as $field ) {
if ( str_contains( $id, $field['_id'] ) ) {
$filtered = array_filter(
$field,
fn( $key ) => str_starts_with( $key, $this->get_type() ),
ARRAY_FILTER_USE_KEY
);
$result = [];
foreach ( $filtered as $key => $value ) {
// Remove the prefix from the key
$newKey = str_replace( $this->get_type() . '_', '', $key );
$result[ $newKey ] = $value;
}
$this->fieldSettings[ $id ] = $result;
return $result;
}
}
}
return $this->fieldSettings[ $id ] ?? [];
}
public function doc_notice_control_content( string $url ): string {
return sprintf(
// Translators: %s is the documentation link.
esc_attr__( 'Not sure how to set this? Check our step by step %s.', 'advanced-fields-for-elementor-forms' ),
/** @lang text */ '' . esc_attr__( 'documentation', 'advanced-fields-for-elementor-forms' ) . ''
);
}
/**
* Disabled fields Cleanup controls
*
* @param $widget
*
* @return void
*/
public function cleanup_controls( $widget ): void {
$elementor = Plugin::elementor();
$control_data = $elementor->controls_manager->get_control_from_stack( $widget->get_unique_name(), 'form_fields' );
if ( is_wp_error( $control_data ) ) {
return;
}
// Remove required control
if ( isset( $control_data['fields']['required']['conditions']['terms'] ) ) {
$control_data['fields']['required']['conditions']['terms'][] = [
'name' => 'field_type',
'operator' => '!in',
'value' => [ $this->get_type() ],
];
}
$widget->update_control( 'form_fields', $control_data );
}
/**
* Field constructor.
* @return void
*/
public function __construct( array $meta ) {
if ( $meta['isEnabled'] === true ) {
parent::__construct();
add_action( 'elementor/frontend/get_builder_content', [ $this,'get_builder_content' ] );
if ( $this->showWidgetControls ) {
add_action(
'elementor/element/form/section_field_style/after_section_end',
[
$this,
'widget_style_controls',
]
);
}
} else {
add_action( 'elementor/element/form/section_form_fields/before_section_end', [ $this, 'cleanup_controls' ] );
}
}
}