AAAAinput;
$db = JFactory::getDbo();
$csvilog = $jinput->get('csvilog', null, null);
// Find the ICEcat ID
$q = "SELECT product_id
FROM ".$db->quoteName('#__csvi_icecat_index')." AS i
LEFT JOIN ".$db->quoteName('#__csvi_icecat_suppliers')." AS s
ON s.supplier_id = i.supplier_id
WHERE i.".$db->quoteName('prod_id')." = ".$db->Quote($mpn)."
AND s.".$db->quoteName('supplier_name')." = ".$db->Quote($mf_name);
$db->setQuery($q);
$csvilog->addDebug(JText::_('COM_CSVI_FIND_ICECAT_ID'), true);
$icecat_id = $db->loadResult();
// See if we have a match, otherwise try to search more liberal
if (!$icecat_id) {
$q = "SELECT product_id
FROM ".$db->quoteName('#__csvi_icecat_index')." AS i
LEFT JOIN ".$db->quoteName('#__csvi_icecat_suppliers')." AS s
ON s.supplier_id = i.supplier_id
WHERE i.".$db->quoteName('prod_id')." LIKE ".$db->Quote($mpn.'%')."
AND s.".$db->quoteName('supplier_name')." = ".$db->Quote($mf_name);
$db->setQuery($q);
$csvilog->addDebug(JText::_('COM_CSVI_FIND_ICECAT_ID'), true);
$icecat_id = $db->loadResult();
}
// See if we have an ICEcat ID
if ($icecat_id) {
// Setup the XML parser
if ($this->_setupXmlParser()) {
// Call ICEcat to get the data
$this->_callIcecat($icecat_id);
// See if we have any valid data
if ($this->_data) {
// Clean some data
$this->_csvi_data = array();
// Parse the XML data
if (!xml_parse($this->_xml_parser, $this->_data, true)) {
die(sprintf("XML error: %s at line %d\n",
xml_error_string(xml_get_error_code($this->_xml_parser)),
xml_get_current_line_number($this->_xml_parser)));
}
xml_parser_free($this->_xml_parser);
return $this->_csvi_data;
}
}
else return false;
}
else return false;
}
/**
* Process start elements
*
* @copyright
* @author RolandD
* @todo optimize building for specific imports
* @see
* @access private
* @param
* @return
* @since 3.0
*/
private function _startElement($parser, $tagname, $attribs) {
$jinput = JFactory::getApplication()->input;
$csvilog = $jinput->get('csvilog', null, null);
$tagname = strtolower($tagname);
if (count($this->_open_tags) >= 1) {
$parent_tag = $this->_open_tags[(count($this->_open_tags) - 1)];
}
else $parent_tag = '';
switch ($tagname) {
case 'product':
switch ($parent_tag) {
case 'productrelated':
// Related products
if (!array_key_exists('related_products', $this->_csvi_data)) $this->_csvi_data['related_products'] = '';
$this->_csvi_data['related_products'] .= $attribs['PROD_ID'].'|';
break;
default:
// See if we have an error
if (array_key_exists('CODE', $attribs) && $attribs['CODE'] == '-1') {
$csvilog->addDebug(JText::sprintf('COM_CSVI_ICECAT_ERROR_XML', $attribs['ERRORMESSAGE']));
}
else {
// Process the attributes
// SKU
$this->_csvi_data['product_sku'] = $attribs['PROD_ID'];
// Name
$this->_csvi_data['product_name'] = $attribs['NAME'];
// Images
$this->_csvi_data['file_url'] = $attribs['HIGHPIC'];
$this->_csvi_data['file_url_thumb'] = $attribs['THUMBPIC'];
// Release date comes int he form YYYY-MM-DD
if (strpos($attribs['RELEASEDATE'], '-')) {
list($year, $month, $day) = explode('-', $attribs['RELEASEDATE']);
$this->_csvi_data['product_available_date'] = $day.'/'.$month.'/'.$year;
}
}
break;
}
break;
case 'productfeature':
switch ($parent_tag) {
default:
$this->_csvi_data['pf'] = $attribs['PRESENTATION_VALUE'];
break;
}
break;
case 'name':
switch ($parent_tag) {
case 'category':
// Category
$this->_csvi_data['category_path'] = $attribs['VALUE'];
break;
case 'feature':
$find = array(' ', '/');
$feature = strtolower(str_replace($find, '_', $attribs['VALUE']));
$csvilog->addDebug(JText::sprintf('COM_CSVI_ICECAT_FOUND_FEATURE', $feature));
$this->_csvi_data[$feature] = $this->_csvi_data['pf'];
$this->_csvi_data['pf'] = null;
break;
}
break;
case 'productpicture':
if (!empty($attribs)) {
// Process the attribs
//
$this->_csvi_data['product_files_file_name'][] = $attribs['THUMBPIC'];
$this->_csvi_data['product_files_file_url'][] = $attribs['PIC'];
$this->_csvi_data['product_files_file_title'][] = basename($attribs['THUMBPIC']);
$this->_csvi_data['product_files_file_published'] = 'Y';
}
break;
case 'productdescription':
if (isset($attribs['LONGDESC'])) $this->_csvi_data['product_desc'] = str_ireplace('\n', '
', $attribs['LONGDESC']);
else $this->_csvi_data['product_desc'] = '';
if (isset($attribs['SHORTDESC'])) $this->_csvi_data['product_s_desc'] = $attribs['SHORTDESC'];
else $this->_csvi_data['product_s_desc'] = '';
break;
case 'shortsummarydescription':
// $this->_csvi_data['product_s_desc'] = '';
break;
case 'longsummarydescription':
// $this->_csvi_data['product_desc'] = '';
break;
case 'supplier':
$this->_csvi_data['manufacturer_name'] = $attribs['NAME'];
break;
case 'productdescription':
//
if (!empty($attribs['MANUALPDFURL'])) {
$this->_csvi_data['product_files_file_name'][] = $attribs['MANUALPDFURL'];
$this->_csvi_data['product_files_file_url'][] = $attribs['MANUALPDFURL'];
$this->_csvi_data['product_files_file_title'][] = basename($attribs['MANUALPDFURL']);
}
if (!empty($attribs['PDFURL'])) {
$this->_csvi_data['product_files_file_name'][] = $attribs['PDFURL'];
$this->_csvi_data['product_files_file_url'][] = $attribs['PDFURL'];
$this->_csvi_data['product_files_file_title'][] = basename($attribs['PDFURL']);
}
break;
default:
break;
}
// Add the tagname of the list of processing tags
$this->_open_tags[] = $tagname;
}
/**
* Process end elements
*
* @copyright
* @author RolandD
* @todo
* @see
* @access private
* @param
* @return
* @since 3.0
*/
private function _endElement($parser, $tagname) {
// Remove the current tag as we are done with it
array_pop($this->_open_tags);
}
/**
* Process the inner data
*
* @copyright
* @author RolandD
* @todo
* @see
* @access private
* @param
* @return
* @since 3.0
*/
private function _characterData($parser, $data) {
$current_tag = end($this->_open_tags);
switch ($current_tag) {
case 'shortsummarydescription':
// $this->_csvi_data['product_s_desc'] .= $data;
break;
case 'longsummarydescription':
// $this->_csvi_data['product_desc'] .= $data;
break;
}
}
/**
* Set up the XML parser
*
* @copyright
* @author RolandD
* @todo
* @see
* @access private
* @param
* @return
* @since 3.0
*/
private function _setupXmlParser() {
$this->_xml_parser = xml_parser_create("UTF-8");
xml_parser_set_option($this->_xml_parser, XML_OPTION_CASE_FOLDING, 1);
xml_set_object($this->_xml_parser, $this);
xml_set_element_handler($this->_xml_parser, "_startElement", "_endElement");
xml_set_character_data_handler($this->_xml_parser, "_characterData");
if ($this->_xml_parser) return true;
else return false;
}
/**
* Request the data from ICEcat
*
* There are different URLs to get the data from:
*
* Open ICEcat users have access to:
* http://data.icecat.biz/export/freexml.int/INT/ for access to the standardized data files (QUALITY=ICECAT).
* The language-specific data-files are found here:
* http://data.icecat.biz/export/freexml.int/[code]/[product_id].xml, where [code] stands e.g. for NL, EN, FR, DE, IT, ES, DK etc.
*
* For the Full ICEcat subscribers, a separate directory structure is in place. The standardized files are located at:
* http://data.icecat.biz/export/level4/INT
* and the language dependent versions are found here:
* http://data.icecat.biz/export/level4/[code]/[product_id].xml, where [code] stands e.g. for NL, EN, FR, DE, IT, ES, DK, etc. For
*
* Products need to be matched to a product file found at http://data.icecat.biz/export/freexml/EN/
*
* an index file with references to all product data-sheets in ICEcat or Open ICEcat, also historical/obsolete products
* files.index.csv|xml or files.index.csv.gz|xml.gz
* a smaller index file with only references to the new or changed product data-sheets of the respective day
* daily.index.csv|xml or daily.index.csv.gz|xml.gz
* an index file with only the products that are currently on the market, as far as we can see that based on 100s of distributor and reseller price files
* on_market.index.csv|xml or on_market.index.csv.gz|xml.gz)
* an index file with the products that are or were on the market for which we only have basic market data, but no complete data-sheet
* nobody.index.csv|xml or nobody.index.csv.gz|xml.gz
*
* @copyright
* @author RolandD
* @todo Check for gzip functionality to reduce filesize
* @see
* @access private
* @param string $icecat_id the ICEcat ID to retrieve
* @return
* @since 3.0
*/
private function _callIcecat($icecat_id) {
$jinput = JFactory::getApplication()->input;
$template = $jinput->get('template', null, null);
$csvilog = $jinput->get('csvilog', null, null);
$settings = new CsviSettings();
// Construct the URL
$url = ($settings->get('icecat.ice_advanced')) ? 'http://data.icecat.biz/export/level4/' : 'http://data.icecat.biz/export/freexml.int/';
// The language to use
$url .= $settings->get('icecat.ice_lang').'/';
// The ID to retrieve
$url .= $icecat_id.'.xml';
$csvilog->addDebug(JText::sprintf('COM_CSVI_CALL_ICECAT_URL', $url));
// Initialise the curl call
$curl = curl_init();
// set URL and other appropriate options
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, $settings->get('icecat.ice_username').":".$settings->get('icecat.ice_password'));
// grab URL and pass it to the browser
$this->_data = curl_exec($curl);
// close cURL resource, and free up system resources
curl_close($curl);
}
/**
* Supported ICEcat languages
*
* @copyright
* @author RolandD
* @todo
* @see
* @access public
* @param
* @return
* @since 3.0
*/
public function supportdLanguages() {
$codes = array();
$codes[] = 'INT'; // - International standardized version of a data-sheet. When QUALITY = ICEcat language independent values.
$codes[] = 'EN'; // Standard or UK English
$codes[] = 'US'; // US English
$codes[] = 'NL'; // Dutch
$codes[] = 'FR'; // French
$codes[] = 'DE'; // German
$codes[] = 'IT'; // Italian
$codes[] = 'ES'; // Spanish
$codes[] = 'DK'; // Danish
$codes[] = 'RU'; // Russian
$codes[] = 'PT'; // Portuguese
$codes[] = 'ZH'; // Chinese (simplified)
$codes[] = 'SE'; // Swedish
$codes[] = 'PL'; // Polish
$codes[] = 'CZ'; // Czech
$codes[] = 'HU'; // Hungarian
$codes[] = 'FI'; // Finnish
$codes[] = 'NO'; // Norwegian
$codes[] = 'TR'; // Turkish
$codes[] = 'BG'; // Bulgarian
$codes[] = 'KA'; // Georgian
$codes[] = 'RO'; // Romanian
$codes[] = 'SR'; // Serbian
$codes[] = 'JA'; // Japanese
$codes[] = 'UK'; // Ukrainian
$codes[] = 'CA'; // Catalan
$codes[] = 'HR'; // Croatian
return $codes;
}
}
?>