Jag har tidigare jobbat mot många olika API:er, men för första gången har jag nu gjort en funktion som arbetar mot Starweb API. Uppdraget gick ut på att läsa av en excelfil och sen jämföra pris och leveransstatus i filen mot alla produkter som hämtades från Starweb. Om en ändring hade gjorts så skulle produkten uppdateras, så inga konstigheter med det. Det var heller inga problem att hämta alla produkter och gå igenom dem för att jämföra förändringar. Men när det kom till att uppdatera produkten började det tråkiga. Då det bara var pris som skulle uppdateras tänkte jag att det räcker med att skicka diverse ID samt priset i XML:en. Produkten uppdaterades, men tyvärr raderades alla parametrar för produkten. Efter kontakt med supporten på Starweb så visade det sig att man i princip behövde skicka med hela produktspecifikationen i XML:en, så som den såg ut när man hämtade den, men inte riktigt. Vissa saker, som kategori, skulle inte med och om det fanns tomma värden skulle inte de heller skickas med. Så istället för att lagra undan bara id på produkt som skulle uppdateras så fick hela produkten lagras och sen gå igenom en ”ränsa-funktion” innan den senare kunde skickas. Lite omständligt för att bara uppdatera prisinformationen tycker jag, något jag även framfört till dem på Starweb, och enligt dem så jobbar de på en ny version av API:et som ska vara klart i höst. Men för uppdraget gjordes ändå en lösning för denna version av API:et så att de nu smidigt kan köra uppdateringen av produkterna.

Lite exempel på hur kod kan se ut:

// CODE for include and start..

// Get all product and save it temporary
$log->reportInfo('Hämta alla produkter');
list($sResponse, $iHttpResponseCode) = restRequest('GET', '/products');
$starwebXml = new SimpleXMLElement($sResponse);
// Check If the XML status code indicate an error
if ($starwebXml->apiInfo->statusCode != 1) {
	$log->reportWarning(null, 'Hämtning misslyckad (' . $starwebXml->apiInfo->statusCode . ') ' . $starwebXml->apiInfo->statusMessage);
} else {
	// Save all producs from starweb
	$allProduct = array();
	foreach ($starwebXml->products->product as $oXmlProduct) {rr
		foreach ($oXmlProduct->models->model as $oXmlModel) {
			$allProduct[str_replace('P', '', $oXmlModel['id'])] = $oXmlProduct;
		}
	}
	// Get xls file
	$objPHPExcel = PHPExcel_IOFactory::load("supplier.xls");
	// Find correct columns
	$colArtecleNo = 'C';
	$colUtprisEx = 'H';
	$colInStockYesNo = 'M';
	$NoCorupt = 0;
	foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
		foreach ($worksheet->getRowIterator() as $row) {
			$cellIterator = $row->getCellIterator();
			$cellIterator->setIterateOnlyExistingCells(true);
			$articleNo = 0;
			$price = 0;
			$stocktypeInt = '';
			foreach ($cellIterator as $cell) {
				// CODE for check columns
			}

			// CODE for check if it should be updated.

			// Do the update in starweb
			if ($update && $productId != 0) {

				unset($product['id']);
				//create xml and remove not needed things for Starweb
				$xmlData = getCleanXML($product);

				// Do a put to Starweb
				list($sResponse, $iHttpResponseCode) = restRequest('PUT', '/products/' . $productId, $xmlData);
				$responsXml = new SimpleXMLElement($sResponse);
				// Check If the XML status code indicate an error
				if ($responsXml->apiInfo->statusCode != 1) {
					$log->reportWarning(null, 'Uppdatering av: ' . $productId . ' misslyckad (' . $starwebXml->apiInfo->statusCode . ') ' . $starwebXml->apiInfo->statusMessage);
				} else {
					$log->reportInfo('Produkt: ' . $productId . ', artikel: '. $articleNo.' uppdaterad');
				}
			}
		}
	}
	echo "Uppdateringen klar";
}

/*
 * Function for cleanup the XML file, for working wih Starweb API
 * @param SimpleXMLElement $product
 * @return XML
 */
function getCleanXML($product) {
	$doc = new DOMDocument;
	$doc->preserveWhiteSpace = false;
	$doc->loadxml($product->asXML());
	$xpath = new DOMXPath($doc);
	// Remove empty atrebute
	foreach ($xpath->query('//*[not(node())]') as $node) {
		$node->parentNode->removeChild($node);
	}
	// Remove category atrebutes
	$domNodeList = $doc->getElementsByTagname('categories');
	$domElemsToRemove = array();
	foreach ($domNodeList as $domElement) {
		$domElemsToRemove[] = $domElement;
	}
	foreach ($domElemsToRemove as $domElement) {
		$domElement->parentNode->removeChild($domElement);
	}
	//Remove name in attrebute and value
	$xpath2 = new DOMXPath($doc);
	foreach ($xpath2->query('/*/*/*/*/*/name') as $node) {
		$node->parentNode->removeChild($node);
	}
	$xpath3 = new DOMXPath($doc);
	foreach ($xpath3->query('/*/*/*/*/*/*/name') as $node) {
		$node->parentNode->removeChild($node);
	}

	$doc->formatOutput = true;
	$xmlData = $doc->savexml();
	$xmlData = str_replace('<?xml version="1.0"?>', '', $xmlData);
	$xmlData = str_replace('&#xF6;', 'ö', $xmlData);
	$xmlData = str_replace('&#xE4;', 'ä', $xmlData);
	$xmlData = str_replace('&#xE5;', 'å', $xmlData);

	return $xmlData;
}

Lämna en kommentar

Din e-mailadress kommer inte att lämnas ut. Obligatoriska fält är markerade med *

Lös matematiken (spamfilter) * Time limit is exhausted. Please reload the CAPTCHA.