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/FluentCRM.php

339 lines
9.6 KiB
PHP

<?php
/**
* ET_Core_API_Email_FluentCRM class file.
*
* @class ET_Core_API_Email_FluentCRM
* @package ET\Core\API\Email
*/
// phpcs:disable Squiz.Commenting.VariableComment.MissingVar -- All the class level variables here inherit parent inline documentation. Please check ET_Core_API_Email_Provider or ET_Core_API_Service class.
// phpcs:disable Squiz.Commenting.FunctionComment.MissingParamTag -- Almost all the methods here inherit parent inline documentation. Please check ET_Core_API_Email_Provider or ET_Core_API_Service class.
/**
* Wrapper for FluentCRM's API.
*
* @since 4.9.1
*
* @package ET\Core\API\Email
*/
class ET_Core_API_Email_FluentCRM extends ET_Core_API_Email_Provider {
/**
* Warning message text if the required plugin doesn't exist.
*
* @var boolean
*/
public static $PLUGIN_REQUIRED; // phpcs:ignore ET.Sniffs.ValidVariableName.PropertyNotSnakeCase -- Widely used on all email provider classes.
/**
* {@inheritdoc}
*/
public $name = 'FluentCRM';
/**
* {@inheritdoc}
*/
public $slug = 'fluentcrm';
/**
* {@inheritdoc}
*/
public $custom_fields = 'predefined';
/**
* {@inheritdoc}
*/
public $custom_fields_scope = 'account';
/**
* ET_Core_API_Email_FluentCRM constructor.
*/
public function __construct( $owner = '', $account_name = '', $api_key = '' ) {
parent::__construct( $owner, $account_name, $api_key );
if ( null === self::$PLUGIN_REQUIRED ) { // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- Widely used on all email provider classes.
self::$PLUGIN_REQUIRED = esc_html__( 'FluentCRM plugin is either not installed or not activated.', 'et_core' ); // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- Widely used on all email provider classes.
}
}
/**
* {@inheritdoc}
*/
public function get_data_keymap( $keymap = array() ) {
$keymap = array(
'list' => array(
'list_id' => 'id',
'name' => 'title',
),
'subscriber' => array(
'email' => 'email',
'last_name' => 'last_name',
'name' => 'first_name',
'custom_fields' => 'custom_fields',
),
'custom_field' => array(
'field_id' => 'slug',
'name' => 'label',
'type' => 'type',
'hidden' => 'hidden',
'options' => 'options',
),
'custom_field_option' => array(
'id' => 'value',
'name' => 'value',
),
'custom_field_type' => array(
// Us <=> Them.
'radio' => 'radio',
'checkbox' => 'checkbox',
// Us => Them.
'input' => 'text',
'select' => 'select-one',
// Them => Us.
'text' => 'input',
'number' => 'input',
'date' => 'input',
'date_time' => 'input',
'select-one' => 'select',
'select-multi' => 'checkbox',
),
);
return parent::get_data_keymap( $keymap );
}
/**
* {@inheritdoc}
*
* FluentCRM is self hosted and all the fields can be managed on the plugin itself.
*/
protected function _fetch_custom_fields( $list_id = '', $list = array() ) {
static $processed = null;
if ( is_null( $processed ) ) {
// A. Default custom fields.
$processed = array(
'address_line_1' => array(
'field_id' => 'address_line_1',
'name' => __( 'Address Line 1', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'address_line_2' => array(
'field_id' => 'address_line_2',
'name' => __( 'Address Line 2', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'postal_code' => array(
'field_id' => 'postal_code',
'name' => __( 'Postal Code', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'city' => array(
'field_id' => 'city',
'name' => __( 'City', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'state' => array(
'field_id' => 'state',
'name' => __( 'State', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'country' => array(
'field_id' => 'country',
'name' => __( 'Country', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'phone' => array(
'field_id' => 'phone',
'name' => __( 'Phone', 'et_builder' ),
'type' => 'input',
'hidden' => false,
),
'status' => array(
'field_id' => 'status',
'name' => __( 'Enable Double Optin', 'et_builder' ),
'type' => 'input',
'required_mark' => 'off',
'default' => 'pending',
'hidden' => true,
),
);
// B. Contact custom fields.
$contact_custom_fields = fluentcrm_get_option( 'contact_custom_fields', array() );
if ( ! empty( $contact_custom_fields ) ) {
foreach ( $contact_custom_fields as $field ) {
// 1. Transform field data to fit our format.
$field = $this->transform_data_to_our_format( $field, 'custom_field' );
$field_id = $field['field_id'];
$type = $field['type'];
// 2. Transform field type to fit our supported field type.
$field['type'] = self::$_->array_get( $this->data_keys, "custom_field_type.{$type}", 'any' );
if ( 'select-multi' === $type ) {
$field['type_origin'] = $type;
}
// 3. Transform `options` data to fit our format (`id` => `name`).
if ( ! empty( $field['options'] ) ) {
$options = array();
foreach ( $field['options'] as $option ) {
$option = array( 'value' => $option );
$option = $this->transform_data_to_our_format( $option, 'custom_field_option' );
$options[ $option['id'] ] = $option['name'];
}
$field['options'] = $options;
}
$processed[ $field_id ] = $field;
}
}
}
return $processed;
}
/**
* {@inheritdoc}
*
* FluentCRM is self hosted and all the fields can be managed on the plugin itself.
*/
public function get_account_fields() {
return array();
}
/**
* {@inheritdoc}
*
* FluentCRM is self hosted and all the lists can be managed on the plugin itself.
*/
public function fetch_subscriber_lists() {
if ( ! defined( 'FLUENTCRM' ) ) {
return self::$PLUGIN_REQUIRED; // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- Widely used on all email provider classes.
}
$list_tags = array();
// Lists.
$lists = FluentCrmApi( 'lists' )->all();
foreach ( $lists as $list ) {
$list_tags[ 'list_' . $list->id ] = array(
'list_id' => 'list_' . $list->id,
'name' => 'List: ' . $list->title,
'subscribers_count' => 0,
);
}
// Tags.
$tags = FluentCrmApi( 'tags' )->all();
foreach ( $tags as $tag ) {
$list_tags[ 'tags_' . $tag->id ] = array(
'list_id' => 'tags_' . $tag->id,
'name' => 'Tag: ' . $tag->title,
'subscribers_count' => 0,
);
}
// Combine both of lists and tags because there is no other way to display both
// with different fields.
$this->data['lists'] = $list_tags;
$this->data['custom_fields'] = $this->_fetch_custom_fields( '', array() );
$this->data['is_authorized'] = true;
$this->save_data();
return 'success';
}
/**
* {@inheritdoc}
*/
protected function _process_custom_fields( $args ) {
if ( ! empty( $args['custom_fields'] ) ) {
$custom_fields = $args['custom_fields'];
foreach ( $custom_fields as $field_id => $field_value ) {
if ( $field_value ) {
$field_type = self::$_->array_get( $this->data['custom_fields'][ $field_id ], 'type' );
$field_type_origin = self::$_->array_get( $this->data['custom_fields'][ $field_id ], 'type_origin' );
// Transform `checkbox` value into string separated by comma i.e. 'val1,val2'.
// However, if the field type origin is `select-multi`, we have to use array
// values instead.
if ( 'checkbox' === $field_type ) {
$field_value = 'select-multi' === $field_type_origin ? array_values( $field_value ) : implode( ',', $field_value );
}
$args[ $field_id ] = $field_value;
}
}
if ( isset( $custom_fields['status'] ) ) {
$args['status'] = 'pending';
}
unset( $args['custom_fields'] );
}
return $args;
}
/**
* {@inheritdoc}
*/
public function subscribe( $args, $url = '' ) {
if ( ! defined( 'FLUENTCRM' ) ) {
ET_Core_Logger::error( self::$PLUGIN_REQUIRED ); // phpcs:ignore ET.Sniffs.ValidVariableName.UsedPropertyNotSnakeCase -- Widely used on all email provider classes.
return esc_html__( 'An error occurred. Please try again later.', 'et_core' );
}
$contact = $this->transform_data_to_provider_format( $args, 'subscriber' );
$contact = $this->_process_custom_fields( $contact );
// IP Address.
$ip_address = 'true' === self::$_->array_get( $args, 'ip_address', 'true' ) ? et_core_get_ip_address() : '';
$contact['ip_address'] = $ip_address;
// Name.
if ( empty( $contact['last_name'] ) ) {
$contact['full_name'] = $contact['first_name'];
unset( $contact['first_name'] );
unset( $contact['last_name'] );
}
// List or Tag.
$list_or_tag_id = $args['list_id'];
if ( false === strpos( $list_or_tag_id, 'tags_' ) ) {
$contact['lists'] = array( intval( str_replace( 'list_', '', $list_or_tag_id ) ) );
} else {
$contact['tags'] = array( intval( str_replace( 'tags_', '', $list_or_tag_id ) ) );
}
$contact = array_filter( $contact );
// Email.
if ( empty( $contact['email'] ) || ! is_email( $contact['email'] ) ) {
return esc_html__( 'Email Validation has been failed.', 'et_core' );
}
FluentCrmApi( 'contacts' )->createOrUpdate( $contact );
return 'success';
}
}