AAAAcsv.php000066600000022363151466041670006074 0ustar00input; // Column headers are always the first line of the file // 1. Store current position $curpos = $this->getFilePos(); if ($curpos > 0) { // 2. Go to the beginning of the file $this->setFilePos(0); } // 3. Read the line $jinput->set('columnheaders', $this->ReadNextLine()); if ($curpos > 0) { // 4. Set the position back $this->setFilePos($curpos); } $this->linepointer++; return true; } /** * Get the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return int current position in the file * @since 3.0 */ public function getFilePos() { return ftell($this->fp); } /** * Set the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param int $pos the position to move to * @return int 0 if success | -1 if not success * @since 3.0 */ public function setFilePos($pos) { return fseek($this->fp, $pos); } /** * Close the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function closeFile($removefolder=true) { fclose($this->fp); $this->_closed = true; parent::closeFile($removefolder); } /** * Read the next line in the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return array with the line of data read | false if data cannot be read * @since 3.0 */ public function readNextLine() { // Check if the file is still open if ($this->_closed) return; // Make sure we have delimiters if (is_null($this->_field_delimiter)) return false; // Load some settings $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $csvilog = $jinput->get('csvilog', null, null); $newdata = array(); // Ignore empty records $csvdata = array(0=>''); while (is_array($csvdata) && count($csvdata)==1 && $csvdata[0]=='') { if (!is_null($this->_text_enclosure)) $csvdata = fgetcsv($this->fp, 0, $this->_field_delimiter, $this->_text_enclosure); else $csvdata = fgetcsv($this->fp, 0, $this->_field_delimiter); } // Check if we can read the line correctly if (count($csvdata) == 1 && !$this->_checked_delimiter) { $current_field = $this->_field_delimiter; $current_text = $this->_text_enclosure; $this->_findDelimiters(true); if ($template->show_preview) { if ($current_field != $this->_field_delimiter) JError::raiseNotice(0, JText::sprintf('COM_CSVI_UNEQUAL_FIELD_DELIMITER', $current_field, $this->_field_delimiter)); if ($current_text != $this->_text_enclosure) JError::raiseNotice(0, JText::sprintf('COM_CSVI_UNEQUAL_TEXT_ENCLOSURE', $current_text, $this->_text_enclosure)); } else { if ($current_field != $this->_field_delimiter) $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_UNEQUAL_FIELD_DELIMITER', $current_field, $this->_field_delimiter)); if ($current_text != $this->_text_enclosure) $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_UNEQUAL_FIELD_DELIMITER', $current_field, $this->_field_delimiter)); } $this->_field_delimiter = $current_field; $this->_text_enclosure = $current_text; } if ($csvdata) { // Do BOM check if ($jinput->get('currentline', 0, 'int') == 1 || is_null($jinput->get('currentline', null, null))) { // Remove text delimiters as they are not recognized by fgetcsv $csvdata[0] = $this->_removeTextDelimiters($this->_checkBom($csvdata[0])); } $this->linepointer++; return $csvdata; } else return false; } /** * Process the file to import * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function processFile() { // Open the csv file $this->fp = fopen($this->filename, "r"); $this->_closed = false; // Load the delimiters $this->_findDelimiters(); return true; } /** * Find the delimiters used * * @copyright * @author RolandD * @todo * @see * @access private * @param bool $force Force to read the delimiters from the imported file * @return bool true if delimiters found | false if delimiters not found * @since 3.0 */ private function _findDelimiters($force=false) { $jinput = JFactory::getApplication()->input; if (!$this->_checked_delimiter) { $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); if (!$template->get('auto_detect_delimiters', 'general', true) && !$force) { // Set the field delimiter if (strtolower($template->get('field_delimiter', 'general')) == 't') $this->_field_delimiter = "\t"; else $this->_field_delimiter = $template->get('field_delimiter', 'general'); // Set the text enclosure $this->_text_enclosure = ($template->get('text_enclosure', 'general', '')) ? $template->get('text_enclosure', 'general') : null; } else { // Read the first line rewind($this->fp); $line = fgets($this->fp); // 1. Is the user using text enclosures $first_char = substr($line, 0, 1); $pattern = '/[a-zA-Z0-9_]/'; $matches = array(); preg_match($pattern, $first_char, $matches); if (count($matches) == 0) { // User is using text delimiter $this->_text_enclosure = $first_char; $csvilog->addDebug(JText::sprintf('COM_CSVI_FOUND_TEXT_ENCLOSURE', $first_char)); // 2. What field delimiter is being used $match_next_char = strpos($line, $this->_text_enclosure, 1); $second_char = substr($line, $match_next_char+1, 1); if ($first_char == $second_char) { $jinput->set('error_found', true); JError::raiseWarning(0, JText::_('COM_CSVI_CANNOT_FIND_TEXT_DELIMITER')); return false; } else { $this->_field_delimiter = $second_char; } } else { $totalchars = strlen($line); // 2. What field delimiter is being used for ($i = 0;$i <= $totalchars; $i++) { $current_char = substr($line, $i, 1); preg_match($pattern, $current_char, $matches); if (count($matches) == 0) { $this->_field_delimiter = $current_char; $i = $totalchars; } } } $csvilog->addDebug(JText::sprintf('COM_CSVI_FOUND_FIELD_DELIMITER', $this->_field_delimiter)); rewind($this->fp); } $this->_checked_delimiter = true; } return true; } /** * Checks if the uploaded file has a BOM * * If the uploaded file has a BOM, remove it since it only causes * problems on import. * * @copyright * @author RolandD * @todo * @see ReadNextLine() * @access private * @param string $data the string to check for a BOM * @return string return the cleaned string * @since 3.0 */ private function _checkBom($data) { // Check the first three characters if (strlen($data) > 3) { if (ord($data{0}) == 239 && ord($data{1}) == 187 && ord($data{2}) == 191) { return substr($data, 3, strlen($data)); } else return $data; } else return $data; } /** * Removes the text delimiters when fgetcsv() has failed to do so because the file contains a BOM. * This allows for the possibility that the data value contains embedded text enclosure characters * (which should be doubled up for correct csv file format). * The string [32" TV] (ignore brackets) should be encoded as ["32"" TV"] * This function correctly decodes ["32"" TV"] back to [32" TV] * * @copyright * @author doorknob * @todo * @see * @access private * @param string $data the string to clean * @return string the cleaned string * @since */ private function _removeTextDelimiters($data) { if( substr($data, 0, 1) == $this->_text_enclosure && substr($data, -1, 1) == $this->_text_enclosure ) { return str_replace($this->_text_enclosure.$this->_text_enclosure, $this->_text_enclosure, substr($data, 1, -1)); } else { return $data; } } /** * Sets the file pointer back to beginning * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function rewind() { $this->setFilePos(0); } } ?> xls.php000066600000006641151466041670006110 0ustar00data[0]['numRows']; } /** * Load the column headers from a file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return bool true * @since 3.0 */ public function loadColumnHeaders() { $jinput = JFactory::getApplication()->input; // Make sure we include the empty fields for ($i=1; $i<=$this->data[0]['numCols']; $i++) { if (!isset($this->data[0]['cells'][1])) $this->data[0]['cells'][1][$i] = ''; } $headers = array_values($this->data[0]['cells'][1]); $jinput->set('columnheaders', $headers); $this->linepointer++; return true; } /** * Get the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return int current position in the file * @since 3.0 */ public function getFilePos() { return $this->linepointer; } /** * Set the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param int $pos the position to move to * @return int current position in the file * @since 3.0 */ public function setFilePos($pos) { $this->linepointer = $pos; return $this->linepointer; } /** * Read the next line in the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return array with the line of data read | false if data cannot be read * @since 3.0 */ public function readNextLine() { if ($this->data[0]['numRows'] >= $this->linepointer) { $newdata = array(); // Make sure we include the empty fields for ($i=1; $i <= $this->data[0]['numCols']; $i++) { if (!isset($this->data[0]['cells'][$this->linepointer][$i])) $newdata[] = ''; else $newdata[] = $this->data[0]['cells'][$this->linepointer][$i]; } $this->linepointer++; return $newdata; } else return false; } /** * Process the file to import * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function processFile() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $this->fp = true; $this->data = new Spreadsheet_Excel_Reader($this->filename, false); $this->data = $this->data->sheets; return true; } /** * Sets the file pointer back to beginning * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function rewind() { $this->setFilePos(1); } } ?> ods.php000066600000010304151466041670006056 0ustar00data->rows; } /** * Load the column headers from a file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return bool true * @since 3.0 */ public function loadColumnHeaders() { $jinput = JFactory::getApplication()->input; $jinput->set('columnheaders', $this->data->_data[1]); $this->linepointer++; return true; } /** * Get the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return int current position in the file * @since 3.0 */ public function getFilePos() { return $this->linepointer; } /** * Set the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param int $pos the position to move to * @return int current position in the file * @since 3.0 */ public function setFilePos($pos) { $this->linepointer = $pos; return $this->linepointer; } /** * Read the next line in the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return array with the line of data read | false if data cannot be read * @since 3.0 */ public function readNextLine() { if ($this->data->rows >= $this->linepointer) { $newdata = array(); $newdata = $this->data->_data[$this->linepointer]; $this->linepointer++; return $newdata; } else return false; } /** * Process the file to import * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function processFile() { if (!$this->_unpacked) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); jimport('joomla.filesystem.file'); jimport('joomla.filesystem.archive'); $this->fp = true; $this->linepointer = 1; $this->data = new ODSParser(); // First we need to unpack the zipfile $unpackfile = $this->_unpackpath.'/ods/'.basename($this->filename).'.zip'; $importfile = $this->_unpackpath.'/ods/content.xml'; // Check the unpack folder JFolder::create($this->_unpackpath.'/ods'); // Delete the destination file if it already exists if (JFile::exists($unpackfile)) JFile::delete($unpackfile); if (JFile::exists($importfile)) JFile::delete($importfile); // Now copy the file to the folder JFile::copy($this->filename, $unpackfile); // Extract the files in the folder if (!JArchive::extract($unpackfile, $this->_unpackpath.'/ods')) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_CANNOT_UNPACK_ODS_FILE')); return false; } // File is always called content.xml else $this->filename = $importfile; // Read the data to process if (!$this->data->read($this->filename)) return false; // Set the unpacked to true as we have unpacked the file $this->_unpacked = true; } // All good return true return true; } /** * Sets the file pointer back to beginning * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function rewind() { // Set the line pointer to 1 as that is the first entry in the data array $this->setFilePos(1); } } ?> excel_reader2.php000066600000164101151466041670010002 0ustar00 * Maintained at http://code.google.com/p/php-excel-reader/ * * Format parsing and MUCH more contributed by: * Matt Roxburgh < http://www.roxburgh.me.uk > * * DOCUMENTATION * ============= * http://code.google.com/p/php-excel-reader/wiki/Documentation * * CHANGE LOG * ========== * http://code.google.com/p/php-excel-reader/wiki/ChangeHistory * * DISCUSSION/SUPPORT * ================== * http://groups.google.com/group/php-excel-reader-discuss/topics * * -------------------------------------------------------------------------- * * Originally developed by Vadim Tkachenko under the name PHPExcelReader. * (http://sourceforge.net/projects/phpexcelreader) * Based on the Java version by Andy Khan (http://www.andykhan.com). Now * maintained by David Sanders. Reads only Biff 7 and Biff 8 formats. * * PHP versions 4 and 5 * * LICENSE: This source file is subject to version 3.0 of the PHP license * that is available through the world-wide-web at the following URI: * http://www.php.net/license/3_0.txt. If you did not receive a copy of * the PHP License and are unable to obtain it through the web, please * send a note to license@php.net so we can mail you a copy immediately. * * @category Spreadsheet * @package Spreadsheet_Excel_Reader * @author Vadim Tkachenko * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version CVS: $Id: excel_reader2.php 1456 2010-12-05 11:31:17Z RolandD $ * @link http://pear.php.net/package/Spreadsheet_Excel_Reader * @see OLE, Spreadsheet_Excel_Writer * -------------------------------------------------------------------------- */ define('NUM_BIG_BLOCK_DEPOT_BLOCKS_POS', 0x2c); define('SMALL_BLOCK_DEPOT_BLOCK_POS', 0x3c); define('ROOT_START_BLOCK_POS', 0x30); define('BIG_BLOCK_SIZE', 0x200); define('SMALL_BLOCK_SIZE', 0x40); define('EXTENSION_BLOCK_POS', 0x44); define('NUM_EXTENSION_BLOCK_POS', 0x48); define('PROPERTY_STORAGE_BLOCK_SIZE', 0x80); define('BIG_BLOCK_DEPOT_BLOCKS_POS', 0x4c); define('SMALL_BLOCK_THRESHOLD', 0x1000); // property storage offsets define('SIZE_OF_NAME_POS', 0x40); define('TYPE_POS', 0x42); define('START_BLOCK_POS', 0x74); define('SIZE_POS', 0x78); define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1)); function GetInt4d($data, $pos) { $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); if ($value>=4294967294) { $value=-2; } return $value; } // http://uk.php.net/manual/en/function.getdate.php function gmgetdate($ts = null){ $k = array('seconds','minutes','hours','mday','wday','mon','year','yday','weekday','month',0); return(array_combine($k,explode(":",gmdate('s:i:G:j:w:n:Y:z:l:F:U',is_null($ts)?time():$ts)))); } function v($data,$pos) { return ord($data[$pos]) | ord($data[$pos+1])<<8; } class OLERead { var $data = ''; function OLERead(){ } function read($sFileName){ // check if file exist and is readable (Darko Miljanovic) if(!is_readable($sFileName)) { $this->error = 1; return false; } $this->data = @file_get_contents($sFileName); if (!$this->data) { $this->error = 1; return false; } if (substr($this->data, 0, 8) != IDENTIFIER_OLE) { $this->error = 1; return false; } $this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); $this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS); $this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS); $this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS); $this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS); $bigBlockDepotBlocks = array(); $pos = BIG_BLOCK_DEPOT_BLOCKS_POS; $bbdBlocks = $this->numBigBlockDepotBlocks; if ($this->numExtensionBlocks != 0) { $bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4; } for ($i = 0; $i < $bbdBlocks; $i++) { $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); $pos += 4; } for ($j = 0; $j < $this->numExtensionBlocks; $j++) { $pos = ($this->extensionBlock + 1)* BIG_BLOCK_SIZE; $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1); for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) { $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); $pos += 4; } $bbdBlocks += $blocksToRead; if ($bbdBlocks < $this->numBigBlockDepotBlocks) { $this->extensionBlock = GetInt4d($this->data, $pos); } } // readBigBlockDepot $pos = 0; $index = 0; $this->bigBlockChain = array(); for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) { $pos = ($bigBlockDepotBlocks[$i] + 1)* BIG_BLOCK_SIZE; //echo "pos = $pos"; for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) { $this->bigBlockChain[$index] = GetInt4d($this->data, $pos); $pos += 4 ; $index++; } } // readSmallBlockDepot(); $pos = 0; $index = 0; $sbdBlock = $this->sbdStartBlock; $this->smallBlockChain = array(); while ($sbdBlock != -2) { $pos = ($sbdBlock + 1)* BIG_BLOCK_SIZE; for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) { $this->smallBlockChain[$index] = GetInt4d($this->data, $pos); $pos += 4; $index++; } $sbdBlock = $this->bigBlockChain[$sbdBlock]; } // readData(rootStartBlock) $block = $this->rootStartBlock; $pos = 0; $this->entry = $this->__readData($block); $this->__readPropertySets(); } function __readData($bl) { $block = $bl; $pos = 0; $data = ''; while ($block != -2) { $pos = ($block + 1)* BIG_BLOCK_SIZE; $data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE); $block = $this->bigBlockChain[$block]; } return $data; } function __readPropertySets(){ $offset = 0; while ($offset < strlen($this->entry)) { $d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE); $nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8); $type = ord($d[TYPE_POS]); $startBlock = GetInt4d($d, START_BLOCK_POS); $size = GetInt4d($d, SIZE_POS); $name = ''; for ($i = 0; $i < $nameSize ; $i++) { $name .= $d[$i]; } $name = str_replace("\x00", "", $name); $this->props[] = array ( 'name' => $name, 'type' => $type, 'startBlock' => $startBlock, 'size' => $size); if ((strtolower($name) == "workbook") || ( strtolower($name) == "book")) { $this->wrkbook = count($this->props) - 1; } if ($name == "Root Entry") { $this->rootentry = count($this->props) - 1; } $offset += PROPERTY_STORAGE_BLOCK_SIZE; } } function getWorkBook(){ if ($this->props[$this->wrkbook]['size'] < SMALL_BLOCK_THRESHOLD){ $rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']); $streamData = ''; $block = $this->props[$this->wrkbook]['startBlock']; $pos = 0; while ($block != -2) { $pos = $block* SMALL_BLOCK_SIZE; $streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE); $block = $this->smallBlockChain[$block]; } return $streamData; }else{ $numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE; if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) { $numBlocks++; } if ($numBlocks == 0) return ''; $streamData = ''; $block = $this->props[$this->wrkbook]['startBlock']; $pos = 0; while ($block != -2) { $pos = ($block + 1)* BIG_BLOCK_SIZE; $streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE); $block = $this->bigBlockChain[$block]; } return $streamData; } } } define('SPREADSHEET_EXCEL_READER_BIFF8', 0x600); define('SPREADSHEET_EXCEL_READER_BIFF7', 0x500); define('SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS', 0x5); define('SPREADSHEET_EXCEL_READER_WORKSHEET', 0x10); define('SPREADSHEET_EXCEL_READER_TYPE_BOF', 0x809); define('SPREADSHEET_EXCEL_READER_TYPE_EOF', 0x0a); define('SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET', 0x85); define('SPREADSHEET_EXCEL_READER_TYPE_DIMENSION', 0x200); define('SPREADSHEET_EXCEL_READER_TYPE_ROW', 0x208); define('SPREADSHEET_EXCEL_READER_TYPE_DBCELL', 0xd7); define('SPREADSHEET_EXCEL_READER_TYPE_FILEPASS', 0x2f); define('SPREADSHEET_EXCEL_READER_TYPE_NOTE', 0x1c); define('SPREADSHEET_EXCEL_READER_TYPE_TXO', 0x1b6); define('SPREADSHEET_EXCEL_READER_TYPE_RK', 0x7e); define('SPREADSHEET_EXCEL_READER_TYPE_RK2', 0x27e); define('SPREADSHEET_EXCEL_READER_TYPE_MULRK', 0xbd); define('SPREADSHEET_EXCEL_READER_TYPE_MULBLANK', 0xbe); define('SPREADSHEET_EXCEL_READER_TYPE_INDEX', 0x20b); define('SPREADSHEET_EXCEL_READER_TYPE_SST', 0xfc); define('SPREADSHEET_EXCEL_READER_TYPE_EXTSST', 0xff); define('SPREADSHEET_EXCEL_READER_TYPE_CONTINUE', 0x3c); define('SPREADSHEET_EXCEL_READER_TYPE_LABEL', 0x204); define('SPREADSHEET_EXCEL_READER_TYPE_LABELSST', 0xfd); define('SPREADSHEET_EXCEL_READER_TYPE_NUMBER', 0x203); define('SPREADSHEET_EXCEL_READER_TYPE_NAME', 0x18); define('SPREADSHEET_EXCEL_READER_TYPE_ARRAY', 0x221); define('SPREADSHEET_EXCEL_READER_TYPE_STRING', 0x207); define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA', 0x406); define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA2', 0x6); define('SPREADSHEET_EXCEL_READER_TYPE_FORMAT', 0x41e); define('SPREADSHEET_EXCEL_READER_TYPE_XF', 0xe0); define('SPREADSHEET_EXCEL_READER_TYPE_BOOLERR', 0x205); define('SPREADSHEET_EXCEL_READER_TYPE_FONT', 0x0031); define('SPREADSHEET_EXCEL_READER_TYPE_PALETTE', 0x0092); define('SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN', 0xffff); define('SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR', 0x22); define('SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS', 0xE5); define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS' , 25569); define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904', 24107); define('SPREADSHEET_EXCEL_READER_MSINADAY', 86400); define('SPREADSHEET_EXCEL_READER_TYPE_HYPER', 0x01b8); define('SPREADSHEET_EXCEL_READER_TYPE_COLINFO', 0x7d); define('SPREADSHEET_EXCEL_READER_TYPE_DEFCOLWIDTH', 0x55); define('SPREADSHEET_EXCEL_READER_TYPE_STANDARDWIDTH', 0x99); define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%s"); /* * Main Class */ class Spreadsheet_Excel_Reader { // MK: Added to make data retrieval easier var $colnames = array(); var $colindexes = array(); var $standardColWidth = 0; var $defaultColWidth = 0; function myHex($d) { if ($d < 16) return "0" . dechex($d); return dechex($d); } function dumpHexData($data, $pos, $length) { $info = ""; for ($i = 0; $i <= $length; $i++) { $info .= ($i==0?"":" ") . $this->myHex(ord($data[$pos + $i])) . (ord($data[$pos + $i])>31? "[" . $data[$pos + $i] . "]":''); } return $info; } function getCol($col) { if (is_string($col)) { $col = strtolower($col); if (array_key_exists($col,$this->colnames)) { $col = $this->colnames[$col]; } } return $col; } // PUBLIC API FUNCTIONS // -------------------- function val($row,$col,$sheet=0) { $col = $this->getCol($col); if (array_key_exists($row,$this->sheets[$sheet]['cells']) && array_key_exists($col,$this->sheets[$sheet]['cells'][$row])) { return $this->sheets[$sheet]['cells'][$row][$col]; } return ""; } function value($row,$col,$sheet=0) { return $this->val($row,$col,$sheet); } function info($row,$col,$type='',$sheet=0) { $col = $this->getCol($col); if (array_key_exists('cellsInfo',$this->sheets[$sheet]) && array_key_exists($row,$this->sheets[$sheet]['cellsInfo']) && array_key_exists($col,$this->sheets[$sheet]['cellsInfo'][$row]) && array_key_exists($type,$this->sheets[$sheet]['cellsInfo'][$row][$col])) { return $this->sheets[$sheet]['cellsInfo'][$row][$col][$type]; } return ""; } function type($row,$col,$sheet=0) { return $this->info($row,$col,'type',$sheet); } function raw($row,$col,$sheet=0) { return $this->info($row,$col,'raw',$sheet); } function rowspan($row,$col,$sheet=0) { $val = $this->info($row,$col,'rowspan',$sheet); if ($val=="") { return 1; } return $val; } function colspan($row,$col,$sheet=0) { $val = $this->info($row,$col,'colspan',$sheet); if ($val=="") { return 1; } return $val; } function hyperlink($row,$col,$sheet=0) { $link = $this->sheets[$sheet]['cellsInfo'][$row][$col]['hyperlink']; if ($link) { return $link['link']; } return ''; } function rowcount($sheet=0) { return $this->sheets[$sheet]['numRows']; } function colcount($sheet=0) { return $this->sheets[$sheet]['numCols']; } function colwidth($col,$sheet=0) { // Col width is actually the width of the number 0. So we have to estimate and come close return $this->colInfo[$sheet][$col]['width']/9142*200; } function colhidden($col,$sheet=0) { return !!$this->colInfo[$sheet][$col]['hidden']; } function rowheight($row,$sheet=0) { return $this->rowInfo[$sheet][$row]['height']; } function rowhidden($row,$sheet=0) { return !!$this->rowInfo[$sheet][$row]['hidden']; } // GET THE CSS FOR FORMATTING // ========================== function style($row,$col,$sheet=0,$properties='') { $css = ""; $font=$this->font($row,$col,$sheet); if ($font!="") { $css .= "font-family:$font;"; } $align=$this->align($row,$col,$sheet); if ($align!="") { $css .= "text-align:$align;"; } $height=$this->height($row,$col,$sheet); if ($height!="") { $css .= "font-size:$height"."px;"; } $bgcolor=$this->bgColor($row,$col,$sheet); if ($bgcolor!="") { $bgcolor = $this->colors[$bgcolor]; $css .= "background-color:$bgcolor;"; } $color=$this->color($row,$col,$sheet); if ($color!="") { $css .= "color:$color;"; } $bold=$this->bold($row,$col,$sheet); if ($bold) { $css .= "font-weight:bold;"; } $italic=$this->italic($row,$col,$sheet); if ($italic) { $css .= "font-style:italic;"; } $underline=$this->underline($row,$col,$sheet); if ($underline) { $css .= "text-decoration:underline;"; } // Borders $bLeft = $this->borderLeft($row,$col,$sheet); $bRight = $this->borderRight($row,$col,$sheet); $bTop = $this->borderTop($row,$col,$sheet); $bBottom = $this->borderBottom($row,$col,$sheet); $bLeftCol = $this->borderLeftColor($row,$col,$sheet); $bRightCol = $this->borderRightColor($row,$col,$sheet); $bTopCol = $this->borderTopColor($row,$col,$sheet); $bBottomCol = $this->borderBottomColor($row,$col,$sheet); // Try to output the minimal required style if ($bLeft!="" && $bLeft==$bRight && $bRight==$bTop && $bTop==$bBottom) { $css .= "border:" . $this->lineStylesCss[$bLeft] .";"; } else { if ($bLeft!="") { $css .= "border-left:" . $this->lineStylesCss[$bLeft] .";"; } if ($bRight!="") { $css .= "border-right:" . $this->lineStylesCss[$bRight] .";"; } if ($bTop!="") { $css .= "border-top:" . $this->lineStylesCss[$bTop] .";"; } if ($bBottom!="") { $css .= "border-bottom:" . $this->lineStylesCss[$bBottom] .";"; } } // Only output border colors if there is an actual border specified if ($bLeft!="" && $bLeftCol!="") { $css .= "border-left-color:" . $bLeftCol .";"; } if ($bRight!="" && $bRightCol!="") { $css .= "border-right-color:" . $bRightCol .";"; } if ($bTop!="" && $bTopCol!="") { $css .= "border-top-color:" . $bTopCol . ";"; } if ($bBottom!="" && $bBottomCol!="") { $css .= "border-bottom-color:" . $bBottomCol .";"; } return $css; } // FORMAT PROPERTIES // ================= function format($row,$col,$sheet=0) { return $this->info($row,$col,'format',$sheet); } function formatIndex($row,$col,$sheet=0) { return $this->info($row,$col,'formatIndex',$sheet); } function formatColor($row,$col,$sheet=0) { return $this->info($row,$col,'formatColor',$sheet); } // CELL (XF) PROPERTIES // ==================== function xfRecord($row,$col,$sheet=0) { $xfIndex = $this->info($row,$col,'xfIndex',$sheet); if ($xfIndex!="") { return $this->xfRecords[$xfIndex]; } return null; } function xfProperty($row,$col,$sheet,$prop) { $xfRecord = $this->xfRecord($row,$col,$sheet); if ($xfRecord!=null) { return $xfRecord[$prop]; } return ""; } function align($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'align'); } function bgColor($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'bgColor'); } function borderLeft($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'borderLeft'); } function borderRight($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'borderRight'); } function borderTop($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'borderTop'); } function borderBottom($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'borderBottom'); } function borderLeftColor($row,$col,$sheet=0) { return $this->colors[$this->xfProperty($row,$col,$sheet,'borderLeftColor')]; } function borderRightColor($row,$col,$sheet=0) { return $this->colors[$this->xfProperty($row,$col,$sheet,'borderRightColor')]; } function borderTopColor($row,$col,$sheet=0) { return $this->colors[$this->xfProperty($row,$col,$sheet,'borderTopColor')]; } function borderBottomColor($row,$col,$sheet=0) { return $this->colors[$this->xfProperty($row,$col,$sheet,'borderBottomColor')]; } // FONT PROPERTIES // =============== function fontRecord($row,$col,$sheet=0) { $xfRecord = $this->xfRecord($row,$col,$sheet); if ($xfRecord!=null) { $font = $xfRecord['fontIndex']; if ($font!=null) { return $this->fontRecords[$font]; } } return null; } function fontProperty($row,$col,$sheet=0,$prop) { $font = $this->fontRecord($row,$col,$sheet); if ($font!=null) { return $font[$prop]; } return false; } function fontIndex($row,$col,$sheet=0) { return $this->xfProperty($row,$col,$sheet,'fontIndex'); } function color($row,$col,$sheet=0) { $formatColor = $this->formatColor($row,$col,$sheet); if ($formatColor!="") { return $formatColor; } $ci = $this->fontProperty($row,$col,$sheet,'color'); return $this->rawColor($ci); } function rawColor($ci) { if (($ci <> 0x7FFF) && ($ci <> '')) { return $this->colors[$ci]; } return ""; } function bold($row,$col,$sheet=0) { return $this->fontProperty($row,$col,$sheet,'bold'); } function italic($row,$col,$sheet=0) { return $this->fontProperty($row,$col,$sheet,'italic'); } function underline($row,$col,$sheet=0) { return $this->fontProperty($row,$col,$sheet,'under'); } function height($row,$col,$sheet=0) { return $this->fontProperty($row,$col,$sheet,'height'); } function font($row,$col,$sheet=0) { return $this->fontProperty($row,$col,$sheet,'font'); } // DUMP AN HTML TABLE OF THE ENTIRE XLS DATA // ========================================= function dump($row_numbers=false,$col_letters=false,$sheet=0,$table_class='excel') { $out = ""; if ($col_letters) { $out .= "\n\t"; if ($row_numbers) { $out .= "\n\t\t"; } for($i=1;$i<=$this->colcount($sheet);$i++) { $style = "width:" . ($this->colwidth($i,$sheet)*1) . "px;"; if ($this->colhidden($i,$sheet)) { $style .= "display:none;"; } $out .= "\n\t\t"; } $out .= "\n"; } $out .= "\n"; for($row=1;$row<=$this->rowcount($sheet);$row++) { $rowheight = $this->rowheight($row,$sheet); $style = "height:" . ($rowheight*(4/3)) . "px;"; if ($this->rowhidden($row,$sheet)) { $style .= "display:none;"; } $out .= "\n\t"; if ($row_numbers) { $out .= "\n\t\t"; } for($col=1;$col<=$this->colcount($sheet);$col++) { // Account for Rowspans/Colspans $rowspan = $this->rowspan($row,$col,$sheet); $colspan = $this->colspan($row,$col,$sheet); for($i=0;$i<$rowspan;$i++) { for($j=0;$j<$colspan;$j++) { if ($i>0 || $j>0) { $this->sheets[$sheet]['cellsInfo'][$row+$i][$col+$j]['dontprint']=1; } } } if(!$this->sheets[$sheet]['cellsInfo'][$row][$col]['dontprint']) { $style = $this->style($row,$col,$sheet); if ($this->colhidden($col,$sheet)) { $style .= "display:none;"; } $out .= "\n\t\t"; } } $out .= "\n"; } $out .= "
 " . strtoupper($this->colindexes[$i]) . "
