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/HubSpot.php
2021-12-07 11:08:05 +00:00

274 lines
6.3 KiB
PHP

<?php
/**
* Wrapper for HubSpot's API.
*
* @since 3.0.72
*
* @package ET\Core\API\Email
*/
class ET_Core_API_Email_HubSpot extends ET_Core_API_Email_Provider {
/**
* @inheritDoc
*/
public $BASE_URL = 'https://api.hubapi.com/contacts/v1';
/**
* @inheritDoc
*/
public $FIELDS_URL = 'https://api.hubapi.com/properties/v1/contacts/properties';
/**
* @inheritDoc
*/
public $LISTS_URL = 'https://api.hubapi.com/contacts/v1/lists/static';
/**
* @inheritDoc
*/
public $SUBSCRIBE_URL = 'https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/@email@';
/**
* @inheritDoc
*/
public $custom_fields_scope = 'account';
/**
* @inheritDoc
*/
public $name = 'HubSpot';
/**
* @inheritDoc
*/
public $slug = 'hubspot';
protected function _fetch_custom_fields( $list_id = '', $list = array() ) {
$this->response_data_key = false;
$fields_unprocessed = parent::_fetch_custom_fields( $list_id, $list );
$fields = array();
foreach ( $fields_unprocessed as $field ) {
$field_id = $field['field_id'];
if ( ! isset( $field['options'] ) ) {
$fields[ $field_id ] = $field;
continue;
}
$options = array();
foreach ( $field['options'] as $option ) {
$option = $this->transform_data_to_our_format( $option, 'custom_field_option' );
$id = $option['id'];
$options[ $id ] = $option['name'];
}
$field['options'] = $options;
$fields[ $field_id ] = $field;
}
return $fields;
}
protected function _get_list_add_contact_url( $list_id ) {
$url = "{$this->BASE_URL}/lists/{$list_id}/add";
return add_query_arg( 'hapikey', $this->data['api_key'], $url );
}
protected function _maybe_set_urls( $email = '' ) {
if ( empty( $this->data['api_key'] ) ) {
return;
}
$this->FIELDS_URL = add_query_arg( 'hapikey', $this->data['api_key'], $this->FIELDS_URL );
$this->LISTS_URL = add_query_arg( 'hapikey', $this->data['api_key'], $this->LISTS_URL );
$this->SUBSCRIBE_URL = add_query_arg( 'hapikey', $this->data['api_key'], $this->SUBSCRIBE_URL );
if ( $email ) {
$this->SUBSCRIBE_URL = str_replace( '@email@', rawurlencode( $email ), $this->SUBSCRIBE_URL );
}
}
protected function _process_custom_fields( $args ) {
$args['properties'] = array();
if ( ! isset( $args['custom_fields'] ) ) {
return $args;
}
$fields = $args['custom_fields'];
$properties = array();
unset( $args['custom_fields'] );
$field_types = array(
'radio',
'booleancheckbox',
);
foreach ( $fields as $field_id => $value ) {
if ( is_array( $value ) && $value ) {
// This is a multiple choice field (eg. checkbox, radio, select)
$value = array_values( $value );
$value = implode( ';', $value );
} elseif ( in_array( $this->data['custom_fields'][ $field_id ]['type'], $field_types, true ) ) {
// Should use array key. Sometimes it's different than value and Hubspot expects the key
$radio_options = $this->data['custom_fields'][ $field_id ]['options'];
$value = array_search( $value, $radio_options );
}
$properties[] = array(
'property' => $field_id,
'value' => $value,
);
}
$args['properties'] = $properties;
return $args;
}
/**
* @inheritDoc
*/
public function get_account_fields() {
return array(
'api_key' => array(
'label' => esc_html__( 'API Key', 'et_core' ),
),
);
}
/**
* @inheritDoc
*/
public function get_data_keymap( $keymap = array() ) {
$keymap = array(
'list' => array(
'list_id' => 'listId',
'name' => 'name',
'subscribers_count' => 'metaData.size',
),
'subscriber' => array(
'email' => 'email',
'name' => 'firstname',
'last_name' => 'lastname',
'custom_fields' => 'custom_fields',
),
'error' => array(
'error_message' => 'message',
),
'custom_field' => array(
'field_id' => 'name',
'name' => 'label',
'type' => 'fieldType',
'options' => 'options',
'hidden' => 'hidden',
),
'custom_field_option' => array(
'id' => 'value',
'name' => 'label',
),
'custom_field_type' => array(
// Us <=> Them
'select' => 'select',
'radio' => 'radio',
'checkbox' => 'checkbox',
// Us => Them
'input' => 'text',
'textarea' => 'text',
// Them => Us
'text' => 'input',
'booleancheckbox' => 'booleancheckbox',
),
);
return parent::get_data_keymap( $keymap );
}
/**
* @inheritDoc
*/
public function fetch_subscriber_lists() {
if ( empty( $this->data['api_key'] ) ) {
return $this->API_KEY_REQUIRED;
}
$this->_maybe_set_urls();
/**
* The maximum number of subscriber lists to request from Hubspot's API at a time.
*
* @since 3.0.75
*
* @param int $max_lists Value must be <= 250.
*/
$max_lists = (int) apply_filters( 'et_core_api_email_hubspot_max_lists', 250 );
$this->LISTS_URL = add_query_arg( 'count', $max_lists, $this->LISTS_URL );
$this->response_data_key = 'lists';
return parent::fetch_subscriber_lists();
}
/**
* @inheritDoc
*/
public function subscribe( $args, $url = '' ) {
if ( empty( $this->data['api_key'] ) ) {
return $this->API_KEY_REQUIRED;
}
$this->_maybe_set_urls( $args['email'] );
$args = $this->_process_custom_fields( $args );
$data = array(
'properties' => array(
array(
'property' => 'email',
'value' => et_core_sanitized_previously( $args['email'] ),
),
array(
'property' => 'firstname',
'value' => et_core_sanitized_previously( $args['name'] ),
),
array(
'property' => 'lastname',
'value' => et_core_sanitized_previously( $args['last_name'] ),
),
),
);
$data['properties'] = array_merge( $data['properties'], $args['properties'] );
$this->prepare_request( $this->SUBSCRIBE_URL, 'POST', false, $data, true );
$this->make_remote_request();
if ( $this->response->ERROR ) {
return $this->get_error_message();
}
$url = $this->_get_list_add_contact_url( $args['list_id'] );
$data = array(
'emails' => array( $args['email'] ),
);
$this->prepare_request( $url, 'POST', false, $data, true );
$this->make_remote_request();
if ( $this->response->ERROR ) {
return $this->get_error_message();
}
return 'success';
}
}