This repository has been archived on 2022-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
divi/core/components/api/email/Fields.php

437 lines
16 KiB
PHP

<?php
class ET_Core_API_Email_Fields {
/**
* @var ET_Core_Data_Utils
*/
protected static $_;
protected static $_any_custom_field_type_support;
protected static $_predefined_custom_field_support;
/**
* @var ET_Core_API_Email_Providers
*/
protected static $_providers;
public static $owner;
protected static function _custom_field_definitions() {
$readonly_dependency = 'builder' === self::$owner ? 'parentModule:provider' : 'email_provider';
$custom_fields_support = array_keys( self::$_providers->names_by_slug( 'all', 'custom_fields' ) );
$custom_fields_data = self::$_providers->custom_fields_data();
$fields = array();
if ( 'bloom' === self::$owner ) {
$fields = array(
'use_custom_fields' => array(
'label' => esc_html__( 'Use Custom Fields', 'et_core' ),
'type' => 'yes_no_button',
'options' => array(
'on' => esc_html__( 'Yes', 'et_core' ),
'off' => esc_html__( 'No', 'et_core' ),
),
'default' => 'off',
'show_if' => array(
'email_provider' => $custom_fields_support,
),
'allow_dynamic' => array_keys( self::$_providers->names_by_slug( 'all', 'dynamic_custom_fields' ) ),
'description' => esc_html__( 'Enable this option to use custom fields in your opt-in form.', 'et_core' ),
),
'custom_fields' => array(
'type' => 'sortable_list',
'label' => '',
'default' => '[]',
),
'editing_field' => array(
'type' => 'skip',
'default' => 'off',
),
);
}
foreach ( $custom_fields_data as $provider => $accounts ) {
foreach ( $accounts as $account => $lists ) {
$account_name = str_replace( ' ', '', strtolower( $account ) );
$key = "predefined_field_{$provider}_{$account_name}";
if ( isset( $lists['custom_fields'] ) ) {
// Custom fields are per account
$fields[ $key ] = self::_predefined_custom_field_select( $lists['custom_fields'], $provider, $account );
continue;
}
foreach ( $lists as $list_id => $custom_fields ) {
// Custom fields are per list
$key = "predefined_field_{$provider}_{$account_name}_{$list_id}";
$fields[ $key ] = self::_predefined_custom_field_select( $custom_fields, $provider, $account, $list_id );
}
}
}
$labels = array(
'link_url' => esc_html__( 'Link URL', 'et_core' ),
'link_text' => esc_html__( 'Link Text', 'et_core' ),
'link_cancel' => esc_html__( 'Discard Changes', 'et_core' ),
'link_save' => esc_html__( 'Save Changes', 'et_core' ),
'link_settings' => esc_html__( 'Option Link', 'et_core' ),
);
$fields = array_merge( $fields, array(
'predefined_field' => array(
'type' => 'skip',
'default' => 'none',
),
'field_id' => array(
'label' => esc_html__( 'ID', 'et_core' ),
'type' => 'text',
'default' => '', // <--- Intentional
'description' => esc_html__( 'Define a unique ID for this field. You should use only English characters without special characters or spaces.', 'et_core' ),
'toggle_slug' => 'main_content',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
),
'field_title' => array(
'label' => esc_html__( 'Name', 'et_core' ),
'type' => 'text',
'description' => esc_html__( 'Set the label that will appear above this field in the opt-in form.', 'et_core' ),
'toggle_slug' => 'main_content',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => array( 'getresponse', 'sendinblue', 'constant_contact', 'fluentcrm' ),
),
),
'field_type' => array(
'label' => esc_html__( 'Type', 'et_core' ),
'type' => 'select',
'default' => 'none',
'option_category' => 'basic_option',
'options' => array(
'none' => esc_html__( 'Choose a field type...', 'et_core' ),
'input' => esc_html__( 'Input Field', 'et_core' ),
'email' => esc_html__( 'Email Field', 'et_core' ),
'text' => esc_html__( 'Textarea', 'et_core' ),
'checkbox' => esc_html__( 'Checkboxes', 'et_core' ),
'radio' => esc_html__( 'Radio Buttons', 'et_core' ),
'select' => esc_html__( 'Select Dropdown', 'et_core' ),
),
'description' => esc_html__( 'Choose the type of field', 'et_core' ),
'toggle_slug' => 'field_options',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => self::$_any_custom_field_type_support,
),
),
'checkbox_checked' => array(
'label' => esc_html__( 'Checked By Default', 'et_core' ),
'description' => esc_html__( 'If enabled, the check mark will be automatically selected for the visitor. They can still deselect it.', 'et_core' ),
'type' => 'hidden',
'option_category' => 'layout',
'default' => 'off',
'toggle_slug' => 'field_options',
'show_if' => array(
'field_type' => 'checkbox',
),
),
'checkbox_options' => array(
'label' => esc_html__( 'Options', 'et_core' ),
'type' => 'sortable_list',
'checkbox' => true,
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => self::$_any_custom_field_type_support,
),
'show_if' => array(
'field_type' => 'checkbox',
),
'right_actions' => 'move|link|copy|delete',
'right_actions_readonly' => 'move|link',
'labels' => $labels,
),
'radio_options' => array(
'label' => esc_html__( 'Options', 'et_core' ),
'type' => 'sortable_list',
'radio' => true,
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => self::$_any_custom_field_type_support,
),
'show_if' => array(
'field_type' => 'radio',
),
'right_actions' => 'move|link|copy|delete',
'right_actions_readonly' => 'move|link',
'labels' => $labels,
),
'select_options' => array(
'label' => esc_html__( 'Options', 'et_core' ),
'type' => 'sortable_list',
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => self::$_any_custom_field_type_support,
),
'show_if' => array(
'field_type' => 'select',
),
'right_actions' => 'move|copy|delete',
'right_actions_readonly' => 'move',
),
'min_length' => array(
'label' => esc_html__( 'Minimum Length', 'et_core' ),
'description' => esc_html__( 'Leave at 0 to remove restriction', 'et_core' ),
'type' => 'range',
'default' => '0',
'unitless' => true,
'range_settings' => array(
'min' => '0',
'max' => '255',
'step' => '1',
),
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'show_if' => array(
'field_type' => 'input',
),
),
'max_length' => array(
'label' => esc_html__( 'Maximum Length', 'et_core' ),
'description' => esc_html__( 'Leave at 0 to remove restriction', 'et_core' ),
'type' => 'range',
'default' => '0',
'unitless' => true,
'range_settings' => array(
'min' => '0',
'max' => '255',
'step' => '1',
),
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'show_if' => array(
'field_type' => 'input',
),
),
'allowed_symbols' => array(
'label' => esc_html__( 'Allowed Symbols', 'et_core' ),
'description' => esc_html__( 'You can validate certain types of information by disallowing certain symbols. Symbols added here will prevent the form from being submitted if added by the user.', 'et_core' ),
'type' => 'select',
'default' => 'all',
'options' => array(
'all' => esc_html__( 'All', 'et_core' ),
'letters' => esc_html__( 'Letters Only (A-Z)', 'et_core' ),
'numbers' => esc_html__( 'Numbers Only (0-9)', 'et_core' ),
'alphanumeric' => esc_html__( 'Alphanumeric Only (A-Z, 0-9)', 'et_core' ),
),
'option_category' => 'basic_option',
'toggle_slug' => 'field_options',
'show_if' => array(
'field_type' => 'input',
),
),
'required_mark' => array(
'label' => esc_html__( 'Required Field', 'et_core' ),
'type' => 'yes_no_button',
'option_category' => 'configuration',
'default' => 'on',
'options' => array(
'on' => esc_html__( 'Yes', 'et_core' ),
'off' => esc_html__( 'No', 'et_core' ),
),
'description' => esc_html__( 'Define whether the field should be required or optional', 'et_core' ),
'toggle_slug' => 'field_options',
'show_if_not' => array(
'email_provider' => 'getresponse',
),
),
'hidden' => array(
'label' => esc_html__( 'Hidden Field', 'et_core' ),
'type' => 'yes_no_button',
'option_category' => 'configuration',
'default' => 'off',
'options' => array(
'on' => esc_html__( 'Yes', 'et_core' ),
'off' => esc_html__( 'No', 'et_core' ),
),
'description' => esc_html__( 'Define whether or not the field should be visible.', 'et_core' ),
'toggle_slug' => 'field_options',
'readonly_if' => array(
$readonly_dependency => self::$_predefined_custom_field_support,
),
'readonly_if_not' => array(
$readonly_dependency => self::$_any_custom_field_type_support,
),
),
'fullwidth_field' => array(
'label' => esc_html__( 'Make Fullwidth', 'et_core' ),
'type' => 'yes_no_button',
'option_category' => 'layout',
'options' => array(
'on' => esc_html__( 'Yes', 'et_core' ),
'off' => esc_html__( 'No', 'et_core' ),
),
'tab_slug' => 'advanced',
'toggle_slug' => 'layout',
'description' => esc_html__( 'If enabled, the field will take 100% of the width of the form, otherwise it will take 50%', 'et_core' ),
'default' => array( 'parent:layout', array(
'left_right' => 'on',
'right_left' => 'on',
'top_bottom' => 'off',
'bottom_top' => 'off',
)),
),
) );
if ( 'builder' === self::$owner ) {
$fields = array_merge( $fields, array(
'field_background_color' => array(
'label' => esc_html__( 'Field Background Color', 'et_core' ),
'description' => esc_html__( "Pick a color to fill the module's input fields.", 'et_core' ),
'type' => 'color-alpha',
'custom_color' => true,
'toggle_slug' => 'form_field',
'tab_slug' => 'advanced',
),
'conditional_logic' => array(
'label' => esc_html__( 'Enable', 'et_core' ),
'type' => 'yes_no_button',
'option_category' => 'layout',
'default' => 'off',
'options' => array(
'on' => esc_html__( 'Yes', 'et_core' ),
'off' => esc_html__( 'No', 'et_core' ),
),
'description' => et_get_safe_localization( __( "Enabling conditional logic makes this field only visible when any or all of the rules below are fulfilled<br><strong>Note:</strong> Only fields with an unique and non-empty field ID can be used", 'et_core' ) ),
'toggle_slug' => 'conditional_logic',
),
'conditional_logic_relation' => array(
'label' => esc_html__( 'Relation', 'et_core' ),
'type' => 'yes_no_button',
'option_category' => 'layout',
'options' => array(
'on' => esc_html__( 'All', 'et_core' ),
'off' => esc_html__( 'Any', 'et_core' ),
),
'default' => 'off',
'button_options' => array(
'button_type' => 'equal',
),
'description' => esc_html__( 'Choose whether any or all of the rules should be fulfilled', 'et_core' ),
'toggle_slug' => 'conditional_logic',
'show_if' => array(
'conditional_logic' => 'on',
),
),
'conditional_logic_rules' => array(
'label' => esc_html__( 'Rules', 'et_core' ),
'description' => esc_html__( 'Conditional logic rules can be used to hide and display different input fields conditionally based on how the visitor has interacted with different inputs.', 'et_core' ),
'type' => 'conditional_logic',
'option_category' => 'layout',
'depends_show_if' => 'on',
'toggle_slug' => 'conditional_logic',
'show_if' => array(
'conditional_logic' => 'on',
),
),
) );
}
if ( 'bloom' === self::$owner ) {
foreach ( $fields as $field_slug => &$field ) {
if ( 'use_custom_fields' !== $field_slug ) {
self::$_->array_set( $field, 'show_if.use_custom_fields', 'on' );
}
}
}
return $fields;
}
protected static function _predefined_custom_field_select( $custom_fields, $provider, $account_name, $list_id = '' ) {
$is_builder = 'builder' === self::$owner;
$is_bloom = 'bloom' === self::$owner;
$dependency = $is_builder ? 'parentModule:provider' : 'email_provider';
$show_if = array(
$dependency => $provider,
);
if ( $is_bloom ) {
$show_if['account_name'] = $account_name;
}
if ( $list_id && $is_builder ) {
$dependency = "parentModule:{$provider}_list";
$show_if[ $dependency ] = "{$account_name}|{$list_id}";
} else if ( $list_id && $is_bloom ) {
$show_if['email_list'] = (string) $list_id;
}
$options = array( 'none' => esc_html__( 'Choose a field...', 'et_core' ) );
foreach ( $custom_fields as $field ) {
$field_id = isset( $field['group_id'] ) ? $field['group_id'] : $field['field_id'];
$options[ $field_id ] = $field['name'];
}
return array(
'label' => esc_html__( 'Field', 'et_core' ),
'type' => 'select',
'options' => $options,
'order' => array_keys( $options ),
'show_if' => $show_if,
'toggle_slug' => 'main_content',
'default' => 'none',
'description' => esc_html__( 'Choose a custom field. Custom fields must be defined in your email provider account.', 'et_core' ),
);
}
/**
* Get field definitions
*
* @since 3.10
*
* @param string $type Accepts 'custom_field'
* @param string $for Accepts 'builder', 'bloom'
*
* @return array
*/
public static function get_definitions( $for, $type = 'custom_field' ) {
self::$owner = $for;
$fields = array();
if ( 'custom_field' === $type ) {
$fields = self::_custom_field_definitions();
}
return $fields;
}
public static function initialize() {
self::$_ = ET_Core_Data_Utils::instance();
self::$_providers = ET_Core_API_Email_Providers::instance();
self::$_predefined_custom_field_support = array_keys( self::$_providers->names_by_slug( 'all', 'predefined_custom_fields' ) );
self::$_any_custom_field_type_support = self::$_providers->names_by_slug( 'all', 'any_custom_field_type' );
}
}
ET_Core_API_Email_Fields::initialize();