class-base.php 0000666 00000102237 15214147305 0007305 0 ustar 00 type = esc_html__( 'Connection', 'wpforms-lite' );
$this->init();
// Add to list of available providers.
add_filter( 'wpforms_providers_available', array( $this, 'register_provider' ), $this->priority, 1 );
// Process builder AJAX requests.
add_action( "wp_ajax_wpforms_provider_ajax_{$this->slug}", array( $this, 'process_ajax' ) );
// Process entry.
add_action( 'wpforms_process_complete', array( $this, 'process_entry' ), 5, 4 );
// Fetch and store the current form data when in the builder.
add_action( 'wpforms_builder_init', array( $this, 'builder_form_data' ) );
// Output builder sidebar.
add_action( 'wpforms_providers_panel_sidebar', array( $this, 'builder_sidebar' ), $this->priority );
// Output builder content.
add_action( 'wpforms_providers_panel_content', array( $this, 'builder_output' ), $this->priority );
// Remove provider from Settings Integrations tab.
add_action( "wp_ajax_wpforms_settings_provider_disconnect_{$this->slug}", array( $this, 'integrations_tab_disconnect' ) );
// Add new provider from Settings Integrations tab.
add_action( "wp_ajax_wpforms_settings_provider_add_{$this->slug}", array( $this, 'integrations_tab_add' ) );
// Add providers sections to the Settings Integrations tab.
add_action( 'wpforms_settings_providers', array( $this, 'integrations_tab_options' ), $this->priority, 2 );
}
/**
* All systems go. Used by subclasses.
*
* @since 1.0.0
*/
public function init() {
}
/**
* Add to list of registered providers.
*
* @since 1.0.0
*
* @param array $providers Array of all active providers.
*
* @return array
*/
public function register_provider( $providers = array() ) {
$providers[ $this->slug ] = $this->name;
return $providers;
}
/**
* Process the Builder AJAX requests.
*
* @since 1.0.0
*/
public function process_ajax() {
// Run a security check.
check_ajax_referer( 'wpforms-builder', 'nonce' );
// Check for permissions.
if ( ! wpforms_current_user_can( 'edit_forms' ) ) {
wp_send_json_error(
array(
'error' => esc_html__( 'You do not have permission', 'wpforms-lite' ),
)
);
}
$name = ! empty( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : '';
$task = ! empty( $_POST['task'] ) ? sanitize_text_field( wp_unslash( $_POST['task'] ) ) : '';
$id = ! empty( $_POST['id'] ) ? sanitize_text_field( wp_unslash( $_POST['id'] ) ) : '';
$connection_id = ! empty( $_POST['connection_id'] ) ? sanitize_text_field( wp_unslash( $_POST['connection_id'] ) ) : '';
$account_id = ! empty( $_POST['account_id'] ) ? sanitize_text_field( wp_unslash( $_POST['account_id'] ) ) : '';
$list_id = ! empty( $_POST['list_id'] ) ? sanitize_text_field( wp_unslash( $_POST['list_id'] ) ) : '';
$data = ! empty( $_POST['data'] ) ? array_map( 'sanitize_text_field', wp_parse_args( wp_unslash( $_POST['data'] ) ) ) : array(); //phpcs:ignore
/*
* Create new connection.
*/
if ( 'new_connection' === $task ) {
$connection = $this->output_connection(
'',
array(
'connection_name' => $name,
),
$id
);
wp_send_json_success(
array(
'html' => $connection,
)
);
}
/*
* Create new Provider account.
*/
if ( 'new_account' === $task ) {
$auth = $this->api_auth( $data, $id );
if ( is_wp_error( $auth ) ) {
wp_send_json_error(
array(
'error' => $auth->get_error_message(),
)
);
} else {
$accounts = $this->output_accounts(
$connection_id,
array(
'account_id' => $auth,
)
);
wp_send_json_success(
array(
'html' => $accounts,
)
);
}
}
/*
* Select/Toggle Provider accounts.
*/
if ( 'select_account' === $task ) {
$lists = $this->output_lists(
$connection_id,
array(
'account_id' => $account_id,
)
);
if ( is_wp_error( $lists ) ) {
wp_send_json_error(
array(
'error' => $lists->get_error_message(),
)
);
} else {
wp_send_json_success(
array(
'html' => $lists,
)
);
}
}
/*
* Select/Toggle Provider account lists.
*/
if ( 'select_list' === $task ) {
$fields = $this->output_fields(
$connection_id,
array(
'account_id' => $account_id,
'list_id' => $list_id,
),
$id
);
if ( is_wp_error( $fields ) ) {
wp_send_json_error(
array(
'error' => $fields->get_error_message(),
)
);
} else {
$groups = $this->output_groups(
$connection_id,
array(
'account_id' => $account_id,
'list_id' => $list_id,
)
);
$conditionals = $this->output_conditionals(
$connection_id,
array(
'account_id' => $account_id,
'list_id' => $list_id,
),
array(
'id' => absint( $_POST['form_id'] ), //phpcs:ignore
)
);
$options = $this->output_options(
$connection_id,
array(
'account_id' => $account_id,
'list_id' => $list_id,
)
);
wp_send_json_success(
array(
'html' => $groups . $fields . $conditionals . $options,
)
);
}
}
die();
}
/**
* Process and submit entry to provider.
*
* @since 1.0.0
*
* @param array $fields List of fields in a form.
* @param array $entry Submitted entry values.
* @param array $form_data Form data and settings.
* @param int $entry_id Saved entry ID.
*/
public function process_entry( $fields, $entry, $form_data, $entry_id ) {
}
/**
* Process conditional fields.
*
* @since 1.0.0
*
* @param array $fields List of fields with their data and settings.
* @param array $entry Submitted entry values.
* @param array $form_data Form data and settings.
* @param array $connection List of connection settings.
*
* @return bool
*/
public function process_conditionals( $fields, $entry, $form_data, $connection ) {
if ( empty( $connection['conditional_logic'] ) || empty( $connection['conditionals'] ) ) {
return true;
}
$process = wpforms_conditional_logic()->process( $fields, $form_data, $connection['conditionals'] );
if ( ! empty( $connection['conditional_type'] ) && 'stop' === $connection['conditional_type'] ) {
$process = ! $process;
}
return $process;
}
/**
* Retrieve all available forms in a field.
*
* Not all fields should be available for merge tags so we compare against a
* white-list. Also some fields, such as Name, should have additional
* variations.
*
* @since 1.0.0
*
* @param object|bool $form
* @param array $whitelist
*
* @return bool|array
*/
public function get_form_fields( $form = false, $whitelist = array() ) {
// Accept form (post) object or form ID.
if ( is_object( $form ) ) {
$form = wpforms_decode( $form->post_content );
} elseif ( is_numeric( $form ) ) {
$form = wpforms()->form->get(
$form,
array(
'content_only' => true,
)
);
}
if ( ! is_array( $form ) || empty( $form['fields'] ) ) {
return false;
}
// White list of field types to allow.
$allowed_form_fields = array(
'text',
'textarea',
'select',
'radio',
'checkbox',
'email',
'address',
'url',
'name',
'hidden',
'date-time',
'phone',
'number',
);
$allowed_form_fields = apply_filters( 'wpforms_providers_fields', $allowed_form_fields );
$whitelist = ! empty( $whitelist ) ? $whitelist : $allowed_form_fields;
$form_fields = $form['fields'];
foreach ( $form_fields as $id => $form_field ) {
if ( ! in_array( $form_field['type'], $whitelist, true ) ) {
unset( $form_fields[ $id ] );
}
}
return $form_fields;
}
/**
* Get form fields ready for select list options.
*
* In this function we also do the logic to limit certain fields to certain
* provider field types.
*
* @since 1.0.0
*
* @param array $form_fields
* @param string $form_field_type
*
* @return array
*/
public function get_form_field_select( $form_fields = array(), $form_field_type = '' ) {
if ( empty( $form_fields ) || empty( $form_field_type ) ) {
return array();
}
$formatted = array();
// Include only specific field types.
foreach ( $form_fields as $id => $form_field ) {
// Email.
if (
'email' === $form_field_type &&
! in_array( $form_field['type'], array( 'text', 'email' ), true )
) {
unset( $form_fields[ $id ] );
}
// Address.
if (
'address' === $form_field_type &&
! in_array( $form_field['type'], array( 'address' ), true )
) {
unset( $form_fields[ $id ] );
}
}
// Format.
foreach ( $form_fields as $id => $form_field ) {
// Complex Name field.
if ( 'name' === $form_field['type'] ) {
// Full Name.
$formatted[] = array(
'id' => $form_field['id'],
'key' => 'value',
'type' => $form_field['type'],
'subtype' => '',
'provider_type' => $form_field_type,
'label' => sprintf(
/* translators: %s - Name field label. */
esc_html__( '%s (Full)', 'wpforms-lite' ),
$form_field['label']
),
);
// First Name.
if ( strpos( $form_field['format'], 'first' ) !== false ) {
$formatted[] = array(
'id' => $form_field['id'],
'key' => 'first',
'type' => $form_field['type'],
'subtype' => 'first',
'provider_type' => $form_field_type,
'label' => sprintf(
/* translators: %s - Name field label. */
esc_html__( '%s (First)', 'wpforms-lite' ),
$form_field['label']
),
);
}
// Middle Name.
if ( strpos( $form_field['format'], 'middle' ) !== false ) {
$formatted[] = array(
'id' => $form_field['id'],
'key' => 'middle',
'type' => $form_field['type'],
'subtype' => 'middle',
'provider_type' => $form_field_type,
'label' => sprintf(
/* translators: %s - Name field label. */
esc_html__( '%s (Middle)', 'wpforms-lite' ),
$form_field['label']
),
);
}
// Last Name.
if ( strpos( $form_field['format'], 'last' ) !== false ) {
$formatted[] = array(
'id' => $form_field['id'],
'key' => 'last',
'type' => $form_field['type'],
'subtype' => 'last',
'provider_type' => $form_field_type,
'label' => sprintf(
/* translators: %s - Name field label. */
esc_html__( '%s (Last)', 'wpforms-lite' ),
$form_field['label']
),
);
}
} else {
// All other fields.
$formatted[] = array(
'id' => $form_field['id'],
'key' => 'value',
'type' => $form_field['type'],
'subtype' => '',
'provider_type' => $form_field_type,
'label' => $form_field['label'],
);
}
}
return $formatted;
}
/************************************************************************
* API methods - these methods interact directly with the provider API. *
************************************************************************/
/**
* Authenticate with the provider API.
*
* @since 1.0.0
*
* @param array $data
* @param string $form_id
*
* @return mixed id or error object
*/
public function api_auth( $data = array(), $form_id = '' ) {
}
/**
* Establish connection object to provider API.
*
* @since 1.0.0
*
* @param string $account_id
*
* @return mixed array or error object
*/
public function api_connect( $account_id ) {
}
/**
* Retrieve provider account lists.
*
* @since 1.0.0
*
* @param string $connection_id
* @param string $account_id
*
* @return mixed array or error object
*/
public function api_lists( $connection_id = '', $account_id = '' ) {
}
/**
* Retrieve provider account list groups.
*
* @since 1.0.0
*
* @param string $connection_id
* @param string $account_id
* @param string $list_id
*
* @return mixed array or error object
*/
public function api_groups( $connection_id = '', $account_id = '', $list_id = '' ) {
}
/**
* Retrieve provider account list fields.
*
* @since 1.0.0
*
* @param string $connection_id
* @param string $account_id
* @param string $list_id
*
* @return mixed array or error object
*/
public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) {
}
/*************************************************************************
* Output methods - these methods generally return HTML for the builder. *
*************************************************************************/
/**
* Connection HTML.
*
* This method compiles all the HTML necessary for a connection to a provider.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
* @param mixed $form Form id or form data.
*
* @return string
*/
public function output_connection( $connection_id = '', $connection = array(), $form = '' ) {
if ( empty( $connection_id ) ) {
$connection_id = 'connection_' . uniqid();
}
if ( empty( $connection ) || empty( $form ) ) {
return '';
}
$output = sprintf( '
', $this->slug, $connection_id );
$output .= $this->output_connection_header( $connection_id, $connection );
$output .= $this->output_auth();
$output .= $this->output_accounts( $connection_id, $connection );
$lists = $this->output_lists( $connection_id, $connection );
$output .= ! is_wp_error( $lists ) ? $lists : '';
$output .= $this->output_groups( $connection_id, $connection );
$fields = $this->output_fields( $connection_id, $connection, $form );
$output .= ! is_wp_error( $fields ) ? $fields : '';
$output .= $this->output_conditionals( $connection_id, $connection, $form );
$output .= $this->output_options( $connection_id, $connection );
$output .= '
';
return $output;
}
/**
* Connection header HTML.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
*
* @return string
*/
public function output_connection_header( $connection_id = '', $connection = array() ) {
if ( empty( $connection_id ) || empty( $connection ) ) {
return '';
}
$output = '';
return $output;
}
/**
* Provider account authorize fields HTML.
*
* @since 1.0.0
*
* @return mixed
*/
public function output_auth() {
}
/**
* Provider account select HTML.
*
* @since 1.0.0
*
* @param string $connection_id Unique connection ID.
* @param array $connection Array of connection data.
*
* @return string
*/
public function output_accounts( $connection_id = '', $connection = array() ) {
if ( empty( $connection_id ) || empty( $connection ) ) {
return '';
}
$providers = wpforms_get_providers_options();
if ( empty( $providers[ $this->slug ] ) ) {
return '';
}
$output = '';
$output .= sprintf( '
%s ', esc_html__( 'Select Account', 'wpforms-lite' ) );
$output .= sprintf( '', $this->slug, $connection_id );
foreach ( $providers[ $this->slug ] as $key => $provider_details ) {
$selected = ! empty( $connection['account_id'] ) ? $connection['account_id'] : '';
$output .= sprintf(
'%s ',
$key,
selected( $selected, $key, false ),
esc_html( $provider_details['label'] )
);
}
$output .= sprintf( '%s', esc_html__( 'Add New Account', 'wpforms-lite' ) );
$output .= ' ';
$output .= '';
return $output;
}
/**
* Provider account lists HTML.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
*
* @return WP_Error|string
*/
public function output_lists( $connection_id = '', $connection = array() ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) ) {
return '';
}
$lists = $this->api_lists( $connection_id, $connection['account_id'] );
$selected = ! empty( $connection['list_id'] ) ? $connection['list_id'] : '';
if ( is_wp_error( $lists ) ) {
return $lists;
}
$output = '';
$output .= sprintf( '
%s ', esc_html__( 'Select List', 'wpforms-lite' ) );
$output .= sprintf( '', $this->slug, $connection_id );
if ( ! empty( $lists ) ) {
foreach ( $lists as $list ) {
$output .= sprintf(
'%s ',
esc_attr( $list['id'] ),
selected( $selected, $list['id'], false ),
esc_attr( $list['name'] )
);
}
}
$output .= ' ';
$output .= '';
return $output;
}
/**
* Provider account list groups HTML.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
*
* @return string
*/
public function output_groups( $connection_id = '', $connection = array() ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) ) {
return '';
}
$groupsets = $this->api_groups( $connection_id, $connection['account_id'], $connection['list_id'] );
if ( is_wp_error( $groupsets ) ) {
return '';
}
$output = '';
return $output;
}
/**
* Provider account list fields HTML.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
* @param mixed $form
*
* @return WP_Error|string
*/
public function output_fields( $connection_id = '', $connection = array(), $form = '' ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) || empty( $form ) ) {
return '';
}
$provider_fields = $this->api_fields( $connection_id, $connection['account_id'], $connection['list_id'] );
$form_fields = $this->get_form_fields( $form );
if ( is_wp_error( $provider_fields ) ) {
return $provider_fields;
}
$output = '';
return $output;
}
/**
* Provider connection conditional options HTML
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
* @param string|array $form
*
* @return string
*/
public function output_conditionals( $connection_id = '', $connection = array(), $form = '' ) {
if ( empty( $connection['account_id'] ) ) {
return '';
}
return wpforms_conditional_logic()->builder_block(
array(
'form' => $this->form_data,
'type' => 'panel',
'panel' => $this->slug,
'parent' => 'providers',
'subsection' => $connection_id,
'reference' => esc_html__( 'Marketing provider connection', 'wpforms-lite' ),
),
false
);
}
/**
* Provider account list options HTML.
*
* @since 1.0.0
*
* @param string $connection_id
* @param array $connection
*
* @return string
*/
public function output_options( $connection_id = '', $connection = array() ) {
}
/********************************************************
* Builder methods - these methods _build_ the Builder. *
********************************************************/
/**
* Fetch and store the current form data when in the builder.
*
* @since 1.2.3
*/
public function builder_form_data() {
if ( ! empty( $_GET['form_id'] ) && empty( $this->form_data ) ) {
$this->form_data = wpforms()->form->get(
absint( $_GET['form_id'] ),
array(
'content_only' => true,
)
);
}
}
/**
* Display content inside the panel content area.
*
* @since 1.0.0
*/
public function builder_content() {
$form_data = $this->form_data;
$providers = wpforms_get_providers_options();
if ( ! empty( $form_data['providers'][ $this->slug ] ) && ! empty( $providers[ $this->slug ] ) ) {
foreach ( $form_data['providers'][ $this->slug ] as $connection_id => $connection ) {
foreach ( $providers[ $this->slug ] as $account_id => $connections ) {
if (
! empty( $connection['account_id'] ) &&
$connection['account_id'] === $account_id
) {
echo $this->output_connection( $connection_id, $connection, $form_data );
}
}
}
}
}
/**
* Display content inside the panel sidebar area.
*
* @since 1.0.0
*/
public function builder_sidebar() {
$form_data = $this->form_data;
$configured = ! empty( $form_data['providers'][ $this->slug ] ) ? 'configured' : '';
$configured = apply_filters( 'wpforms_providers_' . $this->slug . '_configured', $configured );
echo '';
}
/**
* Wrap the builder content with the required markup.
*
* @since 1.0.0
*/
public function builder_output() {
?>
builder_output_before(); ?>
name; ?>
type )
);
?>
builder_output_after(); ?>
esc_html__( 'You do not have permission', 'wpforms-lite' ),
)
);
}
if ( empty( $_POST['provider'] ) || empty( $_POST['key'] ) ) {
wp_send_json_error(
array(
'error' => esc_html__( 'Missing data', 'wpforms-lite' ),
)
);
}
$providers = wpforms_get_providers_options();
if ( ! empty( $providers[ $_POST['provider'] ][ $_POST['key'] ] ) ) {
unset( $providers[ $_POST['provider'] ][ $_POST['key'] ] );
update_option( 'wpforms_providers', $providers );
wp_send_json_success();
} else {
wp_send_json_error(
array(
'error' => esc_html__( 'Connection missing', 'wpforms-lite' ),
)
);
}
}
/**
* AJAX to add a provider from the settings integrations tab.
*
* @since 1.0.0
*/
public function integrations_tab_add() {
if ( $_POST['provider'] !== $this->slug ) { //phpcs:ignore
return;
}
// Run a security check.
check_ajax_referer( 'wpforms-admin', 'nonce' );
// Check for permissions.
if ( ! wpforms_current_user_can() ) {
wp_send_json_error(
array(
'error' => esc_html__( 'You do not have permission', 'wpforms-lite' ),
)
);
}
if ( empty( $_POST['data'] ) ) {
wp_send_json_error(
array(
'error' => esc_html__( 'Missing data', 'wpforms-lite' ),
)
);
}
$data = wp_parse_args( $_POST['data'], array() );
$auth = $this->api_auth( $data, '' );
if ( is_wp_error( $auth ) ) {
wp_send_json_error(
array(
'error' => esc_html__( 'Could not connect to the provider.', 'wpforms-lite' ),
'error_msg' => $auth->get_error_message(),
)
);
} else {
$account = '';
$account .= '' . sanitize_text_field( $data['label'] ) . ' ';
/* translators: %s - Connection date. */
$account .= '' . sprintf( esc_html__( 'Connected on: %s', 'wpforms-lite' ), date_i18n( get_option( 'date_format', time() ) ) ) . ' ';
$account .= '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . ' ';
$account .= ' ';
wp_send_json_success(
array(
'html' => $account,
)
);
}
}
/**
* Add provider to the Settings Integrations tab.
*
* @since 1.0.0
*
* @param array $active Array of active connections.
* @param array $settings Array of all connections settings.
*/
public function integrations_tab_options( $active, $settings ) {
$connected = ! empty( $active[ $this->slug ] );
$accounts = ! empty( $settings[ $this->slug ] ) ? $settings[ $this->slug ] : array();
$class = $connected && $accounts ? 'connected' : '';
$arrow = 'right';
/* translators: %s - provider name. */
$title_connect_to = sprintf( esc_html__( 'Connect to %s', 'wpforms-lite' ), esc_html( $this->name ) );
// This lets us highlight a specific service by a special link.
if ( ! empty( $_GET['wpforms-integration'] ) ) { //phpcs:ignore
if ( $this->slug === $_GET['wpforms-integration'] ) { //phpcs:ignore
$class .= ' focus-in';
$arrow = 'down';
} else {
$class .= ' focus-out';
}
}
?>
slug . '-error', $message );
}
}
class-constant-contact.php 0000666 00000072570 15214147305 0011663 0 ustar 00 version = '1.3.6';
$this->name = 'Constant Contact';
$this->slug = 'constant-contact';
$this->priority = 14;
$this->icon = WPFORMS_PLUGIN_URL . 'assets/images/icon-provider-constant-contact.png';
if ( is_admin() ) {
// Admin notice requesting connecting.
add_action( 'admin_notices', array( $this, 'connect_request' ) );
add_action( 'wp_ajax_wpforms_constant_contact_dismiss', array( $this, 'connect_dismiss' ) );
add_action( 'wpforms_admin_page', array( $this, 'learn_more_page' ) );
// Provide option to override sign up link.
$sign_up = get_option( 'wpforms_constant_contact_signup', false );
if ( $sign_up ) {
$this->sign_up = esc_html( $sign_up );
}
}
}
/**
* Process and submit entry to provider.
*
* @since 1.3.6
*
* @param array $fields List of fields with their data and settings.
* @param array $entry Submitted entry values.
* @param array $form_data Form data and settings.
* @param int $entry_id Saved entry ID.
*
* @return void
*/
public function process_entry( $fields, $entry, $form_data, $entry_id = 0 ) {
// Only run if this form has a connections for this provider.
if ( empty( $form_data['providers'][ $this->slug ] ) ) {
return;
}
/*
* Fire for each connection.
*/
foreach ( $form_data['providers'][ $this->slug ] as $connection ) :
// Before proceeding make sure required fields are configured.
if ( empty( $connection['fields']['email'] ) ) {
continue;
}
// Setup basic data.
$list_id = $connection['list_id'];
$account_id = $connection['account_id'];
$email_data = explode( '.', $connection['fields']['email'] );
$email_id = $email_data[0];
$email = $fields[ $email_id ]['value'];
$this->api_connect( $account_id );
// Email is required and Access token are required.
if ( empty( $email ) || empty( $this->access_token ) ) {
continue;
}
// Check for conditionals.
$pass = $this->process_conditionals( $fields, $entry, $form_data, $connection );
if ( ! $pass ) {
wpforms_log(
esc_html__( 'Constant Contact Subscription stopped by conditional logic', 'wpforms-lite' ),
$fields,
array(
'type' => array( 'provider', 'conditional_logic' ),
'parent' => $entry_id,
'form_id' => $form_data['id'],
)
);
continue;
}
// Check to see if the lead already exists in Constant Contact.
$response = wp_remote_get( 'https://api.constantcontact.com/v2/contacts?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&email=' . $email );
$contact = json_decode( wp_remote_retrieve_body( $response ), true );
// Return early if there was a problem.
if ( isset( $contact['error_key'] ) ) {
wpforms_log(
esc_html__( 'Constant Contact API Error', 'wpforms-lite' ),
$contact->get_error_message(),
array(
'type' => array( 'provider', 'error' ),
'parent' => $entry_id,
'form_id' => $form_data['id'],
)
);
continue;
}
/*
* Setup Merge Vars
*/
$merge_vars = array();
foreach ( $connection['fields'] as $name => $merge_var ) {
// Don't include Email or Full name fields.
if ( 'email' === $name ) {
continue;
}
// Check if merge var is mapped.
if ( empty( $merge_var ) ) {
continue;
}
$merge_var = explode( '.', $merge_var );
$id = $merge_var[0];
$key = ! empty( $merge_var[1] ) ? $merge_var[1] : 'value';
// Check if mapped form field has a value.
if ( empty( $fields[ $id ][ $key ] ) ) {
continue;
}
$value = $fields[ $id ][ $key ];
// Constant Contact doesn't native URL field so it has to be
// stored in a custom field.
if ( 'url' === $name ) {
$merge_vars['custom_fields'] = array(
array(
'name' => 'custom_field_1',
'value' => $value,
),
);
continue;
}
// Constant Contact stores name in two fields, so we have to
// separate it.
if ( 'full_name' === $name ) {
$names = explode( ' ', $value );
if ( ! empty( $names[0] ) ) {
$merge_vars['first_name'] = $names[0];
}
if ( ! empty( $names[1] ) ) {
$merge_vars['last_name'] = $names[1];
}
continue;
}
// Constant Contact stores address in multiple fields, so we
// have to separate it.
if ( 'address' === $name ) {
// Only support Address fields.
if ( 'address' !== $fields[ $id ]['type'] ) {
continue;
}
// Postal code may be in extended US format.
$postal = array(
'code' => '',
'subcode' => '',
);
if ( ! empty( $fields[ $id ]['postal'] ) ) {
$p = explode( '-', $fields[ $id ]['postal'] );
$postal['code'] = ! empty( $p[0] ) ? $p[0] : '';
$postal['subcode'] = ! empty( $p[1] ) ? $p[1] : '';
}
$merge_vars['addresses'] = array(
array(
'address_type' => 'BUSINESS',
'city' => ! empty( $fields[ $id ]['city'] ) ? $fields[ $id ]['city'] : '',
'country_code' => ! empty( $fields[ $id ]['country'] ) ? $fields[ $id ]['country'] : '',
'line1' => ! empty( $fields[ $id ]['address1'] ) ? $fields[ $id ]['address1'] : '',
'line2' => ! empty( $fields[ $id ]['address2'] ) ? $fields[ $id ]['address2'] : '',
'postal_code' => $postal['code'],
'state' => ! empty( $fields[ $id ]['state'] ) ? $fields[ $id ]['state'] : '',
'sub_postal_code' => $postal['subcode'],
),
);
continue;
}
$merge_vars[ $name ] = $value;
}
/*
* Process in API
*/
// If we have a previous contact, only update the list association.
if ( ! empty( $contact['results'] ) ) {
$data = $contact['results'][0];
// Check if they are already assigned to lists.
if ( ! empty( $data['lists'] ) ) {
foreach ( $data['lists'] as $list ) {
// If they are already assigned to this list, return early.
if ( isset( $list['id'] ) && $list_id == $list['id'] ) {
return;
}
}
// Otherwise, add them to the list.
$data['lists'][ count( $data['lists'] ) ] = array(
'id' => $list_id,
'status' => 'ACTIVE',
);
} else {
// Add the contact to the list.
$data['lists'][0] = array(
'id' => $list_id,
'status' => 'ACTIVE',
);
}
// Combine merge vars into data before sending.
$data = array_merge( $data, $merge_vars );
// Args to use.
$args = array(
'body' => wp_json_encode( $data ),
'method' => 'PUT',
'headers' => array(
'Content-Type' => 'application/json',
),
);
$update = wp_remote_request( 'https://api.constantcontact.com/v2/contacts/' . $data['id'] . '?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&action_by=ACTION_BY_VISITOR', $args );
$res = json_decode( wp_remote_retrieve_body( $update ), true );
} else {
// Add a new contact.
$data = array(
'email_addresses' => array( array( 'email_address' => $email ) ),
'lists' => array( array( 'id' => $list_id ) ),
);
// Combine merge vars into data before sending.
$data = array_merge( $data, $merge_vars );
// Args to use.
$args = array(
'body' => wp_json_encode( $data ),
'headers' => array(
'Content-Type' => 'application/json',
),
);
$add = wp_remote_post( 'https://api.constantcontact.com/v2/contacts?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&action_by=ACTION_BY_VISITOR', $args );
$res = json_decode( wp_remote_retrieve_body( $add ), true );
}
// Check for errors.
if ( isset( $res['error_key'] ) ) {
wpforms_log(
esc_html__( 'Constant Contact API Error', 'wpforms-lite' ),
$res->get_error_message(),
array(
'type' => array( 'provider', 'error' ),
'parent' => $entry_id,
'form_id' => $form_data['id'],
)
);
}
endforeach;
}
/************************************************************************
* API methods - these methods interact directly with the provider API. *
************************************************************************/
/**
* Authenticate with the API.
*
* @since 1.3.6
*
* @param array $data
* @param string $form_id
*
* @return mixed id or error object
*/
public function api_auth( $data = array(), $form_id = '' ) {
$id = uniqid();
$providers = wpforms_get_providers_options();
$providers[ $this->slug ][ $id ] = array(
'access_token' => sanitize_text_field( $data['authcode'] ),
'label' => sanitize_text_field( $data['label'] ),
'date' => time(),
);
update_option( 'wpforms_providers', $providers );
return $id;
}
/**
* Establish connection object to API.
*
* @since 1.3.6
*
* @param string $account_id
*
* @return mixed array or error object.
*/
public function api_connect( $account_id ) {
if ( ! empty( $this->api[ $account_id ] ) ) {
return $this->api[ $account_id ];
} else {
$providers = wpforms_get_providers_options();
if ( ! empty( $providers[ $this->slug ][ $account_id ] ) ) {
$this->api[ $account_id ] = true;
$this->access_token = $providers[ $this->slug ][ $account_id ]['access_token'];
} else {
return $this->error( 'API error' );
}
}
}
/**
* Retrieve provider account lists.
*
* @since 1.3.6
*
* @param string $connection_id
* @param string $account_id
*
* @return mixed array or error object
*/
public function api_lists( $connection_id = '', $account_id = '' ) {
$this->api_connect( $account_id );
$request = wp_remote_get( 'https://api.constantcontact.com/v2/lists?api_key=' . $this->api_key . '&access_token=' . $this->access_token );
$lists = json_decode( wp_remote_retrieve_body( $request ), true );
if ( empty( $lists ) ) {
wpforms_log(
esc_html__( 'Constant Contact API Error', 'wpforms-lite' ),
'',
array(
'type' => array( 'provider', 'error' ),
)
);
return $this->error( esc_html__( 'API list error: Constant API error', 'wpforms-lite' ) );
}
return $lists;
}
/**
* Retrieve provider account list fields.
*
* @since 1.3.6
*
* @param string $connection_id
* @param string $account_id
* @param string $list_id
*
* @return mixed array or error object
*/
public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) {
$provider_fields = array(
array(
'name' => 'Email',
'field_type' => 'email',
'req' => '1',
'tag' => 'email',
),
array(
'name' => 'Full Name',
'field_type' => 'name',
'tag' => 'full_name',
),
array(
'name' => 'First Name',
'field_type' => 'first',
'tag' => 'first_name',
),
array(
'name' => 'Last Name',
'field_type' => 'last',
'tag' => 'last_name',
),
array(
'name' => 'Phone',
'field_type' => 'text',
'tag' => 'work_phone',
),
array(
'name' => 'Website',
'field_type' => 'text',
'tag' => 'url',
),
array(
'name' => 'Address',
'field_type' => 'address',
'tag' => 'address',
),
array(
'name' => 'Job Title',
'field_type' => 'text',
'tag' => 'job_title',
),
array(
'name' => 'Company',
'field_type' => 'text',
'tag' => 'company_name',
),
);
return $provider_fields;
}
/*************************************************************************
* Output methods - these methods generally return HTML for the builder. *
*************************************************************************/
/**
* Provider account authorize fields HTML.
*
* @since 1.3.6
* @return string
*/
public function output_auth() {
$providers = wpforms_get_providers_options();
$class = ! empty( $providers[ $this->slug ] ) ? 'hidden' : '';
$output = '';
return $output;
}
/**
* Provider account list groups HTML.
*
* @since 1.3.6
*
* @param string $connection_id
* @param array $connection
*
* @return string
*/
public function output_groups( $connection_id = '', $connection = array() ) {
// No groups or segments for this provider.
return '';
}
/**
* Output content after the main builder output.
*
* @since 1.3.6
*/
public function builder_output_after() {
// Only display if Constant Contact account has not been setup.
$providers = wpforms_get_providers_options();
if ( ! empty( $providers[ $this->slug ] ) ) {
return;
}
?>
';
$output .= '';
$output .= esc_html__( 'Click here for documentation on connecting WPForms with Constant Contact.', 'wpforms-lite' );
$output .= ' ';
$output .= '';
$output .= '';
$output .= esc_html__( 'Because Constant Contact requires external authentication, you will need to register WPForms with Constant Contact before you can proceed.', 'wpforms-lite' );
$output .= '
';
$output .= '';
$output .= esc_html__( 'Click here to register with Constant Contact', 'wpforms-lite' );
$output .= '
';
$output .= sprintf( ' ', $this->name, esc_html__( 'Authorization Code', 'wpforms-lite' ) );
$output .= sprintf( ' ', $this->name, esc_html__( 'Account Nickname', 'wpforms-lite' ) );
echo $output;
}
/************************
* Other functionality. *
************************/
/**
* Add admin notices to connect to Constant Contact.
*
* @since 1.3.6
*/
public function connect_request() {
// Only consider showing the review request to admin users.
if ( ! is_super_admin() ) {
return;
}
// Don't display on WPForms admin content pages.
if ( ! empty( $_GET['wpforms-page'] ) ) {
return;
}
// Don't display if user is about to connect via Settings page.
if ( ! empty( $_GET['wpforms-integration'] ) && $this->slug === $_GET['wpforms-integration'] ) {
return;
}
// Only display the notice is the Constant Contact option is set and
// there are previous Constant Contact connections created.
$cc_notice = get_option( 'wpforms_constant_contact', false );
$providers = wpforms_get_providers_options();
if ( ! $cc_notice || ! empty( $providers[ $this->slug ] ) ) {
return;
}
// Output the notice message.
$connect = admin_url( 'admin.php?page=wpforms-settings&wpforms-integration=constant-contact#!wpforms-tab-providers' );
$learn_more = admin_url( 'admin.php?page=wpforms-page&wpforms-page=constant-contact' );
?>
$44 back for every $1 spent according to DMA.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
Email is still #1 - At least 91% of consumers check their email on a daily basis. You get direct access to your subscribers, without having to play by social media's rules and algorithms.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
You own your email list - Unlike with social media, your list is your property and no one can revoke your access to it.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
Email converts - People who buy products marketed through email spend 138% more than those who don't receive email offers.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
why building your email list is so important.', 'wpforms-lite' ),
array(
'a' => array(
'href' => array(),
'target' => array(),
'rel' => array(),
),
)
),
$more
);
?>