$row 1?" colspan=$colspan":"") . ($rowspan > 1?" rowspan=$rowspan":"") . ">"; $val = $this->val($row,$col,$sheet); if ($val=='') { $val=" "; } else { $val = htmlentities($val); $link = $this->hyperlink($row,$col,$sheet); if ($link!='') { $val = "$val"; } } $out .= "".nl2br($val).""; $out .= "
"; return $out; } // -------------- // END PUBLIC API var $boundsheets = array(); var $formatRecords = array(); var $fontRecords = array(); var $xfRecords = array(); var $colInfo = array(); var $rowInfo = array(); var $sst = array(); var $sheets = array(); var $data; var $_ole; var $_defaultEncoding = "UTF-8"; var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT; var $_columnsFormat = array(); var $_rowoffset = 1; var $_coloffset = 1; /** * List of default date formats used by Excel */ var $dateFormats = array ( 0xe => "m/d/Y", 0xf => "M-d-Y", 0x10 => "d-M", 0x11 => "M-Y", 0x12 => "h:i a", 0x13 => "h:i:s a", 0x14 => "H:i", 0x15 => "H:i:s", 0x16 => "d/m/Y H:i", 0x2d => "i:s", 0x2e => "H:i:s", 0x2f => "i:s.S" ); /** * Default number formats used by Excel */ var $numberFormats = array( 0x1 => "0", 0x2 => "0.00", 0x3 => "#,##0", 0x4 => "#,##0.00", 0x5 => "\$#,##0;(\$#,##0)", 0x6 => "\$#,##0;[Red](\$#,##0)", 0x7 => "\$#,##0.00;(\$#,##0.00)", 0x8 => "\$#,##0.00;[Red](\$#,##0.00)", 0x9 => "0%", 0xa => "0.00%", 0xb => "0.00E+00", 0x25 => "#,##0;(#,##0)", 0x26 => "#,##0;[Red](#,##0)", 0x27 => "#,##0.00;(#,##0.00)", 0x28 => "#,##0.00;[Red](#,##0.00)", 0x29 => "#,##0;(#,##0)", // Not exactly 0x2a => "\$#,##0;(\$#,##0)", // Not exactly 0x2b => "#,##0.00;(#,##0.00)", // Not exactly 0x2c => "\$#,##0.00;(\$#,##0.00)", // Not exactly 0x30 => "##0.0E+0" ); var $colors = Array( 0x00 => "#000000", 0x01 => "#FFFFFF", 0x02 => "#FF0000", 0x03 => "#00FF00", 0x04 => "#0000FF", 0x05 => "#FFFF00", 0x06 => "#FF00FF", 0x07 => "#00FFFF", 0x08 => "#000000", 0x09 => "#FFFFFF", 0x0A => "#FF0000", 0x0B => "#00FF00", 0x0C => "#0000FF", 0x0D => "#FFFF00", 0x0E => "#FF00FF", 0x0F => "#00FFFF", 0x10 => "#800000", 0x11 => "#008000", 0x12 => "#000080", 0x13 => "#808000", 0x14 => "#800080", 0x15 => "#008080", 0x16 => "#C0C0C0", 0x17 => "#808080", 0x18 => "#9999FF", 0x19 => "#993366", 0x1A => "#FFFFCC", 0x1B => "#CCFFFF", 0x1C => "#660066", 0x1D => "#FF8080", 0x1E => "#0066CC", 0x1F => "#CCCCFF", 0x20 => "#000080", 0x21 => "#FF00FF", 0x22 => "#FFFF00", 0x23 => "#00FFFF", 0x24 => "#800080", 0x25 => "#800000", 0x26 => "#008080", 0x27 => "#0000FF", 0x28 => "#00CCFF", 0x29 => "#CCFFFF", 0x2A => "#CCFFCC", 0x2B => "#FFFF99", 0x2C => "#99CCFF", 0x2D => "#FF99CC", 0x2E => "#CC99FF", 0x2F => "#FFCC99", 0x30 => "#3366FF", 0x31 => "#33CCCC", 0x32 => "#99CC00", 0x33 => "#FFCC00", 0x34 => "#FF9900", 0x35 => "#FF6600", 0x36 => "#666699", 0x37 => "#969696", 0x38 => "#003366", 0x39 => "#339966", 0x3A => "#003300", 0x3B => "#333300", 0x3C => "#993300", 0x3D => "#993366", 0x3E => "#333399", 0x3F => "#333333", 0x40 => "#000000", 0x41 => "#FFFFFF", 0x43 => "#000000", 0x4D => "#000000", 0x4E => "#FFFFFF", 0x4F => "#000000", 0x50 => "#FFFFFF", 0x51 => "#000000", 0x7FFF => "#000000" ); var $lineStyles = array( 0x00 => "", 0x01 => "Thin", 0x02 => "Medium", 0x03 => "Dashed", 0x04 => "Dotted", 0x05 => "Thick", 0x06 => "Double", 0x07 => "Hair", 0x08 => "Medium dashed", 0x09 => "Thin dash-dotted", 0x0A => "Medium dash-dotted", 0x0B => "Thin dash-dot-dotted", 0x0C => "Medium dash-dot-dotted", 0x0D => "Slanted medium dash-dotted" ); var $lineStylesCss = array( "Thin" => "1px solid", "Medium" => "2px solid", "Dashed" => "1px dashed", "Dotted" => "1px dotted", "Thick" => "3px solid", "Double" => "double", "Hair" => "1px solid", "Medium dashed" => "2px dashed", "Thin dash-dotted" => "1px dashed", "Medium dash-dotted" => "2px dashed", "Thin dash-dot-dotted" => "1px dashed", "Medium dash-dot-dotted" => "2px dashed", "Slanted medium dash-dotte" => "2px dashed" ); function read16bitstring($data, $start) { $len = 0; while (ord($data[$start + $len]) + ord($data[$start + $len + 1]) > 0) $len++; return substr($data, $start, $len); } // ADDED by Matt Kruse for better formatting function _format_value($format,$num,$f) { // 49==TEXT format // http://code.google.com/p/php-excel-reader/issues/detail?id=7 if ( (!$f && $format=="%s") || ($f==49) || ($format=="GENERAL") ) { return array('string'=>$num, 'formatColor'=>null); } // Custom pattern can be POSITIVE;NEGATIVE;ZERO // The "text" option as 4th parameter is not handled $parts = explode(";",$format); $pattern = $parts[0]; // Negative pattern if (count($parts)>2 && $num==0) { $pattern = $parts[2]; } // Zero pattern if (count($parts)>1 && $num<0) { $pattern = $parts[1]; $num = abs($num); } $color = ""; $matches = array(); $color_regex = "/^\[(BLACK|BLUE|CYAN|GREEN|MAGENTA|RED|WHITE|YELLOW)\]/i"; if (preg_match($color_regex,$pattern,$matches)) { $color = strtolower($matches[1]); $pattern = preg_replace($color_regex,"",$pattern); } // In Excel formats, "_" is used to add spacing, which we can't do in HTML $pattern = preg_replace("/_./","",$pattern); // Some non-number characters are escaped with \, which we don't need $pattern = preg_replace("/\\\/","",$pattern); // Some non-number strings are quoted, so we'll get rid of the quotes $pattern = preg_replace("/\"/","",$pattern); // TEMPORARY - Convert # to 0 $pattern = preg_replace("/\#/","0",$pattern); // Find out if we need comma formatting $has_commas = preg_match("/,/",$pattern); if ($has_commas) { $pattern = preg_replace("/,/","",$pattern); } // Handle Percentages if (preg_match("/\d(\%)([^\%]|$)/",$pattern,$matches)) { $num = $num* 100; $pattern = preg_replace("/(\d)(\%)([^\%]|$)/","$1%$3",$pattern); } // Handle the number itself $number_regex = "/(\d+)(\.?)(\d*)/"; if (preg_match($number_regex,$pattern,$matches)) { $left = $matches[1]; $dec = $matches[2]; $right = $matches[3]; if ($has_commas) { $formatted = number_format($num,strlen($right)); } else { $sprintf_pattern = "%1.".strlen($right)."f"; $formatted = sprintf($sprintf_pattern, $num); } $pattern = preg_replace($number_regex, $formatted, $pattern); } return array( 'string'=>$pattern, 'formatColor'=>$color ); } /** * Constructor * * Some basic initialisation */ function Spreadsheet_Excel_Reader($file='',$store_extended_info=true,$outputEncoding='') { $this->_ole = new OLERead(); $this->setUTFEncoder('iconv'); if ($outputEncoding != '') { $this->setOutputEncoding($outputEncoding); } for ($i=1; $i<245; $i++) { $name = strtolower(( (($i-1)/26>=1)?chr(($i-1)/26+64):'') . chr(($i-1)%26+65)); $this->colnames[$name] = $i; $this->colindexes[$i] = $name; } $this->store_extended_info = $store_extended_info; if ($file!="") { $this->read($file); } } /** * Set the encoding method */ function setOutputEncoding($encoding) { $this->_defaultEncoding = $encoding; } /** * $encoder = 'iconv' or 'mb' * set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding * set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding */ function setUTFEncoder($encoder = 'iconv') { $this->_encoderFunction = ''; if ($encoder == 'iconv') { $this->_encoderFunction = function_exists('iconv') ? 'iconv' : ''; } elseif ($encoder == 'mb') { $this->_encoderFunction = function_exists('mb_convert_encoding') ? 'mb_convert_encoding' : ''; } } function setRowColOffset($iOffset) { $this->_rowoffset = $iOffset; $this->_coloffset = $iOffset; } /** * Set the default number format */ function setDefaultFormat($sFormat) { $this->_defaultFormat = $sFormat; } /** * Force a column to use a certain format */ function setColumnFormat($column, $sFormat) { $this->_columnsFormat[$column] = $sFormat; } /** * Read the spreadsheet file using OLE, then parse */ function read($sFileName) { $res = $this->_ole->read($sFileName); // oops, something goes wrong (Darko Miljanovic) if($res === false) { // check error code if($this->_ole->error == 1) { // bad file die('The filename ' . $sFileName . ' is not readable'); } // check other error codes here (eg bad fileformat, etc...) } $this->data = $this->_ole->getWorkBook(); $this->_parse(); } /** * Parse a workbook * * @access private * @return bool */ function _parse() { $pos = 0; $data = $this->data; $code = v($data,$pos); $length = v($data,$pos+2); $version = v($data,$pos+4); $substreamType = v($data,$pos+6); $this->version = $version; if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { return false; } if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){ return false; } $pos += $length + 4; $code = v($data,$pos); $length = v($data,$pos+2); while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF) { switch ($code) { case SPREADSHEET_EXCEL_READER_TYPE_SST: $spos = $pos + 4; $limitpos = $spos + $length; $uniqueStrings = $this->_GetInt4d($data, $spos+4); $spos += 8; for ($i = 0; $i < $uniqueStrings; $i++) { // Read in the number of characters if ($spos == $limitpos) { $opcode = v($data,$spos); $conlength = v($data,$spos+2); if ($opcode != 0x3c) { return -1; } $spos += 4; $limitpos = $spos + $conlength; } $numChars = ord($data[$spos]) | (ord($data[$spos+1]) << 8); $spos += 2; $optionFlags = ord($data[$spos]); $spos++; $asciiEncoding = (($optionFlags & 0x01) == 0) ; $extendedString = ( ($optionFlags & 0x04) != 0); // See if string contains formatting information $richString = ( ($optionFlags & 0x08) != 0); if ($richString) { // Read in the crun $formattingRuns = v($data,$spos); $spos += 2; } if ($extendedString) { // Read in cchExtRst $extendedRunLength = $this->_GetInt4d($data, $spos); $spos += 4; } $len = ($asciiEncoding)? $numChars : $numChars*2; if ($spos + $len < $limitpos) { $retstr = substr($data, $spos, $len); $spos += $len; } else{ // found countinue $retstr = substr($data, $spos, $limitpos - $spos); $bytesRead = $limitpos - $spos; $charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2)); $spos = $limitpos; while ($charsLeft > 0){ $opcode = v($data,$spos); $conlength = v($data,$spos+2); if ($opcode != 0x3c) { return -1; } $spos += 4; $limitpos = $spos + $conlength; $option = ord($data[$spos]); $spos += 1; if ($asciiEncoding && ($option == 0)) { $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); $retstr .= substr($data, $spos, $len); $charsLeft -= $len; $asciiEncoding = true; } elseif (!$asciiEncoding && ($option != 0)) { $len = min($charsLeft* 2, $limitpos - $spos); // min($charsLeft, $conlength); $retstr .= substr($data, $spos, $len); $charsLeft -= $len/2; $asciiEncoding = false; } elseif (!$asciiEncoding && ($option == 0)) { // Bummer - the string starts off as Unicode, but after the // continuation it is in straightforward ASCII encoding $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); for ($j = 0; $j < $len; $j++) { $retstr .= $data[$spos + $j].chr(0); } $charsLeft -= $len; $asciiEncoding = false; } else{ $newstr = ''; for ($j = 0; $j < strlen($retstr); $j++) { $newstr = $retstr[$j].chr(0); } $retstr = $newstr; $len = min($charsLeft* 2, $limitpos - $spos); // min($charsLeft, $conlength); $retstr .= substr($data, $spos, $len); $charsLeft -= $len/2; $asciiEncoding = false; } $spos += $len; } } //$retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr); $retstr = ($asciiEncoding) ? iconv('iso-8859-1', $this->_defaultEncoding, $retstr) : $this->_encodeUTF16($retstr); if ($richString){ $spos += 4* $formattingRuns; } // For extended strings, skip over the extended string data if ($extendedString) { $spos += $extendedRunLength; } $this->sst[]=$retstr; } break; case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS: return false; break; case SPREADSHEET_EXCEL_READER_TYPE_NAME: break; case SPREADSHEET_EXCEL_READER_TYPE_FORMAT: $indexCode = v($data,$pos+4); if ($version == SPREADSHEET_EXCEL_READER_BIFF8) { $numchars = v($data,$pos+6); if (ord($data[$pos+8]) == 0){ $formatString = substr($data, $pos+9, $numchars); } else { $formatString = substr($data, $pos+9, $numchars*2); } } else { $numchars = ord($data[$pos+6]); $formatString = substr($data, $pos+7, $numchars*2); } $this->formatRecords[$indexCode] = $formatString; break; case SPREADSHEET_EXCEL_READER_TYPE_FONT: $height = v($data,$pos+4); $option = v($data,$pos+6); $color = v($data,$pos+8); $weight = v($data,$pos+10); $under = ord($data[$pos+14]); $font = ""; // Font name $numchars = ord($data[$pos+18]); if ((ord($data[$pos+19]) & 1) == 0){ $font = substr($data, $pos+20, $numchars); } else { $font = substr($data, $pos+20, $numchars*2); $font = $this->_encodeUTF16($font); } $this->fontRecords[] = array( 'height' => $height / 20, 'italic' => !!($option & 2), 'color' => $color, 'under' => !($under==0), 'bold' => ($weight==700), 'font' => $font, 'raw' => $this->dumpHexData($data, $pos+3, $length) ); break; case SPREADSHEET_EXCEL_READER_TYPE_PALETTE: $colors = ord($data[$pos+4]) | ord($data[$pos+5]) << 8; for ($coli = 0; $coli < $colors; $coli++) { $colOff = $pos + 2 + ($coli* 4); $colr = ord($data[$colOff]); $colg = ord($data[$colOff+1]); $colb = ord($data[$colOff+2]); $this->colors[0x07 + $coli] = '#' . $this->myhex($colr) . $this->myhex($colg) . $this->myhex($colb); } break; case SPREADSHEET_EXCEL_READER_TYPE_XF: $fontIndexCode = (ord($data[$pos+4]) | ord($data[$pos+5]) << 8) - 1; $fontIndexCode = max(0,$fontIndexCode); $indexCode = ord($data[$pos+6]) | ord($data[$pos+7]) << 8; $alignbit = ord($data[$pos+10]) & 3; $bgi = (ord($data[$pos+22]) | ord($data[$pos+23]) << 8) & 0x3FFF; $bgcolor = ($bgi & 0x7F); // $bgcolor = ($bgi & 0x3f80) >> 7; $align = ""; if ($alignbit==3) { $align="right"; } if ($alignbit==2) { $align="center"; } $fillPattern = (ord($data[$pos+21]) & 0xFC) >> 2; if ($fillPattern == 0) { $bgcolor = ""; } $xf = array(); $xf['formatIndex'] = $indexCode; $xf['align'] = $align; $xf['fontIndex'] = $fontIndexCode; $xf['bgColor'] = $bgcolor; $xf['fillPattern'] = $fillPattern; $border = ord($data[$pos+14]) | (ord($data[$pos+15]) << 8) | (ord($data[$pos+16]) << 16) | (ord($data[$pos+17]) << 24); $xf['borderLeft'] = $this->lineStyles[($border & 0xF)]; $xf['borderRight'] = $this->lineStyles[($border & 0xF0) >> 4]; $xf['borderTop'] = $this->lineStyles[($border & 0xF00) >> 8]; $xf['borderBottom'] = $this->lineStyles[($border & 0xF000) >> 12]; $xf['borderLeftColor'] = ($border & 0x7F0000) >> 16; $xf['borderRightColor'] = ($border & 0x3F800000) >> 23; $border = (ord($data[$pos+18]) | ord($data[$pos+19]) << 8); $xf['borderTopColor'] = ($border & 0x7F); $xf['borderBottomColor'] = ($border & 0x3F80) >> 7; if (array_key_exists($indexCode, $this->dateFormats)) { $xf['type'] = 'date'; $xf['format'] = $this->dateFormats[$indexCode]; if ($align=='') { $xf['align'] = 'right'; } }elseif (array_key_exists($indexCode, $this->numberFormats)) { $xf['type'] = 'number'; $xf['format'] = $this->numberFormats[$indexCode]; if ($align=='') { $xf['align'] = 'right'; } }else{ $isdate = FALSE; $formatstr = ''; if ($indexCode > 0){ if (isset($this->formatRecords[$indexCode])) $formatstr = $this->formatRecords[$indexCode]; if ($formatstr!="") { $tmp = preg_replace("/\;.*/","",$formatstr); $tmp = preg_replace("/^\[[^\]]*\]/","",$tmp); if (preg_match("/[^hmsday\/\-:\s\\\,AMP]/i", $tmp) == 0) { // found day and time format $isdate = TRUE; $formatstr = $tmp; $formatstr = str_replace(array('AM/PM','mmmm','mmm'), array('a','F','M'), $formatstr); // m/mm are used for both minutes and months - oh SNAP! // This mess tries to fix for that. // 'm' == minutes only if following h/hh or preceding s/ss $formatstr = preg_replace("/(h:?)mm?/","$1i", $formatstr); $formatstr = preg_replace("/mm?(:?s)/","i$1", $formatstr); // A single 'm' = n in PHP $formatstr = preg_replace("/(^|[^m])m([^m]|$)/", '$1n$2', $formatstr); $formatstr = preg_replace("/(^|[^m])m([^m]|$)/", '$1n$2', $formatstr); // else it's months $formatstr = str_replace('mm', 'm', $formatstr); // Convert single 'd' to 'j' $formatstr = preg_replace("/(^|[^d])d([^d]|$)/", '$1j$2', $formatstr); $formatstr = str_replace(array('dddd','ddd','dd','yyyy','yy','hh','h'), array('l','D','d','Y','y','H','g'), $formatstr); $formatstr = preg_replace("/ss?/", 's', $formatstr); } } } if ($isdate){ $xf['type'] = 'date'; $xf['format'] = $formatstr; if ($align=='') { $xf['align'] = 'right'; } }else{ // If the format string has a 0 or # in it, we'll assume it's a number if (preg_match("/[0#]/", $formatstr)) { $xf['type'] = 'number'; if ($align=='') { $xf['align']='right'; } } else { $xf['type'] = 'other'; } $xf['format'] = $formatstr; $xf['code'] = $indexCode; } } $this->xfRecords[] = $xf; break; case SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR: $this->nineteenFour = (ord($data[$pos+4]) == 1); break; case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET: $rec_offset = $this->_GetInt4d($data, $pos+4); $rec_typeFlag = ord($data[$pos+8]); $rec_visibilityFlag = ord($data[$pos+9]); $rec_length = ord($data[$pos+10]); if ($version == SPREADSHEET_EXCEL_READER_BIFF8){ $chartype = ord($data[$pos+11]); if ($chartype == 0){ $rec_name = substr($data, $pos+12, $rec_length); } else { $rec_name = $this->_encodeUTF16(substr($data, $pos+12, $rec_length*2)); } }elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){ $rec_name = substr($data, $pos+11, $rec_length); } $this->boundsheets[] = array('name'=>$rec_name,'offset'=>$rec_offset); break; } $pos += $length + 4; $code = ord($data[$pos]) | ord($data[$pos+1])<<8; $length = ord($data[$pos+2]) | ord($data[$pos+3])<<8; } foreach ($this->boundsheets as $key=>$val){ $this->sn = $key; $this->_parsesheet($val['offset']); } return true; } /** * Parse a worksheet */ function _parsesheet($spos) { $cont = true; $data = $this->data; // read BOF $code = ord($data[$spos]) | ord($data[$spos+1])<<8; $length = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $version = ord($data[$spos + 4]) | ord($data[$spos + 5])<<8; $substreamType = ord($data[$spos + 6]) | ord($data[$spos + 7])<<8; if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { return -1; } if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){ return -2; } $spos += $length + 4; while($cont) { $lowcode = ord($data[$spos]); if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) break; $code = $lowcode | ord($data[$spos+1])<<8; $length = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $spos += 4; $this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1; $this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1; unset($this->rectype); switch ($code) { case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION: if (!isset($this->numRows)) { if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){ $this->sheets[$this->sn]['numRows'] = ord($data[$spos+2]) | ord($data[$spos+3]) << 8; $this->sheets[$this->sn]['numCols'] = ord($data[$spos+6]) | ord($data[$spos+7]) << 8; } else { $this->sheets[$this->sn]['numRows'] = ord($data[$spos+4]) | ord($data[$spos+5]) << 8; $this->sheets[$this->sn]['numCols'] = ord($data[$spos+10]) | ord($data[$spos+11]) << 8; } } break; case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS: $cellRanges = ord($data[$spos]) | ord($data[$spos+1])<<8; for ($i = 0; $i < $cellRanges; $i++) { $fr = ord($data[$spos + 8*$i + 2]) | ord($data[$spos + 8*$i + 3])<<8; $lr = ord($data[$spos + 8*$i + 4]) | ord($data[$spos + 8*$i + 5])<<8; $fc = ord($data[$spos + 8*$i + 6]) | ord($data[$spos + 8*$i + 7])<<8; $lc = ord($data[$spos + 8*$i + 8]) | ord($data[$spos + 8*$i + 9])<<8; if ($lr - $fr > 0) { $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1; } if ($lc - $fc > 0) { $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1; } } break; case SPREADSHEET_EXCEL_READER_TYPE_RK: case SPREADSHEET_EXCEL_READER_TYPE_RK2: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $rknum = $this->_GetInt4d($data, $spos + 6); $numValue = $this->_GetIEEE754($rknum); $info = $this->_getCellDetails($spos,$numValue,$column); $this->addcell($row, $column, $info['string'],$info); break; case SPREADSHEET_EXCEL_READER_TYPE_LABELSST: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $xfindex = ord($data[$spos+4]) | ord($data[$spos+5])<<8; $index = $this->_GetInt4d($data, $spos + 6); $this->addcell($row, $column, $this->sst[$index], array('xfIndex'=>$xfindex) ); break; case SPREADSHEET_EXCEL_READER_TYPE_MULRK: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $colFirst = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $colLast = ord($data[$spos + $length - 2]) | ord($data[$spos + $length - 1])<<8; $columns = $colLast - $colFirst + 1; $tmppos = $spos+4; for ($i = 0; $i < $columns; $i++) { $numValue = $this->_GetIEEE754($this->_GetInt4d($data, $tmppos + 2)); $info = $this->_getCellDetails($tmppos-4,$numValue,$colFirst + $i + 1); $tmppos += 6; $this->addcell($row, $colFirst + $i, $info['string'], $info); } break; case SPREADSHEET_EXCEL_READER_TYPE_NUMBER: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $tmp = unpack("ddouble", substr($data, $spos + 6, 8)); // It machine machine dependent if ($this->isDate($spos)) { $numValue = $tmp['double']; } else { $numValue = $this->createNumber($spos); } $info = $this->_getCellDetails($spos,$numValue,$column); $this->addcell($row, $column, $info['string'], $info); break; case SPREADSHEET_EXCEL_READER_TYPE_FORMULA: case SPREADSHEET_EXCEL_READER_TYPE_FORMULA2: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; if ((ord($data[$spos+6])==0) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) { //String formula. Result follows in a STRING record // This row/col are stored to be referenced in that record // http://code.google.com/p/php-excel-reader/issues/detail?id=4 $previousRow = $row; $previousCol = $column; } elseif ((ord($data[$spos+6])==1) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) { //Boolean formula. Result is in +2; 0=false,1=true // http://code.google.com/p/php-excel-reader/issues/detail?id=4 if (ord($this->data[$spos+8])==1) { $this->addcell($row, $column, "TRUE"); } else { $this->addcell($row, $column, "FALSE"); } } elseif ((ord($data[$spos+6])==2) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) { //Error formula. Error code is in +2; } elseif ((ord($data[$spos+6])==3) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) { //Formula result is a null string. $this->addcell($row, $column, ''); } else { // result is a number, so first 14 bytes are just like a _NUMBER record $tmp = unpack("ddouble", substr($data, $spos + 6, 8)); // It machine machine dependent if ($this->isDate($spos)) { $numValue = $tmp['double']; } else { $numValue = $this->createNumber($spos); } $info = $this->_getCellDetails($spos,$numValue,$column); $this->addcell($row, $column, $info['string'], $info); } break; case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $string = ord($data[$spos+6]); $this->addcell($row, $column, $string); break; case SPREADSHEET_EXCEL_READER_TYPE_STRING: // http://code.google.com/p/php-excel-reader/issues/detail?id=4 if ($version == SPREADSHEET_EXCEL_READER_BIFF8){ // Unicode 16 string, like an SST record $xpos = $spos; $numChars =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8); $xpos += 2; $optionFlags =ord($data[$xpos]); $xpos++; $asciiEncoding = (($optionFlags &0x01) == 0) ; $extendedString = (($optionFlags & 0x04) != 0); // See if string contains formatting information $richString = (($optionFlags & 0x08) != 0); if ($richString) { // Read in the crun $formattingRuns =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8); $xpos += 2; } if ($extendedString) { // Read in cchExtRst $extendedRunLength =$this->_GetInt4d($this->data, $xpos); $xpos += 4; } $len = ($asciiEncoding)?$numChars : $numChars*2; $retstr =substr($data, $xpos, $len); $xpos += $len; $retstr = ($asciiEncoding)? $retstr : $this->_encodeUTF16($retstr); } elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){ // Simple byte string $xpos = $spos; $numChars =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8); $xpos += 2; $retstr =substr($data, $xpos, $numChars); } $this->addcell($previousRow, $previousCol, $retstr); break; case SPREADSHEET_EXCEL_READER_TYPE_ROW: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $rowInfo = ord($data[$spos + 6]) | ((ord($data[$spos+7]) << 8) & 0x7FFF); if (($rowInfo & 0x8000) > 0) { $rowHeight = -1; } else { $rowHeight = $rowInfo & 0x7FFF; } $rowHidden = (ord($data[$spos + 12]) & 0x20) >> 5; $this->rowInfo[$this->sn][$row+1] = Array('height' => $rowHeight / 20, 'hidden'=>$rowHidden ); break; case SPREADSHEET_EXCEL_READER_TYPE_DBCELL: break; case SPREADSHEET_EXCEL_READER_TYPE_MULBLANK: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $cols = ($length / 2) - 3; for ($c = 0; $c < $cols; $c++) { $xfindex = ord($data[$spos + 4 + ($c* 2)]) | ord($data[$spos + 5 + ($c* 2)])<<8; $this->addcell($row, $column + $c, "", array('xfIndex'=>$xfindex)); } break; case SPREADSHEET_EXCEL_READER_TYPE_LABEL: $row = ord($data[$spos]) | ord($data[$spos+1])<<8; $column = ord($data[$spos+2]) | ord($data[$spos+3])<<8; $this->addcell($row, $column, substr($data, $spos + 8, ord($data[$spos + 6]) | ord($data[$spos + 7])<<8)); break; case SPREADSHEET_EXCEL_READER_TYPE_EOF: $cont = false; break; case SPREADSHEET_EXCEL_READER_TYPE_HYPER: // Only handle hyperlinks to a URL $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; $row2 = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; $column = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8; $column2 = ord($this->data[$spos+6]) | ord($this->data[$spos+7])<<8; $linkdata = Array(); $flags = ord($this->data[$spos + 28]); $udesc = ""; $ulink = ""; $uloc = 32; $linkdata['flags'] = $flags; if (($flags & 1) > 0 ) { // is a type we understand // is there a description ? if (($flags & 0x14) == 0x14 ) { // has a description $uloc += 4; $descLen = ord($this->data[$spos + 32]) | ord($this->data[$spos + 33]) << 8; $udesc = substr($this->data, $spos + $uloc, $descLen* 2); $uloc += 2* $descLen; } $ulink = $this->read16bitstring($this->data, $spos + $uloc + 20); if ($udesc == "") { $udesc = $ulink; } } $linkdata['desc'] = $udesc; $linkdata['link'] = $this->_encodeUTF16($ulink); for ($r=$row; $r<=$row2; $r++) { for ($c=$column; $c<=$column2; $c++) { $this->sheets[$this->sn]['cellsInfo'][$r+1][$c+1]['hyperlink'] = $linkdata; } } break; case SPREADSHEET_EXCEL_READER_TYPE_DEFCOLWIDTH: $this->defaultColWidth = ord($data[$spos+4]) | ord($data[$spos+5]) << 8; break; case SPREADSHEET_EXCEL_READER_TYPE_STANDARDWIDTH: $this->standardColWidth = ord($data[$spos+4]) | ord($data[$spos+5]) << 8; break; case SPREADSHEET_EXCEL_READER_TYPE_COLINFO: $colfrom = ord($data[$spos+0]) | ord($data[$spos+1]) << 8; $colto = ord($data[$spos+2]) | ord($data[$spos+3]) << 8; $cw = ord($data[$spos+4]) | ord($data[$spos+5]) << 8; $cxf = ord($data[$spos+6]) | ord($data[$spos+7]) << 8; $co = ord($data[$spos+8]); for ($coli = $colfrom; $coli <= $colto; $coli++) { $this->colInfo[$this->sn][$coli+1] = Array('width' => $cw, 'xf' => $cxf, 'hidden' => ($co & 0x01), 'collapsed' => ($co & 0x1000) >> 12); } break; default: break; } $spos += $length; } if (!isset($this->sheets[$this->sn]['numRows'])) $this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow']; if (!isset($this->sheets[$this->sn]['numCols'])) $this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol']; } function isDate($spos) { $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; return ($this->xfRecords[$xfindex]['type'] == 'date'); } // Get the details for a particular cell function _getCellDetails($spos,$numValue,$column) { $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; $xfrecord = $this->xfRecords[$xfindex]; $type = $xfrecord['type']; $format = $xfrecord['format']; $formatIndex = $xfrecord['formatIndex']; $fontIndex = $xfrecord['fontIndex']; $formatColor = ""; $rectype = ''; $string = ''; $raw = ''; if (isset($this->_columnsFormat[$column + 1])){ $format = $this->_columnsFormat[$column + 1]; } if ($type == 'date') { // See http://groups.google.com/group/php-excel-reader-discuss/browse_frm/thread/9c3f9790d12d8e10/f2045c2369ac79de $rectype = 'date'; // Convert numeric value into a date $utcDays = floor($numValue - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS)); $utcValue = ($utcDays)* SPREADSHEET_EXCEL_READER_MSINADAY; $dateinfo = gmgetdate($utcValue); $raw = $numValue; $fractionalDay = $numValue - floor($numValue) + .0000001; // The .0000001 is to fix for php/excel fractional diffs $totalseconds = floor(SPREADSHEET_EXCEL_READER_MSINADAY* $fractionalDay); $secs = $totalseconds % 60; $totalseconds -= $secs; $hours = floor($totalseconds / (60* 60)); $mins = floor($totalseconds / 60) % 60; $string = date ($format, mktime($hours, $mins, $secs, $dateinfo["mon"], $dateinfo["mday"], $dateinfo["year"])); } else if ($type == 'number') { $rectype = 'number'; $formatted = $this->_format_value($format, $numValue, $formatIndex); $string = $formatted['string']; $formatColor = $formatted['formatColor']; $raw = $numValue; } else{ if ($format=="") { $format = $this->_defaultFormat; } $rectype = 'unknown'; $formatted = $this->_format_value($format, $numValue, $formatIndex); $string = $formatted['string']; $formatColor = $formatted['formatColor']; $raw = $numValue; } return array( 'string'=>$string, 'raw'=>$raw, 'rectype'=>$rectype, 'format'=>$format, 'formatIndex'=>$formatIndex, 'fontIndex'=>$fontIndex, 'formatColor'=>$formatColor, 'xfIndex'=>$xfindex ); } function createNumber($spos) { $rknumhigh = $this->_GetInt4d($this->data, $spos + 10); $rknumlow = $this->_GetInt4d($this->data, $spos + 6); $sign = ($rknumhigh & 0x80000000) >> 31; $exp = ($rknumhigh & 0x7ff00000) >> 20; $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); $mantissalow1 = ($rknumlow & 0x80000000) >> 31; $mantissalow2 = ($rknumlow & 0x7fffffff); $value = $mantissa / pow( 2 , (20- ($exp - 1023))); if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023))); $value += $mantissalow2 / pow (2 , (52 - ($exp - 1023))); if ($sign) {$value = -1* $value;} return $value; } function addcell($row, $col, $string, $info=null) { $this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset); $this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset); $this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string; if ($this->store_extended_info && $info) { foreach ($info as $key=>$val) { $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset][$key] = $val; } } } function _GetIEEE754($rknum) { if (($rknum & 0x02) != 0) { $value = $rknum >> 2; } else { //mmp // I got my info on IEEE754 encoding from // http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html // The RK format calls for using only the most significant 30 bits of the // 64 bit floating point value. The other 34 bits are assumed to be 0 // So, we use the upper 30 bits of $rknum as follows... $sign = ($rknum & 0x80000000) >> 31; $exp = ($rknum & 0x7ff00000) >> 20; $mantissa = (0x100000 | ($rknum & 0x000ffffc)); $value = $mantissa / pow( 2 , (20- ($exp - 1023))); if ($sign) { $value = -1* $value; } //end of changes by mmp } if (($rknum & 0x01) != 0) { $value /= 100; } return $value; } function _encodeUTF16($string) { $result = $string; if ($this->_defaultEncoding){ switch ($this->_encoderFunction){ case 'iconv' : $result = @iconv('UTF-16LE', $this->_defaultEncoding, $string); break; case 'mb_convert_encoding' : $result = @mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' ); break; } } return $result; } function _GetInt4d($data, $pos) { $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); if ($value>=4294967294) { $value=-2; } return $value; } } ?> xml.php000066600000065441151466041670006105 0ustar00_getXmlFields() == true) { $jinput = JFactory::getApplication()->input; $jinput->set('columnheaders', $this->_xml_fields); return true; } else { /** * Note: clearing the value when no fields found causes a problem when processing * XML files with the 'use headers' option set because the function is called after the * end of file has been reached. When an empty set of fields is returned, the program * fails to terminate properly and loops endlessly through the import continuation page. */ return false; } } /** * Get the file position * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return int current position in the file * @since 3.0 */ public function getFilePos() { return $this->linepointer; } /** * Set the file position * * To be able to set the file position correctly, the XML reader needs to be at the start of the file * * @copyright * @author RolandD * @todo * @see * @access public * @param int $pos the position to move to * @return int current position in the file * @since 3.0 */ public function setFilePos($pos) { // Close the XML reader $this->closeFile(false); // Open a new XML reader $this->processFile(); // Move the pointer to the specified position return $this->_skipXmlRecords($pos); } /** * Close the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function closeFile($removefolder=true) { $this->data->close(); $this->_xml_cache = false; $this->_closed = true; parent::closeFile($removefolder); } /** * Read the next line in the file * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return array with the line of data read | false if data cannot be read * @since 3.0 */ public function readNextLine() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $csvilog->addDebug('Reading next line'); if ($this->_getXmlData() == true) { $this->linepointer++; return $this->_xml_data; } else { return false; } } /** * Process the file to import * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function processFile() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Use a streaming approach to support large files $this->data = new XMLReader(); $this->fp = $this->data->open($this->filename); if ($this->fp == false) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_ERROR_XML_READING_FILE')); return false; } // File opened successfully - Prepare the arrays needed to read data from the XML file $this->fp = $this->_getXmlSchema(); if ($this->fp == false) { $this->closeFile(); $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_INVALID_TABLE')); return false; } return true; } /** * Searches an XML file for a series of nodes representing a complete record. The name(s) of the nodes representing records * must be supplied (via the 'xml_nodes_map' field) but the list of fields can be supplied in three ways: * 1 No fields defined in the 'xml_nodes_map' field and the 'use headers' option set to 'off'. Despite the 'use headers' being set * to 'off', the field nodes in the first record are used to configure the whole run. This requires that all fields be present in * every record, the node names match the field names and that all of the 'field' nodes are one level below the 'record' node in * the XML hierarchy. * 2 No fields defined in the 'xml_nodes_map' field and the 'use headers' option set to 'on'. This causes the 'headers to be read * from the XML nodes for every record. This is suitable if not all of the fields are populated for every record in the XML file * but is slower than option 1. * 3 Fields defined in the 'xml_nodes_map' field. The 'use headers' option is ignored. This gives the flexibility to set up a map * so that an XML hierarchy can be modelled, node names to be mapped to field names and also allows fields to be extracted from * node attributes. * * It is possible that the current node when the function is called is the start of the next record. * Valid 'record' node names are held in the $this->_xml_records array. * Valid 'field' node and attribute names are held in the $this->_xml_schema array. * The arrays $this->_xml_data and $this->_xml_fields are populated with data and field names respectively. To prevent SQL errors * when writing the data to the table, only fields found in the array $this->_supported_fields are included. This function could be * extended. * * @copyright * @author doorknob * @todo * @see * @access private * @param * @return bool - indicates whether the array $this->_xml_data was populated. * @since 3.0 */ private function _getXmlFieldsAndData() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Initialise the arrays that will receive the data and field list from the next record $this->_xml_data = array(); $this->_xml_fields = array(); // Validation checking disabled because a DTD (or RELAX NG) schema is required and is usually not available $validate_xml = false; if( $validate_xml == true ) { // Note: When the DTD is external, this must be done before the first read() $this->data->setParserProperty(XMLReader::VALIDATE, true); } /** * Search for the start of the next record but only read the file if the next record is not already current * Must be the correct element type (start of node) and in the list of valid record nodes. * Note: Self closing notes are accepted because they may contain data in the attributes */ if (!$this->_isXmlRecordNode($this->data->nodeType, $this->data->name)) { // Either no current node or the current node is not the start of a record while( $this->data->read() ) { if( $validate_xml == true ) { $this->fp = $this->data->isValid(); if( $this->fp == false ){ $this->closeFile(); $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_FILE_INVALID')); return false; } } if( $this->_isXmlRecordNode( $this->data->nodeType, $this->data->name ) ) { // Record node found break; } } } // Check whether a record was found if ($this->_isXmlRecordNode($this->data->nodeType, $this->data->name)) { // Start of a valid record $self_closing = $this->data->isEmptyElement; $record_name = strtolower($this->data->name); // Extract any attributes, if defined if (isset($this->_xml_schema[$record_name]['attrs']) ) { // Record level attributes are defined as fields while( $this->data->moveToNextAttribute() ) { // Check each attribute to determine whether the value should be extracted if( isset($this->_xml_schema[$record_name]['attrs'][strtolower($this->data->name)]) ) { $this->_xml_fields[] = $this->_xml_schema[$record_name]['attrs'][strtolower($this->data->name)]; $this->_xml_data[] = $this->data->value; } } } if ($self_closing == false) { // Now search for group/field nodes $xml_path = array(); /** * Note: $this->data->next() is used rather than $this->data->read() when the readInnerXML() function has been used * to extract the contents of a node. Because the contect extracted may contain other nodes,$this->data->next() is * used to skip to the closing node. * readInnerXML() is used in case the data contains html tags but it doesn't move the file pointer. * Subsequently using $this->data->next() forces the pointer to skip past any HTML tags that have already been read. * The value does not need to be maintained between between calls to this function because readInnerXML() is * never used immediately before exiting the function. */ $use_read = true; while ($use_read == true ? $this->data->read() : $this->data->next() ) { // XML error detection if ($validate_xml == true) { $this->fp = $this->data->isValid(); if( $this->fp == false ){ $this->closeFile(); $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_FILE_INVALID')); return false; } } // Default to a reading a single node in the next loop $use_read = true; // Searching for a group or field node if ($this->data->nodeType == XMLReader::ELEMENT) { // New node found $self_closing = $this->data->isEmptyElement; if (empty($this->_xml_schema)) { // Template fields being used to control the data extraction if ($this->_isXmlFieldNameValid($this->data->name)) { // Node corresponding to a supported field found - extract the data $this->_xml_fields[] = strtolower($this->data->name); $xmldata = $this->data->readInnerXML(); $xmldata = str_ireplace(array(''), '', $xmldata); $this->_xml_data[] = $xmldata; // At the next read, skip to the next node at this level $use_read = false; } else { // A node has been found that does not match the available fields list $csvilog->addDebug(JText::sprintf('COM_CSVI_XML_NODE_NOT_MATCH_FIELD', $this->data->name)); } } else { // The user defined map is being used to control the data extraction $current_path = $this->_getXmlNodePath($xml_path, strtolower($this->data->name)); // The node may have attributes that map to fields, regardless of the type of node if (isset($this->_xml_schema[$record_name]['nodes'][$current_path]['attrs'])) { // Node has attributes that are defined as fields while ($this->data->moveToNextAttribute()) { // Check each attribute to determine whether the value should be extracted if( isset($this->_xml_schema[$record_name]['nodes'][$current_path]['attrs'][strtolower($this->data->name)]) ) { $this->_xml_fields[] = $this->_xml_schema[$record_name]['nodes'][$current_path]['attrs'][strtolower($this->data->name)]; $xmldata = $this->data->readInnerXML(); $xmldata = str_ireplace(array(''), '', $xmldata); $this->_xml_data[] = $xmldata; // At the next read, skip to the next node at this level $use_read = false; } } } if (empty($this->_xml_schema[$record_name]['nodes'][$current_path]['field'])) { // This node is not defined as a field if (isset($this->_xml_schema[$record_name]['nodes'][$current_path]['field'])) { // This is a 'group' node - add it to the path unless it is self closing if( $self_closing == false ) { $this->_pushXmlNodePath( $xml_path, $this->data->name ); } } else { // Unknown node found - The file is not mapped correctly and the run cannot continue $csvilog->addDebug(JText::sprintf('COM_CSVI_XML_UNMAPPED_NODE', $this->data->name)); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_XML_UNDEFINED_NODE', $this->data->name)); return false; } } else { // This node is defined as a field - extract the data $this->_xml_fields[] = $this->_xml_schema[$record_name]['nodes'][$current_path]['field']; $xmldata = $this->data->readInnerXML(); $xmldata = str_ireplace(array(''), '', $xmldata); $this->_xml_data[] = $xmldata; // At the next read, skip to the next node at this level $use_read = false; } } } else if ($this->data->nodeType == XMLReader::END_ELEMENT) { // Searching for the end of the record or the end of a group node if( strtolower($this->data->name) == $record_name ) { // End of record found break; } else { // End of node - Only valid case is the end of a group node if( !empty($this->_xml_schema) && !empty($xml_path) && $xml_path[count($xml_path)-1] == strtolower($this->data->name) ) { // End of group node found - pop it from the stack $this->_popXmlNodePath( $xml_path ); } else { // Unknown end of node - error $csvilog->addDebug(JText::sprintf('COM_CSVI_XML_UNEXPECTED_END_NODE', $this->data->name)); } } } } } } $this->_xml_cache = !empty($this->_xml_data); return $this->_xml_cache; } /** * Returns a boolean value to indicate whether the specified node is a new XML record type. * * @copyright * @author doorknob * @todo * @see * @access private * @param * @return bool true if record is a node | false if record is not a node * @since 3.0 */ private function _isXmlRecordNode( $node_type, $node_name ) { return ($node_type == XMLReader::ELEMENT && in_array(strtolower($node_name), $this->_xml_records)); } /** * Returns the list of data values found in the most recently read XML record. If the getXmlFields() function has been * called since the last call of this function, the cache may be full and the data can be returned without reading the file. * * @return array - The list of data values from the most recently read XML record (empty when end of file is reached) */ private function _getXmlData() { $return = !empty($this->_xml_data); if( $this->_xml_cache == false ) { $return = $this->_getXmlFieldsAndData(); } // Indicate that a new record will be required the next time this function is called $this->_xml_cache = false; return $return; } /** * Returns the list of fields found in the most recently read XML record. If the cache is empty, the next record is * read from the input file to ensure that the headers correspond with the data (in XML files, each record can have a * different set of 'headers'). Checking the status of the cache indicator also prevents records being skipped if this * function is called multiple times between records. * * @return array - The list of fields from the most recently read XML record (empty when end of file is reached) */ private function _getXmlFields() { $return = !empty($this->_xml_fields); if ($this->_xml_cache == false) { $return = $this->_getXmlFieldsAndData(); } return $return; } /** * Skips through the XML file until the the required number 'record' nodes has been read * Assume the file pointer is at the start of file * * @copyright * @author doorknob, RolandD * @todo * @see * @access private * @param * @return boolean true if records are skipped | false if records are not skipped * @since 3.0 */ private function _skipXmlRecords($pos) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check whether the pointer needs to be moved if ($pos <= 0) return true; $count = 0; /** * Note: When the DTD is external, this must be done before the first read() * Validation not used because invalid files generate php errors when validated */ $validate_xml = false; if( $validate_xml == true ) { $this->data->setParserProperty(XMLReader::VALIDATE, true); } while ($this->data->read()) { // Validation checking disabled because a DTD (or RELAX NG) schema is required and is usually not available if( $validate_xml == true ) { $this->fp = $this->data->isValid(); if( $this->fp == false ){ $this->closeFile(); $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_INVALID')); return false; } } // Searching for a valid record - must be the start of a node and in the list of valid record types if( !$this->_isXmlRecordNode( $this->data->nodeType, $this->data->name ) ) { // Not found - try again continue; } else { // Found a valid record while( $this->_isXmlRecordNode( $this->data->nodeType, $this->data->name ) ) { // Node is a valid record type - skip to the end of the record $this->data->next(); $count++; if( $count == $pos) { return true; } } } } // Hit EOF before skipping the required number of records return false; } /** * Build an array of xml nodes from the user defined map: * * $this->_xml_schema[record_node]['attrs'][attr_name] => field name * $this->_xml_schema[record_node]['nodes'][field_node_path]['attrs'][attr_name] => field name * $this->_xml_schema[record_node]['nodes'][field_node_path]['field'] => field name * Note: field_node_path is a comma separated list of node names below the record node * * @return bool returns true if all fine else false */ private function _getXmlSchema() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $xml_nodes_map = $template->get('xml_nodes_map', 'general', '', 'string', JREQUEST_ALLOWRAW); $xml_node_path = array(); // Single copy of this array that is passed by reference only $current_record = ''; // Single copy of this variable that is passed by reference only return $this->_getXmlNode($xml_nodes_map, $current_record, $xml_node_path); } /** * Process a node from the XML Map * It is permitted for the XML to just define one or more tables without fields (when the 'use headers' option is used) * * Note: Calls itself recursively to process a tree * * @return bool returns true if all fine else false */ private function _getXmlNode($node_content, $current_record, $xml_path) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $current_node = ''; $xml_schema = new XMLReader(); /** * Add a wrapper to make the XML viable and ensure that self closing tags contain a space before the '/>' * The XML may still be invalid but that's down to what the user entered */ $node_content = "\n".$node_content.''; $xml_schema->XML($node_content); // XML file to table map is valid XML - construct the arrays used in file extraction $use_read = true; // The XML could only be validated against a DTD if the syntax of the XML used for the map is made more complex $validate_xml = false; if ($validate_xml == true) { // Note: When the DTD is external, the property value must be set before the first read() $xml_schema->setParserProperty(XMLReader::VALIDATE, true); } while($use_read ? $xml_schema->read() : $xml_schema->next()) { // Validation checking disabled because a DTD (or RELAX NG) schema is required. if ($validate_xml == true) { if( $xml_schema->isValid() == false ){ $xml_schema->close(); return false; } } // Default to a reading a single node in the next loop $use_read = true; // Ignore any node associated with the root if ($xml_schema->name == 'da_root' ) { continue; } // Process start elements if ($xml_schema->nodeType == XMLReader::ELEMENT) { $self_closing = $xml_schema->isEmptyElement; // Ready to add a new node - but only if the last node was closed if (!empty($current_node)) { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_XML_NODE_UNCLOSED', $current_node)); return false; } // A new node was found - Check whether this is a new record type if (empty($current_record)) { // New record type // Check for a self-closing node $self_closing = $xml_schema->isEmptyElement; $current_record = strtolower($xml_schema->name); $this->_xml_records[] = strtolower($current_record); // Store any attributes while ($xml_schema->moveToNextAttribute()) { // Note1: $xml_schema->hasValue only indicates whether the element can have a value, not whether it does // Note2: empty($xml_schema->value) always return true, regardless of the actual value $value = $xml_schema->value; if( !empty($value) ) { if( $this->_isXmlFieldNameValid($xml_schema->value) ) { $this->_xml_schema[$current_record]['attrs'][strtolower($xml_schema->name)] = trim($xml_schema->value); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_XML_FILE_MAP_NO_REFERENCE', $xml_schema->value)); $xml_schema->close(); return false; } } } // Check for a self-closing node if( $self_closing == true ) { $current_record = ''; } } else { // New field type $current_node = strtolower($xml_schema->name); $current_path = $this->_getXmlNodePath($xml_path, $current_node); // Store any attributes while ($xml_schema->moveToNextAttribute()) { // Note1: $xml_schema->hasValue only indicates whether the element can have a value, not whether it does // Note2: empty($xml_schema->value) always return true, regardless of the actual value $value = $xml_schema->value; if( !empty($value) ) { if( $this->_isXmlFieldNameValid( $xml_schema->value ) ) { $this->_xml_schema[$current_record]['nodes'][$current_path]['attrs'][strtolower($xml_schema->name)] = trim($xml_schema->value); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_FILE_MAP_NO_REFERENCE', $xml_schema->value)); $xml_schema->close(); return false; } } } $sub_node_content = $xml_schema->readInnerXML(); // Check whether there are any lower level nodes if (strstr($sub_node_content, '<') === false) { /** * Content has no embedded nodes - Assume a field name * Note: An empty node gives a blank field name which indicates an unwanted node * that is being mapped to prevent errors when processing the file */ if ($this->_isXmlFieldNameValid($sub_node_content)) { $this->_xml_schema[$current_record]['nodes'][$current_path]['field'] = trim($sub_node_content); } else { $this->_xml_schema[$current_record]['nodes'][$current_path]['field'] = ''; } } else { // There are embedded nodes - go down another level // Indicate a 'group' node by storing an empty field name $this->_xml_schema[$current_record]['nodes'][$current_path]['field'] = ''; // Push the node name to the path stack $this->_pushXmlNodePath($xml_path, $current_node); if( $this->_getXmlNode($sub_node_content, $current_record, $xml_path) == false ) { $xml_schema->close(); return false; } // At the next read, skip to the next node at this level $use_read = false; // Close the node $current_node = ''; // Pop the last item off the path stack $this->_popXmlNodePath($xml_path); } // Check for a self-closing node if ($self_closing == true) { $current_node = ''; } } } // Process end elements else if( $xml_schema->nodeType == XMLReader::END_ELEMENT ) { // End of node found // Check for end of record if( !empty($current_record) && strtolower($xml_schema->name) == $current_record ) { // End of record detected $current_record = ''; } // Check that the expected node was closed else if( !empty($current_node) && strtolower($xml_schema->name) == $current_node ) { // End of current node detected $current_node = ''; } } } $xml_schema->close(); // Node not terminated if (!empty($current_node) ) { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_XML_NODE_NOT_CLOSED', $current_node)); return false; } if (empty($this->_xml_records) ) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_XML_NO_RECORDS_DEFINED')); return false; } return true; } /** * Create a string to represent the XML node hierarchy from the 'record' node to a 'field' node * * @return string */ private function _getXmlNodePath($xml_path, $node_name) { return implode(',', $xml_path).(empty($xml_path) ? '' : ',').$node_name; } /** * Determines whether a specific field name is included in the list of * * @return boolean */ private function _isXmlFieldNameValid($field_name) { return in_array(strtolower($field_name), $this->_supported_fields); } /** * Add a new entry to the XML node stack */ private function _pushXmlNodePath($xml_path, $node_name) { /** * Note: The array index is made explicit because when a new row is added, the index value * assigned is one greater than that previously assigned. When enries are being continuously * added and removed, the automatically assigned index number becomes unpredictable */ $xml_path[count($xml_path)] = strtolower($node_name); } /** * Remove the last entry from the XML node stack * * @copyright * @author doorknob * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _popXmlNodePath($xml_path) { if( count($xml_path) > 1 ) { unset($xml_path[count($xml_path)-1]); } else { $xml_path = array(); } } /** * Sets the file pointer back to beginning * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function rewind() { $this->linepointer = 0; } /** * Advances the file pointer 1 forward * * @copyright * @author RolandD * @todo * @see * @access public * @param bool $preview True if called from the preview * @return * @since 3.0 */ public function next($preview=false) { if (!$preview) $discard = $this->readNextLine(); } } ?> index.html000066600000000054151466041670006556 0ustar00ods_reader.php000066600000011626151466041670007410 0ustar00 */ public function read($filename) { $this->_file = $filename; list($this->_xml_parser, $fp) = $this->new_xml_parser($this->_file); if (!$this->_xml_parser) { die("could not open XML input"); } $data = ''; while (!feof($fp)) { $data .= fread($fp, 4096); } fclose($fp); if (!xml_parse($this->_xml_parser, $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); $this->cols = count($this->_data[1]); $this->rows = count($this->_data); return true; } /** * Handle the opening element */ private function startElement($parser, $tagname, $attribs) { switch ($tagname) { case 'TABLE:TABLE-ROW': $this->_linecount++; break; case 'TABLE:TABLE-CELL': $styles = array_keys($attribs); if (empty($styles)) { $this->_data[$this->_linecount]['options']['repeat'] = 1; } else { foreach ($styles as $stylekey => $style) { switch ($style) { case 'TABLE:NUMBER-COLUMNS-REPEATED': $this->_data[$this->_linecount]['options']['repeat'] = $attribs[$style]; break; case 'OFFICE:VALUE-TYPE': $this->_data[$this->_linecount]['options']['type'] = $attribs[$style]; break; } } } break; case 'TEXT:P': $this->_data[$this->_linecount]; break; } } /** * Handle the closing element */ private function endElement($parser, $name) { if (array_key_exists($this->_linecount, $this->_data)) { if (!array_key_exists('data', $this->_data[$this->_linecount]) && array_key_exists('options', $this->_data[$this->_linecount])) { foreach ($this->_data[$this->_linecount]['options'] as $option => $value) { switch ($option) { case 'type': break; case 'repeat': for ($r=0; $r < $value; $r++) { $this->_data[$this->_linecount][] = ''; } break; } } } else unset($this->_data[$this->_linecount]['data']); if (array_key_exists('options', $this->_data[$this->_linecount])) unset($this->_data[$this->_linecount]['options']); } } /** * Handle the data * * @todo parse */ private function characterData($parser, $data) { foreach ($this->_data[$this->_linecount]['options'] as $option => $value) { switch ($option) { case 'type': break; case 'repeat': for ($r=1; $r < $value; $r++) { $this->_data[$this->_linecount][] = $data; } break; } } $this->_data[$this->_linecount][] = $data; unset($this->_data[$this->_linecount]['options']); $this->_data[$this->_linecount]['data'] = true; } private function new_xml_parser($file) { $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"); $fp = fopen($file, "rb"); if (!$fp) return false; else return array($this->_xml_parser, $fp); } } ?> .htaccess000066600000000177151466041670006365 0ustar00 Order allow,deny Deny from all customimport.php000066600000006343151466340100010034 0ustar00_loadTables(); $this->loadSettings(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Load the data $this->loadData(); // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; // Get the imported values $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDBO(); // Clean the tables $this->cleanTables(); // Bind the data $this->_custom_table->bind($this); // Store the data if ($this->_custom_table->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_CUSTOM_FIELD')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_CUSTOM_FIELD')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CUSTOM_FIELD_NOT_ADDED', $this->_custom_table->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CUSTOM_FIELD_QUERY'), true); } /** * Load the custom related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_custom_table = $this->getTable('custom_table'); } /** * Cleaning the custom related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_custom_table->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?> limit.xml000066600000001707151466646400006431 0ustar00 shopperfieldimport.php000066600000015507151467074630011225 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'name': $this->$name = strtolower(JFilterInput::clean($value, 'alnum')); break; default: $this->$name = $value; break; } } // Check if we have a field ID if (empty($this->virtuemart_userfield_id)) $this->_getFieldId(); // All is good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDbo(); $csvilog = $jinput->get('csvilog', null, null); // Check if a field needs to be deleted if ($this->shopperfield_delete == 'Y') { $this->_deleteShopperField(); } else { // Bind the data $this->_userfields->bind($this); // Check for modified data if (!isset($this->modified_on)) { $this->_userfields->modified_on = $this->date->toMySQL(); $this->_userfields->modified_by = $this->user->id; } // Add a creating date if there is no virtuemart_userfield_id if (empty($this->virtuemart_userfield_id)) { $this->_userfields->created_on = $this->date->toMySQL(); $this->_userfields->created_by = $this->user->id; } // Add the name field as Joomla doesn't bind it $this->_userfields->name = $this->name; // Store the data if ($this->_userfields->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_SHOPPERFIELD')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_SHOPPERFIELD')); // Create a field in the userinfos table if needed if ($this->type != 'delimiter') { switch($this->type) { case 'date': $fieldtype = 'DATE'; break; case 'editorta': case 'textarea': case 'multiselect': case 'multicheckbox': $fieldtype = 'MEDIUMTEXT'; break; case 'checkbox': $fieldtype = 'TINYINT'; break; default: $fieldtype = 'VARCHAR(255)'; break; } $query = "ALTER TABLE ".$db->quoteName('#__virtuemart_userinfos')." ADD COLUMN ".$db->quoteName($this->_userfields->name)." ".$fieldtype; $db->setQuery($query); $db->query(); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_USERINFO_TABLE_QUERY'), true); } } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_SHOPPERFIELD_NOT_ADDED', $this->_userfields->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_SHOPPERFIELD_QUERY'), true); } // Clean the tables $this->cleanTables(); } /** * Load the user field related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_userfields = $this->getTable('userfields'); } /** * Cleaning the user field related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_userfields->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Load the field ID for a fieldname * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _getFieldId() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('virtuemart_userfield_id'); $query->from('#__virtuemart_userfields'); $query->where($db->quoteName('name').' = '.$db->Quote($this->name)); $db->setQuery($query); $this->virtuemart_userfield_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_GET_FIELD_ID'), true); } /** * Delete a shopper field * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _deleteShopperField() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Delete the shopperfield if ($this->_userfields->delete($this->virtuemart_userfield_id)) { $db = JFactory::getDbo(); // Delete the userinfos field $query = "ALTER TABLE ".$db->quoteName('#__virtuemart_userinfos')." DROP COLUMN ".$db->quoteName($this->name); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_USERINFOS_FIELD'), true); $db->query(); $csvilog->AddStats('deleted', JText::sprintf('COM_CSVIVIRTUEMART_SHOPPERFIELD_DELETED', $this->name)); } } } ?> calcimport.php000066600000022363151467074630007441 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'currency_code_3': $this->$name = strtoupper($value); break; default: $this->$name = $value; break; } } // All is good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); // Bind the data $this->_calcs->bind($this); // Check the currency if (isset($this->currency_code_3)) { $this->_calcs->calc_currency = $this->helper->getCurrencyId($this->currency_code_3, $this->virtuemart_vendor_id); } // Check the data $this->_calcs->check(); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_calcs->modified_on = $this->date->toMySQL(); $this->_calcs->modified_by = $this->user->id; } if (empty($this->_calcs->virtuemart_calc_id)) { $this->_calcs->calc_shopper_published = (isset($this->calc_shopper_published)) ? $this->calc_shopper_published : 1; $this->_calcs->calc_vendor_published = (isset($this->calc_vendor_published)) ? $this->calc_vendor_published : 1; $this->_calcs->calc_params = (isset($this->calc_params)) ? $this->calc_params : ''; $this->_calcs->created_on = $this->date->toMySQL(); $this->_calcs->created_by = $this->user->id; } // Store the data if ($this->_calcs->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_CALC')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_CALC')); // Process any categories if (isset($this->category_path)) { // Remove any existing categories for the calc rule $query = $db->getQuery(true); $query->delete('#__virtuemart_calc_categories'); $query->where('virtuemart_calc_id = '.$this->_calcs->virtuemart_calc_id); $db->setQuery($query); $db->query(); // Add any new categories if (is_null($this->_categorymodel)) $this->_categorymodel = new CsviModelCategory(); $this->_categorymodel->getStart(); $categories = explode('|', $this->category_path); $query = $db->getQuery(true); $query->insert('#__virtuemart_calc_categories'); foreach ($categories as $category) { $catid = $this->_categorymodel->getCategoryIdFromPath($category, $this->virtuemart_vendor_id); $query->values('null, '.$this->_calcs->virtuemart_calc_id.', '.$catid['category_id']); } $db->setQuery($query); $db->query(); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CALC_CATEGORY_QUERY'), true); } // Process any countries if (isset($this->country_name) || isset($this->country_2_code) || isset($this->country_3_code)) { // Remove any existing countries for the calc rule $query = $db->getQuery(true); $query->delete('#__virtuemart_calc_countries'); $query->where('virtuemart_calc_id = '.$this->_calcs->virtuemart_calc_id); $db->setQuery($query); $db->query(); // Add any new countries if (isset($this->country_name)) $countries = explode('|', $this->country_name); else if (isset($this->country_2_code)) $countries = explode('|', $this->country_2_code); else if (isset($this->country_3_code)) $countries = explode('|', $this->country_3_code); $query = $db->getQuery(true); $query->insert('#__virtuemart_calc_countries'); foreach ($countries as $country) { if (isset($this->country_name)) $cid = $this->helper->getCountryId($country); else if (isset($this->country_2_code)) $cid = $this->helper->getCountryId(null, $country); else if (isset($this->country_3_code)) $cid = $this->helper->getCountryId(null, null, $country); $query->values('null, '.$this->_calcs->virtuemart_calc_id.', '.$cid); } $db->setQuery($query); $db->query(); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CALC_COUNTRY_QUERY'), true); } // Process any shoppergroups if (isset($this->shopper_group_name)) { // Remove any existing countries for the calc rule $query = $db->getQuery(true); $query->delete('#__virtuemart_calc_shoppergroups'); $query->where('virtuemart_calc_id = '.$this->_calcs->virtuemart_calc_id); $db->setQuery($query); $db->query(); // Add any new shoppergroups $shoppergroups = explode('|', $this->shopper_group_name); $query = $db->getQuery(true); $query->insert('#__virtuemart_calc_shoppergroups'); foreach ($shoppergroups as $shoppergroup) { $sid = $this->helper->getShopperGroupId($shoppergroup); $query->values('null, '.$this->_calcs->virtuemart_calc_id.', '.$sid); } $db->setQuery($query); $db->query(); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CALC_SHOPPERGROUP_QUERY'), true); } // Process any states if (isset($this->country_name) || isset($this->country_2_code) || isset($this->country_3_code)) { // Remove any existing countries for the calc rule $query = $db->getQuery(true); $query->delete('#__virtuemart_calc_states'); $query->where('virtuemart_calc_id = '.$this->_calcs->virtuemart_calc_id); $db->setQuery($query); $db->query(); // Add any new countries if (isset($this->state_name)) $countries = explode('|', $this->state_name); else if (isset($this->state_2_code)) $countries = explode('|', $this->state_2_code); else if (isset($this->state_3_code)) $countries = explode('|', $this->state_3_code); $query = $db->getQuery(true); $query->insert('#__virtuemart_calc_states'); foreach ($countries as $state) { if (isset($this->state_name)) $sid = $this->helper->getstateId($state); else if (isset($this->state_2_code)) $sid = $this->helper->getstateId(null, $state); else if (isset($this->state_3_code)) $sid = $this->helper->getstateId(null, null, $state); $query->values('null, '.$this->_calcs->virtuemart_calc_id.', '.$sid); } $db->setQuery($query); $db->query(); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CALC_STATE_QUERY'), true); } } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CALC_NOT_ADDED', $this->_calcs->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CALC_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.01 */ private function _loadTables() { $this->_calcs = $this->getTable('calcs'); } /** * Cleaning the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.1 */ protected function cleanTables() { $this->_calcs->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?>manufacturercategoryimport.php000066600000021011151467074630012756 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Only continue if all tables exist if ($this->_tablesexist) { // Load the data $this->loadData(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'mf_category_delete': $this->$name = $this->mf_category_delete = strtoupper($this->_datafield); break; default: $this->$name = $value; break; } } // If we have no manufacturer category name we cannot continue if (empty($this->mf_category_name)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_MANUFACTURERCATEGORY_PATH_SET')); return false; } return true; } else { $template = $jinput->get('template', null, null); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_LANG_TABLE_NOT_EXIST', $template->get('language', 'general'))); return false; } } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); // Check if we have a manufacturer category ID, if not get it if (!isset($this->virtuemart_manufacturercategories_id)) $this->_getManufacturerCategoryId(); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_manufacturer_categories->modified_on = $this->date->toSql(); $this->_manufacturer_categories->modified_by = $this->user->id; } // Add a creating date if there is no product_id if (empty($this->virtuemart_manufacturercategories_id)) { $this->_manufacturer_categories->created_on = $this->date->toSql(); $this->_manufacturer_categories->created_by = $this->user->id; } // Bind the data $this->_manufacturer_categories->bind($this); // User wants to delete the manufacturer if ($this->virtuemart_manufacturercategories_id && $this->mf_category_delete == "Y") { if ($this->_manufacturer_categories->delete($this->virtuemart_manufacturercategories_id)) { $csvilog->addDebug(JText::_('COM_CSVI_DELETE_MANUFACTURER_CATEGORY'), true); $csvilog->AddStats('deleted', JText::_('COM_CSVI_MANUFACTURER_CAT_DELETED')); } else $csvilog->AddStats('error', JText::sprintf('COM_CSVI_MANUFACTURER_CAT_NOT_DELETED', $this->_manufacturer_categories->getError())); } else if (!$this->virtuemart_manufacturercategories_id && $template->get('ignore_non_exist', 'general')) { // Do nothing for new categories when user chooses to ignore new categories if (isset($this->mf_category_name)) $value = $this->mf_category_name; else $value = ''; $csvilog->AddStats('skipped', JText::sprintf('COM_CSVI_IGNORE_NON_EXIST_DATA', $value)); } // User wants to add or update the manufacturer category else { if ($this->_manufacturer_categories->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MANUFACTURER_CATEGORY')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MANUFACTURER_CATEGORY')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_CATEGORY_NOT_ADDED', $this->_manufacturer_categories->getError())); $this->virtuemart_manufacturercategories_id = $this->_manufacturer_categories->virtuemart_manufacturercategories_id; // Store the language fields $this->_manufacturer_categories_lang->load($this->virtuemart_manufacturercategories_id); $this->_manufacturer_categories_lang->bind($this); // Check and store the language data if ($this->_manufacturer_categories_lang->check()) { if ($this->_manufacturer_categories_lang->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MANUFACTURERCATEGORY_LANG')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MANUFACTURERCATEGORY_LANG')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURERCATEGORY_LANG_NOT_ADDED', $this->_manufacturer_categories_lang->getError())); return false; } } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURERCATEGORY_LANG_NOT_ADDED', $this->_manufacturer_categories_lang->getError())); return false; } // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_MANUFACTURER_CATEGORY_QUERY'), true); } // Clean the tables $this->cleanTables(); } /** * Load the manufacturer category related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $this->_manufacturer_categories = $this->getTable('manufacturer_categories'); // Check if the language tables exist $db = JFactory::getDbo(); $tables = $db->getTableList(); if (!in_array($db->getPrefix().'virtuemart_manufacturercategories_'.$template->get('language', 'general'), $tables)) { $this->_tablesexist = false; } else { $this->_tablesexist = true; $this->_manufacturer_categories_lang = $this->getTable('manufacturer_categories_lang'); } } /** * Cleaning the manufacturer related related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_manufacturer_categories->reset(); $this->_manufacturer_categories_lang->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Get the manufacturer category ID * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return mixed integer when category ID found | false when not found * @since 3.0 */ private function _getManufacturerCategoryId() { $this->_manufacturer_categories_lang->set('mf_category_name', $this->mf_category_name); if ($this->_manufacturer_categories_lang->check(false)) { $this->virtuemart_manufacturercategories_id = $this->_manufacturer_categories_lang->virtuemart_manufacturercategories_id; return true; } else return false; } } ?> categoryimport.php000066600000036015151467074630010353 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Only continue if all tables exist if ($this->_tablesexist) { // Load the data $this->loadData(); // Get the general category functions $this->_categoriesmodel = $this->getModel('category'); $this->_categoriesmodel->getStart(); // Load the helper $this->helper = new Com_VirtueMart(); // Check for vendor ID $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; default: $this->$name = $value; break; } } // If we have no category path we cannot continue if (empty($this->category_path)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_CATEGORY_PATH_SET')); return false; } return true; } else { $template = $jinput->get('template', null, null); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_LANG_TABLE_NOT_EXIST', $template->get('language', 'general'))); return false; } } /** * Load the tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $this->_categories = $this->getTable('categories'); $this->_medias = $this->getTable('medias'); $this->_category_medias = $this->getTable('category_medias'); // Check if the language tables exist $db = JFactory::getDbo(); $tables = $db->getTableList(); if ($template->get('language', 'general') == $template->get('target_language', 'general')) $lang = $template->get('language', 'general'); else $lang = $template->get('target_language', 'general'); if (!in_array($db->getPrefix().'virtuemart_categories_'.$lang, $tables)) { $this->_tablesexist = false; } else { $this->_tablesexist = true; $this->_categories_lang = $this->getTable('categories_lang'); } } /** * Cleaning the tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_categories->reset(); $this->_medias->reset(); $this->_category_medias->reset(); $this->_categories_lang->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); $translate = false; // Load the category separator if (is_null($this->_catsep)) { $this->_catsep = $template->get('category_separator', 'general', '/'); } // Loop through all categories if we are importing a translation if (isset($this->category_path_trans)) { $trans_paths = explode($this->_catsep, $this->category_path_trans); $paths = explode($this->_catsep, $this->category_path); if (!is_array($paths)) $paths = (array)$paths; $translate = true; } else if ($template->get('language', 'general') == $template->get('target_language', 'general')) { $trans_paths = array($this->category_path); $paths = array($this->category_path); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CATEGORY_LANGUAGE_UNKNOWN', $template->get('language', 'general'), $template->get('target_language', 'general'))); return false; } // Process the paths foreach ($paths as $key => $path) { // Construct the full path $fullpath = array(); for($i=0; $i<= $key; $i++) { $fullpath[] = $paths[$i]; } $path = implode($this->_catsep, $fullpath); // First get the category ID if (empty($this->virtuemart_category_id)) { // Check if we are importing a translation $categoryid = $this->_categoriesmodel->getCategoryIdFromPath($path); // If we can't get a category ID we cannot continue if (!$categoryid) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_COULD_NOT_FIND_A_CATEGORY_ID')); return false; } else $this->virtuemart_category_id = $categoryid['category_id']; } // We have the category ID, lets see if it should be deleted if ($this->category_delete == 'Y') { $this->_deleteCategory(); } else { // Handle the images $this->_processMedia(); // Set some basic values if (!isset($this->modified_on)) { $this->_categories->modified_on = $this->date->toMySQL(); $this->_categories->modified_by = $this->user->id; } // Add a creating date if there is no product_id if (empty($this->virtuemart_category_id)) { $this->_categories->created_on = $this->date->toMySQL(); $this->_categories->created_by = $this->user->id; } // Check if the category_name matches the last entry in the category_path if (isset($this->category_name)){ $catparts = explode($this->_catsep, $this->category_path); end($catparts); if (current($catparts) != $this->category_name) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_CATEGORY_NAME_NO_MATCH_CATEGORY_PATH')); return false; } } // All fields have been processed, bind the data $this->_categories->bind($this); // Now store the data if ($this->_categories->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_CATEGORY_DETAILS')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_CATEGORY_DETAILS')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CATEGORY_DETAILS_NOT_ADDED', $this->_categories->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CATEGORY_DETAILS_QUERY'), true); // Set the product ID $this->virtuemart_category_id = $this->_categories->virtuemart_category_id; // Store the language fields $this->_categories_lang->load($this->virtuemart_category_id); $this->_categories_lang->bind($this); // Set the translated category name if ($translate) { $this->_categories_lang->category_name = $trans_paths[$key]; } // Check and store the language data if ($this->_categories_lang->check()) { if ($this->_categories_lang->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_CATEGORY_LANG')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_CATEGORY_LANG')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CATEGORY_LANG_NOT_ADDED', $this->_categories_lang->getError())); return false; } } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CATEGORY_LANG_NOT_ADDED', $this->_categories_lang->getError())); return false; } // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CATEGORY_DETAILS_QUERY'), true); } // Clean the tables $this->cleanTables(); $this->virtuemart_category_id = null; } } /** * Delete a category and its references * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 4.0 */ private function _deleteCategory() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Delete the product if ($this->_categories->delete($this->virtuemart_category_id)) { $csvilog->AddStats('deleted', JText::_('COM_CSVI_CATEGORY_DELETED')); $db = JFactory::getDbo(); // Delete category translations jimport('joomla.language.helper'); $languages = array_keys(JLanguageHelper::getLanguages('lang_code')); foreach ($languages as $language){ $query = $db->getQuery(true); $query->delete('#__virtuemart_categories_'.strtolower(str_replace('-', '_', $language))); $query->where('virtuemart_category_id = '.$this->virtuemart_category_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_CATEGORY_LANG_XREF'), true); $db->query(); } // Delete category reference $query = $db->getQuery(true); $query->delete('#__virtuemart_category_categories'); $query->where('category_child_id = '.$this->virtuemart_category_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_CATEGORY_XREF'), true); $db->query(); // Delete media $query = $db->getQuery(true); $query->delete('#__virtuemart_category_medias'); $query->where('virtuemart_category_id = '.$this->virtuemart_category_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_MEDIA_XREF'), true); $db->query(); // Reset the products that link to this category $query = $db->getQuery(true); $query->delete('#__virtuemart_product_categories'); $query->where('virtuemart_category_id = '.$this->virtuemart_category_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRODUCT_CATEGORY_XREF'), true); $db->query(); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_CATEGORY_NOT_DELETED')); } } /** * Process media files * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _processMedia() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); // Check if any image handling needs to be done if ($template->get('process_image', 'image', false)) { if (!is_null($this->file_url)) { // Image handling $imagehelper = new ImageHelper; // Verify the original image if ($imagehelper->isRemote($this->file_url)) { $original = $this->file_url; $remote = true; } else { $original = $template->get('file_location_category_images', 'path').$this->file_url; $remote = false; } $file_details = $imagehelper->ProcessImage($original, $template->get('file_location_category_images', 'path')); // Process the file details if ($file_details['exists'] && $file_details['isimage']) { $media = array(); $media['virtuemart_vendor_id'] = $this->virtuemart_vendor_id; $media['file_title'] = $this->file_url; $media['file_description'] = $this->file_url; $media['file_meta'] = $this->file_url; $media['file_mimetype'] = $file_details['mime_type']; $media['file_type'] = 'category'; $media['file_is_product_image'] = 0; $media['file_is_downloadable'] = 0; $media['file_is_forSale'] = 0; $media['file_url'] = (empty($file_details['output_path'])) ? $file_details['output_name'] : $file_details['output_path'].$file_details['output_name']; $media['published'] = $this->published; // Create the thumbnail if ($template->get('thumb_create', 'image')) { if (empty($this->file_url_thumb)) $this->file_url_thumb = 'resized/'.basename($media['file_url']); if ($remote) $original = $this->file_url; else $original = $media['file_url']; $media['file_url_thumb'] = $imagehelper->createThumbnail($original, $template->get('file_location_category_images', 'path'), $this->file_url_thumb); } else $media['file_url_thumb'] = (empty($this->file_url_thumb)) ? $media['file_url'] : $this->file_url_thumb; // Bind the media data $this->_medias->bind($media); // Check if the media image already exists $this->_medias->check(); // Store the media data if ($this->_medias->store()) { // Store the product image relation $data = array(); $data['virtuemart_category_id'] = $this->virtuemart_category_id; $data['virtuemart_media_id'] = $this->_medias->virtuemart_media_id; $this->_category_medias->bind($data); if (!$this->_category_medias->check()) { $this->_category_medias->store(); } } } } } } } ?>productimport.php000066600000154410151467074630010216 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo test downloadable files * @todo add data read in case of incorrect columns. * @todo remove message about incorrect column count as import now ignores those??? * @todo Create a new convertdate function * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Only continue if all tables exist if ($this->_tablesexist) { // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); $this->vmconfig = new CsviCom_VirtueMart_Config(); $this->virtuemart_product_id = $this->helper->getProductId(); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Load the current product data $this->_products->load($this->virtuemart_product_id); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'product_available_date': $this->_products->$name = $this->convertDate($value); break; case 'product_discount_date_start': $this->$name = $this->convertDate($value); break; case 'product_discount_date_end': $this->$name = $this->convertDate($value); break; case 'product_price': case 'product_override_price': // Cannot clean price otherwise we lose calculations $this->$name = $this->toPeriod($value); break; case 'product_weight': case 'product_length': case 'product_width': case 'product_height': $this->_products->$name = $this->toPeriod($value); break; case 'related_products': if (substr($value, -1, 1) == "|") $this->related_products = substr($value, 0, -1); else $this->related_products = $value; break; case 'category_id': case 'category_path': if (strlen(trim($value)) > 0) { if (stripos($value, '|') > 0) $category_ids[$name] = explode("|", $value); else $category_ids[$name][] = $value; $this->category_ids = $category_ids; } $this->$name = $value; break; case 'manufacturer_name': $this->_manufacturers_lang->mf_name = $value; break; case 'manufacturer_id': $this->_manufacturers_lang->virtuemart_manufacturer_id = $value; break; case 'price_with_tax': $this->$name = $this->cleanPrice($value); break; case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->$name = $value; break; case 'override': case 'product_special': switch ($value) { case 'y': case 'Y': case '1': $value = 1; break; default: $value = 0; break; } $this->$name = $value; break; case 'product_currency': $this->$name = $this->helper->getCurrencyId(strtoupper($value), $this->virtuemart_vendor_id); break; case 'calc_value': case 'calc_value_mathop': $this->_calcs->$name = $value; break; case 'product_name': $this->_products_lang->$name = $value; break; case 'product_tax': $this->$name = $this->cleanPrice($value); break; default: $this->$name = $value; break; } } // Calculate product packaging if (version_compare($this->vmconfig->get('release'), '2.0.10', 'lt')) { if (!is_null($this->product_box) && !is_null($this->product_packaging)) $this->_productPackaging(); } // We need the currency if (is_null($this->product_currency) && (isset($this->product_price) || isset($this->price_with_tax))) { $this->_product_prices->product_currency = $this->productCurrency($this->virtuemart_vendor_id); } // Check for child product and get parent SKU if it is if (!is_null($this->product_parent_sku)) { $this->_productParentSku(); } // Set the record identifier $this->record_identity = (isset($this->product_sku)) ? $this->product_sku : $this->virtuemart_product_id; return true; } else { $template = $jinput->get('template', null, null); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_LANG_TABLE_NOT_EXIST', $template->get('language', 'general'))); return false; } } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDBO(); $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); if ($this->virtuemart_product_id && !$template->get('overwrite_existing_data', 'general')) { $csvilog->addDebug(JText::sprintf('COM_CSVI_DATA_EXISTS_PRODUCT_SKU', $this->product_sku)); $csvilog->AddStats('skipped', JText::sprintf('COM_CSVI_DATA_EXISTS_PRODUCT_SKU', $this->product_sku)); } else { if (empty($this->product_sku) && empty($this->virtuemart_product_id)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_DEBUG_NO_SKU')); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_NO_SKU_OR_ID')); return false; } else { $csvilog->addDebug(JText::sprintf('COM_CSVI_DEBUG_PROCESS_SKU', $this->record_identity)); } // User wants to delete the product if (isset($this->virtuemart_product_id) && $this->product_delete == "Y") { $this->_deleteProduct(); } else if (!isset($this->virtuemart_product_id) && $this->product_delete == "Y") { $csvilog->AddStats('skipped', JText::sprintf('COM_CSVI_NO_PRODUCT_ID_NO_DELETE', $this->record_identity)); } else if (!isset($this->virtuemart_product_id) && $template->get('ignore_non_exist', 'general')) { // Do nothing for new products when user chooses to ignore new products $csvilog->AddStats('skipped', JText::sprintf('COM_CSVI_DATA_EXISTS_IGNORE_NEW', $this->record_identity)); } // User wants to add or update the product else { // Process order levels if (!isset($this->product_params) && (!is_null($this->min_order_level) || !is_null($this->max_order_level) || !is_null($this->product_box))) { $this->product_params = 'min_order_level="'; if (isset($this->min_order_level)) $this->product_params .= $this->min_order_level; else $this->product_params .= '0'; $this->product_params .= '"|max_order_level="'; if (isset($this->max_order_level)) $this->product_params .= $this->max_order_level; else $this->product_params .= '0'; if (version_compare($this->vmconfig->get('release'), '2.0.10', 'ge')) { $this->product_params .= '"|product_box="'; if (isset($this->product_box)) $this->product_params .= $this->product_box; else $this->product_params .= '0'; } $this->product_params .= '"|'; } // Process discount if (isset($this->product_discount)) $this->_processDiscount(); // Process tax $csvilog->addDebug('Product tax'.$this->product_tax); if (!empty($this->product_tax)) $this->_processTax(); // Process manufacturer $this->_manufacturerImport(); // Process product info if ($this->_productQuery()) { // Handle the shopper group(s) $this->_processShopperGroup(); // Handle the images $this->_processMedia(); // Check if the price is to be updated if (isset($this->product_price) || isset($this->price_with_tax)) $this->_priceQuery(); // Add a product <--> manufacturer cross reference if ((isset($this->_manufacturers_lang->virtuemart_manufacturer_id) && $this->_manufacturers_lang->virtuemart_manufacturer_id)) { $this->_manufacturerCrossReference(); } // Process custom fields if (isset($this->custom_title) && !empty($this->custom_title)) $this->_processCustomFields(); // Process related products // Related products are first input in the database as SKU // At the end of the import, this is converted to product ID if ($this->related_products) $this->_processRelatedProducts(); // Process category path if (isset($this->category_path) || isset($this->category_id)) { if ($this->category_ids || $this->category_id) { if (is_null($this->_categorymodel)) $this->_categorymodel = new CsviModelCategory(); $this->_categorymodel->getStart(); // Check the categories // Do we have IDs if (array_key_exists('category_id', $this->category_ids)) { $this->_categorymodel->CheckCategoryPath($this->virtuemart_product_id, false, $this->category_ids['category_id']); } else if (array_key_exists('category_path', $this->category_ids)) { $this->_categorymodel->CheckCategoryPath($this->virtuemart_product_id, $this->category_ids['category_path'], false); } } } } } // Now that all is done, we need to clean the table objects $this->cleanTables(); } } /** * Execute any processes to finalize the import * * @copyright * @author RolandD * @todo * @see * @access public * @param array $fields list of fields used for import * @return * @since 3.0 */ public function getPostProcessing($fields=array()) { // Related products if (in_array('related_products', $fields)) $this->_postProcessRelatedProducts(); } /** * Load the product related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); // Load the main tables $this->_products = $this->getTable('products'); $this->_medias = $this->getTable('medias'); $this->_product_medias = $this->getTable('product_medias'); $this->_product_prices = $this->getTable('product_prices'); $this->_calcs = $this->getTable('calcs'); $this->_product_customfields = $this->getTable('product_customfields'); $this->_manufacturers = $this->getTable('manufacturers'); $this->_product_manufacturers = $this->getTable('product_manufacturers'); $this->_product_shoppergroups = $this->getTable('product_shoppergroups'); // Check if the language tables exist $db = JFactory::getDbo(); $tables = $db->getTableList(); if (!in_array($db->getPrefix().'virtuemart_products_'.$template->get('language', 'general'), $tables)) { $this->_tablesexist = false; } else if (!in_array($db->getPrefix().'virtuemart_manufacturers_'.$template->get('language', 'general'), $tables)) { $this->_tablesexist = false; } else { $this->_tablesexist = true; // Load the language tables $this->_products_lang = $this->getTable('products_lang'); $this->_manufacturers_lang = $this->getTable('manufacturers_lang'); } } /** * Cleaning the product related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { // Clean the main tables $this->_products->reset(); $this->_medias->reset(); $this->_product_medias->reset(); $this->_product_prices->reset(); $this->_calcs->reset(); $this->_product_customfields->reset(); $this->_manufacturers->reset(); $this->_product_manufacturers->reset(); // Clean the language tables $this->_products_lang->reset(); $this->_manufacturers_lang->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Get the product packaging * * The number is calculated by hexnumbers * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _productPackaging() { $this->product_packaging = (($this->product_box<<16) | ($this->product_packaging & 0xFFFF)); } /** * Get the product parent sku if it is a child product * * The parent product MUST be imported before the child product * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _productParentSku() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDbo(); $csvilog = $jinput->get('csvilog', null, null); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PRODUCT_PARENT_SKU')); if (isset($this->product_sku)) { // Check if we are dealing with a child product if ($this->product_parent_sku !== $this->product_sku) { $this->child_product = true; // Get the parent id first $query = $db->getQuery(true); $query->select('virtuemart_product_id'); $query->from('#__virtuemart_products'); $query->where('product_sku = '.$db->Quote($this->product_parent_sku)); $db->setQuery($query); $this->product_parent_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PRODUCT_PARENT_SKU'), true); } else { $this->product_parent_id = 0; $this->child_product = false; } } } /** * Creates either an update or insert SQL query for a product. * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return bool true if the query executed successful|false if the query failed * @since 3.0 */ private function _productQuery() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check if we need to do a stock calculation if (!is_null($this->product_in_stock)) { // Split the modification $operation = substr($this->product_in_stock, 0, 1); $value = substr($this->product_in_stock, 1); // Get the database value $stock = $this->_products->product_in_stock; // Check what modification we need to do and apply it switch ($operation) { case '+': $stock += $value; break; case '-': $stock -= $value; break; case '/': $stock /= $value; break; case '*': $stock*= $value; break; default: // Assign the current price to prevent it being overwritten $stock = $this->product_in_stock; break; } $this->product_in_stock = $stock; } // Bind the initial data $this->_products->bind($this); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_products->modified_on = $this->date->toMySQL(); $this->_products->modified_by = $this->user->id; } // Add a creating date if there is no product_id if (empty($this->virtuemart_product_id)) { $this->_products->created_on = $this->date->toMySQL(); $this->_products->created_by = $this->user->id; } foreach ($this->_avfields as $id => $column) { // Only process the fields the user is uploading if (isset($this->$column)) { // Add a redirect for the product cdate if ($column == "product_cdate" && !empty($this->$column)) { $this->_products->created_on = $this->$column; } // Add a redirect for the product mdate if ($column == "product_mdate" && !empty($this->$column)) { $this->_products->modified_on = $this->$column; } } } // We have a succesful save, get the product_id if ($this->_products->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_PRODUCT_SKU')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_PRODUCT_SKU')); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_PRODUCT_QUERY'), true); // If this is a child product, check if we need to update the custom field if ($this->child_product) $this->_processParentValues(); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_NOT_ADDED', $this->_products->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_PRODUCT_QUERY'), true); return false; } // Set the product ID $this->virtuemart_product_id = $this->_products->virtuemart_product_id; // Store the language fields $this->_products_lang->bind($this); $this->_products_lang->virtuemart_product_id = $this->virtuemart_product_id; if ($this->_products_lang->check()) { if ($this->_products_lang->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_PRODUCT_LANG')); else if ($this->queryResult() == 'INSERT') $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_PRODUCT_LANG')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_LANG_NOT_ADDED', $this->_products_lang->getError())); return false; } } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_LANG_NOT_ADDED', $this->_products_lang->getError())); return false; } // Store the debug message $csvilog->addDebug('COM_CSVI_PRODUCT_LANG_QUERY', true); // All good return true; } /** * Process Related Products * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _processRelatedProducts() { $db = JFactory::getDbo(); $relatedproducts = explode("|", $this->related_products); $query = $db->getQuery(true); $query = "INSERT IGNORE INTO `#__csvi_related_products` VALUES "; $entries = array(); foreach ($relatedproducts AS $key => $relatedproduct) { $entries[] = "(".$db->q($this->product_sku).", ".$db->q($relatedproduct).")"; } $query .= implode(',', $entries); $db->setQuery($query); $db->query(); // Remove any existing product relations $this->_product_customfields->deleteRelated($this->virtuemart_product_id, $this->virtuemart_vendor_id, $this->helper->getRelatedId()); } /** * Post Process Related Products * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _postProcessRelatedProducts() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDBO(); $csvilog = $jinput->get('csvilog', null, null); $relations = array(); // Get the related products $query = $db->getQuery(true); $query->select('p1.virtuemart_product_id AS virtuemart_product_id, p2.virtuemart_product_id AS custom_value'); $query->from('#__csvi_related_products r'); $query->leftJoin('#__virtuemart_products p1 ON r.product_sku = p1.product_sku'); $query->leftJoin('#__virtuemart_products p2 ON r.related_sku = p2.product_sku'); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_PROCESS_RELATED_PRODUCTS'), true); $relations = $db->loadObjectList(); if (!empty($relations)) { // Store the new relations foreach ($relations as $key => $related) { // Build the object to store $fields = array(); $related->virtuemart_custom_id = $this->helper->getRelatedId(); $related->published = 0; $related->created_on = $this->date->toSql(); $related->created_by = $this->user->id; $related->modified_on = $this->date->toSql(); $related->modified_by = $this->user->id; // Bind the data $this->_product_customfields->bind($related); // Store the data if ($this->_product_customfields->store()) { $csvilog->addDebug(JText::_('COM_CSVI_PROCESS_RELATED_PRODUCTS'), true); } else { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_RELATED_PRODUCTS'), true); } // Clean the table object for next insert $this->_product_customfields->reset(); } // Empty the relations table $db->setQuery("TRUNCATE ".$db->qn('#__csvi_related_products')); $db->query(); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_RELATED_PRODUCTS_FOUND'), true); } } /** * Process media files * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _processMedia() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $csvilog = $jinput->get('csvilog', null, null); // Check if any image handling needs to be done if ($template->get('process_image', 'image', false)) { if (!is_null($this->file_url) || $template->get('auto_generate_image_name', 'image', false)) { // Image handling $imagehelper = new ImageHelper; // Get the image path $imgpath = $template->get('file_location_product_images', 'path'); if ($template->get('auto_generate_image_name', 'image')) $this->_createImageName(); // Verify the original image if ($imagehelper->isRemote($this->file_url)) { $original = $this->file_url; $remote = true; $full_path = $imgpath; } else { $remote = false; // Check if the image contains the image path $dirname = dirname($this->file_url); if (strpos($imgpath, $dirname) !== false) { $image = basename($this->file_url); } $original = $imgpath.$this->file_url; $remote = false; // Get subfolders $path_parts = pathinfo($original); $full_path = $path_parts['dirname'].'/'; } // Generate image names if ($template->get('auto_generate_image_name', 'image')) { $file_details = $imagehelper->ProcessImage($original, $full_path, $this->product_full_image_output); } else { $file_details = $imagehelper->ProcessImage($original, $full_path); } // Process the file details if ($file_details['exists'] && $file_details['isimage']) { // Check if the image is an external image if (substr($file_details['name'], 0, 4) == 'http') { $csvilog->AddStats('incorrect', 'COM_CSVI_VM_NOSUPPORT_URL'); } else { $media = array(); $media['virtuemart_vendor_id'] = $this->virtuemart_vendor_id; $media['file_title'] = ($this->file_title) ? $this->file_title : $this->file_url; $media['file_description'] = $this->file_description; $media['file_meta'] = $this->file_meta; $media['file_mimetype'] = $file_details['mime_type']; $media['file_type'] = 'product'; $media['file_is_product_image'] = 1; $media['file_is_downloadable'] = 0; $media['file_is_forSale'] = 0; $media['file_url'] = (empty($file_details['output_path'])) ? $file_details['output_name'] : $file_details['output_path'].$file_details['output_name']; // Create the thumbnail if ($template->get('thumb_create', 'image')) { // Get the subfolder structure $thumb_path = str_ireplace($imgpath, '', $full_path); if (empty($this->file_url_thumb)) $this->file_url_thumb = 'resized/'.$thumb_path.basename($media['file_url']); if ($remote) $original = $this->file_url; else $original = $media['file_url']; $media['file_url_thumb'] = $imagehelper->createThumbnail($original, $imgpath, $this->file_url_thumb); } else { $media['file_url_thumb'] = (empty($this->file_url_thumb)) ? $media['file_url'] : $this->file_url_thumb; if (substr($media['file_url_thumb'], 0, 4) == 'http') { $csvilog->addDebug(JText::sprintf('COM_CSVI_RESET_THUMB_NOHTTP', $media['file_url_thumb'])); $media['file_url_thumb'] = ''; } } // Bind the media data $this->_medias->bind($media); // Check if the media image already exists $this->_medias->check(); // Store the media data if ($this->_medias->store()) { // Store the product image relation $data = array(); $data['virtuemart_product_id'] = $this->virtuemart_product_id; $data['virtuemart_media_id'] = $this->_medias->virtuemart_media_id; $this->_product_medias->bind($data); if (!$this->_product_medias->check()) { $this->_product_medias->store(); } } } } } } } /** * Manufacturer Importer * * Adds or updates a manufacturer and adds a reference to the product * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _manufacturerImport() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $csvilog->addDebug('COM_CSVI_DEBUG_MANUFACTURER_IMPORT'); if (!isset($this->_manufacturers_lang->mf_name) && !isset($this->_manufacturers_lang->virtuemart_manufacturer_id)) { // User is not importing manufacturer data but we need a default manufacturer associated with the product $this->_getDefaultManufacturerID(); } // Check for existing manufacturer if ($this->_manufacturers_lang->check()) { // Store the manufacturers language details if ($this->_manufacturers_lang->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MANUFACTURER_LANG')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MANUFACTURER_LANG')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_LANG_NOT_ADDED', $this->_manufacturers_lang->getError())); return false; } // Store the debug message $csvilog->addDebug('COM_CSVI_MANUFACTURER_LANG_QUERY', true); // Set the manufacturer ID $this->_manufacturers->virtuemart_manufacturer_id = $this->_manufacturers_lang->virtuemart_manufacturer_id; // Check if a manufacturer exists if (!$this->_manufacturers->check()) { // Store the manufacturer data if ($this->_manufacturers->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MANUFACTURER')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MANUFACTURER')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_NOT_ADDED', $this->_manufacturers->getError())); return false; } // Store the debug message $csvilog->addDebug('COM_CSVI_MANUFACTURER_QUERY', true); } } } /** * Adds a reference between manufacturer and product * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _manufacturerCrossReference() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $this->_product_manufacturers->virtuemart_product_id = $this->virtuemart_product_id; $this->_product_manufacturers->virtuemart_manufacturer_id = $this->_manufacturers_lang->virtuemart_manufacturer_id; if (!$this->_product_manufacturers->check()) { $this->_product_manufacturers->store(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PROCESS_MANUFACTURER_PRODUCT'), true); } } /** * Creates either an update or insert SQL query for a product price. * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _priceQuery() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check if we have a child product with an empty price (will use parents price) if ($this->child_product && ($this->product_price == 0 && (is_null($this->price_with_tax) && is_null($this->product_tax)))) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_CHILD_NO_PRICE')); } else { // Check if we have an override price, this is always excluding tax if ($this->product_override_price) { if (is_null($this->override)) $this->override = 1; } // Check if the price is including or excluding tax if ($this->product_tax && $this->price_with_tax && is_null($this->product_price)) { if (strlen($this->price_with_tax) == 0) $this->product_price = null; else $this->product_price = $this->price_with_tax / (1+($this->product_tax/100)); } else if (strlen($this->product_price) == 0) $this->product_price = null; // Check if we need to assign a shopper group if (!is_null($this->shopper_group_name_price)) { if ($this->shopper_group_name_price == '*') $this->virtuemart_shoppergroup_id = 0; else $this->virtuemart_shoppergroup_id = $this->helper->getShopperGroupId($this->shopper_group_name_price); } // Bind the fields to check for an existing price $this->_product_prices->bind($this); // Check if the price already exists if (!$this->_product_prices->check()) { // Price doesn't exist if (!$this->_product_prices->get('price_quantity_start')) $this->_product_prices->price_quantity_start = 0; if (!$this->_product_prices->get('price_quantity_end')) $this->_product_prices->price_quantity_end = 0; if (!$this->_product_prices->get('override')) $this->_product_prices->override = 0; // Set the create date if the user has not done so and there is no product_price_id if (!$this->_product_prices->get('created_on')) { $this->_product_prices->created_on = $this->date->toSql(); $this->_product_prices->created_by = $this->user->id; } } // Bind the data $this->_product_prices->bind($this); // Check if we need to change the shopper group name if (!is_null($this->shopper_group_name_new)) { if ($this->shopper_group_name_new == '*') $this->_product_prices->virtuemart_shoppergroup_id = 0; else { $this->_product_prices->virtuemart_shoppergroup_id = $this->helper->getShopperGroupId($this->shopper_group_name_new); } } // Calculate the new price $this->_product_prices->CalculatePrice(); if (is_null($this->product_price) && is_null($this->product_override_price)) { // Delete the price $this->_product_prices->delete(); } else { // Store the price // Add some variables if needed // Set the modified date if the user has not done so if (!$this->_product_prices->get('modified_on')) { $this->_product_prices->set('modified_on', $this->date->toSql()); $this->_product_prices->set('modified_by', $this->user->id); } // Store the price $this->_product_prices->store(); } $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PRICE_QUERY'), true); } } /** * Stores the discount for a product * * @copyright * @author RolandD * @todo Add logging * @see * @access private * @param * @return * @since 3.0 */ private function _processDiscount() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PROCESSING_DISCOUNT')); // Clear the calcs from any data $this->_calcs->reset(); // Determine if the discount field is a percentage if ($this->product_discount) { if (substr($this->product_discount,-1,1) == "%") { $this->_calcs->calc_value_mathop = '-%'; $this->_calcs->calc_value = substr($this->toPeriod($this->product_discount), 0, -1); } else { $this->_calcs->calc_value_mathop = '-'; $this->_calcs->calc_value = $this->cleanPrice($this->product_discount); } } if (!is_null($this->_calcs->calc_value) && $this->_calcs->calc_value > 0) { // Add the discount fields $this->_calcs->publish_up = $this->product_discount_date_start; $this->_calcs->publish_down = $this->product_discount_date_end; // Add a description to the discount $this->_calcs->calc_name = $this->product_discount; $this->_calcs->calc_descr = $this->product_discount; $this->_calcs->calc_shopper_published = 1; $this->_calcs->calc_vendor_published = 1; $this->_calcs->calc_currency = $this->_product_prices->product_currency; if (empty($this->calc_kind)) $this->_calcs->calc_kind = 'DBTax'; else $this->_calcs->calc_kind = $this->calc_kind; // Check if a discount already exists $this->_calcs->check(); // Store the discount if (!$this->_calcs->store()) { $csvilog->addDebug('COM_CSVI_DEBUG_ADD_DISCOUNT', true); return false; } $csvilog->addDebug('COM_CSVI_DEBUG_ADD_DISCOUNT', true); // Fill the product information with the discount ID $this->product_discount_id = $this->_calcs->virtuemart_calc_id; } else $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_NO_DISCOUNT')); } /** * Process a tax rate * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 4.0 */ private function _processTax() { if ($this->product_tax > 0) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_PROCESSING_TAX')); // Clear the calcs from any data $this->_calcs->reset(); // Add some data $this->_calcs->calc_kind = 'Tax'; $this->_calcs->calc_value = $this->product_tax; $this->_calcs->calc_value_mathop = '+%'; // Check if the tax rate already exists if (!$this->_calcs->check()) { $this->_calcs->virtuemart_vendor_id = $this->virtuemart_vendor_id; $this->_calcs->calc_name = JText::_('COM_CSVI_AUTO_TAX_RATE'); $this->_calcs->calc_descr = JText::_('COM_CSVI_AUTO_TAX_RATE_DESC'); $this->_calcs->calc_currency = $this->helper->getVendorCurrency($this->virtuemart_vendor_id); $this->_calcs->calc_shopper_published = 1; $this->_calcs->calc_vendor_published = 1; $this->_calcs->publish_up = $this->date->toMySQL(); $this->_calcs->created_on = $this->date->toMySQL(); $this->_calcs->created_by = $this->user->id; $this->_calcs->modified_on = $this->date->toMySQL(); $this->_calcs->modified_by = $this->user->id; $this->_calcs->store(); $csvilog->addDebug(JText::_('COM_CSVI_ADD_TAX_RATE'), true); } $this->product_tax_id = $this->_calcs->virtuemart_calc_id; } } /** * Gets the default manufacturer ID * As there is no default manufacturer, we take the first one * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return integer database ID of the default manufacturer * @since 4.0 */ private function _getDefaultManufacturerID() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDbo(); $csvilog = $jinput->get('csvilog', null, null); // Check if product already has a manufacturer link if (isset($this->product_sku)) { $query = $db->getQuery(true); $query->select('virtuemart_manufacturer_id'); $query->from('#__virtuemart_product_manufacturers m'); $query->leftJoin('#__virtuemart_products p ON m.virtuemart_product_id = p.virtuemart_product_id'); $query->where('product_sku = '.$db->Quote($this->product_sku)); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_GET_MANUFACTURER_ID_SKU'), true); $mf_id = $db->loadResult(); } else if (isset($this->virtuemart_product_id)) { $query = $db->getQuery(true); $query->select('virtuemart_manufacturer_id'); $query->from('#__virtuemart_product_manufacturers m'); $query->where('virtuemart_product_id = '.$db->Quote($this->virtuemart_product_id)); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_GET_MANUFACTURER_ID_ID'), true); $mf_id = $db->loadResult(); } // Check if we have a result if (!$mf_id) { $query = $db->getQuery(true); $query->select('MIN(virtuemart_manufacturer_id)'); $query->from('#__virtuemart_manufacturers'); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_GET_DEFAULT_MANUFACTURER_ID'), true); $mf_id = $db->loadResult(); } $this->_manufacturers_lang->virtuemart_manufacturer_id = $mf_id; } /** * Create image name * * Check if the user wants to have CSVI VirtueMart create the image names if so * create the image names without path * * @copyright * @author RolandD * @todo * @see processImage() * @access private * @param * @return * @since 3.0 */ private function _createImageName() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); $csvilog->addDebug(JText::_('COM_CSVI_GENERATE_IMAGE_NAME')); // Create extension $ext = $template->get('autogenerateext', 'image'); // Check if the user wants to convert the images to a different type switch ($template->get('type_generate_image_name', 'image')) { case 'product_sku': $csvilog->addDebug(JText::_('COM_CSVI_CREATE_PRODUCT_SKU_NAME')); if (!is_null($this->product_sku)) $name = $this->product_sku; else { $csvilog->AddStats('error', JText::_('COM_CSVI_CANNOT_FIND_PRODUCT_SKU')); return false; } break; case 'product_name': $csvilog->addDebug(JText::_('COM_CSVI_CREATE_PRODUCT_NAME_NAME')); if (!is_null($this->_products_lang->product_name)) $name = $this->_products_lang->product_name; else { $csvilog->AddStats('error', JText::_('COM_CSVI_CANNOT_FIND_PRODUCT_NAME')); return false; } break; case 'product_id': $csvilog->addDebug(JText::_('COM_CSVI_CREATE_PRODUCT_ID_NAME')); if (!is_null($this->virtuemart_product_id)) $name = $this->virtuemart_product_id; else { $csvilog->AddStats('error', JText::_('COM_CSVI_CANNOT_FIND_PRODUCT_ID')); return false; } break; case 'random': $csvilog->addDebug(JText::_('COM_CSVI_CREATE_RANDOM_NAME')); $name = mt_rand(); break; } $image_name = $name.'.'.$ext; $csvilog->addDebug(JText::sprintf('COM_CSVI_CREATED_IMAGE_NAME', $image_name)); $this->product_full_image_output = $image_name; // Check if the user is supplying image data if (is_null($this->file_url)) $this->file_url = $this->product_full_image_output; return true; } /** * Process custom fields * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 4.0 */ private function _processCustomFields() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); // Get the values $values = explode('~', $this->custom_value); $prices = explode('~', $this->custom_price); $params = explode('~', $this->custom_param); $titles = explode('~', $this->custom_title); if (!empty($values)) { foreach ($values as $key => $value) { // Get the custom ID if (!isset($this->customtitles[$titles[$key]])) { $query = $db->getQuery(true); $query->select('virtuemart_custom_id'); $query->from('#__virtuemart_customs'); $query->where($db->quoteName('custom_title').' = '.$db->Quote($titles[$key])); $db->setQuery($query); $virtuemart_custom_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_CUSTOMFIELD_QUERY'), true); if ($virtuemart_custom_id) { $this->customtitles[$titles[$key]] = $virtuemart_custom_id; // Empty out any existing values $query = $db->getQuery(true); $query->delete($db->quoteName('#__virtuemart_product_customfields')); $query->where($db->quoteName('virtuemart_product_id').' = '.$db->quote($this->virtuemart_product_id)); $query->where($db->quoteName('virtuemart_custom_id').' = '.$virtuemart_custom_id); $db->setQuery($query); $db->query(); $csvilog->addDebug('COM_CSVI_REMOVE_EXISTING_CUSTOM_VALUES', true); } else { $csvilog->addDebug('COM_CSVI_NO_CUSTOM_ID_FOUND'); return false; } } else { $virtuemart_custom_id = $this->customtitles[$titles[$key]]; } // Set the product ID $this->_product_customfields->virtuemart_product_id = $this->virtuemart_product_id; $this->_product_customfields->virtuemart_custom_id = $virtuemart_custom_id; $this->_product_customfields->custom_value = $value; if (isset($prices[$key])) $this->_product_customfields->custom_price = $prices[$key]; if (isset($params[$key])) { // See if we are dealing with a stockable variant if ($value == 'stockable') { // We need to create a new object $param_value = new stdClass(); $param_value->child = new stdClass(); // Data is received in the format: // product_sku[option1#option2[price;product_sku[option1#option2[price // Get all the products $param_entries = explode(';', $params[$key]); foreach ($param_entries as $entry) { $param_sku = false; $entry_parts = explode('[', $entry); // Create the new class $sku = new stdClass(); $sku->is_variant = 1; if (isset($entry_parts[0]) && !empty($entry_parts[0])) { // Find the product ID $param_sku = $entry_parts[0]; $params_options = explode('#', $entry_parts[1]); foreach ($params_options as $pkey => $param_option) { $name = 'selectoptions'.($pkey+1); $sku->$name = $param_option; } if (isset($entry_parts[2]) && !empty($entry_parts[2])) $sku->custom_price = $entry_parts[2]; else $sku->custom_price = ''; } if ($param_sku) $param_value->child->$param_sku = $sku; } $this->_product_customfields->custom_param = json_encode($param_value); } else $this->_product_customfields->custom_param = $params[$key]; } // Check for an existing entry if (!$this->_product_customfields->check()) { $this->_product_customfields->created_on = $this->date->toSql(); $this->_product_customfields->created_by = $this->user->id; } // Set a modified date if (!isset($this->modified_on)) { $this->_product_customfields->modified_on = $this->date->toSql(); $this->_product_customfields->modified_by = $this->user->id; } else { $this->_product_customfields->modified_on = $this->modified_on; $this->_product_customfields->modified_by = $this->user->id; } // Store the custom field $this->_product_customfields->store(); $csvilog->addDebug('COM_CSVI_DEBUG_CUSTOMFIELD_QUERY', true); // Reset the field $this->_product_customfields->reset(); } } } /** * Delete a product and its references * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _deleteProduct() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Delete the product if ($this->_products->delete($this->virtuemart_product_id)) { $db = JFactory::getDbo(); // Delete product translations jimport('joomla.language.helper'); $languages = array_keys(JLanguageHelper::getLanguages('lang_code')); foreach ($languages as $language){ $query = $db->getQuery(true); $query->delete('#__virtuemart_products_'.strtolower(str_replace('-', '_', $language))); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRODUCT_LANG_XREF'), true); $db->query(); } // Delete category reference $query = $db->getQuery(true); $query->delete('#__virtuemart_product_categories'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_CATEGORY_XREF'), true); $db->query(); // Delete manufacturer reference $query = $db->getQuery(true); $query->delete('#__virtuemart_product_manufacturers'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_MANUFACTURER_XREF'), true); $db->query(); // Reset child parent reference $query = $db->getQuery(true); $query->update('#__virtuemart_products'); $query->set('product_parent_id = 0'); $query->where('product_parent_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRODUCT_PARENT'), true); $db->query(); // Delete prices $query = $db->getQuery(true); $query->delete('#__virtuemart_product_prices'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRICES_XREF'), true); $db->query(); // Delete shopper groups $query = $db->getQuery(true); $query->delete('#__virtuemart_product_shoppergroups'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_SHOPPERGROUP_XREF'), true); $db->query(); // Delete prices $query = $db->getQuery(true); $query->delete('#__virtuemart_product_prices'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRICES_XREF'), true); $db->query(); // Delete custom fields $query = $db->getQuery(true); $query->delete('#__virtuemart_product_customfields'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_CUSTOMFIELDS_XREF'), true); $db->query(); // Delete media $query = $db->getQuery(true); $query->delete('#__virtuemart_product_medias'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_MEDIA_XREF'), true); $db->query(); // Delete ratings $query = $db->getQuery(true); $query->delete('#__virtuemart_product_ratings'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_RATINGS_XREF'), true); $db->query(); // Delete rating reviews $query = $db->getQuery(true); $query->delete('#__virtuemart_product_rating_reviews'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_RATING_REVIEWS_XREF'), true); $db->query(); // Delete rating votes $query = $db->getQuery(true); $query->delete('#__virtuemart_product_rating_votes'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_RATING_VOTES_XREF'), true); $db->query(); $csvilog->AddStats('deleted', JText::sprintf('COM_CSVI_PRODUCT_DELETED', $this->record_identity)); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_NOT_DELETED', $this->record_identity)); } return true; } /** * Convert the product SKU to product ID in the parent properties * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 1.0 */ private function _processParentValues() { if (isset($this->product_sku) && !is_null($this->product_parent_id)) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $param_sku = $this->_products->virtuemart_product_id; $sku = $this->product_sku; // Load the values $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('custom_param'); $query->from('#__virtuemart_product_customfields'); $query->where('virtuemart_product_id = '.$this->product_parent_id); $query->where('custom_value = '.$db->quote('stockable')); $db->setQuery($query); $params = $db->loadResult(); $values = json_decode($params); // Replace the key if it exists if (isset($values->child->$sku)) { $values->child->$param_sku = $values->child->$sku; unset($values->child->$sku); // Store the values $query = $db->getQuery(true); $query->update('#__virtuemart_product_customfields'); $query->set('custom_param = '.$db->quote(json_encode($values))); $query->where('virtuemart_product_id = '.$this->product_parent_id); $query->where('custom_value = '.$db->quote('stockable')); $db->setQuery($query); $db->query(); $csvilog->addDebug('COM_CSVI_DEBUG_STORE_PARENT_VALUE', true); } else { $csvilog->addDebug('COM_CSVI_DEBUG_NO_PARENT_VALUE_FOUND', true); } } } /** * Process the shopper groups * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.5.2 */ private function _processShopperGroup() { if (!empty($this->shopper_group_name)) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Get the shopper group names $names = explode('|', $this->shopper_group_name); foreach ($names as $name) { $data = array(); $data['virtuemart_shoppergroup_id'] = $this->helper->getShopperGroupId($name); $data['virtuemart_product_id'] = $this->virtuemart_product_id; $this->_product_shoppergroups->bind($data); if(!$this->_product_shoppergroups->check()) { if ($this->_product_shoppergroups->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_PRODUCT_SHOPPERGROUP')); else if ($this->queryResult() == 'INSERT') $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_PRODUCT_SHOPPERGROUP')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_SHOPPERGROUP_NOT_ADDED', $this->_product_shoppergroups->getError())); return false; } } } } } }userinfoimport.php000066600000035444151467074630010375 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo change cdate/mdate to use JDate * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'address_type': switch (strtolower($value)) { case 'shipping address': case 'st': $this->$name = 'ST'; break; case 'billing address': case 'bt': default: $this->$name = 'BT'; break; } break; default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo Add a beter text for MISSING_REQUIRED_FIELDS * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDbo(); $csvilog = $jinput->get('csvilog', null, null); $userdata = array(); jimport('joomla.user.helper'); // See if we have a user_info_id if (empty($this->virtuemart_userinfo_id)) { // No user_info_id, maybe we have user_id, address_type and address_type_name if ((!isset($this->virtuemart_user_id) && (!isset($this->email))) || !isset($this->address_type) || !isset($this->address_type_name)) { // No way to identify what needs to be updated, set error and return $csvilog->AddStats('incorrect', JText::_('COM_CSVI_MISSING_REQUIRED_FIELDS')); return false; } } // We have a virtuemart_userinfo_id, do we have a virtuemart_user_id else { $query = $db->getQuery(true); $query->select('virtuemart_user_id'); $query->from('#__virtuemart_userinfos'); $query->where('virtuemart_userinfo_id = '.$db->Quote($this->virtuemart_userinfo_id)); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_FIND_USER_ID_FROM_VM'), true); $this->virtuemart_user_id = $db->loadResult(); } // Check for the user_info_id if (empty($this->virtuemart_userinfo_id)) { // See if we have a user_id or user_email if (!isset($this->virtuemart_user_id) && isset($this->email)) { // We have an e-mail address, find the user_id $query = $db->getQuery(true); $query->select('id'); $query->from('#__users'); $query->where('email = '.$db->Quote($this->email)); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_FIND_USER_ID_FROM_JOOMLA'), true); $this->virtuemart_user_id = $db->loadResult(); } if ($this->virtuemart_user_id) { // if we have a user_id we can get the user_info_id $query = $db->getQuery(true); $query->select('virtuemart_userinfo_id'); $query->from('#__virtuemart_userinfos'); $query->where('virtuemart_user_id = '.$this->virtuemart_user_id); $query->where('address_type = '.$db->Quote($this->address_type)); $query->where('address_type_name = '.$db->Quote($this->address_type_name)); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_FIND_USER_INFO_ID'), true); $this->virtuemart_userinfo_id = $db->loadResult(); } } // If it is a new Joomla user but no username is set, we must set one if ((!isset($this->virtuemart_user_id) || !$this->virtuemart_user_id) && !isset($this->username)) { $userdata['username'] = $this->email; } // Set the username else if (isset($this->username)) $userdata['username'] = $this->username; // Check if we have an encrypted password if (isset($this->password_crypt)) { $userdata['password'] = $this->password_crypt; } else if (isset($this->password)) { // Check if we have an encrypted password $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($this->password, $salt); $password = $crypt.':'.$salt; $userdata['password'] = $password; } // No user id, need to create a user if possible if (!isset($this->virtuemart_user_id) && isset($this->email) && isset($this->password)) { // Set the creation date $date = JFactory::getDate(); $userdata['registerDate'] = $date->toMySQL(); } else if (!isset($this->virtuemart_user_id) && (!isset($this->email) || !isset($this->password))) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_NEW_USER_PASSWORD_EMAIL')); return false; } else { // Set the id $userdata['id'] = $this->virtuemart_user_id; } // Only store the Joomla user if there is an e-mail address supplied if (isset($this->email)) { // Set the name if (isset($this->name)) $userdata['name'] = $this->name; else { $fullname = false; if (isset($this->first_name)) $fullname .= $this->first_name.' '; if (isset($this->last_name)) $fullname .= $this->last_name; if (!$fullname) $fullname = $this->user_email; $userdata['name'] = trim($fullname); } // Set the email $userdata['email'] = $this->email; // Set if the user is blocked if (isset($this->block)) $userdata['block'] = $this->block; // Set the sendEmail if (isset($this->sendemail)) $userdata['sendEmail'] = $this->sendemail; // Set the registerDate if (isset($this->registerdate)) $userdata['registerDate'] = $this->registerdate; // Set the lastvisitDate if (isset($this->lastvisitdate)) $userdata['lastvisitDate'] = $this->lastvisitdate; // Set the activation if (isset($this->activation)) $userdata['activation'] = $this->activation; // Set the params if (isset($this->params)) $userdata['params'] = $this->params; // Check if we have a group ID if (!isset($this->group_id)) { $query = $db->getQuery(true); $query->select('id'); $query->from('#__usergroups'); $query->where($db->quoteName('title').' = '.$db->Quote($this->usergroup_name)); $db->setQuery($query); $this->group_id = $db->loadResult(); if (empty($this->group_id)) { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_NO_USERGROUP_FOUND', $this->usergroup_name)); return false; } } // Bind the data $this->_user->bind($userdata); // Store/update the user if ($this->_user->store()) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_JOOMLA_USER_STORED'), true); // Get the new user ID $this->virtuemart_user_id = $this->_user->id; // Empty the usergroup map table $query = $db->getQuery(true); $query->delete('#__user_usergroup_map'); $query->where('user_id = '.$this->virtuemart_user_id); $db->setQuery($query); $db->query(); // Store the user in the usergroup map table $query = $db->getQuery(true); $query->insert('#__user_usergroup_map'); $query->values($this->virtuemart_user_id.', '.$this->group_id); $db->setQuery($query); // Store the map if ($db->query()) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_JOOMLA_USER_MAP_STORED'), true); } else $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_JOOMLA_USER_MAP_NOT_STORED'), true); } else $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_JOOMLA_USER_NOT_STORED'), true); } else $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_JOOMLA_USER_SKIPPED')); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_userinfos->modified_on = $this->date->toMySQL(); $this->_userinfos->modified_by = $this->user->id; } // Bind the VirtueMart user data $this->_userinfos->bind($this); // Store the VirtueMart user info if ($this->_userinfos->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_USERINFO')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_USERINFO')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_USERINFO_NOT_ADDED', $this->_userinfos->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_USERINFO_QUERY'), true); // See if there is any shopper group information to be stored // user_id, vendor_id, shopper_group_id, customer number // Get the user_id if (!isset($this->virtuemart_user_id) && isset($this->_userinfos->virtuemart_userinfo_id)) { $this->virtuemart_user_id = $_userinfos->virtuemart_user_id; } // Get the vendor_id if (empty($this->virtuemart_vendor_id) && isset($this->vendor_name)) { $query = $db->getQuery(true); $query->select('virtuemart_vendor_id'); $query->from('#__virtuemart_vendors'); $query->where('vendor_name = '.$db->Quote($this->vendor_name)); $db->setQuery($query); $this->virtuemart_vendor_id = $db->loadResult(); if (empty($this->vendor_id)) $this->virtuemart_vendor_id = $this->helper->getVendorId(); } else $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Get the shopper_group_id if (empty($this->virtuemart_shoppergroup_id) && isset($this->shopper_group_name)) { $query = $db->getQuery(true); $query->select('virtuemart_shoppergroup_id'); $query->from('#__virtuemart_shoppergroups'); $query->where('shopper_group_name = '.$db->Quote($this->shopper_group_name)); $db->setQuery($query); $this->virtuemart_shoppergroup_id = $db->loadResult(); if (empty($this->virtuemart_shoppergroup_id)) $this->virtuemart_shoppergroup_id = $this->helper->getDefaultShopperGroupID(); } else if (!isset($this->virtuemart_shoppergroup_id) && !isset($this->shopper_group_name)) $this->virtuemart_shoppergroup_id = $this->helper->getDefaultShopperGroupID(); // Bind the shopper group data $this->_vmuser_shoppergroups->bind($this); $this->_vmuser_shoppergroups->check(); if ($this->_vmuser_shoppergroups->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_SHOPPER_GROUP')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_SHOPPER_GROUP')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_SHOPPER_GROUP_NOT_ADDED', $this->_vmuser_shoppergroups->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_SHOPPER_GROUP_QUERY'), true); // See if there is any vmusers entry $this->_vmusers->load($this->virtuemart_user_id); if (empty($this->_vmusers->virtuemart_user_id)) { if (!isset($this->user_is_vendor)) $this->user_is_vendor = 0; if (!isset($this->customer_number)) $this->customer_number = md5($userdata['username']); if (!isset($this->perms)) $this->perms = 'shopper'; if (!isset($this->virtuemart_paymentmethod_id)) $this->virtuemart_paymentmethod_id = null; if (!isset($this->virtuemart_shipmentmethod_id)) $this->virtuemart_shipmentmethod_id = null; if (!isset($this->agreed)) $this->agreed = 0; } // Bind the data $this->_vmusers->bind($this); // Check the vmusers table if ($this->_vmusers->check()) { // Update the dates if (!isset($this->modified_on)) { $this->_vmusers->modified_on = $this->date->toMySQL(); $this->_vmusers->modified_by = $this->user->id; } } else { $this->_vmusers->created_on = $this->date->toMySQL(); $this->_vmusers->created_by = $this->user->id; } // Store the vmusers data if ($this->_vmusers->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_VMUSERS')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_VMUSERS')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_VMUSERS_NOT_ADDED', $this->_vmusers->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_VMUSERS_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the user info related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_userinfos = $this->getTable('userinfos'); $this->_vmusers = $this->getTable('vmusers'); $this->_vmuser_shoppergroups = $this->getTable('vmuser_shoppergroups'); $this->_user = $this->getTable('users'); } /** * Cleaning the user info related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_userinfos->reset(); $this->_vmusers->reset(); $this->_vmuser_shoppergroups->reset(); $this->_user->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?>waitinglistimport.php000066600000013231151467074630011067 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_product_id = $this->helper->getProductId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { default: $this->$name = $value; break; } } // All is good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Get the user ID if (empty($this->virtuemart_user_id)) { $this->virtuemart_user_id = $this->_getUserId(); if (empty($this->virtuemart_user_id)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_WAITINGLIST_NO_USER_FOUND')); return false; } } if (empty($this->virtuemart_product_id)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_WAITINGLIST_NO_PRODUCT_FOUND')); return false; } if ($this->virtuemart_product_id && $this->virtuemart_user_id && $this->notify_email) { // Bind the data $this->_waitingusers->bind($this); // Check the data $this->_waitingusers->check(); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_waitingusers->modified_on = $this->date->toMySQL(); $this->_waitingusers->modified_by = $this->user->id; } if (empty($this->_waitingusers->virtuemart_waitinguser_id)) { $this->_waitingusers->created_on = $this->date->toMySQL(); $this->_waitingusers->created_by = $this->user->id; } // Store the data if ($this->_waitingusers->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_WAITINGLIST')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_WAITINGLIST')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_WAITINGLIST_NOT_ADDED', $this->_waitingusers->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_WAITINGLIST_QUERY'), true); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_WAITINGLIST_NO_USER_PRODUCT_ID')); } // Clean the tables $this->cleanTables(); } /** * Load the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.01 */ private function _loadTables() { $this->_waitingusers = $this->getTable('waitingusers'); } /** * Cleaning the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.1 */ protected function cleanTables() { $this->_waitingusers->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Get the user ID * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return mixed int when user ID found | false when not found * @since 3.1 */ private function _getUserId() { if (isset($this->username)) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('id'); $query->from('#__users'); $query->where('username = '.$db->Quote($this->username)); $db->setQuery($query); $result = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_FIND_USER_ID'), true); if ($result) return $result; else return false; } else return false; } } ?>orderitemimport.php000066600000016546151467074630010537 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'product_price': $this->product_item_price = $this->cleanPrice($value); break; case 'product_final_price': $this->$name = $this->cleanPrice($value); break; case 'product_sku': $this->order_item_sku = $value; $this->product_sku = $value; break; case 'product_name': $this->order_item_name = $value; break; case 'created_on': $this->cdate = $this->convertDate($value); break; case 'modified_on': $this->mdate = $this->convertDate($value); break; case 'address_type': switch (strtolower($name)) { case 'shipping address': case 'st': $this->$name = 'ST'; break; case 'billing address': case 'bt': default: $this->$name = 'BT'; break; } break; case 'order_status_name': $this->order_status = $this->helper->getOrderStatus($value); break; default: $this->$name = $value; break; } } // Check if we have an order ID if (!isset($this->virtuemart_order_id)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_ORDER_ID_FOUND')); return false; } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDbo(); $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); // Check for product ID if (!isset($this->virtuemart_product_id) && isset($this->product_sku)) { $this->virtuemart_product_id = $this->helper->getProductId(); if (empty($this->virtuemart_product_id)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_PRODUCT_ID_FOUND')); return false; } } else if (isset($this->virtuemart_product_id) && !isset($this->product_sku)) { $query = $db->getQuery(true); $query->select('product_sku'); $query->from('#__virtuemart_products'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $this->order_item_sku = $db->loadResult(); } else if (!isset($this->virtuemart_product_id) && !isset($this->product_sku)) { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NO_PRODUCT_ID_OR_SKU')); return false; } // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_order_items->modified_on = $this->date->toMySQL(); $this->_order_items->modified_by = $this->user->id; } // Check if there is an existing order item $query = $db->getQuery(true); $query->select('virtuemart_order_item_id'); $query->from('#__virtuemart_order_items'); $query->where('virtuemart_order_id = '.$this->virtuemart_order_id); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $query->where('virtuemart_vendor_id = '.$this->virtuemart_vendor_id); $db->setQuery($query); $this->virtuemart_order_item_id = $db->loadResult(); if (empty($this->virtuemart_order_item_id) && !isset($this->created_on)) { $this->_order_items->created_on = $this->date->toMySQL(); $this->_order_items->created_by = $this->user->id; } else { $this->_order_items->load($this->virtuemart_order_item_id); } // Bind the data $this->_order_items->bind($this); // Check if we have a product name if (empty($this->_order_items->order_item_name)) { $query = $db->getQuery(true); $query->select('product_name'); $query->from('#__virtuemart_products_'.$template->get('language', 'general')); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $this->_order_items->order_item_name = $db->loadResult(); } // Store the data if ($this->_order_items->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_ORDER_ITEM')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_ORDER_ITEM')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_ORDER_ITEM_NOT_ADDED', $this->_order_items->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_ORDER_ITEM_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the order item related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_order_items = $this->getTable('order_items'); } /** * Cleaning the order item related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_order_items->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?> manufacturerimport.php000066600000024224151467074630011231 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Only continue if all tables exist if ($this->_tablesexist) { // Load the data $this->loadData(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'mf_category_name': $this->_manufacturer_categories_lang->mf_category_name = $value; break; default: $this->$name = $value; break; } } return true; } else { $template = $jinput->get('template', null, null); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_LANG_TABLE_NOT_EXIST', $template->get('language', 'general'))); return false; } } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check if we need to get manufacturer category ID if (empty($this->virtuemart_manufacturercategories_id) && isset($this->_manufacturer_categories_lang->mf_category_name)) { if ($this->_manufacturer_categories_lang->check(false)) { $this->virtuemart_manufacturercategories_id = $this->_manufacturer_categories_lang->virtuemart_manufacturercategories_id; } } // Check for the manufacturer ID if (!isset($this->virtuemart_manufacturer_id)) $this->_getManufacturerId(); // Bind the data $this->_manufacturers->bind($this); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_manufacturers->modified_on = $this->date->toMySQL(); $this->_manufacturers->modified_by = $this->user->id; } // Add a creating date if there is no product_id if (empty($this->virtuemart_manufacturer_id)) { $this->_manufacturers->created_on = $this->date->toMySQL(); $this->_manufacturers->created_by = $this->user->id; } // Check if we need to delete the manufacturer if ($this->manufacturer_delete == 'Y') { $this->_deleteManufacturer(); } else { // Store the data if ($this->_manufacturers->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MANUFACTURER')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MANUFACTURER')); $this->virtuemart_manufacturer_id = $this->_manufacturers->get('virtuemart_manufacturer_id'); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_NOT_ADDED', $this->_manufacturers->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_MANUFACTURER_QUERY'), true); // Store the language fields $this->_manufacturers_lang->bind($this); $this->_manufacturers_lang->virtuemart_manufacturer_id = $this->virtuemart_manufacturer_id; if ($this->_manufacturers_lang->check()) { if ($this->_manufacturers_lang->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_PRODUCT_LANG')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_PRODUCT_LANG')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_LANG_NOT_ADDED', $this->_manufacturers_lang->getError())); return false; } } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_LANG_NOT_ADDED', $this->_manufacturers_lang->getError())); return false; } // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_MANUFACTURER_LANG_QUERY'), true); } // Clean the tables $this->cleanTables(); } /** * Load the manufacturer related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $jinput = JFactory::getApplication()->input; $template = $jinput->get('template', null, null); $this->_manufacturers = $this->getTable('manufacturers'); // Check if the language tables exist $db = JFactory::getDbo(); $tables = $db->getTableList(); if (!in_array($db->getPrefix().'virtuemart_manufacturers_'.$template->get('language', 'general'), $tables)) { $this->_tablesexist = false; } else if (!in_array($db->getPrefix().'virtuemart_manufacturercategories_'.$template->get('language', 'general'), $tables)) { $this->_tablesexist = false; } else { $this->_tablesexist = true; $this->_manufacturers_lang = $this->getTable('manufacturers_lang'); $this->_manufacturer_categories_lang = $this->getTable('manufacturer_categories_lang'); } } /** * Cleaning the manufacturer related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_manufacturers->reset(); $this->_manufacturers_lang->reset(); $this->_manufacturer_categories_lang->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Delete a manufacturer and its references * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _deleteManufacturer() { if (!empty($this->virtuemart_manufacturer_id)) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); // Delete product manufacturer xref $query = $db->getQuery(true); $query->delete('#__product_manufacturers'); $query->where('virtuemart_manufacturer_id = '.$this->virtuemart_manufacturer_id); $db->setQuery(); if ($db->query()) { $csvilog->addStats('deleted', JText::_('COM_CSVI_MANUFACTURER_XREF_DELETED')); } else { $csvilog->addStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_XREF_NOT_DELETED', $db->getErrorMsg())); } // Delete translations jimport('joomla.language.helper'); $languages = array_keys(JLanguageHelper::getLanguages('lang_code')); foreach ($languages as $language){ $query = $db->getQuery(true); $query->delete('#__virtuemart_manufacturers_'.strtolower(str_replace('-', '_', $language))); $query->where('virtuemart_manufacturer_id = '.$this->virtuemart_manufacturer_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_MANUFACTURER_LANG_XREF'), true); $db->query(); } // Delete manufacturer if ($this->_manufacturers->delete($this->virtuemart_manufacturer_id)) { $csvilog->AddStats('deleted', JText::_('COM_CSVI_DELETE_MANUFACTURER')); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MANUFACTURER_NOT_DELETED', $this->_manufacturers->getError())); } // Delete media $query = $db->getQuery(true); $query->delete('#__virtuemart_manufacturer_medias'); $query->where('virtuemart_manufacturer_id = '.$this->virtuemart_manufacturer_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_MEDIA_XREF'), true); $db->query(); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_MANUFACTURER_NOT_DELETED_NO_ID')); } } /** * Get the manufacturer ID * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return mixed integer when category ID found | false when not found * @since 3.0 */ private function _getManufacturerId() { $this->_manufacturers_lang->set('mf_name', $this->mf_name); if ($this->_manufacturers_lang->check(false)) { $this->virtuemart_manufacturer_id = $this->_manufacturers_lang->virtuemart_manufacturer_id; return true; } else return false; } } ?> couponimport.php000066600000011464151467074630010042 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->csviuser = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Load the data $this->loadData(); // Load the helper $this->helper = new Com_Akeebasubs(); // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'enabled': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'value': $this->$name = $this->cleanPrice($value); break; case 'publish_up': case 'publish_down': $this->$name = $this->convertDate($value); break; default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check if we have a user ID if (!isset($this->user) && isset($this->username)) { $this->user = $this->helper->getUser($this->username); } // Check if we have a subscription title if (!isset($this->subscriptions) && isset($this->subscription_title)) { $this->subscriptions = $this->helper->getSubscription($this->subscription_title); } // Set some basic values if (!isset($this->modified_on)) { $this->_coupons->modified_on = $this->date->toMySQL(); $this->_coupons->modified_by = $this->csviuser->id; } // Add a creating date if there is no product_id if (empty($this->akeebasubs_coupon_id)) { $this->_coupons->created_on = $this->date->toMySQL(); $this->_coupons->created_by = $this->csviuser->id; } // Bind the data $this->_coupons->bind($this); // Check the data $this->_coupons->check(); // Store the data if ($this->_coupons->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_COUPON')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_COUPON')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_COUPON_NOT_ADDED', $this->_coupons->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_COUPON_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the coupon related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_coupons = $this->getTable('coupons'); } /** * Cleaning the coupon related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_coupons->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?>ratingimport.php000066600000014664151467074630010030 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Load the data $this->loadData(); // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Load the helper $this->helper = new Com_VirtueMart(); // Get the product ID $this->virtuemart_product_id = $this->helper->getProductId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; default: $this->$name = $value; break; } } return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; // Get the imported values $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDBO(); // Check if there is a product ID if (!empty($this->virtuemart_product_id)) { // Find the user ID for the username if (isset($this->username)) { $q = "SELECT id FROM #__users WHERE username = ".$db->Quote($this->username); $db->setQuery($q); $this->created_by = $db->loadResult(); } // Set some basic values if (is_null($this->lastip)) $this->lastip = $_SERVER['SERVER_ADDR']; if (is_null($this->created_on)) $this->created_on = $this->date->toMySQL(); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->modified_on = $this->date->toMySQL(); $this->modified_by = $this->user->id; } // Bind the data $this->_rating_reviews->bind($this); // Store the rating reviews if ($this->_rating_reviews->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_PRODUCT_REVIEW')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_PRODUCT_REVIEW')); // Store the rating votes $this->_rating_votes->bind($this); if ($this->_rating_votes->store($this)) { // Update product votes $vote = new stdClass(); $vote->virtuemart_product_id = $this->virtuemart_product_id; $vote->created_on = $this->created_on; $vote->created_by = $this->created_by; $vote->modified_on = $this->modified_on; $vote->modified_by = $this->modified_by; // Check if an entry already exist $query = $db->getQuery(true); $query->select('virtuemart_rating_id'); $query->from('#__virtuemart_ratings'); $query->where('virtuemart_product_id = '.$this->virtuemart_product_id); $db->setQuery($query); $vote->virtuemart_rating_id = $db->loadResult(); // Vote exists if ($vote->virtuemart_rating_id > 0) { // Get all the votes $q = "SELECT vote FROM #__virtuemart_rating_votes WHERE virtuemart_product_id = ".$this->virtuemart_product_id; $db->setQuery($q); $ratings = $db->loadResultArray(); // Create the new totals $vote->ratingcount = count($ratings); $vote->rates = array_sum($ratings); $vote->rating = $vote->rates / $vote->ratingcount; } // Vote does not exist else { $vote->rates = $this->vote; $vote->rating = $this->vote; $vote->ratingcount = 1; } // Store the ratings $this->_ratings->bind($vote); $this->_ratings->check(); $this->_ratings->store(); } } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_PRODUCT_REVIEW_NOT_ADDED', $this->_rating_reviews->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_PRODUCT_REVIEW_QUERY'), true); } else { $csvilog->AddStats('incorrect', JText::_('COM_CSVI_PRODUCT_REVIEW_NO_PRODUCT_ID')); } // Clean the tables $this->cleanTables(); } /** * Load the reviews related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_ratings = $this->getTable('ratings'); $this->_rating_reviews = $this->getTable('rating_reviews'); $this->_rating_votes = $this->getTable('rating_votes'); } /** * Cleaning the product related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_ratings->reset(); $this->_rating_reviews->reset(); $this->_rating_votes->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } } ?> orderimport.php000066600000050227151467074630007652 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'customer_notified': $this->$name = (strtoupper($value) == 'N') ? 0 : 1; break; case 'order_status': $this->$name = $value; break; case 'order_status_name': $this->order_status_code = $this->helper->getOrderStatus($value); $this->order_status = $this->order_status_code; break; case 'order_total': case 'order_subtotal': case 'order_tax': case 'order_shipment': case 'order_shipment_tax': case 'order_payment': case 'order_payment_tax': case 'coupon_discount': case 'order_discount': $this->$name = $this->cleanPrice($value); break; default: $this->$name = $value; break; } } // All is good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $db = JFactory::getDBO(); $csvilog = $jinput->get('csvilog', null, null); // Load the order user details if (!isset($this->virtuemart_user_id) && isset($this->email)) { $query = $db->getQuery(true); $query->select('id'); $query->from('#__users'); $query->where('email = '.$db->Quote($this->email)); $db->setQuery($query); $this->virtuemart_user_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_RETRIEVE_USER_ID'), true); } if (isset($this->virtuemart_user_id)) { $query = $db->getQuery(true); $query->select('*'); $query->from('#__virtuemart_userinfos'); $query->where('address_type = '.$db->Quote('BT')); $query->where('virtuemart_user_id = '.$this->virtuemart_user_id); $db->setQuery($query); $userdetails = $db->loadObject(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_LOAD_USER_DETAILS'), true); } else { $csvilog->addDebug(JText::_('COM_CSVI_NOT_PROCESS_USER')); $csvilog->AddStats('incorrect', JText::_('COM_CSVI_NOT_PROCESS_USER')); return false; } // Check if we have an order ID if (empty($this->virtuemart_order_id) && !empty($this->order_number)) { $query = $db->getQuery(true); $query->select('virtuemart_order_id'); $query->from('#__virtuemart_orders'); $query->where('order_number = '.$db->Quote($this->order_number)); $db->setQuery($query); $this->virtuemart_order_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_LOAD_ORDER_ID'), true); } // Load the order if there is an order_id if (empty($this->virtuemart_order_id)) { // Add a creating date if there is no order id $this->_orders->created_on = $this->date->toMySQL(); $this->_orders->created_by = $this->user->id; // Create an order number if it is empty if (empty($this->order_number)) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_CREATE_ORDER_NUMBER')); $this->order_number = substr(md5(session_id().(string)time().(string)$this->virtuemart_user_id), 0, 8); } else { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_NOT_CREATE_ORDER_NUMBER')); } // Create an order pass if (empty($this->order_pass)) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_CREATE_ORDER_PASS')); $this->order_pass = 'p_'.substr(md5(session_id().(string)time().(string)$this->order_number), 0, 6); } // Check the user currency if (!isset($this->user_currency_id) && isset($this->user_currency)) { $query = $db->getQuery(true); $query->select('virtuemart_currency_id'); $query->from('#__virtuemart_currencies'); $query->where('currency_code_3 = '.$db->Quote($this->user_currency)); $db->setQuery($query); $this->user_currency_id = $db->loadResult(); } // Check the currency rate if (!isset($user->user_currency_rate)) { $user->user_currency_rate = 1; } // Check the order currency if (!isset($this->order_currency)) $this->_orders->order_currency = $this->user_currency_id; // Check the user info id //if (empty($this->virtuemart_order_id)) $this->virtuemart_order_userinfo_id = $userdetails->virtuemart_userinfo_id; // Check the pyament method ID if (!isset($this->virtuemart_paymentmethod_id)) { // Handle the payment method ID if (isset($this->payment_element)) { $query = $db->getQuery(true); $query->select('virtuemart_paymentmethod_id'); $query->from('#__virtuemart_paymentmethods'); $query->where('payment_element = '.$db->Quote($this->payment_element)); $db->setQuery($query); $this->virtuemart_paymentmethod_id = $db->loadResult(); } else $this->virtuemart_paymentmethod_id = 0; } // Check order payment if (!isset($this->order_payment) )$this->_orders->order_payment = 0; // Check order payment tax if (!isset($this->order_payment_tax)) $this->_orders->order_payment_tax = 0; // Check the order_shipping if (!isset($this->order_shipment)) $this->order_shipment = 0; // Check the order_shipping_tax if (!isset($this->order_shipment_tax)) $this->order_shipment_tax = 0; // Check the coupon_code if (!isset($this->coupon_code)) $this->coupon_code = ''; // Check the customer note if (!isset($this->customer_note)) $this->customer_note = ''; // Check the IP address if (!isset($this->ip_address)) $this->ip_address = $_SERVER['SERVER_ADDR']; // Check the ship_method_id if (!isset($this->virtuemart_shipmentmethod_id)) { if (isset($this->shipment_element)) { $query = $db->getQuery(true); $query->select('virtuemart_shipmentmethod_id'); $query->from('#__virtuemart_shipmentmethods'); $query->where('shipment_element = '.$db->Quote('shipment_element')); $db->setQuery($query); $this->virtuemart_shipmentmethod_id = $db->loadResult(); } $this->virtuemart_shipmentmethod_id = ''; } } // Add the modification date if (!isset($this->modified_on)) { $this->_orders->modified_on = $this->date->toMySQL(); $this->_orders->modified_by = $this->user->id; } // Bind order data $this->_orders->bind($this); // Store the order if ($this->_orders->store()) { $csvilog->addDebug(JText::_('COM_CSVI_ORDER_QUERY'), true); if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_ORDER')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_ORDER')); $this->virtuemart_order_id = $this->_orders->virtuemart_order_id; } else { $csvilog->addDebug(JText::_('COM_CSVI_ORDER_QUERY'), true); $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_ORDER_NOT_ADDED', $this->_orders->getError())); // Clean the tables $this->cleanTables(); return false; } // Store the user info if (!isset($this->virtuemart_order_userinfo_id)) { // Check if there is the requested address in the database $query = $db->getQuery(true); $query->select('virtuemart_order_userinfo_id'); $query->from('#__virtuemart_order_userinfo'); $query->where('address_type = '.$db->Quote($this->address_type)); $query->where('virtuemart_order_id = '.$this->virtuemart_order_id); $db->setQuery($query); $this->virtuemart_order_userinfo_id = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_LOAD_ORDER_INFO_ID'), true); } // Load the order info if ($this->virtuemart_order_userinfo_id) { $this->_order_userinfos->load($this->virtuemart_order_userinfo_id); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_LOAD_ORDER_INFO'), true); if (!isset($this->modified_on)) { $this->_order_userinfos->modified_on = $this->date->toMySQL(); $this->_order_userinfos->modified_by = $this->user->id; } } if (!$this->virtuemart_order_userinfo_id || $this->_order_userinfos->virtuemart_user_id != $this->virtuemart_user_id) { $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_LOAD_USER_ORDER_INFO')); // Address type name if (!isset($this->address_type_name)) $this->address_type_name = $userdetails->address_type_name; // Company if (!isset($this->company)) $this->company = $userdetails->company; // Title if (!isset($this->title)) $this->title = $userdetails->title; // Last name if (!isset($this->last_name)) $this->last_name = $userdetails->last_name; // First name if (!isset($this->first_name)) $this->first_name = $userdetails->first_name; // Middle name if (!isset($this->middle_name)) $this->middle_name = $userdetails->middle_name; // Phone 1 if (!isset($this->phone_1)) $this->phone_1 = $userdetails->phone_1; // Phone 2 if (!isset($this->phone_2)) $this->phone_2 = $userdetails->phone_2; // Fax if (!isset($this->fax)) $this->fax = $userdetails->fax; // Address 1 if (!isset($this->address_1)) $this->address_1 = $userdetails->address_1; // Address 2 if (!isset($this->address_2)) $this->address_2 = $userdetails->address_2; // City if (!isset($this->city)) $this->city = $userdetails->city; // State if (!isset($this->virtuemart_state_id)) { if (isset($this->state_name) || isset($this->state_2_code) || isset($this->state_3_code)) { $query = $db->getQuery(true); $query->select('virtuemart_state_id'); $query->from('#__virtuemart_states'); if (isset($this->state_name)) $query->where('state_name = '.$db->Quote($this->state)); else if (isset($this->state_2_code)) $query->where('state_2_code = '.$db->Quote($this->state_2_code)); else if (isset($this->state_3_code)) $query->where('state_3_code = '.$db->Quote($this->state_3_code)); $db->setQuery($query); $this->virtuemart_state_id = $db->loadResult(); } else $this->virtuemart_state_id = $userdetails->virtuemart_state_id; } // Country if (!isset($this->virtuemart_country_id)) { if (isset($this->country_name) || isset($this->country_2_code) || isset($this->country_3_code)) { $this->virtuemart_country_id = $this->helper->getCountryId($this->country_name, $this->country_2_code, $this->country_3_code); } else $this->virtuemart_country_id = $userdetails->virtuemart_country_id; } // Zip if (!isset($this->zip)) $this->zip = $userdetails->zip; // Agreed if (!isset($this->agreed)) $this->agreed = 0; // Modified date if (!isset($this->modified_on)) { $this->_order_userinfos->modified_on = $this->date->toMySQL(); $this->_order_userinfos->modified_by = $this->user->id; } // Created date if (!isset($this->created_on)) { $this->_order_userinfos->created_on = $this->date->toMySQL(); $this->_order_userinfos->created_by = $this->user->id; } } // Bind the user uploaded data $this->_order_userinfos->bind($this); // Store the order user info if ($this->_order_userinfos->store($this)) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_ORDERUSER')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_ORDERUSER')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_ORDERUSER_NOT_ADDED', $this->_order_userinfos->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_ORDERUSER_QUERY'), true); // Check if the order has at least a billing address if ($this->address_type == 'ST') { // Check if there is the requested address in the database $query = $db->getQuery(true); $query->select('virtuemart_order_userinfo_id'); $query->from('#__virtuemart_order_userinfos'); $query->where('address_type = '.$db->Quote('BT')); $query->where('virtuemart_order_id = '.$this->virtuemart_order_id); $db->setQuery($query); $bt_order_info_id = $db->loadResult(); // There is no BT address let's add one if (!$bt_order_info_id) { // Get all the fields from the user info table $q = "SHOW COLUMNS FROM #__virtuemart_userinfos"; $db->setQuery($q); $user_fields_raw = $db->loadAssocList(); $user_fields = array(); foreach($user_fields_raw as $user_field) { $user_fields[] = $user_field['Field']; } $q = "SHOW COLUMNS FROM #__virtuemart_order_userinfos"; $db->setQuery($q); $order_user_fields_raw = $db->loadAssocList(); $order_user_fields = array(); foreach($order_user_fields_raw as $user_field) { $order_user_fields[] = $user_field['Field']; } $copy_fields = array_intersect($order_user_fields, $user_fields); // Create the billing address entry $q = "INSERT INTO #__virtuemart_order_userinfos (".implode(',', $copy_fields).", virtuemart_order_id) (SELECT ".implode(',', $copy_fields).", ".$this->virtuemart_order_id." AS order_id FROM #__virtuemart_userinfos WHERE user_id = ".$this->virtuemart_user_id." AND address_type = 'BT')"; $db->setQuery($q); $db->query(); $csvilog->addDebug(JText::_('COM_CSVI_CREATE_BILLING_QUERY'), true); } } // Create an order history entry // Load the payment info if (isset($this->virtuemart_order_history_id)) { $this->_order_histories->load($this->virtuemart_order_history_id); if (!isset($this->modified_on)) { $this->_order_histories->modified_on = $this->date->toMySQL(); $this->_order_histories->modified_by = $this->user->id; } } else { if (!isset($this->modified_on)) { $this->_order_histories->modified_on = $this->date->toMySQL(); $this->_order_histories->modified_by = $this->user->id; } // Add a creating date if there is no product_id $this->_order_histories->created_on = $this->date->toMySQL(); $this->_order_histories->created_by = $this->user->id; if (!isset($this->customer_notified)) $this->customer_notified = 0; // Comments $this->_order_histories->comments = ''; } // Bind the payment data $this->_order_histories->bind($this); // Store the order history info if ($this->_order_histories->store($this)) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_ORDER_HISTORY')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_ORDER_HISTORY')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_ORDER_PAYMNET_NOT_ADDED', $this->_order_histories->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_ORDER_HISTORY_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the order import related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_orders = $this->getTable('orders'); $this->_order_userinfos = $this->getTable('order_userinfos'); $this->_order_items = $this->getTable('order_items'); $this->_order_histories = $this->getTable('order_histories'); } /** * Cleaning the order import related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_orders->reset(); $this->_order_userinfos->reset(); $this->_order_items->reset(); $this->_order_histories->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Formate a date to MySQL timestamp * * Format of the date is day/month/year or day-month-year. * * @copyright * @author RolandD * @todo use JDate * @todo move to general function * @see * @access private * @param * @return string MySQL timestamp * @since 3.0 */ private function _getMysqlDate() { $new_date = preg_replace('/-|\./', '/', $this->_datafield); $date_parts = explode('/', $new_date); if ((count($date_parts) == 3) && ($date_parts[0] > 0 && $date_parts[0] < 32 && $date_parts[1] > 0 && $date_parts[1] < 13 && (strlen($date_parts[2]) == 4))) { $old_date = $date_parts[2].'-'.$date_parts[1].'-'.$date_parts[0]; } else $old_date = date('Y-m-d H:i:s', time()); return $old_date; } } ?> customfieldimport.php000066600000013341151467074630011051 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'created_on': case 'modified_on': case 'locked_on': $this->$name = $this->convertDate($value); break; default: $this->$name = $value; break; } } // All is good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Get the plugin ID if (empty($this->custom_jplugin_id) && !empty($this->custom_element)) { $this->custom_jplugin_id = $this->_getPluginId(); if (empty($this->custom_jplugin_id)) { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_NO_PLUGIN_FOUND', $this->plugin_name)); return false; } else { // Make sure the custom_value is the same as custom_element when dealing with a plugin // This is needed as otherwise the plugin is not called $this->custom_value = $this->custom_element; } } // Bind the data $this->_customs->bind($this); // Check the data $this->_customs->check(); // Set the modified date as we are modifying the product if (!isset($this->modified_on)) { $this->_customs->modified_on = $this->date->toMySQL(); $this->_customs->modified_by = $this->user->id; } if (empty($this->_customs->virtuemart_custom_id)) { $this->_customs->custom_params = ''; $this->_customs->custom_field_desc = ''; $this->_customs->created_on = $this->date->toMySQL(); $this->_customs->created_by = $this->user->id; } // Store the data if ($this->_customs->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_CUSTOMFIELD')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_CUSTOMFIELD')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_CUSTOMFIELD_NOT_ADDED', $this->_customs->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_CUSTOMFIELD_QUERY'), true); // Clean the tables $this->cleanTables(); } /** * Load the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.01 */ private function _loadTables() { $this->_customs = $this->getTable('customs'); } /** * Cleaning the waiting list related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.1 */ protected function cleanTables() { $this->_customs->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Get the user ID * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return mixed int when user ID found | false when not found * @since 3.1 */ private function _getPluginId() { if (isset($this->plugin_name)) { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('extension_id'); $query->from('#__extensions'); $query->where('name = '.$db->Quote($this->plugin_name)); $query->where('type = '.$db->Quote('plugin')); $db->setQuery($query); $result = $db->loadResult(); $csvilog->addDebug(JText::_('COM_CSVI_FIND_USER_ID'), true); if ($result) return $result; else return false; } else return false; } } ?>mediaimport.php000066600000025034151467074630007614 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->user = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo Redo the validateInput * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Get the logger $jinput = JFactory::getApplication()->input; // Load the data $this->loadData(); // Load the helper $this->helper = new Com_VirtueMart(); // Get the logger $csvilog = $jinput->get('csvilog', null, null); $this->virtuemart_vendor_id = $this->helper->getVendorId(); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'published': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'media_delete': $this->$name = strtoupper($value); break; default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $db = JFactory::getDBO(); $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); // Process the image $this->_processMedia(); // Set some basic values if (!isset($this->modified_on)) { $this->_medias->modified_on = $this->date->toMySQL(); $this->_medias->modified_by = $this->user->id; } // Find the media ID $this->_medias->file_url = $this->file_url; $this->_medias->check(); $this->virtuemart_media_id = $this->_medias->virtuemart_media_id; // Do we need to delete a media file? if ($this->media_delete == 'Y') { $this->_deleteMedia(); } else { // Check if the media exists if (empty($this->virtuemart_media_id)) { $this->_medias->created_on = $this->date->toMySQL(); $this->_medias->created_by = $this->user->id; } // Bind all the data $this->_medias->bind($this); // Store the data if ($this->_medias->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MEDIAFILE')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MEDIAFILE')); // Add a link to the product if the SKU is specified if (isset($this->product_sku)) { $this->_product_medias->virtuemart_media_id = $this->_medias->virtuemart_media_id; $this->_product_medias->virtuemart_product_id = $this->helper->getProductId(); if (!$this->_product_medias->check()) { if ($this->_product_medias->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_MEDIAXREF')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_MEDIAXREF')); } } } } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MEDIAFILE_NOT_ADDED', $this->_medias->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_MEDIAFILE_QUERY'), true); } // Clean the tables $this->cleanTables(); } /** * Load the product files related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_medias = $this->getTable('medias'); $this->_product_medias = $this->getTable('product_medias'); } /** * Cleaning the product files related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_medias->reset(); $this->_product_medias->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Delete a media and its references * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _deleteMedia() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Delete the product if ($this->_medias->delete($this->virtuemart_media_id)) { $db = JFactory::getDbo(); // Delete product reference $query = $db->getQuery(true); $query->delete('#__virtuemart_product_medias'); $query->where('virtuemart_media_id = '.$this->virtuemart_media_id); $db->setQuery($query); $csvilog->addDebug(JText::_('COM_CSVI_DEBUG_DELETE_PRODUCT_XREF'), true); $db->query(); $csvilog->AddStats('deleted', JText::sprintf('COM_CSVI_MEDIA_DELETED', $this->virtuemart_media_id)); } else { $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_MEDIA_NOT_DELETED', $this->virtuemart_media_id)); } return true; } /** * Process media files * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 4.0 */ private function _processMedia() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); $template = $jinput->get('template', null, null); // Check if any image handling needs to be done if ($template->get('process_image', 'image', false)) { if (!is_null($this->file_url)) { // Image handling $imagehelper = new ImageHelper; // Verify the original image if ($imagehelper->isRemote($this->file_url)) { $original = $this->file_url; $remote = true; if ($template->get('save_images_on_server', 'image')) { switch ($this->file_type) { case 'category': $base = $template->get('file_location_category_images', 'path'); break; default: $base = $template->get('file_location_product_images', 'path'); break; } } else $base = ''; $full_path = $base; } else { // Create the full file_url path switch ($this->file_type) { case 'category': $base = $template->get('file_location_category_images', 'path'); break; default: $base = $template->get('file_location_product_images', 'path'); break; } // Check if the image contains the image path $dirname = dirname($this->file_url); if (strpos($base, $dirname) !== false) { $image = basename($this->file_url); } $original = $base.$this->file_url; $remote = false; // Get subfolders $path_parts = pathinfo($original); $full_path = $path_parts['dirname'].'/'; $csvilog->addDebug(JText::sprintf('COM_CSVI_CREATED_FILE_URL', $original)); $remote = false; } // Generate image names $file_details = $imagehelper->ProcessImage($original, $full_path); // Process the file details if ($file_details['exists'] && $file_details['isimage']) { $media = array(); $this->file_title = ($this->file_title) ? $this->file_title : $this->file_url; $this->file_description = ($this->file_description) ? $this->file_description : $this->file_url; $this->file_meta = ($this->file_meta) ? $this->file_meta : $this->file_url; $this->file_mimetype = $file_details['mime_type']; $this->file_type = $this->file_type; $this->file_is_product_image = ($this->file_type == 'product') ? 1 : 0; $this->file_is_downloadable = ($this->file_is_downloadable) ? $this->file_is_downloadable : 0; $this->file_is_forSale = ($this->file_is_forSale) ? $this->file_is_forSale : 0; $this->file_url = (empty($file_details['output_path'])) ? $file_details['output_name'] : $file_details['output_path'].$file_details['output_name']; // Create the thumbnail if ($template->get('thumb_create', 'image')) { // Get the subfolder structure $thumb_path = str_ireplace($base, '', $full_path); if (empty($this->file_url_thumb)) $this->file_url_thumb = 'resized/'.$thumb_path.basename($this->file_url); if (!$remote) $original = $this->file_url; $this->file_url_thumb = $imagehelper->createThumbnail($original, $base, $this->file_url_thumb); } else if (empty($this->file_url_thumb)) $this->file_url_thumb = $this->file_url; } } } } }subscriptionimport.php000066600000013502151467643700011256 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Load the data $this->loadData(); // Load the helper $this->helper = new Com_Akeebasubs(); // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'enabled': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'subscription_delete': switch ($value) { case 'y': case 'Y': $this->$name = 'Y'; break; default: $this->$name = 'N'; break; } break; case 'net_amount': case 'tax_amount': case 'gross_amount': case 'affiliate_commision': case 'prediscount_amount': case 'discount_amount': $this->$name = $this->cleanPrice($value); break; case 'publish_up': case 'publish_down': $this->$name = $this->convertDate($value); break; case 'state': $this->_subscriptions->state = $value; break; default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // See if we need to delete a subscription if ($this->subscription_delete == 'Y' && $this->akeebasubs_subscription_id) { $this->_deleteSubscription(); } else { // Check if we have a user ID if (!isset($this->user_id) && isset($this->username)) { $this->user_id = $this->helper->getUser($this->username); } // Check if we have a subscription title if (!isset($this->akeebasubs_level_id) && isset($this->subscription_title)) { $this->akeebasubs_level_id = $this->helper->getSubscription($this->subscription_title); } // Add a creating date if there is no product_id if (empty($this->akeebasubs_subscription_id)) { $this->_subscriptions->created_on = $this->date->toMySQL(); } // Bind the data $this->_subscriptions->bind($this); // Check the data $this->_subscriptions->check(); // Store the data if ($this->_subscriptions->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_SUBSCRIPTION')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_SUBSCRIPTION')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_SUBSCRIPTION_NOT_ADDED', $this->_subscriptions->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_SUBSCRIPTION_QUERY'), true); } // Clean the tables $this->cleanTables(); } /** * Load the coupon related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_subscriptions = $this->getTable('subscriptions'); } /** * Cleaning the coupon related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_subscriptions->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Delete a subscription * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 4.0 */ private function _deleteSubscription() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); if ($this->_subscriptions->delete($this->akeebasubs_subscription_id)) { $csvilog->AddStats('deleted', JText::sprintf('COM_CSVI_SUBSCRIPTION_DELETED', $this->akeebasubs_subscription_id)); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_SUBSCRIPTION_NOT_DELETED', $this->akeebasubs_subscription_id)); } } ?>affiliateimport.php000066600000014500151467643700010455 0ustar00_loadTables(); $this->loadSettings(); // Set some initial values $this->date = JFactory::getDate(); $this->csviuser = JFactory::getUser(); } /** * Here starts the processing * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getStart() { // Load the data $this->loadData(); // Load the helper $this->helper = new Com_Akeebasubs(); // Get the logger $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Process data foreach ($this->csvi_data as $name => $value) { // Check if the field needs extra treatment switch ($name) { case 'enabled': switch ($value) { case 'n': case 'N': case '0': $value = 0; break; default: $value = 1; break; } $this->published = $value; break; case 'commision': case 'amount': $this->$name = $this->cleanPrice($value); break; default: $this->$name = $value; break; } } // All good return true; } /** * Process each record and store it in the database * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 3.0 */ public function getProcessRecord() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check if we have a user ID if (!isset($this->user_id) && isset($this->username)) { $this->user_id = $this->helper->getUser($this->username); } if (!empty($this->user_id)) { // Bind the data $this->_affiliates->bind($this); // Check if the affiliate needs to be deleted if ($this->affiliate_delete == 'Y') { $this->_deleteAffiliate(); } else { // Check the data $this->_affiliates->check(); // Store the data if ($this->_affiliates->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_AFFILIATE')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_AFFILIATE')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_AFFILIATE_NOT_ADDED', $this->_affiliates->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_AFFILIATE_QUERY'), true); // See if we have any affiliate payments to add if (isset($this->amount)) { if (!isset($this->created_on)) $this->created_on = $this->date->toMySQL(); // Bind the data $this->akeebasubs_affiliate_id = $this->_affiliates->akeebasubs_affiliate_id; $this->_affpayments->bind($this); // Check the data if ($this->_affpayments->check()) { // Store the data if ($this->_affpayments->store()) { if ($this->queryResult() == 'UPDATE') $csvilog->AddStats('updated', JText::_('COM_CSVI_UPDATE_AFFILIATEPAY')); else $csvilog->AddStats('added', JText::_('COM_CSVI_ADD_AFFILIATEPAY')); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_AFFILIATEPAY_NOT_ADDED', $this->_affpayments->getError())); // Store the debug message $csvilog->addDebug(JText::_('COM_CSVI_AFFILIATEPAY_QUERY'), true); } } } } // Clean the tables $this->cleanTables(); } /** * Load the affiliate related tables * * @copyright * @author RolandD * @todo * @see * @access private * @param * @return * @since 3.0 */ private function _loadTables() { $this->_affiliates = $this->getTable('affiliates'); $this->_affpayments = $this->getTable('affpayments'); } /** * Cleaning the coupon related tables * * @copyright * @author RolandD * @todo * @see * @access protected * @param * @return * @since 3.0 */ protected function cleanTables() { $this->_affiliates->reset(); $this->_affpayments->reset(); // Clean local variables $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { if (substr($name, 0, 1) != '_') { $this->$name = $value; } } } /** * Delete an affiliate * * @copyright * @author RolandD * @todo * @see * @access public * @param * @return * @since 4.0 */ private function _deleteAffiliate() { $jinput = JFactory::getApplication()->input; $csvilog = $jinput->get('csvilog', null, null); // Check the data if ($this->_affiliates->check()) { if ($this->_affiliates->delete()) { $csvilog->AddStats('deleted', JText::sprintf('COM_CSVI_AFFILIATES_DELETED', $this->_affiliates->akeebasubs_affiliate_id)); // Delete all payments if ($this->_affpayments->delete($this->user_id)) { $csvilog->AddStats('deleted', JText::sprintf('COM_CSVI_AFFILIATESPAY_DELETED', $this->user_id)); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_AFFILIATESPAY_NOT_DELETED', $this->user_id)); } else $csvilog->AddStats('incorrect', JText::sprintf('COM_CSVI_AFFILIATES_NOT_DELETED', $this->_affiliates->akeebasubs_affiliate_id)); } } } ?>default_fields.php000066600000035770151476163500010257 0ustar00 form->getValue('operation', 'options') == 'customimport') { ?>
form->getInput('custom_table'); ?>

