mirror of
https://github.com/KevinMidboe/rohnenedre.git
synced 2025-12-29 21:31:16 +00:00
344 lines
11 KiB
PHP
344 lines
11 KiB
PHP
<?php
|
|
|
|
class AWeberEntry extends AWeberResponse {
|
|
|
|
/**
|
|
* @var array Holds list of data keys that are not publicly accessible
|
|
*/
|
|
protected $_privateData = array(
|
|
'resource_type_link',
|
|
'http_etag',
|
|
);
|
|
|
|
/**
|
|
* @var array Stores local modifications that have not been saved
|
|
*/
|
|
protected $_localDiff = array();
|
|
|
|
/**
|
|
* @var array Holds AWeberCollection objects already instantiated, keyed by
|
|
* their resource name (plural)
|
|
*/
|
|
protected $_collections = array();
|
|
|
|
/**
|
|
* attrs
|
|
*
|
|
* Provides a simple array of all the available data (and collections) available
|
|
* in this entry.
|
|
*
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function attrs() {
|
|
$attrs = array();
|
|
foreach ($this->data as $key => $value) {
|
|
if (!in_array($key, $this->_privateData) && !strpos($key, 'collection_link')) {
|
|
$attrs[$key] = $value;
|
|
}
|
|
}
|
|
if (!empty(AWeberAPI::$_collectionMap[$this->type])) {
|
|
foreach (AWeberAPI::$_collectionMap[$this->type] as $child) {
|
|
$attrs[$child] = 'collection';
|
|
}
|
|
}
|
|
return $attrs;
|
|
}
|
|
|
|
/**
|
|
* _type
|
|
*
|
|
* Used to pull the name of this resource from its resource_type_link
|
|
* @access protected
|
|
* @return String
|
|
*/
|
|
protected function _type() {
|
|
if (empty($this->type)) {
|
|
$typeLink = $this->data['resource_type_link'];
|
|
if (empty($typeLink)) return null;
|
|
list($url, $type) = explode('#', $typeLink);
|
|
$this->type = $type;
|
|
}
|
|
return $this->type;
|
|
}
|
|
|
|
/**
|
|
* delete
|
|
*
|
|
* Delete this object from the AWeber system. May not be supported
|
|
* by all entry types.
|
|
* @access public
|
|
* @return boolean Returns true if it is successfully deleted, false
|
|
* if the delete request failed.
|
|
*/
|
|
public function delete() {
|
|
$this->adapter->request('DELETE', $this->url, array(), array('return' => 'status'));
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* move
|
|
*
|
|
* Invoke the API method to MOVE an entry resource to a different List.
|
|
*
|
|
* Note: Not all entry resources are eligible to be moved, please
|
|
* refer to the AWeber API Reference Documentation at
|
|
* https://labs.aweber.com/docs/reference/1.0 for more
|
|
* details on which entry resources may be moved and if there
|
|
* are any requirements for moving that resource.
|
|
*
|
|
* @access public
|
|
* @param AWeberEntry(List) List to move Resource (this) too.
|
|
* @return mixed AWeberEntry(Resource) Resource created on List ($list)
|
|
* or False if resource was not created.
|
|
*/
|
|
public function move($list, $last_followup_message_number_sent=NULL) {
|
|
# Move Resource
|
|
$params = array(
|
|
'ws.op' => 'move',
|
|
'list_link' => $list->self_link
|
|
);
|
|
if (isset($last_followup_message_number_sent)) {
|
|
$params['last_followup_message_number_sent'] = $last_followup_message_number_sent;
|
|
}
|
|
|
|
$data = $this->adapter->request('POST', $this->url, $params, array('return' => 'headers'));
|
|
|
|
# Return new Resource
|
|
$url = $data['Location'];
|
|
$resource_data = $this->adapter->request('GET', $url);
|
|
return new AWeberEntry($resource_data, $url, $this->adapter);
|
|
}
|
|
|
|
/**
|
|
* save
|
|
*
|
|
* Saves the current state of this object if it has been changed.
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function save() {
|
|
if (!empty($this->_localDiff)) {
|
|
$data = $this->adapter->request('PATCH', $this->url, $this->_localDiff, array('return' => 'status'));
|
|
}
|
|
$this->_localDiff = array();
|
|
return true;
|
|
|
|
}
|
|
|
|
/**
|
|
* __get
|
|
*
|
|
* Used to look up items in data, and special properties like type and
|
|
* child collections dynamically.
|
|
*
|
|
* @param String $value Attribute being accessed
|
|
* @access public
|
|
* @throws AWeberResourceNotImplemented
|
|
* @return mixed
|
|
*/
|
|
public function __get($value) {
|
|
if (in_array($value, $this->_privateData)) {
|
|
return null;
|
|
}
|
|
if (!empty($this->data) && array_key_exists($value, $this->data)) {
|
|
if (is_array($this->data[$value])) {
|
|
$array = new AWeberEntryDataArray($this->data[$value], $value, $this);
|
|
$this->data[$value] = $array;
|
|
}
|
|
return $this->data[$value];
|
|
}
|
|
if ($value == 'type') return $this->_type();
|
|
if ($this->_isChildCollection($value)) {
|
|
return $this->_getCollection($value);
|
|
}
|
|
throw new AWeberResourceNotImplemented($this, $value);
|
|
}
|
|
|
|
/**
|
|
* __set
|
|
*
|
|
* If the key provided is part of the data array, then update it in the
|
|
* data array. Otherwise, use the default __set() behavior.
|
|
*
|
|
* @param mixed $key Key of the attr being set
|
|
* @param mixed $value Value being set to the $key attr
|
|
* @access public
|
|
*/
|
|
public function __set($key, $value) {
|
|
if (array_key_exists($key, $this->data)) {
|
|
$this->_localDiff[$key] = $value;
|
|
return $this->data[$key] = $value;
|
|
} else {
|
|
return parent::__set($key, $value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* findSubscribers
|
|
*
|
|
* Looks through all lists for subscribers
|
|
* that match the given filter
|
|
* @access public
|
|
* @return AWeberCollection
|
|
*/
|
|
public function findSubscribers($search_data) {
|
|
$this->_methodFor(array('account'));
|
|
$params = array_merge($search_data, array('ws.op' => 'findSubscribers'));
|
|
$data = $this->adapter->request('GET', $this->url, $params);
|
|
|
|
$ts_params = array_merge($params, array('ws.show' => 'total_size'));
|
|
$total_size = $this->adapter->request('GET', $this->url, $ts_params, array('return' => 'integer'));
|
|
|
|
# return collection
|
|
$data['total_size'] = $total_size;
|
|
$url = $this->url . '?'. http_build_query($params);
|
|
return new AWeberCollection($data, $url, $this->adapter);
|
|
}
|
|
|
|
/**
|
|
* getActivity
|
|
*
|
|
* Returns analytics activity for a given subscriber
|
|
* @access public
|
|
* @return AWeberCollection
|
|
*/
|
|
public function getActivity() {
|
|
$this->_methodFor(array('subscriber'));
|
|
$params = array('ws.op' => 'getActivity');
|
|
$data = $this->adapter->request('GET', $this->url, $params);
|
|
|
|
$ts_params = array_merge($params, array('ws.show' => 'total_size'));
|
|
$total_size = $this->adapter->request('GET', $this->url, $ts_params, array('return' => 'integer'));
|
|
|
|
# return collection
|
|
$data['total_size'] = $total_size;
|
|
$url = $this->url . '?'. http_build_query($params);
|
|
return new AWeberCollection($data, $url, $this->adapter);
|
|
}
|
|
|
|
/** getParentEntry
|
|
*
|
|
* Gets an entry's parent entry
|
|
* Returns NULL if no parent entry
|
|
*/
|
|
public function getParentEntry(){
|
|
$url_parts = explode('/', $this->url);
|
|
$size = count($url_parts);
|
|
|
|
#Remove entry id and slash from end of url
|
|
$url = substr($this->url, 0, -strlen($url_parts[$size-1])-1);
|
|
|
|
#Remove collection name and slash from end of url
|
|
$url = substr($url, 0, -strlen($url_parts[$size-2])-1);
|
|
|
|
try {
|
|
$data = $this->adapter->request('GET', $url);
|
|
return new AWeberEntry($data, $url, $this->adapter);
|
|
} catch (Exception $e) {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* getWebForms
|
|
*
|
|
* Gets all web_forms for this account
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getWebForms() {
|
|
$this->_methodFor(array('account'));
|
|
$data = $this->adapter->request('GET', $this->url.'?ws.op=getWebForms', array(),
|
|
array('allow_empty' => true));
|
|
return $this->_parseNamedOperation($data);
|
|
}
|
|
|
|
|
|
/**
|
|
* getWebFormSplitTests
|
|
*
|
|
* Gets all web_form split tests for this account
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getWebFormSplitTests() {
|
|
$this->_methodFor(array('account'));
|
|
$data = $this->adapter->request('GET', $this->url.'?ws.op=getWebFormSplitTests', array(),
|
|
array('allow_empty' => true));
|
|
return $this->_parseNamedOperation($data);
|
|
}
|
|
|
|
/**
|
|
* _parseNamedOperation
|
|
*
|
|
* Turns a dumb array of json into an array of Entries. This is NOT
|
|
* a collection, but simply an array of entries, as returned from a
|
|
* named operation.
|
|
*
|
|
* @param array $data
|
|
* @access protected
|
|
* @return array
|
|
*/
|
|
protected function _parseNamedOperation($data) {
|
|
$results = array();
|
|
foreach($data as $entryData) {
|
|
$results[] = new AWeberEntry($entryData, str_replace($this->adapter->app->getBaseUri(), '',
|
|
$entryData['self_link']), $this->adapter);
|
|
}
|
|
return $results;
|
|
}
|
|
|
|
/**
|
|
* _methodFor
|
|
*
|
|
* Raises exception if $this->type is not in array entryTypes.
|
|
* Used to restrict methods to specific entry type(s).
|
|
* @param mixed $entryTypes Array of entry types as strings, ie array('account')
|
|
* @access protected
|
|
* @return void
|
|
*/
|
|
protected function _methodFor($entryTypes) {
|
|
if (in_array($this->type, $entryTypes)) return true;
|
|
throw new AWeberMethodNotImplemented($this);
|
|
}
|
|
|
|
/**
|
|
* _getCollection
|
|
*
|
|
* Returns the AWeberCollection object representing the given
|
|
* collection name, relative to this entry.
|
|
*
|
|
* @param String $value The name of the sub-collection
|
|
* @access protected
|
|
* @return AWeberCollection
|
|
*/
|
|
protected function _getCollection($value) {
|
|
if (empty($this->_collections[$value])) {
|
|
$url = "{$this->url}/{$value}";
|
|
$data = $this->adapter->request('GET', $url);
|
|
$this->_collections[$value] = new AWeberCollection($data, $url, $this->adapter);
|
|
}
|
|
return $this->_collections[$value];
|
|
}
|
|
|
|
|
|
/**
|
|
* _isChildCollection
|
|
*
|
|
* Is the given name of a collection a child collection of this entry?
|
|
*
|
|
* @param String $value The name of the collection we are looking for
|
|
* @access protected
|
|
* @return boolean
|
|
* @throws AWeberResourceNotImplemented
|
|
*/
|
|
protected function _isChildCollection($value) {
|
|
$this->_type();
|
|
if (!empty(AWeberAPI::$_collectionMap[$this->type]) &&
|
|
in_array($value, AWeberAPI::$_collectionMap[$this->type])) return true;
|
|
return false;
|
|
}
|
|
|
|
}
|