File indexing completed on 2024-12-22 05:37:02
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Service 0017 * @subpackage Ebay 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id: Abstract.php 22824 2010-08-09 18:59:54Z renanbr $ 0021 */ 0022 0023 /** 0024 * @category Zend 0025 * @package Zend_Service 0026 * @subpackage Ebay 0027 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0028 * @license http://framework.zend.com/license/new-bsd New BSD License 0029 */ 0030 abstract class Zend_Service_Ebay_Abstract 0031 { 0032 const OPTION_APP_ID = 'app_id'; 0033 const OPTION_GLOBAL_ID = 'global_id'; 0034 0035 /** 0036 * @var array 0037 */ 0038 protected $_options = array(); 0039 0040 /** 0041 * @var mixed 0042 */ 0043 protected $_client; 0044 0045 /** 0046 * @param Zend_Config|array $options 0047 * @return void 0048 */ 0049 public function __construct($options = null) 0050 { 0051 $options = self::optionsToArray($options); 0052 $this->setOption($options); 0053 } 0054 0055 /** 0056 * @param string|Zend_Config|array $name 0057 * @param mixed $value 0058 * @return Zend_Service_Ebay_Abstract Provides a fluent interface 0059 */ 0060 public function setOption($name, $value = null) 0061 { 0062 if ($name instanceof Zend_Config) { 0063 $name = $name->toArray(); 0064 } 0065 if (is_array($name)) { 0066 $this->_options = $name + $this->_options; 0067 } else { 0068 $this->_options[$name] = $value; 0069 } 0070 return $this; 0071 } 0072 0073 /** 0074 * @param string $name 0075 * @return mixed 0076 */ 0077 public function getOption($name = null) 0078 { 0079 if (null === $name) { 0080 return $this->_options; 0081 } 0082 if ($this->hasOption($name)) { 0083 return $this->_options[$name]; 0084 } 0085 return null; 0086 } 0087 0088 /** 0089 * @param string $name 0090 * @return boolean 0091 */ 0092 public function hasOption($name) 0093 { 0094 return array_key_exists($name, $this->_options); 0095 } 0096 0097 /** 0098 * @param mixed $client 0099 * @return Zend_Service_Ebay_Abstract Provides a fluent interface 0100 */ 0101 abstract public function setClient($client); 0102 0103 /** 0104 * @return mixed 0105 */ 0106 abstract public function getClient(); 0107 0108 /** 0109 * @param Zend_Config|array $options 0110 * @throws Zend_Service_Ebay_Finding_Exception When $options is not an array neither a Zend_Config object 0111 * @return array 0112 */ 0113 public static function optionsToArray($options) 0114 { 0115 if (null === $options) { 0116 $options = array(); 0117 } else if ($options instanceof Zend_Config) { 0118 $options = $options->toArray(); 0119 } 0120 0121 if (!is_array($options)) { 0122 /** 0123 * @see Zend_Service_Ebay_Exception 0124 */ 0125 // require_once 'Zend/Service/Ebay/Exception.php'; 0126 throw new Zend_Service_Ebay_Exception('Invalid options provided.'); 0127 } 0128 0129 return $options; 0130 } 0131 0132 /** 0133 * Implements Name-value Syntax translator. 0134 * 0135 * Example: 0136 * 0137 * array( 0138 * 'paginationInput' => array( 0139 * 'entriesPerPage' => 5, 0140 * 'pageNumber' => 2 0141 * ), 0142 * 'itemFilter' => array( 0143 * array( 0144 * 'name' => 'MaxPrice', 0145 * 'value' => 25, 0146 * 'paramName' => 'Currency', 0147 * 'paramValue' => 'USD' 0148 * ), 0149 * array( 0150 * 'name' => 'FreeShippingOnly', 0151 * 'value' => true 0152 * ), 0153 * array( 0154 * 'name' => 'ListingType', 0155 * 'value' => array( 0156 * 'AuctionWithBIN', 0157 * 'FixedPrice', 0158 * 'StoreInventory' 0159 * ) 0160 * ) 0161 * ), 0162 * 'productId' => array( 0163 * '' => 123, 0164 * 'type' => 'UPC' 0165 * ) 0166 * ) 0167 * 0168 * this above is translated to 0169 * 0170 * array( 0171 * 'paginationInput.entriesPerPage' => '5', 0172 * 'paginationInput.pageNumber' => '2', 0173 * 'itemFilter(0).name' => 'MaxPrice', 0174 * 'itemFilter(0).value' => '25', 0175 * 'itemFilter(0).paramName' => 'Currency', 0176 * 'itemFilter(0).paramValue' => 'USD', 0177 * 'itemFilter(1).name' => 'FreeShippingOnly', 0178 * 'itemFilter(1).value' => '1', 0179 * 'itemFilter(2).name' => 'ListingType', 0180 * 'itemFilter(2).value(0)' => 'AuctionWithBIN', 0181 * 'itemFilter(2).value(1)' => 'FixedPrice', 0182 * 'itemFilter(2).value(2)' => 'StoreInventory', 0183 * 'productId' => '123', 0184 * 'productId.@type' => 'UPC' 0185 * ) 0186 * 0187 * @param Zend_Config|array $options 0188 * @link http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#nvsyntax 0189 * @return array A simple array of strings 0190 */ 0191 protected function _optionsToNameValueSyntax($options) 0192 { 0193 $options = self::optionsToArray($options); 0194 ksort($options); 0195 $new = array(); 0196 $runAgain = false; 0197 foreach ($options as $name => $value) { 0198 if (is_array($value)) { 0199 // parse an array value, check if it is associative 0200 $keyRaw = array_keys($value); 0201 $keyNumber = range(0, count($value) - 1); 0202 $isAssoc = count(array_diff($keyRaw, $keyNumber)) > 0; 0203 // check for tag representation, like <name att="sometinhg"></value> 0204 // empty key refers to text value 0205 // when there is a root tag, attributes receive flags 0206 $hasAttribute = array_key_exists('', $value); 0207 foreach ($value as $subName => $subValue) { 0208 // generate new key name 0209 if ($isAssoc) { 0210 // named keys 0211 $newName = $name; 0212 if ($subName !== '') { 0213 // when $subName is empty means that current value 0214 // is the main value for the main key 0215 $glue = $hasAttribute ? '.@' : '.'; 0216 $newName .= $glue . $subName; 0217 } 0218 } else { 0219 // numeric keys 0220 $newName = $name . '(' . $subName . ')'; 0221 } 0222 // save value 0223 if (is_array($subValue)) { 0224 // it is necessary run this again, value is an array 0225 $runAgain = true; 0226 } else { 0227 // parse basic type 0228 $subValue = self::toEbayValue($subValue); 0229 } 0230 $new[$newName] = $subValue; 0231 } 0232 } else { 0233 // parse basic type 0234 $new[$name] = self::toEbayValue($value); 0235 } 0236 } 0237 if ($runAgain) { 0238 // this happens if any $subValue found is an array 0239 $new = $this->_optionsToNameValueSyntax($new); 0240 } 0241 return $new; 0242 } 0243 0244 /** 0245 * Translate native PHP values format to ebay format for request. 0246 * 0247 * Boolean is translated to "0" or "1", date object generates ISO 8601, 0248 * everything else is translated to string. 0249 * 0250 * @param mixed $value 0251 * @return string 0252 */ 0253 public static function toEbayValue($value) 0254 { 0255 if (is_bool($value)) { 0256 $value = $value ? '1' : '0'; 0257 } else if ($value instanceof Zend_Date) { 0258 $value = $value->getIso(); 0259 } else if ($value instanceof DateTime) { 0260 $value = $value->format(DateTime::ISO8601); 0261 } else { 0262 $value = (string) $value; 0263 } 0264 return $value; 0265 } 0266 0267 /** 0268 * Translate an ebay value format to native PHP type. 0269 * 0270 * @param string $value 0271 * @param string $type 0272 * @see http://developer.ebay.com/DevZone/finding/CallRef/types/simpleTypes.html 0273 * @throws Zend_Service_Ebay_Finding_Exception When $type is not valid 0274 * @return mixed 0275 */ 0276 public static function toPhpValue($value, $type) 0277 { 0278 switch ($type) { 0279 // cast for: boolean 0280 case 'boolean': 0281 $value = (string) $value == 'true'; 0282 break; 0283 0284 // cast for: Amount, decimal, double, float, MeasureType 0285 case 'float': 0286 $value = floatval((string) $value); 0287 break; 0288 0289 // cast for: int, long 0290 // integer type generates a string value, because 32 bit systems 0291 // have an integer range of -2147483648 to 2147483647 0292 case 'integer': 0293 // break intentionally omitted 0294 0295 // cast for: anyURI, base64Binary, dateTime, duration, string, token 0296 case 'string': 0297 $value = (string) $value; 0298 break; 0299 0300 default: 0301 /** 0302 * @see Zend_Service_Ebay_Exception 0303 */ 0304 // require_once 'Zend/Service/Ebay/Exception.php'; 0305 throw new Zend_Service_Ebay_Exception("Invalid type '{$type}'."); 0306 } 0307 return $value; 0308 } 0309 }