registerTask( 'dl' , 'download' ); $this->registerTask( 'download' , 'download' ); } function download() { $useCache = 1; global $mainframe; $id = Sql2excelParms::get_parm_value('id', 'int', 0); $wb_id = (int) $id; $preview = Sql2excelParms::get_parm_value('preview', 'int', '-1'); $wbParms = $this->getWorkbookParms($wb_id); if ( count($wbParms) ) { //$cmpParms = &$mainframe->getParams(); $cmpParms = Sql2excelParms::getParms(); $substParms = $this->getSubstParms(); $wsParms = $this->getWorksSheetParms($wb_id); $extraParms = array(); $substWBParms = Sql2excelParms::get($cmpParms,'subst_wbparms', '1'); // User Parameters ? if ( $wbParms[0]->parms != '' ) { $extraParms = $this->parse_wb_parms($wbParms[0]->parms, $wbParms[0]->parms_prompt,$preview, $substWBParms, $cmpParms, $substParms); if ( count($extraParms) > 0 ) { $substParms = array_merge($substParms,$extraParms); // Don't use cache for Workbooks with Workbook Parameters $useCache = 0; } } // end User Parameters // Output XLS, CSV or HTM $dlformat = 1; if ( isset($wbParms[0]->dlformat) ) { $dlformat = $wbParms[0]->dlformat; } $sheet = Sql2excelParms::get_parm_value('sheet', 'int', 0); // Is the format specified through the URL? $format = Sql2excelParms::get_parm_value('format', 'int', 0); if ( $format < 1 ) { // No - auto-select format based on settings if ( $dlformat == 3 || ( $dlformat == 1 && Sql2excelParms::get($cmpParms,'dlformat', '2') == 3 ) ) { $format = 3; } elseif ( $dlformat == 4 || ( $dlformat == 1 && Sql2excelParms::get($cmpParms,'dlformat', '2') == 4 ) ) { $format = 4; } else { //writeExcel::writeFile($wbParms,$wsParms,$cmpParms,$substParms,$useCache,0); $format = 2; } } // Finally, output in the selected download format if ( $format == 3 ) { require_once( JPATH_COMPONENT.DS.'helpers'.DS.'csv_writer.php' ); writeCSV::writeFile($wbParms,$wsParms,$sheet,$cmpParms,$substParms,$useCache,0); } elseif ( $format == 4 ) { require_once( JPATH_COMPONENT.DS.'helpers'.DS.'htm_writer.php' ); writeHTM::writeFile($wbParms,$wsParms,$sheet,$cmpParms,$substParms,$useCache,0); } else { writeExcel::writeFile($wbParms,$wsParms,$cmpParms,$substParms,$useCache,0); $format = 2; } } else { JError::raiseError(500, JText::_( 'ERROR : Excel Workbook Not Found!' ) ); } exit; } function utf8_strrev($str, $reverse_numbers = true){ $pattern = $reverse_numbers ? '/./us' : '/(\d+)?./us'; preg_match_all($pattern, $str, $ar); return join('',array_reverse($ar[0])); } /** * Returns the Workbook Parameters * @return object with parms */ function getWorkbookParms($id, $preview=0) { $db = & JFactory::getDBO(); $user =& JFactory::getUser(); $aid = $user->get('aid', 0); $wheres[] = " a.id = " . (int) $id; $wheres[] = " a.section = b.id "; $wheres[] = " a.category = c.id "; $wheres[] = " a.published=1 "; $wheres[] = " b.published=1 "; $wheres[] = " c.published=1 "; if ($aid !== null) { $wheres[] = "a.access <= " . (int) $aid; $wheres[] = "b.access <= " . (int) $aid; $wheres[] = "c.access <= " . (int) $aid; } $query = " SELECT a.* " . " FROM #__sql2excel_workbooks AS a, #__sql2excel_sections AS b, #__sql2excel_categories AS c " . " WHERE " . implode( " AND ", $wheres ); $db->setQuery( $query ); $rows = $db->loadObjectList(); // Update Workbook Download count if ( count($rows) >= 1 && $preview==0 ) { $query = ' UPDATE #__sql2excel_workbooks ' . ' SET count=count+1 ' . ' WHERE ID=' . (int) $id; $db->setQuery( $query ); $db->query(); } return $rows; } /** * Returns worksheet info */ function getWorksSheetParms($id, $ws_id=0) { $db = & JFactory::getDBO(); $user =& JFactory::getUser(); $aid = $user->get('aid', 0); $wheres[] = ' a.id=b.ws_id '; $wheres[] = ' b.wb_id=' . $id . ' '; if ( $ws_id > 0 ) { $wheres[] = ' a.id=' . $ws_id . ' '; } $wheres[] = " a.published=1 "; $wheres[] = " b.wb_id=c.id "; $wheres[] = " c.published=1 "; $wheres[] = " c.section=d.id "; $wheres[] = " c.category=e.id "; $wheres[] = " d.published=1 "; $wheres[] = " e.published=1 "; $wheres[] = " f.id = a.database "; if ($aid !== null) { $wheres[] = "a.access <= " . (int) $aid; $wheres[] = "c.access <= " . (int) $aid; $wheres[] = "d.access <= " . (int) $aid; $wheres[] = "e.access <= " . (int) $aid; } $query = ' SELECT a.id as key1, c.id as key2, a.*, b.*, f.db_host, f.db_username, f.db_password, f.db_database, f.db_type, f.db_prefix ' . ' FROM #__sql2excel_worksheets AS a, #__sql2excel_worksheet2book AS b, #__sql2excel_workbooks AS c, #__sql2excel_sections AS d, #__sql2excel_categories AS e, #__sql2excel_databases AS f' . ' WHERE ' . implode(' AND ', $wheres ) . ' ORDER BY b.ordering'; $db->setQuery( $query ); $rows = $db->loadObjectList(); // Update Worksheet Download counts if ( count($rows) >= 1 && $ws_id == 0 ) { $wsIDs = array(); foreach ( $rows as $row ) { $wsIDs[] = $row->ws_id; } $wsIDs = implode(',', $wsIDs); $updateSQL = ' UPDATE #__sql2excel_worksheets c ' . ' SET c.count=c.count+1 ' . ' WHERE c.ID IN ( ' . $wsIDs . ')'; $db->setQuery( $updateSQL ); $db->query(); } return $rows; } /** * Returns Substitution Parameters * @return array with parms/values */ function getSubstParms() { $sparms = array(); // User Variables $user =& JFactory::getUser(); $sparms{'USER_ID'} = $user->id; $sparms{'USERNAME'} = $user->username; $sparms{'USER_NAME'} = $user->name; $sparms{'USER_EMAIL'} = $user->email; $sparms{'USER_TYPE'} = $user->usertype; $sparms{'USER_SEMAIL'} = $user->sendEmail; $sparms{'USER_GID'} = $user->gid; $sparms{'USER_RDATE'} = $user->registerDate; $sparms{'USER_LDATE'} = $user->lastvisitDate; $sparms{'USER_ACTIVATION'} = $user->activation; $sparms{'USER_AID'} = $user->aid; $userParams = $user->params; $userParams = explode("\n",$userParams); foreach ( $userParams as $p ) { $p = explode('=',$p); if ( count($p) == 2 && $p[0] == 'timezone' ) { $sparms{'USER_TZ'} = $p[1]; } elseif ( count($p) == 2 && $p[0] == 'language' ) { $sparms{'USER_LANG'} = $p[1]; } } if ( isset($_SERVER['REMOTE_ADDR']) ) { $sparms{'USER_IP'} = $_SERVER['REMOTE_ADDR']; } if ( isset($_SERVER['USER_AGENT']) ) { $sparms{'USER_AGENT'} = $_SERVER['HTTP_USER_AGENT']; } // Server Variables $sparms{'SERVER_URL'} = JURI::root(); if ( isset($_SERVER['HTTP_HOST']) ) { $sparms{'SERVER_HOST'} = $_SERVER['HTTP_HOST']; } if ( isset($_SERVER['SERVER_ADDR']) ) { $sparms{'SERVER_SERVERIP'} = $_SERVER['SERVER_ADDR']; } if ( isset($_SERVER['SERVER_SOFTWARE']) ) { $sparms{'SERVER_SOFTWARE'} = $_SERVER['SERVER_SOFTWARE']; } if ( isset($_SERVER['HTTP_REFERER']) ) { $referer = $_SERVER['HTTP_REFERER']; $sparms{'SERVER_REFERER'} = $referer; $referer_queryString = parse_url($referer); if ( isset($referer_queryString['query']) ) { $referer_queryString = $referer_queryString['query']; parse_str($referer_queryString, $matches); $urlParms = array_keys($matches); foreach ( $urlParms as $parmName ) { if ( !is_array($matches{$parmName}) ) { $parmVal = explode(':', $matches{$parmName}); $sparms{'JOOMLA_PARM_' . strtoupper($parmName) } = $parmVal[0]; } } } } // Joomla Variables $version = new JVersion(); $sparms{'JOOMLA_VER_LONG'} = $version->getLongVersion(); $sparms{'JOOMLA_VER'} = $version->getShortVersion(); // SQL 2 Excel Variables if ( isset($_SERVER['REQUEST_URI']) ) { $sparms{'SQL2EXCEL_DLURL'} = JURI::root() . substr($_SERVER['REQUEST_URI'],1); } return $sparms; } function parse_wb_parms($parms, $parms_prompt=0, $preview=0, $substWBParms=1, $cmpParms = array(), $substParms = array()) { $extraParms = array(); $i=1; $parmsArr = explode('~@~',$parms); foreach ($parmsArr as $parm) { $parmTokens = explode(',', $parm); if ( count($parmTokens) >= 4 ) { $parmID = 'wbparm' . $i; $parmName = $parmTokens[0]; $parmVar = $parmTokens[1]; $parmType = $parmTokens[2]; $parmValue = $parmTokens[3]; $parmDB = 1; if ( isset($parmTokens[4]) ) { $parmDB = $parmTokens[4]; } if ( $parmType == "Integer" || $parmType == "UnsignedInteger" ) { $parmValue = Sql2excelParms::get_parm_value($parmID, 'int', $parmValue); } elseif ( $parmType == "Real" || $parmType == "UnsignedRealReal") { $parmValue = Sql2excelParms::get_parm_value($parmID, 'float', $parmValue); } elseif ( $parmType == "AlphaNum" ) { $parmValue = Sql2excelParms::get_parm_value($parmID, 'alnum', $parmValue); } elseif ( $parmType == "Username" ) { $parmValue = Sql2excelParms::get_parm_value($parmID, 'username', $parmValue); } elseif ( $parmType == "List" || $parmType == "ListMultiNum" || $parmType == "ListMultiStr" ) { $parmList = Sql2excelParms::get_parm_value($parmID, 'string', $parmValue); if ( $parms_prompt == 0 ) { if ( $parmList != '' ) { $parmList = str_replace('~COMMA~',',',$parmList); $parmList = explode('~NL~',$parmList); $defaultValue = explode(',',$parmList[0]); $defaultValue = $defaultValue[0]; $multiStr = ''; foreach ( $parmList as $lisval ) { $tokens = explode(',',$lisval); if ( sizeof($tokens) > 2 ) { if ( strpos($parmType,'Multi') > 0 ) { if ( $parmType == "ListMultiNum" ) { $pVal = $tokens[0]; } else { $pVal = "'" . $tokens[0] . "'"; } if ( $multiStr == '' ) { $multiStr = $pVal; } else { $multiStr .= ',' . $pVal; } } else { $defaultValue = $tokens[0]; } } } if ( strpos($parmType,'Multi') > 0 && $multiStr) { $parmValue = $multiStr; } else { $parmValue = $defaultValue; } //$parmValue = $defaultValue; } else { $parmValue = ''; } } else { // Parameter was prompted => getting value directly $parmValue = $parmList; } } elseif ( $parmType == "ListSQL" || $parmType == 'ListSQLMultiNum' || $parmType == 'ListSQLMultiStr' ) { $query = Sql2excelParms::get_parm_value($parmID, 'string', $parmValue); if ( $parms_prompt == 0 && !$preview ) { // Parameter not prompted => getting SQL query passed $query = str_replace('~COMMA~',',',$query); $query = str_replace('~NL~',"\n",$query); $query = str_replace('~NL~',"\n",$query); $query = $this->utf8_strrev($query); if ( $substWBParms ) { $query = writeExcel::replace_vars($query, $substParms,$extraParms); } // Get Database Connection $db = null; $dbType = 1; if ( $parmDB == 1 ) { $db = & JFactory::getDBO(); } else { $jdb = & JFactory::getDBO(); $jdb->setQuery( 'SELECT * FROM #__sql2excel_databases WHERE ID=' . $parmDB ); $dbInfo = $jdb->loadObject(); if ( $dbInfo ) { $db = writeExcel::getDB($dbInfo); $dbType=$dbInfo->db_type; } } if ( $db ) { $rows = writeExcel::getResults($db, $query, $cmpParms, $dbType); if ( is_Array($rows) ) { $colNames = writeExcel::getColumnNames($rows); $firstRow = $rows[0]; if ( strpos($parmType,'Multi') > 0 ) { if ( count($colNames) > 2 ) { $multiStr = ''; foreach ( $rows as $row ) { if ( $row->$colNames[2] != '' ) { if ( $parmType == 'ListSQLMultiStr' ) { $pVal = "'" . $row->$colNames[2] . "'"; } else { $pVal = $row->$colNames[2]; } if ( $multiStr == '' ) { $multiStr = $pVal; } else { $multiStr .= ',' . $pVal; } } } if ( $multiStr != '' ) { $parmValue = $multiStr; } else { $parmValue = $firstRow->$colNames[0]; if ( $parmType == 'ListSQLMultiStr' ) { $parmValue = "'" . $parmValue . "'"; } } } else { $parmValue = $firstRow->$colNames[0]; if ( $parmType == 'ListSQLMultiStr' ) { $parmValue = "'" . $parmValue . "'"; } } } else { if ( count($colNames) > 2 ) { //$parmValue = $firstRow[2]; $parmValue = $firstRow->$colNames[2]; } else { //$parmValue = $firstRow[0]; $parmValue = $firstRow->$colNames[0]; } } } else { $parmValue = ''; } } else { $parmValue = JText::_('ERROR: Workbook Parameter') . ' ' . $parmVar . ' - ' . JText::_('Database Connection Error!'); } // Save this parameter for further substitutions $extraParms[$parmVar]=$parmValue; } else { // Parameter was prompted or No Prompt Preview => getting value directly $parmValue = $query; } } else { $parmValue = Sql2excelParms::get_parm_value($parmID, 'string', $parmValue); } if ( is_string($parmValue) && $substWBParms ) { $parmValue = writeExcel::replace_vars($parmValue, $substParms,$extraParms); } $wbP[$parmVar]=$parmValue; // Save this parameter for further substitutions $extraParms[$parmVar]=$parmValue; $i++; } } return $extraParms; } }