diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Service/Ebay/Abstract.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Service/Ebay/Abstract.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,309 @@ +setOption($options); + } + + /** + * @param string|Zend_Config|array $name + * @param mixed $value + * @return Zend_Service_Ebay_Abstract Provides a fluent interface + */ + public function setOption($name, $value = null) + { + if ($name instanceof Zend_Config) { + $name = $name->toArray(); + } + if (is_array($name)) { + $this->_options = $name + $this->_options; + } else { + $this->_options[$name] = $value; + } + return $this; + } + + /** + * @param string $name + * @return mixed + */ + public function getOption($name = null) + { + if (null === $name) { + return $this->_options; + } + if ($this->hasOption($name)) { + return $this->_options[$name]; + } + return null; + } + + /** + * @param string $name + * @return boolean + */ + public function hasOption($name) + { + return array_key_exists($name, $this->_options); + } + + /** + * @param mixed $client + * @return Zend_Service_Ebay_Abstract Provides a fluent interface + */ + abstract public function setClient($client); + + /** + * @return mixed + */ + abstract public function getClient(); + + /** + * @param Zend_Config|array $options + * @throws Zend_Service_Ebay_Finding_Exception When $options is not an array neither a Zend_Config object + * @return array + */ + public static function optionsToArray($options) + { + if (null === $options) { + $options = array(); + } else if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + if (!is_array($options)) { + /** + * @see Zend_Service_Ebay_Exception + */ + require_once 'Zend/Service/Ebay/Exception.php'; + throw new Zend_Service_Ebay_Exception('Invalid options provided.'); + } + + return $options; + } + + /** + * Implements Name-value Syntax translator. + * + * Example: + * + * array( + * 'paginationInput' => array( + * 'entriesPerPage' => 5, + * 'pageNumber' => 2 + * ), + * 'itemFilter' => array( + * array( + * 'name' => 'MaxPrice', + * 'value' => 25, + * 'paramName' => 'Currency', + * 'paramValue' => 'USD' + * ), + * array( + * 'name' => 'FreeShippingOnly', + * 'value' => true + * ), + * array( + * 'name' => 'ListingType', + * 'value' => array( + * 'AuctionWithBIN', + * 'FixedPrice', + * 'StoreInventory' + * ) + * ) + * ), + * 'productId' => array( + * '' => 123, + * 'type' => 'UPC' + * ) + * ) + * + * this above is translated to + * + * array( + * 'paginationInput.entriesPerPage' => '5', + * 'paginationInput.pageNumber' => '2', + * 'itemFilter(0).name' => 'MaxPrice', + * 'itemFilter(0).value' => '25', + * 'itemFilter(0).paramName' => 'Currency', + * 'itemFilter(0).paramValue' => 'USD', + * 'itemFilter(1).name' => 'FreeShippingOnly', + * 'itemFilter(1).value' => '1', + * 'itemFilter(2).name' => 'ListingType', + * 'itemFilter(2).value(0)' => 'AuctionWithBIN', + * 'itemFilter(2).value(1)' => 'FixedPrice', + * 'itemFilter(2).value(2)' => 'StoreInventory', + * 'productId' => '123', + * 'productId.@type' => 'UPC' + * ) + * + * @param Zend_Config|array $options + * @link http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#nvsyntax + * @return array A simple array of strings + */ + protected function _optionsToNameValueSyntax($options) + { + $options = self::optionsToArray($options); + ksort($options); + $new = array(); + $runAgain = false; + foreach ($options as $name => $value) { + if (is_array($value)) { + // parse an array value, check if it is associative + $keyRaw = array_keys($value); + $keyNumber = range(0, count($value) - 1); + $isAssoc = count(array_diff($keyRaw, $keyNumber)) > 0; + // check for tag representation, like + // empty key refers to text value + // when there is a root tag, attributes receive flags + $hasAttribute = array_key_exists('', $value); + foreach ($value as $subName => $subValue) { + // generate new key name + if ($isAssoc) { + // named keys + $newName = $name; + if ($subName !== '') { + // when $subName is empty means that current value + // is the main value for the main key + $glue = $hasAttribute ? '.@' : '.'; + $newName .= $glue . $subName; + } + } else { + // numeric keys + $newName = $name . '(' . $subName . ')'; + } + // save value + if (is_array($subValue)) { + // it is necessary run this again, value is an array + $runAgain = true; + } else { + // parse basic type + $subValue = self::toEbayValue($subValue); + } + $new[$newName] = $subValue; + } + } else { + // parse basic type + $new[$name] = self::toEbayValue($value); + } + } + if ($runAgain) { + // this happens if any $subValue found is an array + $new = $this->_optionsToNameValueSyntax($new); + } + return $new; + } + + /** + * Translate native PHP values format to ebay format for request. + * + * Boolean is translated to "0" or "1", date object generates ISO 8601, + * everything else is translated to string. + * + * @param mixed $value + * @return string + */ + public static function toEbayValue($value) + { + if (is_bool($value)) { + $value = $value ? '1' : '0'; + } else if ($value instanceof Zend_Date) { + $value = $value->getIso(); + } else if ($value instanceof DateTime) { + $value = $value->format(DateTime::ISO8601); + } else { + $value = (string) $value; + } + return $value; + } + + /** + * Translate an ebay value format to native PHP type. + * + * @param string $value + * @param string $type + * @see http://developer.ebay.com/DevZone/finding/CallRef/types/simpleTypes.html + * @throws Zend_Service_Ebay_Finding_Exception When $type is not valid + * @return mixed + */ + public static function toPhpValue($value, $type) + { + switch ($type) { + // cast for: boolean + case 'boolean': + $value = (string) $value == 'true'; + break; + + // cast for: Amount, decimal, double, float, MeasureType + case 'float': + $value = floatval((string) $value); + break; + + // cast for: int, long + // integer type generates a string value, because 32 bit systems + // have an integer range of -2147483648 to 2147483647 + case 'integer': + // break intentionally omitted + + // cast for: anyURI, base64Binary, dateTime, duration, string, token + case 'string': + $value = (string) $value; + break; + + default: + /** + * @see Zend_Service_Ebay_Exception + */ + require_once 'Zend/Service/Ebay/Exception.php'; + throw new Zend_Service_Ebay_Exception("Invalid type '{$type}'."); + } + return $value; + } +}