<?php
/**
* @name iContactApi
* @package iContact
* @author iContact <www.icontact.com>
* @description This class is a wrapper for the iContact API.
* It makes integrating iContact into your app as simple as
* calling a method.
* @version 2.0
* */
if (!class_exists('iContactApi'))
{
class iContactApi
{
//////////////////////////////////////////////////////////////////////////////
/// Properties //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
protected static $oInstance = null; // This holds the instance of this class
protected $iAccountId = null; // This holds the account ID
protected $iClientFolderId = null; // This holds the client folder ID
protected $aConfig = array(); // This is our array for pragmatically overriding configuration constants
protected $aErrors = array(); // This holds the errors encountered with the iContact API
protected $sLastRequest = null; // This holds the last request JSON
protected $sLastResponse = null; // This holds the last response JSON
protected $sRequestUri = null; // This stores the last used URL
protected $bSandbox = false; // This tells the system whether or not to use the iContact Sandbox or not
protected $aSearchParameters = array(); // This is our container for search params
protected $iTotal = 0; // If the results return a total, it will be stored here
protected $aWarnings = array(); // This holds the warnings encountered with the iContact API
//////////////////////////////////////////////////////////////////////////////
/// Singleton ///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This sets the singleton pattern instance
* @static
* @access public
* @param iContactApi $oInstance Instance to set to
* @return iContactApi $this
* */
public static function setInstance($oInstance)
{
self::$oInstance = $oInstance;
// Return instance of class
return self::$oInstance;
}
/**
* This gets the singleton instance
* @static
* @access public
* @return iContactApi $this
* */
public static function getInstance()
{
// Check to see if an instance has already
// been created
if (is_null(self::$oInstance))
{
// If not, return a new instance
self::$oInstance = new self();
return self::$oInstance;
}
else
{
// If so, return the previously created
// instance
return self::$oInstance;
}
}
/**
* This resets the singleton instance to null
* @static
* @access public
* @return void
* */
public static function resetInstance()
{
// Reset the instance
self::$oInstance = null;
}
//////////////////////////////////////////////////////////////////////////////
/// Constructor /////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This is our constuctor and simply checks for
* defined constants and configuration values and
* then builds the configuration from that
* @access protected
* @return iContactApi $this
* */
protected function __construct()
{
// Check for constants
$aConstantMap = array(
// 'ICONTACT_APIVERSION',
// 'ICONTACT_APISANDBOXURL',
'ICONTACT_APPID' => 'appId',
// 'ICONTACT_APIURL',
'ICONTACT_APIUSERNAME' => 'apiUsername',
'ICONTACT_APIPASSWORD' => 'apiPassword'
);
// Loop through the map
foreach ($aConstantMap as $sConstant => $sConfigKey)
{
// Check for the defined constant
if (defined($sConstant))
{
// Set the configuration key to the contant's value
$this->aConfig[$sConfigKey] = constant($sConstant);
}
}
// Return instance
return $this;
}
//////////////////////////////////////////////////////////////////////////////
/// Public //////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This method adds a contact to your iContact account
* @access public
* @param string $sEmail
* @param string [$sStatus]
* @param string [$sPrefix]
* @param string [$sFirstName]
* @param string [$sLastName]
* @param string [$sSuffix]
* @param string [$sStreet]
* @param string [$sStreet2]
* @param string [$sCity]
* @param string [$sState]
* @param string [$sPostalCode]
* @param string [$sPhone]
* @param string [$sFax]
* @param string [$sBusiness]
*
* @return object
* */
public function addContact($sEmail, $sStatus = 'normal', $sPrefix = null, $sFirstName = null, $sLastName = null, $sSuffix = null, $sStreet = null, $sStreet2 = null, $sCity = null, $sState = null, $sPostalCode = null, $sPhone = null, $sFax = null, $sBusiness = null)
{
// Valid statuses
$aValidStatuses = array('normal', 'bounced', 'donotcontact', 'pending', 'invitable', 'deleted');
// Contact placeholder
$aContact = array(
'email' => $sEmail
);
// Check for a prefix
if (!empty($sPrefix))
{
// Add the new prefix
$aContact['prefix'] = (string) $sPrefix;
}
// Check for a first name
if (!empty($sFirstName))
{
// Add the new first name
$aContact['firstName'] = (string) $sFirstName;
}
// Check for a last name
if (!empty($sLastName))
{
// Add the new last name
$aContact['lastName'] = (string) $sLastName;
}
// Check for a suffix
if (!empty($sSuffix))
{
// Add the new suffix
$aContact['suffix'] = (string) $sSuffix;
}
// Check for a street
if (!empty($sStreet))
{
// Add the new street
$aContact['street'] = (string) $sStreet;
}
// Check for a street2
if (!empty($sStreet2))
{
// Add the new street 2
$aContact['street2'] = (string) $sStreet2;
}
// Check for a city
if (!empty($sCity))
{
// Add the new city
$aContact['city'] = (string) $sCity;
}
// Check for a state
if (!empty($sState))
{
// Add the new state
$aContact['state'] = (string) $sState;
}
// Check for a postal code
if (!empty($sPostalCode))
{
// Add the new postal code
$aContact['postalCode'] = (string) $sPostalCode;
}
// Check for a phone number
if (!empty($sPhone))
{
// Add the new phone number
$aContact['phone'] = (string) $sPhone;
}
// Check for a fax number
if (!empty($sFax))
{
// Add the new fax number
$aContact['fax'] = (string) $sFax;
}
// Check for a business name
if (!empty($sBusiness))
{
// Add the new business
$aContact['business'] = (string) $sBusiness;
}
// Check for a valid status
if (!empty($sStatus) && in_array($sStatus, $aValidStatuses))
{
// Add the new status
$aContact['status'] = $sStatus;
}
else
{
$aContact['status'] = 'normal';
}
// Make the call
$aContacts = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/contacts", 'POST', array($aContact), 'contacts');
// Return the contact
return $aContacts[0];
}
/**
* This method adds a custom field or "term"
* to the array of search parameters
* @access public
* @param string $sName
* @param string $sValue
* @return iContactApi $this
* */
public function addCustomQueryField($sName, $sValue)
{
// Add the field
$this->aSearchParameters[$sName] = (string) $sValue;
// Return instance
return $this;
}
/**
* This message adds a list to your iContact account
* @access public
* @param string $sName
* @param integer $iWelcomeMessageId
* @param bool [$bEmailOwnerOnChange]
* @param bool [$bWelcomeOnManualAdd]
* @param bool [$bWelcomeOnSignupAdd]
* @param string [$sDescription]
* @param string [$sPublicName]
* @return object
* */
public function addList($sName, $iWelcomeMessageId, $bEmailOwnerOnChange = true, $bWelcomeOnManualAdd = false, $bWelcomeOnSignupAdd = false, $sDescription = null, $sPublicName = null)
{
// Setup the list
$aList = array(
'name' => $sName,
'welcomeMessageId' => $iWelcomeMessageId,
'emailOwnerOnChange' => intval($bEmailOwnerOnChange),
'welcomeOnManualAdd' => intval($bWelcomeOnManualAdd),
'welcomeOnSignupAdd' => intval($bWelcomeOnSignupAdd),
'description' => $sDescription,
'publicname' => $sPublicName
);
// Make the call
$aLists = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/lists", 'POST', array($aList), 'lists');
// Return the list
return $aLists[0];
}
/**
* This method adds a message to
* your iContact API account
* @access public
* @param string $sSubject
* @param integer $iCampaignId
* @param string [$sHtmlBody]
* @param string [$sTextBody]
* @param string [$sMessageName]
* @param integer [$iListId]
* @param string [$sMessageType]
* @return object
* */
public function addMessage($sSubject, $iCampaignId, $sHtmlBody = null, $sTextBody = null, $sMessageName = null, $iListId = null, $sMessageType = 'normal')
{
// Valid message types
$aValidMessageTypes = array('normal', 'autoresponder', 'welcome', 'confirmation');
// Setup the message data
$aMessage = array(
'campaignId' => $iCampaignId,
'htmlBody' => $sHtmlBody,
'messageName' => $sMessageName,
'messageType' => (in_array($sMessageType, $aValidMessageTypes) ? $sMessageType : 'normal'),
'subject' => $sSubject,
'textBody' => $sTextBody
);
// Add the message
$aNewMessage = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/messages", 'POST', array($aMessage), 'messages');
// Return the message data
return $aNewMessage[0];
}
/**
* This method adds a field to the order by
* key in the search parameters array
* @access public
* @param string $sField
* @param string [$sDirection]
* @return iContactApi $this
* */
public function addOrderBy($sField, $sDirection = null)
{
// Check for existing order by parameters
if (empty($this->aSearchParameters['orderby']))
{
// Check for a direction
if (empty($sDirection))
{
// Add just the field
$this->aSearchParameters['orderby'] = (string) $sField;
}
else
{
// Add the field and direction
$this->aSearchParameters['orderby'] = (string) "{$sField}:{$sDirection}";
}
}
else
{
// Check for a direction
if (empty($sDirection))
{
// Append just the field
$this->aSearchParameters['orderby'] .= (string) ",{$sField}";
}
else
{
// Append the field and direction
$this->aSearchParameters['orderby'] .= (string) ",{$sField}:{$sDirection}";
}
}
// Return failure
return false;
}
/**
* This method handles the deleting of a single list
* @access public
* @param integer $iListId
* @return bool
* */
public function deleteList($iListId)
{
// Delete the list
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/lists/{$iListId}", 'delete');
}
/**
* This method handles the handshaking between this app and the iContact API
* @access public
* @param string $sResource
* @param string $sMethod
* @param string $sReturnKey
* @param mixed $mPostData Array, object, or string
* @return array|object
* */
public function makeCall($sResource, $sMethod = 'GET', $mPostData = null, $sReturnKey = null)
{
// List of needed constants
$aRequiredConfigs = array('apiPassword', 'apiUsername', 'appId');
// First off check for definitions
foreach ($aRequiredConfigs as $sKey)
{
// Is it defined
if (empty($this->aConfig[$sKey]))
{
// Set an error
$this->addError("{$sKey} is undefined.");
}
}
// Set the URI that we will be calling
$sApiUrl = (string) "{$this->getUrl()}{$sResource}";
// Initialize the cURL handle
$rHandle = curl_init();
// Give our handle headers
curl_setopt($rHandle, CURLOPT_HTTPHEADER, $this->getHeaders());
// Tell our handle that we
// want the data returned
curl_setopt($rHandle, CURLOPT_RETURNTRANSFER, true);
// Turn SSL verifcation off, so scripts do not get broken
curl_setopt($rHandle, CURLOPT_SSL_VERIFYPEER, false);
// Determine the request
// method we are using
switch (strtoupper($sMethod))
{
// Deleting data
case 'DELETE' :
// Set the cURL custom header
curl_setopt($rHandle, CURLOPT_CUSTOMREQUEST, 'DELETE');
break;
// Recieving data
case 'GET' :
// Check for a query string
if (!empty($this->aSearchParameters))
{
// Add the query string
$sApiUrl .= (string) '?' . http_build_query($this->aSearchParameters);
}
break;
// Sending data
case 'POST' :
// Check for POST data
if (empty($mPostData))
{
// Add an error, for there is no
// POST data to send to the API
$this->addError('No POST data was provided.');
}
else
{
// Tell our handle that
// we want to send data
curl_setopt($rHandle, CURLOPT_POST, true);
// Give our handle the data
curl_setopt($rHandle, CURLOPT_POSTFIELDS, json_encode($mPostData));
// Set the request JSON
$this->sLastRequest = (string) json_encode($mPostData);
}
break;
// Uploading data
case 'PUT' :
if (empty($mPostData))
{
// Is there data?
$this->addError('No file or data specified for PUT request');
}
elseif (!is_string($mPostData) || !file_exists($mPostData))
{
// Not a file, so we assume this is just data
curl_setopt($rHandle, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($rHandle, CURLOPT_POSTFIELDS, $mPostData);
}
else
{
$rFileContentHandle = fopen($mPostData, 'r');
if ($rFileContentHandle === false)
{
$this->addError('A non-existant file was specified for POST data, or the file could not be opened.');
}
else
{
// Found a file, so upload its contents
curl_setopt($rHandle, CURLOPT_PUT, true);
curl_setopt($rHandle, CURLOPT_INFILE, $rFileContentHandle);
}
}
break;
}
// Store the URL into the instance
$this->sRequestUri = (string) $sApiUrl;
// Give our handle a URL
curl_setopt($rHandle, CURLOPT_URL, $sApiUrl);
// Try to execute the handle
if (!$sResponse = curl_exec($rHandle))
{
// Add an error, for we could
// not even execute the handle
$this->addError('We were unable to execute the cURL handle.');
}
// Set the response JSON
$this->sLastResponse = (string) $sResponse;
// Try to decode the response
if ((!$aResponse = json_decode($sResponse)) && (strtoupper($sMethod) != 'DELETE'))
{
// Add an error, for the API
// did not return valid JSON
$this->addError('The iContact API did not return valid JSON.');
}
// Close the cURL handle
curl_close($rHandle);
// Check for errors from the API
if (!empty($aResponse->errors))
{
// Loop through the errors
foreach ($aResponse->errors as $sError)
{
// Add the error
$this->addError($sError, 1);
}
}
// Check for warnings from the API
if (!empty($aResponse->warnings))
{
// Loop through the warnings
foreach ($aResponse->warnings as $sWarning)
{
// Add the warning
$this->addWarning($sWarning);
}
}
// Check for set errors
if (!empty($this->aErrors))
{
// Throw a new exception
throw new Exception('Errors have occurred and the system cannot continue. Use getErrors() for details.');
}
// Check for a total
if (!empty($aResponse->total))
{
// Store the total records
// into the current instsnce
$this->iTotal = (integer) $aResponse->total;
}
// Return the response
if (strtoupper($sMethod) == 'DELETE')
{
// Return success
return true;
}
elseif (empty($sReturnKey))
{
// Return the entire
// base response
return $aResponse;
}
else
{
// Return the narrowed resposne
return $aResponse->$sReturnKey;
}
}
/**
* This method sends a message
* @access public
* @param string $sIncludeListId
* @param integer $iMessageId
* @param string [$sExcludeListIds]
* @param string [$sExcludeSegmentIds]
* @param string [$sIncludeSegmentIds]
* @param string [$sScheduledTime]
* @return object
* */
public function sendMessage($sIncludeListIds, $iMessageId, $sExcludeListIds = null, $sExcludeSegmentIds = null, $sIncludeSegmentIds = null, $sScheduledTime = null)
{
// Send the message
$aSends = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/sends", 'POST', array(
array(
'excludeListIds' => $sExcludeListIds,
'excludeSegmentIds' => $sExcludeSegmentIds,
'includeListIds' => $sIncludeListIds,
'includeSegmentIds' => $sIncludeSegmentIds,
'scheduledTime' => (empty($sScheduledTime) ? null : date('c', strtotime($sScheduledTime)))
)
), 'sends');
// Return the send
return $aSends;
}
/**
* This method subscribes a contact to a list
* @access public
* @param integer $iContactId
* @param integer $iListId
* @param string $sStatus
* @return object
* */
public function subscribeContactToList($iContactId, $iListId, $sStatus = 'normal')
{
// Valid statuses
$aValidStatuses = array('normal', 'pending', 'unsubscribed');
// Setup the subscription and make the call
$aSubscriptions = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/subscriptions", 'POST', array(
array(
'contactId' => $iContactId,
'listId' => $iListId,
'status' => $sStatus
)
), 'subscriptions');
// Return the subscription
return $aSubscriptions;
}
/**
* This method updates a contact in your iContact account
* @access public
* @param integer $iContactId
* @param string $sEmail
* @param string $sPrefix
* @param string $sFirstName
* @param string $sLastName
* @param string $sSuffix
* @param string $sStreet
* @param string $sStreet2
* @param string $sCity
* @param string $sState
* @param string $sPostalCode
* @param string $sPhone
* @param string $sFax
* @param string $sBusiness
* @param string $sStatus
* @return bool|object
* */
public function updateContact($iContactId, $sEmail = null, $sPrefix = null, $sFirstName = null, $sLastName = null, $sSuffix = null, $sStreet = null, $sStreet2 = null, $sCity = null, $sState = null, $sPostalCode = null, $sPhone = null, $sFax = null, $sBusiness = null, $sStatus = null)
{
// Valid statuses
$aValidStatuses = array('normal', 'bounced', 'donotcontact', 'pending', 'invitable', 'deleted');
// Contact placeholder
$aContact = array();
// Check for an email address
if (!empty($sEmail))
{
// Add the new email
$aContact['email'] = (string) $sEmail;
}
// Check for a prefix
if (!empty($sPrefix))
{
// Add the new prefix
$aContact['prefix'] = (string) $sPrefix;
}
// Check for a first name
if (!empty($sFirstName))
{
// Add the new first name
$aContact['firstName'] = (string) $sFirstName;
}
// Check for a last name
if (!empty($sLastName))
{
// Add the new last name
$aContact['lastName'] = (string) $sLastName;
}
// Check for a suffix
if (!empty($sSuffix))
{
// Add the new suffix
$aContact['suffix'] = (string) $sSuffix;
}
// Check for a street
if (!empty($sStreet))
{
// Add the new street
$aContact['street'] = (string) $sStreet;
}
// Check for a street2
if (!empty($sStreet2))
{
// Add the new street 2
$aContact['street2'] = (string) $sStreet2;
}
// Check for a city
if (!empty($sCity))
{
// Add the new city
$aContact['city'] = (string) $sCity;
}
// Check for a state
if (!empty($sState))
{
// Add the new state
$aContact['state'] = (string) $sState;
}
// Check for a postal code
if (!empty($sPostalCode))
{
// Add the new postal code
$aContact['postalCode'] = (string) $sPostalCode;
}
// Check for a phone number
if (!empty($sPhone))
{
// Add the new phone number
$aContact['phone'] = (string) $sPhone;
}
// Check for a fax number
if (!empty($sFax))
{
// Add the new fax number
$aContact['fax'] = (string) $sFax;
}
// Check for a business name
if (!empty($sBusiness))
{
// Add the new business
$aContact['business'] = (string) $sBusiness;
}
// Check for a valid status
if (!empty($sStatus) && in_array($sStatus, $aValidStatuses))
{
// Add the new status
$aContact['status'] = $sStatus;
}
// Make sure the contact isn't empty
if (!empty($aContact))
{
// Make the call
$oContact = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/contacts/{$iContactId}", 'POST', array($aContact), 'contact');
// Return the contact
return $oContact;
}
// Inevitably return failure
return false;
}
/**
* This method uploads a CSV file to the iContact API
* @access public
* @param string $sFile
* @param integer [$iListId]
* @param integer [$iUploadId]
* @return string|bool
* */
public function uploadData($sFile, $iListId = null, $iUploadId = null)
{
// Check for an upload ID
if (empty($iUploadId))
{
// Make the call
$aUploads = $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/uploads", 'POST', array(
array(
'action' => 'add',
'listIds' => $iListId
)
), 'uploads');
// Store the uploadID
$iUploadId = $aUploads[0]->uploadId;
}
// Upload the data
if ($this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/uploads/{$iUploadId}/data", 'PUT', $sFile, 'uploadId'))
{
// Loop until the upload is complete
while (true)
{
// Grab the upload
$aUpload = $this->getUpload($iUploadId);
// Check to see if the upload
// has finished uploading
if ($aUpload->status != 'receiving')
{
// Return the upload
return $this->makeCall("/a/{$this->setAccountId()}/c{$this->setClientFolderId()}/uploads/{$iUploadId}/data", 'GET');
}
}
}
// Return failure
return false;
}
/**
* This message updates a list on your iContact account
* @access public
* @param string $sName
* @param integer $iListId
* @param string $sName
* @param integer $iWelcomeMessageId
* @param bool [$bEmailOwnerOnChange]
* @param bool [$bWelcomeOnManualAdd]
* @param bool [$bWelcomeOnSignupAdd]
* @param string [$sDescription]
* @param string [$sPublicName]
* @return object
* */
public function updateList($iListId, $sName, $iWelcomeMessageId, $bEmailOwnerOnChange = true, $bWelcomeOnManualAdd = false, $bWelcomeOnSignupAdd = false, $sDescription = null, $sPublicName = null)
{
// Setup the list
$aList = array(
'name' => $sName,
'welcomeMessageId' => $iWelcomeMessageId,
'emailOwnerOnChange' => intval($bEmailOwnerOnChange),
'welcomeOnManualAdd' => intval($bWelcomeOnManualAdd),
'welcomeOnSignupAdd' => intval($bWelcomeOnSignupAdd),
'description' => $sDescription,
'publicname' => $sPublicName
);
// Return the list
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/lists/{$iListId}", 'POST', $aList, 'list');
;
}
/**
* This method tells the system whether
* or not to use the sandbox or not, the
* sandbox is turned off by defualt and
* by default this method turns it on
* @access public
* @param bool [$bUse]
* @return iContactApi $this
* */
public function useSandbox($bUse = true)
{
// Set the sandbox status
$this->bSandbox = (bool) $bUse;
// Return instance
return $this;
}
//////////////////////////////////////////////////////////////////////////////
/// PROTECTED ///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This method appends an error to the list
* of errors encountered with the iContact API
* @access protected
* @param string $sText
* @param integer [$iCode]
* @return iContactApi $this
* */
protected function addError($sText)
{
// Append the error
array_push($this->aErrors, $sText);
// Return instance
return $this;
}
/**
* This method appends a warning to the list
* of warnings encountered with the iContact API
* @access protected
* @param string $sText
* @return iContactApi $this
* */
public function addWarning($sText)
{
// Append the warning
array_push($this->aWarnings, $sText);
// Return instance
return $this;
}
//////////////////////////////////////////////////////////////////////////////
/// Getters /////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This method grabs the campaigns associated
* your iContact account
* @access public
* @return object
* */
public function getCampaigns()
{
// Make the call and return the data
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/campaigns", 'GET');
}
/**
* This method grabs a single contact
* from your iContact Account
* @access public
* @param integer $iContactId
* @return object
* */
public function getContact($iContactId)
{
// Make the call and return the data
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/contacts/{$iContactId}", 'GET', null, 'contact');
}
/**
* This method grabs the contacts associated
* with you iContact API account
* @access public
* @return array
* */
public function getContacts()
{
// Make the call and return the data
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/contacts", 'GET');
}
/**
* This method returns any set
* errors in the current instance
* @access public
* @return array|bool
* */
public function getErrors()
{
// Check for errors
if (empty($this->aErrors))
{
// Return false, for
// there are no errors
return false;
}
else
{
// Return the errors
return $this->aErrors;
}
}
/**
* This method builds the header array
* for making calls to the API
* @access public
* @return array
* */
public function getHeaders()
{
// Return the headers
return array(
'Except:',
'Accept: application/json',
'Content-type: application/json',
'Api-Version: ' . (defined('ICONTACT_APIVERSION') ? constant('ICONTACT_APIVERSION') : '2.2'),
'Api-AppId: ' . (!empty($this->aConfig['appId']) ? $this->aConfig['appId'] : constant('ICONTACT_APPID')),
'Api-Username: ' . (!empty($this->aConfig['apiUsername']) ? $this->aConfig['apiUsername'] : constant('ICONTACT_APIUSERNAME')),
'Api-Password: ' . (!empty($this->aConfig['apiPassword']) ? $this->aConfig['apiPassword'] : constant('ICONTACT_APIPASSWORD'))
);
}
/**
* This method returns the last
* API POST request JSON
* @access public
* @param bool [$bDecode]
* @return string|object
* */
public function getLastRequest($bDecode = false)
{
// Check to see if we need
// to decode the raw JSON
if ($bDecode === true)
{
// Return the decoded JSON
return json_decode($this->sLastRequest);
}
// Return the raw JSON
return $this->sLastRequest;
}
/**
* This method returns the last
* API response JSON
* @access public
* @param bool [$bDecode]
* @return string|object
* */
public function getLastResponse($bDecode = false)
{
// Check to see if we need
// to decode the raw JSON
if ($bDecode === true)
{
// Return the decoded JSON
return json_decode($this->sLastResponse);
}
// Return the raw JSON
return $this->sLastResponse;
}
/**
* This method grabs a list of lists
* that are associated with you iContact
* API account
* @access public
* @return array
* */
public function getLists()
{
// Make the call and return the lists
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/lists", 'GET', null, 'lists');
}
/**
* This method lists the opens of a
* single message based on the messageID
* @access public
* @param integer iMessageId
* @return integer
* */
public function getMessageOpens($iMessageId)
{
// Make the call and return the data
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/messages/{$iMessageId}/opens", 'GET', null, 'total');
}
public function getMessages($sType = null)
{
// Check for a message type
if (!empty($sType))
{
$this->addCustomQueryField('messageType', $sType);
}
// Return the messages
return $this->makeCall("/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}/messages", 'GET', null, 'messages');
}
/**
* This method returns the URL
* that the last API request
* called
* @access public
* @return string
* */
public function getRequestUri()
{
// Return the URL
return $this->sRequestUri;
}
/**
* This method returns the count of the
* total number of records from the most
* recent API call, if there is one
* @access public
* @return integer
* */
public function getTotal()
{
// Return the total records
return $this->iTotal;
}
/**
* This method simply returns the base URL for
* your API/Sandbox account
* @access public
* @param bool [$bFull]
* @return string
* */
public function getUrl($bFull = false)
{
// Set the sandbox URL
$sSandboxUrl = defined('ICONTACT_APISANDBOXURL') ? constant('ICONTACT_APISANDBOXURL') : 'https://app.sandbox.icontact.com/icp';
// Set the production URL
$sApiUrl = defined('ICONTACT_APIURL') ? constant('ICONTACT_APIURL') : 'https://app.icontact.com/icp';
// Determine which one needs to be returned with the URL
$sBaseUrl = ($this->bSandbox === true) ? $sSandboxUrl : $sApiUrl;
// Do we need to return the entire url or just
// the base url of the API service
if ($bFull === false)
{
// Return the base url
return $sBaseUrl;
}
else
{
// Return the base url and account details
return $sBaseUrl . "/a/{$this->setAccountId()}/c/{$this->setClientFolderId()}";
}
}
/**
* This method grabs a specific upload
* @access public
* @param integer $iUploadId
* @return object
* */
public function getUpload($iUploadId)
{
// Return the upload data
return $this->makeCall("/a/{$this->setAccountId()}/c{$this->setClientFolderId()}/uploads/{$iUploadId}/data");
}
/**
* This method grabs the uploads associated
* with your iContact Account
* @access public
* @return array
* */
public function getUploads()
{
// Return the uploads
return $this->makeCall("/a/{$this->setAccountId()}/c{$this->setClientFolderId()}/uploads");
}
/**
* This method returns the warnings encountered
* while communicating with the iContact API
* @access public
* @return array
* */
public function getWarnings()
{
// Return the current system warnings
return $this->aWarnings;
}
//////////////////////////////////////////////////////////////////////////////
/// Setters /////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* This method fetches the Account ID
* from the iContact API if it has not
* already been stored in the instance
* @access public
* @param integer [$iAccountId]
* @return integer
* */
public function setAccountId($iAccountId = null)
{
// Check for an overriding
// Account ID
if (!empty($iAccountId))
{
// Override the Account ID
$this->iAccountId = (integer) $iAccountId;
}
else
{
// Check to see if the
// Account ID has already
// been stored in the
// instance
if (empty($this->iAccountId))
{
// Load the Account ID
if ($aAccounts = $this->makeCall('/a/', 'get', null, 'accounts'))
{
// Set the account
$aAccount = $aAccounts[0];
// Make sure the account is active
if (intval($aAccount->enabled) === 1)
{
// The account is active
// set the Account ID
$this->iAccountId = (integer) $aAccount->accountId;
}
else
{
// Set an error, for this account
// has been disabled
$this->addError('Your account has been disabled.');
}
}
}
}
// Inevitably return instance
return $this->iAccountId;
}
/**
* This method fetches the Client
* Folder ID from the iContact API
* if it has not already been stored
* in the instance and the Account ID
* has also been stored in the instance
* @access public
* @param integer [$iClientFolderId]
* @return integer
* */
public function setClientFolderId($iClientFolderId = null)
{
// Check for an overriding
// Client Folder ID
if (!empty($iClientFolderId))
{
// Set the Client Folder ID
$this->iClientFolderId = (integer) $iClientFolderId;
}
elseif (empty($this->iClientFolderId))
{
// Check for an Account ID
if (empty($this->iAccountId))
{
// Set the Account ID
$this->setAccountId();
}
// Set the resource
$sResource = (string) "/a/{$this->iAccountId}/c/";
// Find the Client Folder ID
if ($aClients = $this->makeCall($sResource, 'get', null, 'clientfolders'))
{
if (empty($aClients))
{
// Add an error, for there
// are no client folders
$this->addError('No client folders were found for this account.');
}
else
{
// Grab the default client folder
$aClient = $aClients[0];
// Set the Client Folder ID
$this->iClientFolderId = (integer) $aClient->clientFolderId;
}
}
}
// Inevitably return instance
return $this->iClientFolderId;
}
/**
* This method sets configuration into the
* plugin to pragmatically override constants
* @access public
* @param array $aConfig
* @return iContactApi $this
* */
public function setConfig($aConfig)
{
// Combine the arrays
$this->aConfig = (array) array_merge($this->aConfig, $aConfig);
// Return instance
return $this;
}
/**
* This method sets the result limit
* for GET requests to the iContact API
* @access public
* @param integer $iLimit
* @return iContactApi $this
* */
public function setLimit($iLimit)
{
// Set the limit in the search parameters
$this->aSearchParameters['limit'] = (integer) $iLimit;
// Return instance
return $this;
}
/**
* This method sets the result index
* offset for paginating results from
* GET requests to the iContact API
* @access public
* @param integer $iOffset
* @return iContactApi $this
* */
public function setOffset($iOffset)
{
// Set the offset in the search parameters
$this->aSearchParameters['offset'] = (integer) $iOffset;
// Return instance
return $this;
}
}
}
?>