Blame | Letzte Änderung | Log anzeigen | RSS feed
<?phprequire_once 'GetAttributesCSRequestType.php';require_once 'GetAttributesCSResponseType.php';class EbatNs_CharacteristicSetDependencyLinker{private $_CharactericsSet = array();private $_AttributeSystemVersion;private $_proxy;private $_csIdent;private $_attribIdent;private $_valueIdent;public function __construct($proxy){$this->_proxy = $proxy;}public function getCharactericsSetArray(){return $this->_CharactericsSet;}public function getCharactericsSet($index){return $this->_CharactericsSet[$index];}public function getAttVersion(){return $this->_AttributeSystemVersion;}public function getCharactericsSetCount(){return count($this->_CharactericsSet);}// $csSetId could be either a single csSet-id or an array of idspublic function fetchByCsSetId($csSetId, $VersionOnly = false){if (is_array($csSetId)){foreach($csSetId as $setId)$this->_fetchCsSets($setId, $VersionOnly);}else$this->_fetchCsSets($csSetId, $VersionOnly);}// use $VersionOnly to populate only the version fieldspublic function fetchAll($VersionOnly = false){$this->_fetchCsSets(null, $VersionOnly);}// function to link the dependent attributes into their parent attribute valuesprivate function linkDependencies($attribList, $dependencies){// get each parent attributeid and the dependencies for each valueforeach($dependencies as $parentId => $parentValueArray){// reference to the parent attribute object$parentAttribObj = &$attribList[$parentId];// get each value of the parent attribute and the array of childsforeach($parentValueArray as $parentValue => $childIdArray)// get each attributeid of the childs and their arrays of valuesforeach($childIdArray as $childId => $childValueArrays)// sometimes we have multiple arrays of values with the same child attributeid// linking to valueid of the parent's attributeforeach($childValueArrays as $outerKey => $childValueArray){// pick a copy of the attribute for the child attributeidif (is_object($attribList[$childId]))// we have to use the clone keyword with brackets,// as PHP4 doesn't know this keyword. a function clone()// has to be defined in global scope. PHP5 ignores the// brackets and executes the internal "clone"$childAttribObj = clone($attribList[$childId]);else$childAttribObj = $attribList[$childId];// empty the values of the child attribute, since we don't need all// valueobjects of in the child attribute for the specific parent attribute$childAttribObj->getValueList()->setValue(array());// get the dependency type for a later rendering of the csset$dependencyType = $childValueArray[0];// get each valueobject to be linked to the parent attributes valueforeach($childValueArray[1] as $key => $childValueObj){// get the valueid of the childs valueonject$childValue = $childValueObj->getTypeAttribute('id');// pick the childs attribute value and reference it to the// parents value array$childAttribObj->getValueList()->setValue($attribList[$childId]->getValueList()->getValue($this->_valueIdent[$childId][$childValue]), $key);// unset the dependency object of the child attribute,// as we don't need it anymore$childAttribObj->setDependency(null);}// update the count value for the inserted child attribute values$childAttribObj->getValueList()->attributeValues['count'] = count($childAttribObj->getValueList()->getValue());// insert the dependency type to the child attribute object for a later rendering$childAttribObj->attributeValues['dependencyType'] = $dependencyType;// copy the child attribute object to the parent's attribute value object$parentAttribObj->getValueList()->getValue($this->_valueIdent[$parentId][$parentValue])->setDependencyList($childAttribObj, $outerKey);// unset the dependency object of the parent attribute,// as we don't need it anymore$parentAttribObj->setDependency(null);}}return $attribList;}// combine the working array of the linked attribute with the complete attributeData-section// of the GetAttributesCS-callprivate function combineCharacteristics($attributeData, $linkedAttribs){// get each linked attribute object and the cssetid it belongs toforeach($linkedAttribs as $linkedCharacteristicSetId => $linkedAttributeArray){// reference to the attribute array of the csset in the attributeData-section// of the GetAttributesCS-call$characteristicsListInitial = &$attributeData->getCharacteristics(0)->getCharacteristicsSet($this->_csIdent[$linkedCharacteristicSetId])->getCharacteristicsList()->getInitial();// empty the attribute array, since we have rebuilt all attributes in the working array$characteristicsListInitial = array();// get each linked attribute to copy it to the reference of the attributeDataforeach($linkedAttributeArray as $linkedAttribute)// don't copy attributes which are a child (have a parent attribute id),// since we have linked/inserted them to the parent attributesif (!isset($linkedAttribute->attributeValues['parentAttrId']))$characteristicsListInitial[] = $linkedAttribute;}return $attributeData;}// - build some arrays for an easy location of the sets, attributes and value// deep inside the characteristic sets// - copy all attributes and their dependencies to link them togetherprivate function manageDependencies($attributeData){// array to identify and locate the cssets$this->_csIdent = array();// pick up all cssets to link the dependent attributes of each set$characteristics = $attributeData->getCharacteristics();$CharacteristicsSets = $characteristics[0]->getCharacteristicsSet();foreach($CharacteristicsSets as $CharacteristicsSetKey => $CharacteristicsSet){// working array of all attributes in a set$copyAttribs = array();// working array of all dependencies between all attributes in a set$depArray = array();// array to identify and locate the attributes$this->_attribIdent = array();// array to identify and locate the attributevalues$this->_valueIdent = array();// save the array-keyids of each csset for an easy location$this->_csIdent[$CharacteristicsSet->attributeValues['id']] = $CharacteristicsSetKey;// pick up all attributes and dependencies in the set and copy them// to the working arrays$csAttribs = $CharacteristicsSet->getCharacteristicsList()->getInitial();foreach($csAttribs as $csAttribKey => $csAttrib){// save the array-keyids of each attribute for an easy location$this->_attribIdent[$csAttrib->attributeValues['id']] = $csAttribKey;// copy each attribute to the working array$copyAttribs[$csAttrib->attributeValues['id']] = $csAttrib;// pick up all attributevalues and dependencies of the attributeif ($csAttrib->getValueList()){// save the array-keyids of each value of the attribute// for an easy locationforeach($csAttrib->getValueList()->getValue() as $valueKey => $valueList)$this->_valueIdent[$csAttrib->attributeValues['id']][$valueList->attributeValues['id']] = $valueKey;}if ($csAttrib->getDependency()){// build the working array of all dependencies of the attributeforeach($csAttrib->getDependency() as $dependency)$depArray[$csAttrib->attributeValues['id']][$dependency->attributeValues['parentValueId']][$dependency->attributeValues['childAttrId']][] = array($dependency->attributeValues['type'], $dependency->getValue());}}// link all dependencies of a single csset to the attributes$linkedAttribs[$CharacteristicsSet->attributeValues['id']] = $this->linkDependencies($copyAttribs, $depArray);}// combine the linked working arrays of all cssets with the attributeData-section// of the GetAttributesCS-call$combinedCharacteristicSets = $this->combineCharacteristics($attributeData, $linkedAttribs);return $combinedCharacteristicSets;}// $CsIdToGet can be null (and so loading ALL CsSets)// use $VersionOnly to populate only the version fieldsprivate function _fetchCsSets($CsIdToGet, $VersionOnly = false){// so query the CharactericsSet ...$request = new GetAttributesCSRequestType();if ($CsIdToGet)$request->setAttributeSetID($CsIdToGet);if (!$VersionOnly){$request->setDetailLevel('ReturnAll');}$response = $this->_proxy->GetAttributesCS($request);$this->_AttributeSystemVersion = $response->getAttributeSystemVersion();if (!$VersionOnly){$attributeData = $response->getAttributeData();$parser = $this->_proxy->getParser('http://www.intradesys.com/Schemas/ebay/AttributeData_Extension.xsd');$parser->setExtensionPrefix('EbatNsCsSetExt_');$parserResponse = $parser->decode('eBay', '<?xml version="1.0" encoding="utf-8" ?>' . utf8_encode($attributeData), 3, 'EbatNsCsSetExt_AttributeDataType');$attributeDependencyData = $this->manageDependencies($parserResponse);$characteristics = $attributeDependencyData->getCharacteristics();$characteristics = $characteristics[0];$characteristicSets = $characteristics->getCharacteristicsSet();foreach($characteristicSets as $characteristicSet){$this->_CharactericsSet[$characteristicSet->attributeValues['id']] = $characteristicSet;}}}}?>