You are here

function amazon_item_clean_xml in Amazon Product Advertisement API 7.2

Same name and namespace in other branches
  1. 6 amazon.module \amazon_item_clean_xml()
  2. 7 amazon.module \amazon_item_clean_xml()

Take the Amazon XML item and turn it into our own private 'cleaned' data structure.

Parameters

$xml: XML structure as returned from Amazon API call.

Return value

'Cleaned' XML structure for local use.

3 calls to amazon_item_clean_xml()
amazon_search_simple_search in amazon_search/amazon_search.module
Perform the search.
_amazon_item_batch_lookup_from_web in ./amazon.module
Get 10 or less items from the AWS web service. AWS allows ONLY 10 items, See http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.ht....
_asin_devel_generate in asin/asin.module
Utility function that actually provides the values for asin_devel_generate().

File

./amazon.module, line 635

Code

function amazon_item_clean_xml($xml) {
  $metadata = amazon_data_cache();
  $item = array();

  // Pull the absolute basic information Amazon keeps at the top level
  // of the XML tree, cast to string, and move on.
  $item['asin'] = (string) $xml->ASIN;
  $item['locale'] = (string) $xml->locale;
  if (!empty($xml->ItemAttributes->ISBN)) {
    $item['isbn'] = (string) $xml->ItemAttributes->ISBN;
  }
  if (!empty($xml->ItemAttributes->EAN)) {
    $item['ean'] = (string) $xml->ItemAttributes->EAN;
  }
  $item['salesrank'] = intval($xml->SalesRank);
  $item['detailpageurl'] = (string) $xml->DetailPageURL;
  if (!empty($xml->ItemAttributes->ListPrice)) {
    $item['listpriceamount'] = intval($xml->ItemAttributes->ListPrice->Amount);
    $item['listpricecurrencycode'] = (string) $xml->ItemAttributes->ListPrice->CurrencyCode;
    $item['listpriceformattedprice'] = (string) $xml->ItemAttributes->ListPrice->FormattedPrice;
  }
  if (!empty($xml->OfferSummary->LowestNewPrice)) {

    // Lowest may be "too low to display" so we need to make it an integer
    $item['lowestpriceamount'] = intval($xml->OfferSummary->LowestNewPrice->Amount);
    $item['lowestpricecurrencycode'] = (string) $xml->OfferSummary->LowestNewPrice->CurrencyCode;
    $item['lowestpriceformattedprice'] = (string) $xml->OfferSummary->LowestNewPrice->FormattedPrice;
  }

  // Note that this one assumes we've searched with Merchant = Amazon.
  // Otherwise we can do an xpath search looking for the actual amazon listing.
  if (!empty($xml->Offers->Offer[0]->OfferListing->Price)) {
    $item['amazonpriceamount'] = intval($xml->Offers->Offer[0]->OfferListing->Price->Amount);
    $item['amazonpricecurrencycode'] = (string) $xml->Offers->Offer[0]->OfferListing->Price->CurrencyCode;
    $item['amazonpriceformattedprice'] = (string) $xml->Offers->Offer[0]->OfferListing->Price->FormattedPrice;
  }
  $participant_types = preg_split('/,/', AMAZON_PARTICIPANT_TYPES);

  // Pull in the basics of the ItemAttributes collection.
  foreach ((array) $xml->ItemAttributes as $key => $value) {
    if (is_string($value) && !in_array($key, $participant_types)) {
      $key = strtolower($key);
      $item[$key] = $value;
    }
  }

  // Handle the Authors/Artists/Etc.
  foreach ($participant_types as $key) {
    if (isset($xml->ItemAttributes->{$key})) {
      foreach ($xml->ItemAttributes->{$key} as $value) {
        $item[strtolower($key)][] = (string) $value;
        $item['participants'][] = (string) $value;
      }
    }
  }

  // Handle the product images. In theory, there could be a million different
  // product image types. We're only going to check for the most common ones
  // and ignore the rest for now.
  $supported_sizes = preg_split('/,/', AMAZON_IMAGE_SIZES);
  if (isset($xml->ImageSets->ImageSet)) {
    $ImageSets = (array) $xml->ImageSets;
    if (is_array($ImageSets['ImageSet'])) {
      if (isset($ImageSets['ImageSet'][0])) {
        $ImageSets = $ImageSets['ImageSet'];
        foreach ($ImageSets as $number => $set) {
          $set = (array) $set;
          if ($set['@attributes']['Category'] == 'primary') {
            $ImageSet = $set;
          }
        }
      }
    }
    else {
      $ImageSet = $ImageSets['ImageSet'];
    }
    foreach ($ImageSet as $key => $data) {
      if (in_array($key, $supported_sizes)) {
        $item['imagesets'][strtolower($key)] = array(
          'url' => (string) $data->URL,
          'height' => intval($data->Height),
          'width' => intval($data->Width),
        );
      }
    }
  }

  // Prepare XML Request ImageSets
  // $xml->ImageSets is an array of Images returned from amazon_http_request()
  if (isset($xml->ImageSets)) {

    // First, we loop through each ImageSet in the ImageSets array
    // Second, we loop through each image size ($supported_sizes) in the ImageSet
    // Finally, we store the imagesets in the $item array
    $i = 0;
    foreach ((array) $xml->ImageSets as $ImageSetKey => $ImageSets) {
      foreach ((array) $ImageSets as $ImageSetKey => $ImageSet) {
        $i++;
        $k = 0;
        $ImageSet = (array) $ImageSet;
        foreach ($ImageSet as $ImageSize => $imageData) {
          $k++;
          if (in_array($ImageSize, $supported_sizes)) {
            $item['imagesets_gallery'][strtolower($ImageSize) . '_gallery'][$i] = array(
              'url' => (string) $imageData->URL,
              'category' => (string) $ImageSet['@attributes']['Category'],
              'height' => intval($imageData->Height),
              'width' => intval($imageData->Width),
            );
          }
        }
      }
    }
  }

  // Handle the editorial reviews.
  if (isset($xml->EditorialReviews)) {
    foreach ($xml->EditorialReviews->EditorialReview as $data) {
      $item['editorialreviews'][] = array(
        'source' => (string) $data->Source,
        'content' => (string) $data->Content,
      );
    }
  }

  // And the customer reviews.
  if (isset($xml->CustomerReviews)) {
    $item['customerreviews_iframe'] = (string) $xml->CustomerReviews->IFrameURL;
  }

  // Give other modules an opportunity to pull out other bits of Amazon data
  // that would otherwise be ignored. We can't use module_invoke_all, as it
  // would lose the reference.
  foreach (module_implements('amazon_item_clean_xml') as $module) {
    $function = $module . '_amazon_item_clean_xml';
    $function($item, $xml);
  }
  return $item;
}