Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

* Fix for API error: The field 'calculated_price' cannot be written to. ... #102

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
90 changes: 73 additions & 17 deletions bigcommerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ public function authenticate($username, $password)
{
curl_setopt($this->curl, CURLOPT_USERPWD, "{$username}:{$password}");
}
public function oAuthAuthenticate($client_id, $access_token)
{
$this->addHeader('X-Auth-Client', $client_id);
$this->addHeader('X-Auth-Token', $access_token);
}
public function setTimeout($timeout)
{
curl_setopt($this->curl, CURLOPT_TIMEOUT, $timeout);
Expand Down Expand Up @@ -278,22 +283,49 @@ class Client
private static $connection;
private static $resource;
private static $path_prefix = '/api/v2';
private static $oauth_api_path = 'https://api.bigcommerce.com/stores';
private static $auth_mode = 'oauth';
private static $oauth_client_id;
private static $oauth_access_token;
private static $oauth_store_hash;
private static $oauth_path_prefix = '/v2';
public static $api_path;
public static function configure($settings)
{
if (!isset($settings['store_url'])) {
if (isset($settings['auth_mode']) && in_array($settings['auth_mode'], array('oauth', 'basic'))) {
self::$auth_mode = $settings['auth_mode'];
}
if (!isset($settings['store_url']) && self::$auth_mode === 'basic') {
throw new Exception('\'store_url\' must be provided');
}
if (!isset($settings['username'])) {
if (!isset($settings['username']) && self::$auth_mode === 'basic') {
throw new Exception('\'username\' must be provided');
}
if (!isset($settings['api_key'])) {
if (!isset($settings['api_key']) && self::$auth_mode === 'basic') {
throw new Exception('\'api_key\' must be provided');
}
self::$username = $settings['username'];
self::$api_key = $settings['api_key'];
self::$store_url = rtrim($settings['store_url'], '/');
self::$api_path = self::$store_url . self::$path_prefix;
if (!isset($settings['client_id']) && self::$auth_mode === 'oauth') {
throw new Exception('\'client_id\' must be provided');
}
if (!isset($settings['access_token']) && self::$auth_mode === 'oauth') {
throw new Exception('\'access_token\' must be provided');
}
if (!isset($settings['store_hash']) && self::$auth_mode === 'oauth') {
throw new Exception('\'store_hash\' must be provided');
}
if ('basic' === self::$auth_mode) {
self::$username = $settings['username'];
self::$api_key = $settings['api_key'];
self::$store_url = rtrim($settings['store_url'], '/');
self::$api_path = self::$store_url . self::$path_prefix;
} elseif ('oauth' === self::$auth_mode) {
self::$oauth_client_id = $settings['client_id'];
self::$oauth_access_token = $settings['access_token'];
self::$oauth_store_hash = $settings['store_hash'];
self::$api_path = self::$oauth_api_path . '/' . self::$oauth_store_hash . self::$oauth_path_prefix;
} else {
throw new Exception('Given Auth mode is not supported');
}
self::$connection = false;
}
public static function failOnError($option = true)
Expand Down Expand Up @@ -324,7 +356,11 @@ private static function connection()
{
if (!self::$connection) {
self::$connection = new Connection();
self::$connection->authenticate(self::$username, self::$api_key);
if ('basic' === self::$auth_mode) {
self::$connection->authenticate(self::$username, self::$api_key);
} else {
self::$connection->oAuthAuthenticate(self::$oauth_client_id, self::$oauth_access_token);
}
}
return self::$connection;
}
Expand Down Expand Up @@ -413,23 +449,23 @@ public static function getProductImages($id)
}
public static function getProductCustomFields($id)
{
return self::getCollection('/products/' . $id . '/customfields/', 'ProductCustomField');
return self::getCollection('/products/' . $id . '/custom_fields', 'ProductCustomField');
}
public static function getProductCustomField($product_id, $id)
{
return self::getResource('/products/' . $product_id . '/customfields/' . $id, 'ProductCustomField');
return self::getResource('/products/' . $product_id . '/custom_fields/' . $id, 'ProductCustomField');
}
public static function createProductCustomField($product_id, $object)
{
return self::createResource('/products/' . $product_id . '/customfields', $object);
return self::createResource('/products/' . $product_id . '/custom_fields', $object);
}
public static function updateProductCustomField($product_id, $id, $object)
{
return self::updateResource('/products/' . $product_id . '/customfields/' . $id, $object);
return self::updateResource('/products/' . $product_id . '/custom_fields/' . $id, $object);
}
public static function deleteProductCustomField($product_id, $id)
{
return self::deleteResource('/products/' . $product_id . '/customfields/' . $id);
return self::deleteResource('/products/' . $product_id . '/custom_fields/' . $id);
}
public static function getProductsCount($filter = false)
{
Expand Down Expand Up @@ -641,6 +677,26 @@ public static function updateCoupon($id, $object)
{
return self::updateResource('/coupons/' . $id, $object);
}
public static function listWebHook()
{
return self::getResource('/hooks');
}
public static function getWebHook($id)
{
return self::getResource('/hooks/' . $id);
}
public static function createWebHook($object)
{
return self::createResource('/hooks', $object);
}
public static function updateWebHook($id, $object)
{
return self::updateResource('/hooks/' . $id, $object);
}
public static function deleteWebHook($id)
{
return self::deleteResource('/hooks/' . $id);
}
public static function getRequestLogs()
{
return self::getCollection('/requestlogs');
Expand Down Expand Up @@ -982,7 +1038,7 @@ class OrderStatus extends Resource
class Product extends Resource
{
protected $ignoreOnCreate = array('date_created', 'date_modified');
protected $ignoreOnUpdate = array('id', 'rating_total', 'rating_count', 'date_created', 'date_modified', 'date_last_imported', 'number_sold', 'brand', 'images', 'discount_rules', 'configurable_fields', 'custom_fields', 'videos', 'skus', 'rules', 'option_set', 'options', 'tax_class');
protected $ignoreOnUpdate = array('id', 'rating_total', 'rating_count', 'date_created', 'date_modified', 'date_last_imported', 'number_sold', 'brand', 'images', 'discount_rules', 'configurable_fields', 'custom_fields', 'videos', 'skus', 'rules', 'option_set', 'options', 'tax_class', 'calculated_price', 'primary_image', 'downloads');
protected $ignoreIfZero = array('tax_class_id');
public function brand()
{
Expand Down Expand Up @@ -1059,15 +1115,15 @@ class ProductCustomField extends Resource
protected $ignoreOnUpdate = array('id', 'product_id');
public function create()
{
return Client::createResource('/products/' . $this->product_id . '/customfields', $this->getCreateFields());
return Client::createResource('/products/' . $this->product_id . '/custom_fields', $this->getCreateFields());
}
public function update()
{
Client::updateResource('/products/' . $this->product_id . '/customfields/' . $this->id, $this->getUpdateFields());
Client::updateResource('/products/' . $this->product_id . '/custom_fields/' . $this->id, $this->getUpdateFields());
}
public function delete()
{
Client::deleteResource('/products/' . $this->product_id . '/customfields/' . $this->id);
Client::deleteResource('/products/' . $this->product_id . '/custom_fields/' . $this->id);
}
}
namespace Bigcommerce\Api\Resources;
Expand Down
112 changes: 86 additions & 26 deletions src/Bigcommerce/Api/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,15 @@ class Client
static private $connection;
static private $resource;
static private $path_prefix = '/api/v2';
static private $oauth_api_path = 'https://api.bigcommerce.com/stores';
static private $auth_mode = 'oauth';
static private $oauth_client_id;
static private $oauth_access_token;
static private $oauth_store_hash;
static private $oauth_path_prefix = '/v2';

/**

/**
* Full URL path to the configured store API.
*
* @var string
Expand All @@ -35,25 +42,49 @@ class Client
* @param array $settings
*/
public static function configure($settings)
{
if (!isset($settings['store_url'])) {
throw new Exception("'store_url' must be provided");
}

if (!isset($settings['username'])) {
throw new Exception("'username' must be provided");
}

if (!isset($settings['api_key'])) {
throw new Exception("'api_key' must be provided");
}

self::$username = $settings['username'];
self::$api_key = $settings['api_key'];
self::$store_url = rtrim($settings['store_url'], '/');
self::$api_path = self::$store_url . self::$path_prefix;
self::$connection = false;
}
{
if (isset($settings['auth_mode']) && in_array($settings['auth_mode'], array('oauth', 'basic'))) {
self::$auth_mode = $settings['auth_mode'];
}
// Basic Auth specific settings
if (!isset($settings['store_url']) && self::$auth_mode === 'basic') {
throw new Exception("'store_url' must be provided");
}

if (!isset($settings['username']) && self::$auth_mode === 'basic') {
throw new Exception("'username' must be provided");
}

if (!isset($settings['api_key']) && self::$auth_mode === 'basic') {
throw new Exception("'api_key' must be provided");
}
// OAuth specific settings
if (!isset($settings['client_id']) && self::$auth_mode === 'oauth') {
throw new Exception("'client_id' must be provided");
}
if (!isset($settings['access_token']) && self::$auth_mode === 'oauth') {
throw new Exception("'access_token' must be provided");
}
if (!isset($settings['store_hash']) && self::$auth_mode === 'oauth') {
throw new Exception("'store_hash' must be provided");
}

if ('basic' === self::$auth_mode) {
self::$username = $settings['username'];
self::$api_key = $settings['api_key'];
self::$store_url = rtrim($settings['store_url'], '/');
self::$api_path = self::$store_url . self::$path_prefix;
} elseif ('oauth' === self::$auth_mode) {
self::$oauth_client_id = $settings['client_id'];
self::$oauth_access_token = $settings['access_token'];
self::$oauth_store_hash = $settings['store_hash'];
self::$api_path = self::$oauth_api_path . '/' . self::$oauth_store_hash . self::$oauth_path_prefix;
} else {
throw new Exception('Given Auth mode is not supported');
}

self::$connection = false;
}

/**
* Configure the API client to throw exceptions when HTTP errors occur.
Expand Down Expand Up @@ -121,7 +152,11 @@ private static function connection()
{
if (!self::$connection) {
self::$connection = new Connection();
self::$connection->authenticate(self::$username, self::$api_key);
if ('basic' === self::$auth_mode) {
self::$connection->authenticate(self::$username, self::$api_key);
} else {
self::$connection->oAuthAuthenticate(self::$oauth_client_id, self::$oauth_access_token);
}
}

return self::$connection;
Expand Down Expand Up @@ -312,7 +347,7 @@ public static function getProductImages($id)
*/
public static function getProductCustomFields($id)
{
return self::getCollection('/products/' . $id . '/customfields/', 'ProductCustomField');
return self::getCollection('/products/' . $id . '/custom_fields', 'ProductCustomField');
}

/**
Expand All @@ -323,7 +358,7 @@ public static function getProductCustomFields($id)
*/
public static function getProductCustomField($product_id, $id)
{
return self::getResource('/products/' . $product_id . '/customfields/' . $id, 'ProductCustomField');
return self::getResource('/products/' . $product_id . '/custom_fields/' . $id, 'ProductCustomField');
}

/**
Expand All @@ -336,7 +371,7 @@ public static function getProductCustomField($product_id, $id)
*/
public static function createProductCustomField($product_id, $object)
{
return self::createResource('/products/' . $product_id . '/customfields', $object);
return self::createResource('/products/' . $product_id . '/custom_fields', $object);
}

/**
Expand All @@ -348,7 +383,7 @@ public static function createProductCustomField($product_id, $object)
*/
public static function updateProductCustomField($product_id, $id, $object)
{
return self::updateResource('/products/' . $product_id . '/customfields/' . $id, $object);
return self::updateResource('/products/' . $product_id . '/custom_fields/' . $id, $object);
}

/**
Expand All @@ -359,7 +394,7 @@ public static function updateProductCustomField($product_id, $id, $object)
*/
public static function deleteProductCustomField($product_id, $id)
{
return self::deleteResource('/products/' . $product_id . '/customfields/' . $id);
return self::deleteResource('/products/' . $product_id . '/custom_fields/' . $id);
}

/**
Expand Down Expand Up @@ -857,6 +892,31 @@ public static function updateCoupon($id, $object)
return self::updateResource('/coupons/' . $id, $object);
}

public static function listWebHook()
{
return self::getResource('/hooks');
}

public static function getWebHook($id)
{
return self::getResource('/hooks/' . $id);
}

public static function createWebHook($object)
{
return self::createResource('/hooks', $object);
}

public static function updateWebHook($id, $object)
{
return self::updateResource('/hooks/' . $id, $object);
}

public static function deleteWebHook($id)
{
return self::deleteResource('/hooks/' . $id);
}

/**
* The request logs with usage history statistics.
*/
Expand Down
12 changes: 12 additions & 0 deletions src/Bigcommerce/Api/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,17 @@ public function authenticate($username, $password)
curl_setopt($this->curl, CURLOPT_USERPWD, "$username:$password");
}

/**
* Sets headers for OAuth authentication
* @param string $client_id
* @param string $access_token
*/
public function oAuthAuthenticate($client_id, $access_token)
{
$this->addHeader('X-Auth-Client', $client_id);
$this->addHeader('X-Auth-Token', $access_token);
}

/**
* Set a default timeout for the request. The client will error if the
* request takes longer than this to respond.
Expand Down Expand Up @@ -197,6 +208,7 @@ private function initializeRequest()
$this->responseHeaders = array();
$this->lastError = false;
$this->addHeader('Accept', $this->getContentType());
// OAuth support
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers);
}

Expand Down
5 changes: 4 additions & 1 deletion src/Bigcommerce/Api/Resources/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class Product extends Resource
);

/**
* @see https://developer.bigcommerce.com/display/API/Products#Products-ReadOnlyFields
* @see https://developer.bigcommerce.com/api/stores/v2/products#update-product-read-only
* @var array
*/
protected $ignoreOnUpdate = array(
Expand All @@ -39,6 +39,9 @@ class Product extends Resource
'option_set',
'options',
'tax_class',
'calculated_price',
'primary_image',
'downloads'
);

protected $ignoreIfZero = array(
Expand Down
Loading