%PDF- %PDF-
| Direktori : /home/lightco1/luminero.com.au/administrator/components/com_cmc/helpers/ |
| Current File : /home/lightco1/luminero.com.au/administrator/components/com_cmc/helpers/chimp.php |
<?php
/**
* @package CMC
* @author Compojoom <contact-us@compojoom.com>
* @date 2016-04-15
*
* @copyright Copyright (C) 2008 - 2016 compojoom.com - Daniel Dimitrov, Yves Hoppe. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('_JEXEC') or die('Restricted access');
// TODO move to autoloader
require_once JPATH_ADMINISTRATOR . "/components/com_cmc/libraries/drewm/mailchimp-api/MailChimp.php";
require_once JPATH_ADMINISTRATOR . "/components/com_cmc/libraries/drewm/mailchimp-api/Batch.php";
/**
* Class cmcHelperChimp
*
* This class will work as a small abstraction over the MCAPI class.
* I got too tired of typing the $key all the time :)
*
* @since 1.0
*/
class CmcHelperChimp extends \DrewM\MailChimp\MailChimp
{
/**
* The MailChimp API Key
*
* @var null|string
*
* @since 1.0.0
*/
public $api_key = null;
/**
* Verify SSL Certificate of MailChimp
*
* @var bool
*
* @since 1.0.0
*/
public $verify_ssl = false;
/**
* The constructor
*
* @param string $key - the mailchimp api key
*/
public function __construct($key = '')
{
if (!$key)
{
$key = JComponentHelper::getParams('com_cmc')->get('api_key', '');
}
$this->api_key = $key;
// Add logging
JLog::addLogger(
array(
'text_file' => 'com_cmc.errors.php'
),
JLog::ERROR,
array('com_cmc')
);
parent::__construct($key);
}
/**
* Get the account details (/) of the mailchimp account
*
* @return array|false
*/
public function getAccountDetails()
{
return $this->get("/");
}
/**
* Get the lists information
*
* @param string|null $ids The listid or null for all
*
* @return array|false The list information
*/
public function lists($ids = null)
{
if (!$ids)
{
$lists = $this->get('/lists', array('count' => 1000));
}
else
{
$lists = array();
if (is_array($ids))
{
foreach ($ids as $id)
{
$lists[] = $this->get('/lists/' . $id, array('count' => 1000));
}
}
else
{
$lists[] = $this->get('/lists/' . $ids, array('count' => 1000));
}
}
return $lists;
}
/**
* Get member details
*
* @param string $listid The list id
* @param string $status The subscription status
* @param integer $offset The offset where to begin with
* @param integer $limit The limit
*
* @return array|false The member details
*/
public function listMembers($listid, $status, $offset = 0, $limit = 50)
{
$args = array();
if ($status)
{
$args["status"] = $status;
}
$args["offset"] = $offset;
$args["count"] = $limit;
$members = $this->get('/lists/' . $listid . '/members', $args);
$members = $members['members'];
// Add email address to merge vars
for ($i = 0; $i < count($members); $i++)
{
$members[$i]['merge_fields'] = array_merge(array("EMAIL" => $members[$i]['email_address']), $members[$i]['merge_fields']);
// Always get interests
if (!isset($members[$i]['interests']))
{
$members[$i]['interests'] = array();
}
}
return $members;
}
/**
* Get the member info for the given email address and list
*
* @param string $listid The list id
* @param string $email The email
*
* @return array|false
*/
public function listMemberInfo($listid, $email)
{
$subscriber_hash = $this->subscriberHash($email);
return $this->get('/lists/' . $listid . '/members/' . $subscriber_hash);
}
/**
* Get the merge vars for the listid
*
* @param string $listid The list id
*
* @return mixed
*/
public function listMergeVars($listid)
{
// Normally this should be enough..
$params = array('count' => 1000);
// We need to merge the email field here
$email = array(
'merge_id' => 1,
'tag' => 'EMAIL',
'name' => JText::_('COM_CMC_EMAIL'),
'type' => 'text',
'required' => true,
'public' => true,
'display_order' => 1,
'list_id' => $listid
);
$fields = $this->get('/lists/' . $listid . '/merge-fields', $params);
$fields = array_merge(array($email), $fields['merge_fields']);
return $fields;
}
/**
* Get the interest groups
*
* @param string $listid The list id
*
* @return array|false
*/
public function listInterestGroupings($listid)
{
$params = array('count' => 1000);
$interests = $this->get('/lists/' . $listid . '/interest-categories', $params);
return isset($interests['categories']) ? $interests['categories'] : null;
}
/**
* Get field details (options etc.)
*
* @param string $listId The list id
* @param string $fieldId The field id
*
* @return array|null
*/
public function listIntegerestGroupingsField($listId, $fieldId)
{
$params = array('count' => 1000);
$fields = $this->get('/lists/' . $listId . '/interest-categories/' . $fieldId . "/interests", $params);
return isset($fields['interests']) ? $fields['interests'] : null;
}
/**
* Unsubscribe from list
*
* @param string $listid The list id
* @param string $email The email
*
* @return array|false
*/
public function listUnsubscribe($listid, $email)
{
$subscriber_hash = $this->subscriberHash($email);
return $this->delete('/lists/' . $listid . '/members/' . $subscriber_hash);
}
/**
* Add ecommerce order
*
* @param object $order The order details
*
* @throws Exception
*
* @return array
*/
public function ecommOrderAdd($order)
{
return $this->post('/ecommerce/stores/' . $order['store_id'] . '/orders', $order);
}
/**
* Unimplemented in v3 API!
*
* @param string $email The email
*
* @deprecated Not implemented in v3
*
* @throws Exception
*/
public function listsForEmail($email)
{
throw new Exception("Unimplemented not available in v3", 500);
}
/**
* Is the user subscribed
*
* @param string $listId The list id
* @param string $email The mail address
*
* @return bool true if yes
*
* @since 3.0.0
*/
public function isSubscribed($listId, $email)
{
$subscriber_hash = $this->subscriberHash($email);
$result = $this->get('/lists/' . $listId . "/members/" . $subscriber_hash);
// Not existing member
if ($result['status'] == 404)
{
return false;
}
return in_array($result['status'], array('subscribed', 'pending', 'unsubscribed', 'transactional')) ? true : false;
}
/**
* Subscribe / Update some one to the list
*
* @param string $listId The list id
* @param string $email_address The email
* @param array $merge_vars Merge vars
* @param array $interests Merge vars
*
* @return array|false
*/
public function listSubscribe($listId,
$email_address,
$merge_vars = null,
$interests = null,
$email_type = 'html',
$double_optin = true,
$update_existing = false,
$replace_interests = true,
$send_welcome = false)
{
$status = 'subscribed';
if ($double_optin)
{
$status = 'pending';
}
// We need to unset that
if (isset($merge_vars['GROUPINGS']))
{
unset($merge_vars['GROUPINGS']);
}
$args = array(
'email_address' => $email_address,
'status' => $status,
'merge_fields' => $merge_vars,
'interests' => count($interests) ? $interests : new stdClass,
'email_type' => $email_type
);
if ($update_existing && $this->isSubscribed($listId, $email_address))
{
// Update user ..
return $this->listUpdateSubscribe(
$listId,
$email_address,
$merge_vars,
$interests,
$email_type
);
}
$result = $this->post("/lists/" . $listId . "/members", $args);
return $result;
}
/**
* Update to subscribtion
*
* @param string $listId The list id
* @param string $email_address The email
* @param array $merge_vars Merge vars
* @param array $interests Merge vars
* @param string $email_type HTML or Text?
* @param string $status subscribed or pending??
*
* @return array|false
*/
public function listUpdateSubscribe($listId,
$email_address,
$merge_vars = null,
$interests = null,
$email_type = 'html',
$status = 'subscribed'
)
{
$subscriber_hash = $this->subscriberHash($email_address);
$args = array(
'email_address' => $email_address,
'status' => $status,
'merge_fields' => $merge_vars,
'interests' => $interests,
'email_type' => $email_type
);
// The updated object
$result = $this->put('/lists/' . $listId . "/members/" . $subscriber_hash, $args);
return $result;
}
/**
* Send Ecommerce request
*
* @param $mcId
* @param object $store
* @param $order
* @param array $lines
* @param array $customer
*
* @return array|false
*
* @since version
*/
public function addEcomOrder($mcId, $store, $order, $lines = array(), $customer)
{
$order->id = (string) $order->id;
$order->order_total = (double) $order->order_total;
$order->payment_tax = (double) $order->payment_tax;
if(!$this->storeExists($store->id))
{
if(!$this->storeCreate($store))
{
JLog::add('Couldn\'t create store with ID ' . $store->id, Jlog::ERROR, 'com_cmc');
return false;
};
}
foreach($lines as $key => $product)
{
if(!$this->productExists($store->id, $product['product_id']))
{
// Try to create the product
if(!$this->createProduct($store->id, $product))
{
unset($lines[$key]);
}
}
if(count($lines) == 0)
{
// we couldn't create the products at this stage
return false;
}
}
$args = (array) $order;
$args['lines'] = $lines;
$args['campaign_id'] = $mcId;
$args['customer'] = $customer;
$result = $this->post('/ecommerce/stores/' . $store->id . "/orders", $args);
return $result;
}
/**
* Create a new shop
*
* @param object $shop Shop
*
* @return bool|string
*
* @since __DEPLOY_VERSION__
*/
public function createShop($shop)
{
if ($this->storeExists($shop->id))
{
return true;
}
return $this->storeCreate($shop);
}
/**
* Check if the store exists
*
* @param string $storeId - the store id
*
* @return bool
*/
public function storeExists($storeId)
{
$this->get('/ecommerce/stores/' . $storeId);
$lastResponse = $this->getLastResponse();
if ($lastResponse['headers']['http_code'] == 404)
{
return false;
}
return true;
}
/**
* Create a store if doesn't exist
*
* @param object $store - the store object as described here http://developer.mailchimp.com/documentation/mailchimp/reference/ecommerce/stores/
*
* @return array|false
*/
public function storeCreate($store)
{
$result = $this->post('/ecommerce/stores', $store);
return $result;
}
/**
* Update a shop
*
* @param object $shop - the store object as described here http://developer.mailchimp.com/documentation/mailchimp/reference/ecommerce/stores/
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function updateShop($shop)
{
return $this->patch('/ecommerce/stores/' . $shop->id, $shop);
}
/**
* DELETE /ecommerce/stores/{store_id}
*
* @param string $shopId Store id (e.g. 1)
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function deleteShop($shopId)
{
return $this->delete('/ecommerce/stores/' . $shopId);
}
/**
* Create a product
*
* @param string $storeId - the store id
* @param object $product - the product object as described here http://developer.mailchimp.com/documentation/mailchimp/reference/ecommerce/stores/products/
*
* @return array|false
*/
public function createProduct($storeId, $product)
{
$variants = array (
'id' => $product['product_id'],
'title' => $product['title']
);
$product['id'] = $product['product_id'];
$product['variants'][] = $variants;
$result = $this->post('/ecommerce/stores/' . $storeId . '/products', $product);
return $result;
}
/**
* Batch subscribe users to mailchimp
*
* @param string $list - the list id
* @param array $users - the users to subscribe to the list (the merges)
*
* @return void
*
* @since __DEPLOY_VERSION__
*/
public function listBatchSubscribe($list, $users)
{
$config = JComponentHelper::getParams('com_cmc');
$batch = new \DrewM\MailChimp\Batch($this);
$status = 'subscribed';
// If double opt-in is on, then add the user as pending and let mailchimp send him a confirmation mail
if($config->get('opt_in', true))
{
$status = 'pending';
}
foreach($users as $user)
{
$args = array(
'email_address' => $user['EMAIL'],
"status_if_new" => $status,
'merge_fields' => $user,
'interests' => new stdClass,
'email_type' => 'html'
);
$batch->put('my-id', 'lists/' . $list . '/members/' . md5($user['EMAIL']), $args);
}
// Send the request
$batch->execute();
}
/**
* Add a new product to the shop
*
* @param string $shopId Store id (e.g. 1)
* @param CmcMailChimpProduct $product Product
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function addProduct($shopId, CmcMailChimpProduct $product)
{
$exists = $this->productExists($shopId, $product);
if ($exists)
{
return $this->updateProduct($shopId, $product);
}
return $this->post('/ecommerce/stores/' . $shopId . '/products', $product);
}
/**
* Checks if a product (with id) is existing
*
* @param string $shopId StoreId
* @param CmcMailChimpProduct $product Product
*
* @return bool
*
* @since __DEPLOY_VERSION__
*/
public function productExists($shopId, CmcMailChimpProduct $product)
{
$result = $this->get('/ecommerce/stores/' . $shopId . '/products/' . $product->id);
$lastResponse = $this->getLastResponse();
if ($lastResponse['headers']['http_code'] == 404)
{
return false;
}
return true;
}
/**
* DELETE /ecommerce/stores/{store_id}/products/{product_id}
*
* @param string $shopId Store id (e.g. 1)
* @param string $productId Product id (e.g. vm_product_)
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function deleteProduct($shopId, $productId)
{
$result = $this->delete('/ecommerce/stores/' . $shopId . '/products/' . $productId);
return $result;
}
/**
* DELETE /ecommerce/stores/{store_id}/products/{product_id}
*
* @param string $shopId Store id (e.g. 1)
* @param CmcMailChimpProduct $product Product
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function updateProduct($shopId, CmcMailChimpProduct $product)
{
$result = $this->patch('/ecommerce/stores/' . $shopId . '/products/' . $product->id, $product);
return $result;
}
/**
* Add a new customer to the shop
*
* @param string $shopId Store id (e.g. 1)
* @param CmcMailChimpCustomer $customer CustomerObject
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function addCustomer($shopId, CmcMailChimpCustomer $customer)
{
$exists = $this->customerExists($shopId, $customer);
if ($exists)
{
return $this->updateCustomer($shopId, $customer);
}
return $this->post('/ecommerce/stores/' . $shopId . '/customers', $customer);
}
/**
* Update a customer
*
* @param string $shopId Store id (e.g. 1)
* @param CmcMailChimpCustomer $customer CustomerObject
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function updateCustomer($shopId, CmcMailChimpCustomer $customer)
{
return $this->patch('/ecommerce/stores/' . $shopId . '/customers/' . $customer->id, $customer);
}
/**
* Checks if a customer (with id) is existing
*
* @param string $shopId StoreId
* @param CmcMailChimpCustomer $customer Customer
*
* @return bool
*
* @since __DEPLOY_VERSION__
*/
public function customerExists($shopId, CmcMailChimpCustomer $customer)
{
$result = $this->get('/ecommerce/stores/' . $shopId . '/customers/' . $customer->id);
$lastResponse = $this->getLastResponse();
if ($lastResponse['headers']['http_code'] == 404)
{
return false;
}
return true;
}
/**
* DELETE /ecommerce/stores/{store_id}/customers/{product_id}
*
* @param string $shopId Store id (e.g. 1)
* @param string $productId Product id (e.g. vm_customer_42)
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function deleteCustomer($shopId, $id)
{
return $this->delete('/ecommerce/stores/' . $shopId . '/customers/' . $id);
}
/**
* Add a new order to the shop
*
* @param string $shopId Store id (e.g. vm_1)
* @param CmcMailChimpOrder $order Order
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function addOrder($shopId, CmcMailChimpOrder $order)
{
$exists = $this->orderExists($shopId, $order);
if ($exists)
{
return $this->updateOrder($shopId, $order);
}
return $this->post('/ecommerce/stores/' . $shopId . '/orders', $order);
}
/**
* Update an order
*
* @param string $shopId Store id (e.g. vm_1)
* @param CmcMailChimpOrder $order Order
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function updateOrder($shopId, CmcMailChimpOrder $order)
{
return $this->patch('/ecommerce/stores/' . $shopId . '/orders/' . $order->id, $order);
}
/**
* Checks if a order (with id) is existing
*
* @param string $shopId StoreId
* @param CmcMailChimpOrder $order Order
*
* @return bool
*
* @since __DEPLOY_VERSION__
*/
public function orderExists($shopId, CmcMailChimpOrder $order)
{
$result = $this->get('/ecommerce/stores/' . $shopId . '/orders/' . $order->id);
$lastResponse = $this->getLastResponse();
if ($lastResponse['headers']['http_code'] == 404)
{
return false;
}
return true;
}
/**
* DELETE /ecommerce/stores/{store_id}/orders/{product_id}
*
* @param string $shopId Store id (e.g. 1)
* @param string $id Order id (e.g. vm_order_42)
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function deleteOrder($shopId, $id)
{
return $this->delete('/ecommerce/stores/' . $shopId . '/orders/' . $id);
}
/**
* Add a new cart to the shop
*
* @param string $shopId Store id (e.g. vm_1)
* @param CmcMailChimpCart $cart Cart item
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function addCart($shopId, CmcMailChimpCart $cart)
{
$exists = $this->cartExists($shopId, $cart);
if ($exists)
{
return $this->updateCart($shopId, $cart);
}
return $this->post('/ecommerce/stores/' . $shopId . '/carts', $cart);
}
/**
* Update an cart
*
* @param string $shopId Store id (e.g. vm_1)
* @param CmcMailChimpCart $cart Cart
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function updateCart($shopId, CmcMailChimpCart $cart)
{
return $this->patch('/ecommerce/stores/' . $shopId . '/carts/' . $cart->id, $cart);
}
/**
* Checks if a cart (with id) is existing
*
* @param string $shopId Store id (e.g. vm_1)
* @param CmcMailChimpCart $cart Cart
*
* @return bool
*
* @since __DEPLOY_VERSION__
*/
public function cartExists($shopId, CmcMailChimpCart $cart)
{
$result = $this->get('/ecommerce/stores/' . $shopId . '/carts/' . $cart->id);
$lastResponse = $this->getLastResponse();
if ($lastResponse['headers']['http_code'] == 404)
{
return false;
}
return true;
}
/**
* DELETE /ecommerce/stores/{store_id}/carts/{product_id}
*
* @param string $shopId Store id (e.g. 1)
* @param string $id Cart id (e.g. vm_cart_42)
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function deleteCart($shopId, $id)
{
return $this->delete('/ecommerce/stores/' . $shopId . '/carts/' . $id);
}
/**
* CREATE list POST /lists
*
* @param array $list The list
*
* @return array|false
*
* @since __DEPLOY_VERSION__
*/
public function createList($list)
{
return $this->post('/lists', $list);
}
}