169 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			3.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 Zoho extends Integration
 | |
| {
 | |
| 	/**
 | |
| 	 * Create a new instance
 | |
| 	 *
 | |
| 	 * @param array $options The service's required options
 | |
| 	 * @throws \Exception
 | |
| 	 */
 | |
| 	public function __construct($options)
 | |
| 	{
 | |
| 		parent::__construct();
 | |
| 		$this->setKey($options['api']);
 | |
| 		$this->endpoint = 'https://campaigns.zoho.com/api';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Subscribe user to ZoHo
 | |
| 	 *
 | |
| 	 *  https://www.zoho.com/campaigns/help/api/contact-subscribe.html
 | |
| 	 *
 | |
| 	 *  @param   string   $email         	  User's email address
 | |
| 	 *  @param   string   $list          	  The ZoHo list unique ID
 | |
| 	 *  @param   Object   $customFields  	  Collection of custom fields
 | |
| 	 *
 | |
| 	 *  @return  void
 | |
| 	 */
 | |
| 	public function subscribe($email, $list, $customFields = array())
 | |
| 	{
 | |
| 
 | |
| 		$contactinfo = json_encode(array_merge(array("Contact Email" => $email), $customFields));
 | |
| 
 | |
| 		$data = array(
 | |
| 			"authtoken" => $this->key,
 | |
| 			"scope" => "CampaignsAPI",
 | |
| 			"version" => "1",
 | |
| 			"resfmt" => "JSON",
 | |
| 			"listkey" => $list,
 | |
| 			"contactinfo" => $contactinfo
 | |
| 		);
 | |
| 
 | |
| 		$this->get('json/listsubscribe', $data);
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Returns all available ZoHo lists
 | |
| 	 *
 | |
| 	 *  https://www.zoho.com/campaigns/help/api/get-mailing-lists.html
 | |
| 	 *
 | |
| 	 *  @return  array
 | |
| 	 */
 | |
| 	public function getLists()
 | |
| 	{
 | |
| 		if (!$this->key)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$data = array(
 | |
| 			'authtoken' => $this->key,
 | |
| 			'scope'     => 'CampaignsAPI',
 | |
| 			'sort'      => 'asc',
 | |
| 			'resfmt'    => 'JSON',
 | |
| 			'range'     => '1000' //ambiguously large range of total results to overwrite the default range which is 20
 | |
| 		);
 | |
| 
 | |
| 		$data = $this->get("getmailinglists", $data);
 | |
| 
 | |
| 		if (!$this->success())
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$lists = array();
 | |
| 
 | |
| 		if (!isset($data["list_of_details"]) || !is_array($data["list_of_details"]))
 | |
| 		{
 | |
| 			return $lists;
 | |
| 		}
 | |
| 
 | |
| 		foreach ($data["list_of_details"] as $key => $list)
 | |
| 		{
 | |
| 			$lists[] = array(
 | |
| 				"id"   => $list["listkey"],
 | |
| 				"name" => $list["listname"]
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		return $lists;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Get the last error returned by either the network transport, or by the API.
 | |
| 	 *
 | |
| 	 *  @return  string
 | |
| 	 */
 | |
| 	public function getLastError()
 | |
| 	{
 | |
| 		$body = $this->last_response->body;
 | |
| 
 | |
| 		if (isset($body['message']))
 | |
| 		{
 | |
| 			return $body['message'];
 | |
| 		}
 | |
| 
 | |
| 		return 'An unspecified error occured';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if the response was successful or a failure. If it failed, store the error.
 | |
| 	 * 
 | |
| 	 * @return bool     If the request was successful
 | |
| 	 */
 | |
| 	protected function determineSuccess()
 | |
| 	{
 | |
| 		$status = $this->findHTTPStatus();
 | |
| 
 | |
| 		// check if the status is equal to the arbitrary success codes of ZoHo
 | |
| 		if (in_array($status, array(0, 200, 6101, 6201)))
 | |
| 		{
 | |
| 			return ($this->request_successful = true);
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Find the HTTP status code from the headers or API response body
 | |
| 	 * 
 | |
| 	 * @return int  HTTP status code
 | |
| 	 */
 | |
| 	protected function findHTTPStatus()
 | |
| 	{
 | |
| 		$status  = $this->last_response->code;
 | |
| 		$success = ($status >= 200 && $status <= 299) ? true : false;
 | |
| 
 | |
| 		if (!$success)
 | |
| 		{
 | |
| 			return 418;
 | |
| 		}
 | |
| 
 | |
| 		// ZoHo sometimes uses "Code" instead of "code"
 | |
| 		// also they don't use HTTP status codes
 | |
| 		// instead they store their own status code inside the response body
 | |
| 		$data = array_change_key_case($this->last_response->body);
 | |
| 		
 | |
| 		if (isset($data['code']))
 | |
| 		{
 | |
| 			return (int) $data['code'];
 | |
| 		}
 | |
| 
 | |
| 		return 418;
 | |
| 	}
 | |
| } |