209 lines
4.4 KiB
PHP
209 lines
4.4 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 IContact extends Integration
|
|
{
|
|
public $accountID;
|
|
|
|
public $clientFolderID;
|
|
|
|
/**
|
|
* Create a new instance
|
|
* @param array $options The service's required options
|
|
*/
|
|
public function __construct($options)
|
|
{
|
|
parent::__construct();
|
|
$this->endpoint = 'https://app.icontact.com/icp/a';
|
|
$this->options->set('headers.API-Version', '2.2');
|
|
$this->options->set('headers.API-AppId', $options['appID']);
|
|
$this->options->set('headers.API-Username', $options['username']);
|
|
$this->options->set('headers.API-Password', $options['appPassword']);
|
|
$this->setAccountID($options['accountID']);
|
|
$this->setClientFolderID($options['clientFolderID']);
|
|
}
|
|
|
|
/**
|
|
* Finds and sets the iContact AccountID
|
|
*
|
|
* @param mixed $accountID
|
|
*/
|
|
public function setAccountID($accountID = false)
|
|
{
|
|
if ($accountID)
|
|
{
|
|
$this->accountID = $accountID;
|
|
}
|
|
|
|
$accounts = $this->get('');
|
|
|
|
if (!$this->success())
|
|
{
|
|
throw new \Exception($this->getLastError());
|
|
}
|
|
|
|
// Make sure the account is active
|
|
if (intval($accounts['accounts'][0]['enabled']) === 1)
|
|
{
|
|
$this->accountID = (integer) $accounts['accounts'][0]['accountId'];
|
|
}
|
|
else
|
|
{
|
|
throw new \Exception(Text::_('NR_ICONTACT_ACCOUNTID_ERROR'), 1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Finds and sets the iContact ClientFolderID
|
|
*
|
|
* @param mixed $clientFolderID
|
|
*/
|
|
public function setClientFolderID($clientFolderID = false)
|
|
{
|
|
if ($clientFolderID)
|
|
{
|
|
$this->clientFolderID = $clientFolderID;
|
|
}
|
|
|
|
// We need an existant accountID
|
|
if (empty($this->accountID))
|
|
{
|
|
try
|
|
{
|
|
$this->setAccountID();
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
if ($clientFolder = $this->get($this->accountID . '/c/'))
|
|
{
|
|
$this->clientFolderID = $clientFolder['clientfolders'][0]['clientFolderId'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Subscribes a user to an iContact List
|
|
*
|
|
* API REFERENCE
|
|
* https://www.icontact.com/developerportal/documentation/contacts
|
|
*
|
|
* @param string $email
|
|
* @param object $params The extra form fields
|
|
* @param mixed $list The iContact List ID
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function subscribe($email, $params, $list)
|
|
{
|
|
$data = array('contact' => array_merge(array('email' => $email, 'status' => 'normal'), (array) $params));
|
|
|
|
try
|
|
{
|
|
$contact = $this->post($this->accountID .'/c/' . $this->clientFolderID . '/contacts', $data);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw $e;
|
|
}
|
|
|
|
if ((isset($contact['contacts'])) && (is_array($contact['contacts'])) && (count($contact['contacts']) > 0))
|
|
{
|
|
$this->addToList($list, $contact['contacts'][0]['contactId']);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Adds a contact to an iContact List
|
|
*
|
|
* API REFERENCE
|
|
* https://www.icontact.com/developerportal/documentation/subscriptions
|
|
*
|
|
* @param string $listID
|
|
* @param string $contactID
|
|
*/
|
|
public function addToList($listID, $contactID)
|
|
{
|
|
$data = array(
|
|
array(
|
|
'contactId' => $contactID,
|
|
'listId' => $listID,
|
|
'status' => 'normal'
|
|
)
|
|
);
|
|
$this->post($this->accountID .'/c/' . $this->clientFolderID . '/subscriptions',$data);
|
|
}
|
|
|
|
/**
|
|
* Returns all Client lists
|
|
*
|
|
* API REFERENCE
|
|
* https://www.icontact.com/developerportal/documentation/lists
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getLists()
|
|
{
|
|
$data = $this->get($this->accountID .'/c/' . $this->clientFolderID . '/lists');
|
|
|
|
if (!$this->success())
|
|
{
|
|
return;
|
|
}
|
|
|
|
$lists = array();
|
|
|
|
if (!isset($data["lists"]) || !is_array($data["lists"]))
|
|
{
|
|
return $lists;
|
|
}
|
|
|
|
foreach ($data["lists"] as $key => $list)
|
|
{
|
|
$lists[] = array(
|
|
'id' => $list['listId'],
|
|
'name' => $list['name']
|
|
);
|
|
}
|
|
|
|
return $lists;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
$message = '';
|
|
|
|
if (isset($body['errors']))
|
|
{
|
|
foreach ($body['errors'] as $error) {
|
|
$message .= $error . ' ';
|
|
}
|
|
}
|
|
|
|
return trim($message);
|
|
}
|
|
} |