| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- <?php
- /**
- * Helper class for connecting to third party services.
- *
- * @since 1.5.4
- */
- final class FLBuilderServices {
- /**
- * Data for working with each supported third party service.
- *
- * @since 1.5.4
- * @access private
- * @var array $services_data
- */
- static private $services_data = array(
- 'activecampaign' => array(
- 'type' => 'autoresponder',
- 'name' => 'ActiveCampaign',
- 'class' => 'FLBuilderServiceActiveCampaign',
- ),
- 'aweber' => array(
- 'type' => 'autoresponder',
- 'name' => 'AWeber',
- 'class' => 'FLBuilderServiceAWeber',
- ),
- 'campaign-monitor' => array(
- 'type' => 'autoresponder',
- 'name' => 'Campaign Monitor',
- 'class' => 'FLBuilderServiceCampaignMonitor',
- ),
- 'campayn' => array(
- 'type' => 'autoresponder',
- 'name' => 'Campayn',
- 'class' => 'FLBuilderServiceCampayn',
- ),
- 'constant-contact' => array(
- 'type' => 'autoresponder',
- 'name' => 'Constant Contact',
- 'class' => 'FLBuilderServiceConstantContact',
- ),
- 'convertkit' => array(
- 'type' => 'autoresponder',
- 'name' => 'ConvertKit',
- 'class' => 'FLBuilderServiceConvertKit',
- ),
- 'drip' => array(
- 'type' => 'autoresponder',
- 'name' => 'Drip',
- 'class' => 'FLBuilderServiceDrip',
- ),
- 'email-address' => array(
- 'type' => 'autoresponder',
- 'name' => 'Email Address',
- 'class' => 'FLBuilderServiceEmailAddress',
- ),
- 'enormail' => array(
- 'type' => 'autoresponder',
- 'name' => 'Enormail',
- 'class' => 'FLBuilderServiceEnormail',
- ),
- 'getresponse' => array(
- 'type' => 'autoresponder',
- 'name' => 'GetResponse',
- 'class' => 'FLBuilderServiceGetResponse',
- ),
- 'godaddy-email-marketing' => array(
- 'type' => 'autoresponder',
- 'name' => 'GoDaddy Email Marketing',
- 'class' => 'FLBuilderServiceGoDaddyEmailMarketing',
- ),
- 'hatchbuck' => array(
- 'type' => 'autoresponder',
- 'name' => 'Hatchbuck',
- 'class' => 'FLBuilderServiceHatchbuck',
- ),
- 'icontact' => array(
- 'type' => 'autoresponder',
- 'name' => 'iContact',
- 'class' => 'FLBuilderServiceIContact',
- ),
- 'icontact-pro' => array(
- 'type' => 'autoresponder',
- 'name' => 'iContact Pro',
- 'class' => 'FLBuilderServiceIContactPro',
- ),
- 'infusionsoft' => array(
- 'type' => 'autoresponder',
- 'name' => 'Infusionsoft',
- 'class' => 'FLBuilderServiceInfusionsoft',
- ),
- 'madmimi' => array(
- 'type' => 'autoresponder',
- 'name' => 'Mad Mimi',
- 'class' => 'FLBuilderServiceMadMimi',
- ),
- 'mailchimp' => array(
- 'type' => 'autoresponder',
- 'name' => 'MailChimp',
- 'class' => 'FLBuilderServiceMailChimp',
- ),
- 'mailerlite' => array(
- 'type' => 'autoresponder',
- 'name' => 'MailerLite',
- 'class' => 'FLBuilderServiceMailerLite',
- ),
- 'mailpoet' => array(
- 'type' => 'autoresponder',
- 'name' => 'MailPoet',
- 'class' => 'FLBuilderServiceMailPoet',
- ),
- 'mailrelay' => array(
- 'type' => 'autoresponder',
- 'name' => 'Mailrelay',
- 'class' => 'FLBuilderServiceMailrelay',
- ),
- 'mautic' => array(
- 'type' => 'autoresponder',
- 'name' => 'Mautic',
- 'class' => 'FLBuilderServiceMautic',
- ),
- 'ontraport' => array(
- 'type' => 'autoresponder',
- 'name' => 'Ontraport',
- 'class' => 'FLBuilderServiceOntraport',
- 'namespace' => true,
- ),
- 'sendinblue' => array(
- 'type' => 'autoresponder',
- 'name' => 'SendinBlue',
- 'class' => 'FLBuilderServiceSendinBlue',
- ),
- 'sendy' => array(
- 'type' => 'autoresponder',
- 'name' => 'Sendy',
- 'class' => 'FLBuilderServiceSendy',
- 'namespace' => true,
- ),
- );
- /**
- * Get an array of services data of a certain type such as "autoresponder".
- * If no type is specified, all services will be returned.
- *
- * @since 1.5.4
- * @param string $type The type of service data to return.
- * @return array An array of services and related data.
- */
- static public function get_services_data( $type = null ) {
- $services = array();
- // Return all services.
- if ( ! $type ) {
- $services = self::$services_data;
- } else {
- foreach ( self::$services_data as $key => $service ) {
- if ( $service['type'] == $type ) {
- $services[ $key ] = $service;
- }
- }
- }
- // Remove services that use namespaces if we're not on a supported PHP version.
- foreach ( $services as $key => $service ) {
- if ( isset( $service['namespace'] ) && ! version_compare( phpversion(), '5.3', '>=' ) ) {
- unset( $services[ $key ] );
- }
- }
- // Remove services that don't meet the requirements.
- if ( isset( $services['mailpoet'] )
- && ! class_exists( 'WYSIJA' )
- && ( ! defined( 'MAILPOET_INITIALIZED' ) || ( defined( 'MAILPOET_INITIALIZED' ) && false === MAILPOET_INITIALIZED ) )
- ) {
- unset( $services['mailpoet'] );
- }
- return $services;
- }
- /**
- * Get an instance of a service helper class.
- *
- * @since 1.5.4
- * @param string $type The type of service.
- * @return object
- */
- static public function get_service_instance( $service ) {
- $services = self::get_services_data();
- $data = $services[ $service ];
- // Make sure the base class is loaded.
- if ( ! class_exists( 'FLBuilderService' ) ) {
- require_once FL_BUILDER_DIR . 'classes/class-fl-builder-service.php';
- }
- // Make sure the service class is loaded.
- if ( ! class_exists( $data['class'] ) ) {
- require_once FL_BUILDER_DIR . 'classes/class-fl-builder-service-' . $service . '.php';
- }
- return new $data['class']();
- }
- /**
- * Save the API connection of a service and retrieve account settings markup.
- *
- * Called via the connect_service frontend AJAX action.
- *
- * @since 1.5.4
- * @return array The response array.
- */
- static public function connect_service() {
- $saved_services = FLBuilderModel::get_services();
- $post_data = FLBuilderModel::get_post_data();
- $response = array(
- 'error' => false,
- 'html' => '',
- );
- // Validate the service data.
- if ( ! isset( $post_data['service'] ) || empty( $post_data['service'] ) ) {
- $response['error'] = _x( 'Error: Missing service type.', 'Third party service such as MailChimp.', 'fl-builder' );
- } elseif ( ! isset( $post_data['fields'] ) || 0 === count( $post_data['fields'] ) ) {
- $response['error'] = _x( 'Error: Missing service data.', 'Connection data such as an API key.', 'fl-builder' );
- } elseif ( ! isset( $post_data['fields']['service_account'] ) || empty( $post_data['fields']['service_account'] ) ) {
- $response['error'] = _x( 'Error: Missing account name.', 'Account name for a third party service such as MailChimp.', 'fl-builder' );
- }
- // Get the service data.
- $service = $post_data['service'];
- $service_account = $post_data['fields']['service_account'];
- // Does this account already exist?
- if ( isset( $saved_services[ $service ][ $service_account ] ) ) {
- $response['error'] = _x( 'Error: An account with that name already exists.', 'Account name for a third party service such as MailChimp.', 'fl-builder' );
- }
- // Try to connect to the service.
- if ( ! $response['error'] ) {
- $instance = self::get_service_instance( $service );
- $connection = $instance->connect( $post_data['fields'] );
- if ( $connection['error'] ) {
- $response['error'] = $connection['error'];
- } else {
- FLBuilderModel::update_services(
- $service,
- $service_account,
- $connection['data']
- );
- $response['html'] = self::render_account_settings( $service, $service_account );
- }
- }
- // Return the response.
- return $response;
- }
- /**
- * Render the connection settings or account settings for a service.
- *
- * Called via the render_service_settings frontend AJAX action.
- *
- * @since 1.5.4
- * @return array The response array.
- */
- static public function render_settings() {
- $post_data = FLBuilderModel::get_post_data();
- $saved_services = FLBuilderModel::get_services();
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
- $settings = $module->settings;
- $service = $post_data['service'];
- $response = array(
- 'error' => false,
- 'html' => '',
- );
- // Render the settings to connect a new account.
- if ( isset( $post_data['add_new'] ) || ! isset( $saved_services[ $service ] ) ) {
- $response['html'] = self::render_connect_settings( $service );
- } else {
- $account = isset( $settings->service_account ) ? $settings->service_account : '';
- $response['html'] = self::render_account_settings( $service, $account );
- }
- // Return the response.
- return $response;
- }
- /**
- * Render the settings to connect to a new account.
- *
- * @since 1.5.4
- * @return string The settings markup.
- */
- static public function render_connect_settings( $service ) {
- ob_start();
- FLBuilder::render_settings_field( 'service_account', array(
- 'row_class' => 'fl-builder-service-connect-row',
- 'class' => 'fl-builder-service-connect-input',
- 'type' => 'text',
- 'label' => __( 'Account Name', 'fl-builder' ),
- 'help' => __( 'Used to identify this connection within the accounts list and can be anything you like.', 'fl-builder' ),
- 'preview' => array(
- 'type' => 'none',
- ),
- ));
- $instance = self::get_service_instance( $service );
- echo $instance->render_connect_settings();
- FLBuilder::render_settings_field( 'service_connect_button', array(
- 'row_class' => 'fl-builder-service-connect-row',
- 'class' => 'fl-builder-service-connect-button',
- 'type' => 'button',
- 'label' => __( 'Connect', 'fl-builder' ),
- ));
- return ob_get_clean();
- }
- /**
- * Render the account settings for a saved connection.
- *
- * @since 1.5.4
- * @param string $service The service id such as "mailchimp".
- * @param string $active The name of the active account, if any.
- * @return string The account settings markup.
- */
- static public function render_account_settings( $service, $active = '' ) {
- ob_start();
- $saved_services = FLBuilderModel::get_services();
- $settings = new stdClass();
- $settings->service_account = $active;
- $options = array(
- '' => __( 'Choose...', 'fl-builder' ),
- );
- // Build the account select options.
- foreach ( $saved_services[ $service ] as $account => $data ) {
- $options[ $account ] = $account;
- }
- $options['add_new_account'] = __( 'Add Account...', 'fl-builder' );
- // Render the account select.
- FLBuilder::render_settings_field( 'service_account', array(
- 'row_class' => 'fl-builder-service-account-row',
- 'class' => 'fl-builder-service-account-select',
- 'type' => 'select',
- 'label' => __( 'Account', 'fl-builder' ),
- 'options' => $options,
- 'preview' => array(
- 'type' => 'none',
- ),
- ), $settings);
- // Render additional service fields if we have a saved account.
- if ( ! empty( $active ) && isset( $saved_services[ $service ][ $active ] ) ) {
- $post_data = FLBuilderModel::get_post_data();
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
- $instance = self::get_service_instance( $service );
- $response = $instance->render_fields( $active, $module->settings );
- if ( ! $response['error'] ) {
- echo $response['html'];
- }
- }
- return ob_get_clean();
- }
- /**
- * Render the markup for service specific fields.
- *
- * Called via the render_service_fields frontend AJAX action.
- *
- * @since 1.5.4
- * @return array The response array.
- */
- static public function render_fields() {
- $post_data = FLBuilderModel::get_post_data();
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
- $instance = self::get_service_instance( $post_data['service'] );
- $response = $instance->render_fields( $post_data['account'], $module->settings );
- return $response;
- }
- /**
- * Delete a saved account from the database.
- *
- * Called via the delete_service_account frontend AJAX action.
- *
- * @since 1.5.4
- * @return void
- */
- static public function delete_account() {
- $post_data = FLBuilderModel::get_post_data();
- if ( ! isset( $post_data['service'] ) || ! isset( $post_data['account'] ) ) {
- return;
- }
- FLBuilderModel::delete_service_account( $post_data['service'], $post_data['account'] );
- }
- }
|