144 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.1 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;
 | |
| 
 | |
| use Joomla\CMS\Language\Text;
 | |
| 
 | |
| class MailerLite 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);
 | |
| 		$this->setEndpoint('https://connect.mailerlite.com/api');
 | |
| 		$this->options->set('headers.Authorization', 'Bearer ' . $this->key);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Subscribes a user to a MailerLite Account
 | |
| 	 *
 | |
| 	 *  API Reference v3:
 | |
| 	 *  https://developers.mailerlite.com/docs/subscribers.html#create-upsert-subscriber
 | |
| 	 *
 | |
| 	 *  @param   string   $email     		  The user's email
 | |
| 	 *  @param   array    $fields    		  All the custom fields
 | |
| 	 *  @param   string   $groupIds  		  The Group IDs
 | |
| 	 *  @param   string   $subscriber_status  The subscriber status (active, unsubscribed, unconfirmed, bounced, junk)
 | |
| 	 *  @param   boolean  $update_existing    Whether to update the existing contact (Only in v3)
 | |
| 	 *
 | |
| 	 *  @return  boolean
 | |
| 	 */
 | |
| 	public function subscribe($email, $fields, $groupIds = [], $subscriber_status = '', $update_existing = true)
 | |
| 	{
 | |
| 		// Abort if we don't want to update existing subscribers and the subscriber already exists
 | |
| 		if (!$update_existing && $this->subscriberExists($email))
 | |
| 		{
 | |
| 			throw new \Exception(Text::_('NR_YOU_ARE_ALREADY_A_SUBSCRIBER'), 1);
 | |
| 		}
 | |
| 		
 | |
| 		$data = [
 | |
| 			'email'  => $email,
 | |
| 			'fields' => $fields
 | |
| 		];
 | |
| 
 | |
| 		if ($subscriber_status)
 | |
| 		{
 | |
| 			$data['status'] = $subscriber_status;
 | |
| 		}
 | |
| 
 | |
| 		if ($groupIds)
 | |
| 		{
 | |
| 			$data['groups'] = $groupIds;
 | |
| 		}
 | |
| 
 | |
| 		$this->post('subscribers', $data);
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if a subscriber exists
 | |
| 	 * 
 | |
| 	 * @param   string   $email  The subscriber's email
 | |
| 	 * 
 | |
| 	 * @return  boolean
 | |
| 	 */
 | |
| 	private function subscriberExists($email = '')
 | |
| 	{
 | |
| 		if (!$email)
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$response = $this->get('subscribers/' . $email);
 | |
| 
 | |
| 		return isset($response['data']['email']) && $response['data']['email'] == $email;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Returns all groups
 | |
| 	 *
 | |
| 	 *  API Reference v3:
 | |
| 	 *  https://developers.mailerlite.com/docs/groups.html#list-all-groups
 | |
| 	 *
 | |
| 	 *  @return  array
 | |
| 	 */
 | |
| 	public function getGroups()
 | |
| 	{
 | |
| 		$data = [
 | |
| 			'offset' => 0,
 | |
| 			'limit' => 50
 | |
| 		];
 | |
| 
 | |
| 		$lists = [];
 | |
| 
 | |
| 		$data = $this->get('groups', $data);
 | |
| 
 | |
| 		// sanity check
 | |
| 		if (!isset($data['data']) || !is_array($data['data']))
 | |
| 		{
 | |
| 			return $lists;
 | |
| 		}
 | |
| 
 | |
| 		foreach ($data['data'] as $key => $list)
 | |
| 		{
 | |
| 			$lists[] = [
 | |
| 				'id'   => $list['id'],
 | |
| 				'name' => $list['name']
 | |
| 			];
 | |
| 		}
 | |
| 
 | |
| 		return $lists;
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 *  Get the last error returned by either the network transport, or by the API.
 | |
| 	 *
 | |
| 	 *  API Reference:
 | |
| 	 *  https://developers.mailerlite.com/docs/#validation-errors
 | |
| 	 *
 | |
| 	 *  @return  string
 | |
| 	 */
 | |
| 	public function getLastError()
 | |
| 	{
 | |
| 		$body    = $this->last_response->body;
 | |
| 
 | |
| 		return isset($body['message']) ? $body['message'] : 'An error has occurred.';
 | |
| 	}
 | |
| } |