297 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * @author          Tassos Marinos <info@tassos.gr>
 | |
|  * @link            https://www.tassos.gr
 | |
|  * @copyright       Copyright © 2024 Tassos All Rights Reserved
 | |
|  * @license         GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
 | |
|  */
 | |
| 
 | |
| namespace NRFramework\Integrations;
 | |
| 
 | |
| // No direct access
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| class GetResponse extends Integration
 | |
| {
 | |
| 	/**
 | |
| 	 * Create a new instance
 | |
| 	 * 
 | |
| 	 * @param array $options The service's required options
 | |
| 	 */
 | |
| 	public function __construct($options)
 | |
| 	{
 | |
| 		parent::__construct();
 | |
| 		$this->setKey($options);
 | |
| 		$this->endpoint = 'https://api.getresponse.com/v3';
 | |
| 		$this->options->set('headers.X-Auth-Token', 'api-key ' . $this->key);
 | |
| 		$this->options->set('headers.Accept-Encoding', 'gzip,deflate');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Subscribe user to GetResponse Campaign
 | |
| 	 *
 | |
| 	 *  https://apidocs.getresponse.com/v3/resources/contacts#contacts.create
 | |
| 	 *
 | |
| 	 *  TODO: Update existing contact
 | |
| 	 *
 | |
| 	 *  @param   string   $email        	  Email of the Contact
 | |
| 	 *  @param   string   $name    			  The name of the Contact
 | |
| 	 *  @param   int	  $dayOfCycle		  Enter 0 to add to the start day of the cycle.
 | |
| 	 *  @param   object   $campaign  		  Campaign ID
 | |
| 	 *  @param   object   $customFields  	  Collection of custom fields
 | |
| 	 *  @param   object   $update_existing    Update existing contact
 | |
| 	 *  @param   array    $tags			      Set user tags
 | |
| 	 * 	@param 	 string	  $tags_replace		  Determines what changes to make to the subscriber's tags. Values: add_only, replace_all
 | |
| 	 *
 | |
| 	 *  @return  void
 | |
| 	 */
 | |
| 	public function subscribe($email, $name, $campaign, $customFields, $update_existing, $dayOfCycle = 0, $tags = [], $tags_replace = 'add_only')
 | |
| 	{
 | |
| 		$data = [
 | |
| 			'email' 			=> $email,
 | |
| 			'name'				=> $name,
 | |
| 			'dayOfCycle'		=> $dayOfCycle,
 | |
| 			'campaign' 			=> ['campaignId' => $campaign],
 | |
| 			'customFieldValues'	=> $this->validateCustomFields($customFields),
 | |
| 			'ipAddress' 		=> \NRFramework\User::getIP()
 | |
| 		];
 | |
| 
 | |
| 		if (empty($name) || is_null($name))
 | |
| 		{
 | |
| 			unset($data['name']);
 | |
| 		}
 | |
| 
 | |
| 		$contactId = null;
 | |
| 		$service_tags = [];
 | |
| 
 | |
| 		if ($tags)
 | |
| 		{
 | |
| 			$service_tags = $this->getServiceTags();
 | |
| 		}
 | |
| 
 | |
| 		// Replace all existing contact tags with new ones
 | |
| 		if ($tags && $tags_replace === 'replace_all')
 | |
| 		{
 | |
| 			$data['tags'] = $this->validateTags($tags, $service_tags, $tags_replace);
 | |
| 		}
 | |
| 
 | |
| 		if ($update_existing) 
 | |
| 		{
 | |
| 			$contactId = $this->getContact($email);
 | |
| 		}
 | |
| 
 | |
| 		$endpoint = 'contacts';
 | |
| 		$endpoint = !empty($contactId) ? $endpoint . '/' . $contactId : $endpoint;
 | |
| 
 | |
| 		$this->post($endpoint, $data);
 | |
| 
 | |
| 		// Add new tags to the contact
 | |
| 		if ($tags && $tags_replace === 'add_only' && $contactId)
 | |
| 		{
 | |
| 			$data = ['tags' => $this->validateTags($tags, $service_tags, $tags_replace)];
 | |
| 
 | |
| 			$this->post('contacts/' . $contactId . '/tags', $data);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Return all service tags.
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	private function getServiceTags()
 | |
| 	{
 | |
| 		$tags = [];
 | |
| 
 | |
| 		foreach ($this->get('tags') as $tag)
 | |
| 		{
 | |
| 			$tags[$tag['tagId']] = $tag['name'];
 | |
| 		}
 | |
| 
 | |
| 		return $tags;
 | |
| 	}
 | |
| 	
 | |
| 	/**
 | |
| 	 * Validates and returns the valid tags.
 | |
| 	 * 
 | |
| 	 * @param   array  $tags
 | |
| 	 * @param   array  $service_tags
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	private function validateTags($tags = [], $service_tags = [], $tags_replace = 'add_only')
 | |
| 	{
 | |
| 		$final_tags = [];
 | |
| 
 | |
| 		foreach ($tags as $index => $tag)
 | |
| 		{
 | |
| 			$valid = false;
 | |
| 			
 | |
| 			// Find tag in service tags and add it to final tags list
 | |
| 			foreach ($service_tags as $tagId => $tagName)
 | |
| 			{
 | |
| 				if ($tagId === $tag || $tagName === $tag)
 | |
| 				{
 | |
| 					$valid = true;
 | |
| 
 | |
| 					// Add to final list
 | |
| 					$final_tags[] = [
 | |
| 						'tagId' => $tagId
 | |
| 					];
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			// Add invalid tags
 | |
| 			if (!$valid && $tags_replace == 'add_only')
 | |
| 			{
 | |
| 				$new_tag = $this->createTag($tag);
 | |
| 				$final_tags[] = [
 | |
| 					'tagId' => $new_tag['tagId']
 | |
| 				];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $final_tags;
 | |
| 	}
 | |
| 
 | |
| 	private function createTag($tag)
 | |
| 	{
 | |
| 		$data = [
 | |
| 			'name' => $tag
 | |
| 		];
 | |
| 		
 | |
| 		return $this->post('tags', $data);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Returns a new array with valid only custom fields
 | |
| 	 *
 | |
| 	 *  @param   array  $customFields   Array of custom fields
 | |
| 	 *
 | |
| 	 *  @return  array  Array of valid only custom fields
 | |
| 	 */
 | |
| 	public function validateCustomFields($customFields)
 | |
| 	{
 | |
| 		$fields = [];
 | |
| 	
 | |
| 		if (!is_array($customFields))
 | |
| 		{
 | |
| 			return $fields;
 | |
| 		}
 | |
| 
 | |
| 		$accountCustomFields = $this->get('custom-fields');
 | |
| 
 | |
| 		if (!$this->request_successful)
 | |
| 		{
 | |
| 			return $fields;
 | |
| 		}
 | |
| 
 | |
| 		foreach ($accountCustomFields as $key => $customField)
 | |
| 		{
 | |
| 			if (!isset($customFields[$customField['name']]))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 				
 | |
| 			$fields[] = [
 | |
| 				'customFieldId' => $customField['customFieldId'],
 | |
| 				'value'			=> [$customFields[$customField['name']]]
 | |
| 			];
 | |
| 		}
 | |
| 
 | |
| 		return $fields;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get the last error returned by either the network transport, or by the API.
 | |
| 	 * If something didn't work, this should contain the string describing the problem.
 | |
| 	 * 
 | |
| 	 * @return  string  describing the error
 | |
| 	 */
 | |
| 	public function getLastError()
 | |
| 	{
 | |
| 		$body = $this->last_response->body;
 | |
| 		
 | |
| 		if (!isset($body['context']) || !isset($body['context'][0]))
 | |
| 		{
 | |
| 			return $body['codeDescription'] . ' - ' . $body['message'];
 | |
| 		}
 | |
| 
 | |
| 		$error = $body['context'][0];
 | |
| 
 | |
| 		// GetResponse returns a JSON string as $error and we try to decode it so we can return a more human-friendly error message
 | |
| 		$error = is_string($error) && json_encode($error, true) ? json_decode($error, true) : $error;
 | |
| 
 | |
| 		if (is_array($error) && isset($error['fieldName'])) 
 | |
| 		{
 | |
| 			$errorFieldName = is_array($error['fieldName']) ? implode(' ', $error['fieldName']) : $error['fieldName'];
 | |
| 			return $errorFieldName . ': ' . $error['message'];
 | |
| 		}
 | |
| 		
 | |
| 		return (is_array($error)) ? implode(' ', $error) : $error;
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Returns all available GetResponse campaigns
 | |
| 	 *
 | |
| 	 *  https://apidocs.getresponse.com/v3/resources/campaigns#campaigns.get.all
 | |
| 	 *
 | |
| 	 *  @return  array
 | |
| 	 */
 | |
| 	public function getLists()
 | |
| 	{
 | |
| 		$data = $this->get('campaigns');
 | |
| 
 | |
| 		if (!$this->success())
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if (!is_array($data) || !count($data))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$lists = [];
 | |
| 
 | |
| 		foreach ($data as $key => $list)
 | |
| 		{
 | |
| 			$lists[] = [
 | |
| 				'id'   => $list['campaignId'],
 | |
| 				'name' => $list['name']
 | |
| 			];
 | |
| 		}
 | |
| 
 | |
| 		return $lists;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Get the Contact resource
 | |
| 	 *
 | |
| 	 *  @param   string  $email  The email of the contact which we want to retrieve
 | |
| 	 *
 | |
| 	 *  @return  string          The Contact ID
 | |
| 	 */
 | |
| 	public function getContact($email)
 | |
| 	{
 | |
| 		if (!isset($email)) 
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$data = $this->get('contacts', ['query[email]' => $email]);
 | |
| 
 | |
| 		if (empty($data)) 
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// the returned data is an array with only one contact
 | |
| 		$contactId = $data[0]['contactId'];
 | |
| 
 | |
| 		return ($contactId) ? $contactId : null;
 | |
| 		
 | |
| 	}
 | |
| } |