'addRow')); ?> templatefields, '_field_name', null, 'value', 'text', null, '_field_name'); ?> replacements, '_replace_field', '', 'value', 'text', '', '_replace_field_default'); ?>

template->get('import_fields'); if (isset($import_fields['_selected_name'])) { for ($rows = 0; $rows < count($import_fields['_selected_name']); $rows++) { $id = mt_rand(); ?>
replacements, 'jform[import_fields][_replace_field]['.$rows.']', '', 'value', 'text', $import_fields['_replace_field'][$rows], '_replace_field_'.$id); ?>
templatefields as $fieldname) { ?>
text; ?>
default_limit.php000066600000004136151476163500010117 0ustar00
  • form->getLabel('use_system_limits', 'limit'); ?>
    form->getInput('use_system_limits', 'limit'); ?>
  • form->getLabel('max_execution_time', 'limit'); ?>
    form->getInput('max_execution_time', 'limit'); ?>
    :
  • form->getLabel('memory_limit', 'limit'); ?>
    form->getInput('memory_limit', 'limit'); ?>
    :
  • form->getLabel('post_max_size', 'limit'); ?>
    form->getInput('post_max_size', 'limit'); ?>
    :
  • form->getLabel('upload_max_filesize', 'limit'); ?>
    form->getInput('upload_max_filesize', 'limit'); ?>
    :
default_source.php000066600000005306151476163500010301 0ustar00
  • form->getLabel('source', 'general'); ?>
    form->getInput('source', 'general'); ?>
  • form->getLabel('import_file', 'general'); ?>
    form->getInput('import_file', 'general'); ?>
  • form->getLabel('local_csv_file', 'general'); ?>
    form->getInput('local_csv_file', 'general'); ?>
  • form->getLabel('urlfile', 'general'); ?>
    form->getInput('urlfile', 'general'); ?>
  • form->getLabel('ftphost', 'general'); ?>
    form->getInput('ftphost', 'general'); ?>
  • form->getLabel('ftpport', 'general'); ?>
    form->getInput('ftpport', 'general'); ?>
  • form->getLabel('ftpusername', 'general'); ?>
    form->getInput('ftpusername', 'general'); ?>
  • form->getLabel('ftppass', 'general'); ?>
    form->getInput('ftppass', 'general'); ?>
  • form->getLabel('ftproot', 'general'); ?>
    form->getInput('ftproot', 'general'); ?>
  • form->getLabel('ftpfile', 'general'); ?>
    form->getInput('ftpfile', 'general'); ?>
default_file.php000066600000011213151476163500007712 0ustar00
  • form->getLabel('auto_detect_delimiters', 'general'); ?>
    form->getInput('auto_detect_delimiters', 'general'); ?>
  • form->getLabel('field_delimiter', 'general'); ?>
    form->getInput('field_delimiter', 'general'); ?>
  • form->getLabel('text_enclosure', 'general'); ?>
    form->getInput('text_enclosure', 'general'); ?>
  • form->getLabel('im_mac', 'general'); ?>
    form->getInput('im_mac', 'general'); ?>
  • form->getLabel('use_column_headers', 'general'); ?>
    form->getInput('use_column_headers', 'general'); ?>
  • form->getLabel('skip_first_line', 'general'); ?>
    form->getInput('skip_first_line', 'general'); ?>
  • form->getLabel('overwrite_existing_data', 'general'); ?>
    form->getInput('overwrite_existing_data', 'general'); ?>
  • form->getLabel('ignore_non_exist', 'general'); ?>
    form->getInput('ignore_non_exist', 'general'); ?>
  • form->getLabel('skip_default_value', 'general'); ?>
    form->getInput('skip_default_value', 'general'); ?>
  • form->getLabel('collect_debug_info', 'general'); ?>
    form->getInput('collect_debug_info', 'general'); ?>
  • form->getLabel('refresh_xml_headers', 'general'); ?>
    form->getInput('refresh_xml_headers', 'general'); ?>
  • form->getLabel('xml_nodes_map', 'general'); ?>
    form->getInput('xml_nodes_map', 'general'); ?>
default_category_path.php000066600000002565151476204420011633 0ustar00
  • form->getLabel('file_location_category_images', 'path'); ?>
    form->getInput('file_location_category_images', 'path'); ?>
    '.$this->config->get('media_category_path').'');?> | |
default_media_path.php000066600000004243151476204420011070 0ustar00
  • form->getLabel('file_location_product_images', 'path'); ?>
    form->getInput('file_location_product_images', 'path'); ?>
    '.$this->config->get('media_product_path').'');?> | |
  • form->getLabel('file_location_category_images', 'path'); ?>
    form->getInput('file_location_category_images', 'path'); ?>
    '.$this->config->get('media_category_path').'');?> | |
default_category.php000066600000002237151476204420010613 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
  • form->getLabel('target_language', 'general'); ?>
    form->getInput('target_language', 'general'); ?>
  • form->getLabel('category_separator', 'general'); ?>
    form->getInput('category_separator', 'general'); ?>
default_product.php000066600000005120151476204420010450 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
  • form->getLabel('category_separator', 'general'); ?>
    form->getInput('category_separator', 'general'); ?>
  • form->getLabel('append_categories', 'product'); ?>
    form->getInput('append_categories', 'product'); ?>
  • form->getLabel('update_based_on', 'product'); ?>
    form->getInput('update_based_on', 'product'); ?>
  • form->getLabel('mpn_column_name', 'product'); ?>
    form->getInput('mpn_column_name', 'product'); ?>
  • form->getLabel('unpublish_before_import', 'product'); ?>
    form->getInput('unpublish_before_import', 'product'); ?>
  • form->getLabel('use_icecat', 'product'); ?>
    form->getInput('use_icecat', 'product'); ?>
default_category_image.php000066600000010773151476204420011761 0ustar00
  • form->getLabel('process_image', 'image'); ?>
    form->getInput('process_image', 'image'); ?>
  • form->getLabel('change_case', 'image'); ?>
    form->getInput('change_case', 'image'); ?>
  • form->getLabel('keep_original', 'image'); ?>
    form->getInput('keep_original', 'image'); ?>
  • form->getLabel('convert_type', 'image'); ?>
    form->getInput('convert_type', 'image'); ?>
  • form->getLabel('save_images_on_server', 'image'); ?>
    form->getInput('save_images_on_server', 'image'); ?>
  • form->getLabel('full_resize', 'image'); ?>
    form->getInput('full_resize', 'image'); ?>
  • form->getLabel('full_width', 'image'); ?>
    form->getInput('full_width', 'image'); ?>
  • form->getLabel('full_height', 'image'); ?>
    form->getInput('full_height', 'image'); ?>
  • form->getLabel('thumb_check_filetype', 'image'); ?>
    form->getInput('thumb_check_filetype', 'image'); ?>
  • form->getLabel('thumb_create', 'image'); ?>
    form->getInput('thumb_create', 'image'); ?>
  • form->getLabel('thumb_extension', 'image'); ?>
    form->getInput('thumb_extension', 'image'); ?>
  • form->getLabel('thumb_width', 'image'); ?>
    form->getInput('thumb_width', 'image'); ?>
  • form->getLabel('thumb_height', 'image'); ?>
    form->getInput('thumb_height', 'image'); ?>
default_order_item.php000066600000001447151476204420011131 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
default_category_file.php000066600000010314151476204420011605 0ustar00
  • form->getLabel('auto_detect_delimiters', 'general'); ?>
    form->getInput('auto_detect_delimiters', 'general'); ?>
  • form->getLabel('field_delimiter', 'general'); ?>
    form->getInput('field_delimiter', 'general'); ?>
  • form->getLabel('text_enclosure', 'general'); ?>
    form->getInput('text_enclosure', 'general'); ?>
  • form->getLabel('im_mac', 'general'); ?>
    form->getInput('im_mac', 'general'); ?>
  • form->getLabel('use_column_headers', 'general'); ?>
    form->getInput('use_column_headers', 'general'); ?>
  • form->getLabel('skip_first_line', 'general'); ?>
    form->getInput('skip_first_line', 'general'); ?>
  • form->getLabel('skip_default_value', 'general'); ?>
    form->getInput('skip_default_value', 'general'); ?>
  • form->getLabel('collect_debug_info', 'general'); ?>
    form->getInput('collect_debug_info', 'general'); ?>
  • form->getLabel('refresh_xml_headers', 'general'); ?>
    form->getInput('refresh_xml_headers', 'general'); ?>
  • form->getLabel('xml_nodes_map', 'general'); ?>
    form->getInput('xml_nodes_map', 'general'); ?>
default_media.php000066600000001453151476204420010054 0ustar00
  • form->getLabel('ignore_non_exist', 'media'); ?>
    form->getInput('ignore_non_exist', 'media'); ?>
default_media_image.php000066600000010766151476204420011225 0ustar00
  • form->getLabel('process_image', 'image'); ?>
    form->getInput('process_image', 'image'); ?>
  • form->getLabel('change_case', 'image'); ?>
    form->getInput('change_case', 'image'); ?>
  • form->getLabel('keep_original', 'image'); ?>
    form->getInput('keep_original', 'image'); ?>
  • form->getLabel('convert_type', 'image'); ?>
    form->getInput('convert_type', 'image'); ?>
  • form->getLabel('save_images_on_server', 'image'); ?>
    form->getInput('save_images_on_server', 'image'); ?>
  • form->getLabel('full_resize', 'image'); ?>
    form->getInput('full_resize', 'image'); ?>
  • form->getLabel('full_width', 'image'); ?>
    form->getInput('full_width', 'image'); ?>
  • form->getLabel('full_height', 'image'); ?>
    form->getInput('full_height', 'image'); ?>
  • form->getLabel('thumb_check_filetype', 'image'); ?>
    form->getInput('thumb_check_filetype', 'image'); ?>
  • form->getLabel('thumb_create', 'image'); ?>
    form->getInput('thumb_create', 'image'); ?>
  • form->getLabel('thumb_extension', 'image'); ?>
    form->getInput('thumb_extension', 'image'); ?>
  • form->getLabel('thumb_width', 'image'); ?>
    form->getInput('thumb_width', 'image'); ?>
  • form->getLabel('thumb_height', 'image'); ?>
    form->getInput('thumb_height', 'image'); ?>
default_manufacturer_category.php000066600000001466151476204420013372 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
default_image.php000066600000012706151476204420010062 0ustar00
  • form->getLabel('process_image', 'image'); ?>
    form->getInput('process_image', 'image'); ?>
  • form->getLabel('auto_generate_image_name', 'image'); ?>
    form->getInput('auto_generate_image_name', 'image'); ?>
  • form->getLabel('type_generate_image_name', 'image'); ?>
    form->getInput('type_generate_image_name', 'image'); ?>
  • form->getLabel('autogenerateext', 'image'); ?>
    form->getInput('autogenerateext', 'image'); ?>
  • form->getLabel('change_case', 'image'); ?>
    form->getInput('change_case', 'image'); ?>
  • form->getLabel('keep_original', 'image'); ?>
    form->getInput('keep_original', 'image'); ?>
  • form->getLabel('convert_type', 'image'); ?>
    form->getInput('convert_type', 'image'); ?>
  • form->getLabel('save_images_on_server', 'image'); ?>
    form->getInput('save_images_on_server', 'image'); ?>
  • form->getLabel('full_resize', 'image'); ?>
    form->getInput('full_resize', 'image'); ?>
  • form->getLabel('full_width', 'image'); ?>
    form->getInput('full_width', 'image'); ?>
  • form->getLabel('full_height', 'image'); ?>
    form->getInput('full_height', 'image'); ?>
  • form->getLabel('thumb_check_filetype', 'image'); ?>
    form->getInput('thumb_check_filetype', 'image'); ?>
  • form->getLabel('thumb_create', 'image'); ?>
    form->getInput('thumb_create', 'image'); ?>
  • form->getLabel('thumb_extension', 'image'); ?>
    form->getInput('thumb_extension', 'image'); ?>
  • form->getLabel('thumb_width', 'image'); ?>
    form->getInput('thumb_width', 'image'); ?>
  • form->getLabel('thumb_height', 'image'); ?>
    form->getInput('thumb_height', 'image'); ?>
default_manufacturer.php000066600000001444151476204420011471 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
default_product_path.php000066600000002614151476204420011471 0ustar00
  • form->getLabel('file_location_product_images', 'path'); ?>
    form->getInput('file_location_product_images', 'path'); ?>
    '.$this->config->get('media_product_path').'');?> | |
default_calc.php000066600000001773151476204420007704 0ustar00
  • form->getLabel('language', 'general'); ?>
    form->getInput('language', 'general'); ?>
  • form->getLabel('category_separator', 'general'); ?>
    form->getInput('category_separator', 'general'); ?>
default_manufacturer_file.php000066600000010314151476204420012464 0ustar00
  • form->getLabel('auto_detect_delimiters', 'general'); ?>
    form->getInput('auto_detect_delimiters', 'general'); ?>
  • form->getLabel('field_delimiter', 'general'); ?>
    form->getInput('field_delimiter', 'general'); ?>
  • form->getLabel('text_enclosure', 'general'); ?>
    form->getInput('text_enclosure', 'general'); ?>
  • form->getLabel('im_mac', 'general'); ?>
    form->getInput('im_mac', 'general'); ?>
  • form->getLabel('use_column_headers', 'general'); ?>
    form->getInput('use_column_headers', 'general'); ?>
  • form->getLabel('skip_first_line', 'general'); ?>
    form->getInput('skip_first_line', 'general'); ?>
  • form->getLabel('skip_default_value', 'general'); ?>
    form->getInput('skip_default_value', 'general'); ?>
  • form->getLabel('collect_debug_info', 'general'); ?>
    form->getInput('collect_debug_info', 'general'); ?>
  • form->getLabel('refresh_xml_headers', 'general'); ?>
    form->getInput('refresh_xml_headers', 'general'); ?>
  • form->getLabel('xml_nodes_map', 'general'); ?>
    form->getInput('xml_nodes_map', 'general'); ?>
category_image.xml000066600000006521151476442470010273 0ustar00 manufacturer_category.xml000066600000000530151476442470011677 0ustar00 category_path.xml000066600000000361151476442470010141 0ustar00 order_item.xml000066600000000250151476442470007436 0ustar00 media.xml000066600000000444151476442470006371 0ustar00 product.xml000066600000003177151476442470007000 0ustar00 image.xml000066600000010514151476442470006373 0ustar00 media_path.xml000066600000000700151476442470007400 0ustar00 calc.xml000066600000000530151476442470006210 0ustar00 media_image.xml000066600000006521151476442470007535 0ustar00 manufacturer.xml000066600000000250151476442470010001 0ustar00 product_path.xml000066600000000356151476442470010010 0ustar00 category.xml000066600000000766151476442470007136 0ustar00