Файл: aweber/aweber_api/aweber_entry.php
Строк: 287
<?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;
}
}