<?php
/**
* Created on Jun.2010
*
* @author: Gorazd Vesleič
*
* @desc: za izvoze
*
* funkcije:
* - Init() - inicializacija
*
*/
DEFINE (NEW_LINE, "\n");
DEFINE (TMP_EXT, '.tmp');
DEFINE (STR_DLMT, '|');
DEFINE (DAT_EXT, '.dat');
define("EXPORT_FOLDER", "admin/survey/SurveyData");
class SurveyExport
{
private $sid = null; // id ankete
private $folder = ''; # pot do folderja
private $inited = false; # ali smo razred inicializirali
private $SMV = false; # manjkajoče vrednosti
private $survey = null; # podatki ankete
private $db_table = ''; # ali se uporablja aktivna tabela
private $_CURRENT_STATUS_FILTER = ''; # filter po statusih, privzeto izvažamo 6 in 5
public $_FILTRED_VARIABLES = array(); # filter po spremenljivkah
# ali obstaja datoteka z podatki in ali je zadnja verzija
private $_fileStatus = FILE_STATUS_NO_DATA; # (FILE_STATUS_OK,FILE_STATUS_OLD,FILE_STATUS_NO_FILE,FILE_STATUS_NO_DATA)
private $_dataFileName = null; # ime obstoječe datoteke na FS.
private $_headFileName = null; # ime obstoječe datoteke na FS.
private $exportSettings = array();
private $_EXPORT_FULL_META = false; # ali izvažamo polne meta podatke
private $_EXPORT_HIDDEN_SYSTEM = false; # ali izvažamo sistemske podatke (email, telefon)
private $_EXPORT_ONLY_DATA = false; # ali izvažamo samo podatke brez parapodatkov
private $_EXPORT_SPSS_DATA = false; # ali izvažamo podatke za spsss
private $_EXPORT_SPSS_HEAD = true; # ali izvažamo header za spss
private $_EXPORT_EXCEL_HEAD = true; # ali izvažamo header za excel
private $_EXPORT_EXCEL_REPLACE = array(); # ali izvažamo zamenjave za excel
private $_SPECIAL_EXPORT = false; # samo za posebne primere kadar "moramo" izpisovati skrite sistemske variable (preko get se pošlje special_export=true
private $_HEADERS = array(); # array z header podatki
private $_FIELDS_ARRAY = array(); # array kamor shranimo polja katera za katera pobiramo podatke
private $_QUOTE = '"'; # Kateri zanko uporabimo za nize " ali '
private $_VARIABLE_FILTER = ''; # sed string array z prikazanimi variablami z upoštevanjem filtrov
private $_SVP_PV = array(); # array z prikazanimi variablami z upoštevanjem filtrov
/** Inicializacija
*
* @param $sid
*/
public function Init($sid = null) {
global $admin_type, $lang, $site_path, $global_user_id;
if ($sid == null) {
die('Error! Missing survey Id');
}
$this->folder = $site_path . EXPORT_FOLDER.'/';
# nastavimo id ankete
$this->sid = $sid;
if (IS_WINDOWS) {
$this->_QUOTE = '"';
} else {
$this->_QUOTE = '\'';
}
# informacije ankete
SurveyInfo::getInstance()->SurveyInit($this->sid);
$this->survey = SurveyInfo::getInstance()->resetSurveyData();
$this->survey = SurveyInfo::getInstance()->getSurveyRow();
# aktivne tabele
if (SurveyInfo::getInstance()->getSurveyColumn('db_table') == 1)
$this->db_table = '_active';
// Preverimo ce ima user dostop
$d = new Dostop();
if(!$d->checkDostop($this->sid)){
die('Error! Access to survey '.$this->sid.' denied.');
}
# vsilimo podstran zaradi profila statusov
$_POST['podstran'] = A_COLLECT_DATA_EXPORT;
$this->_CURRENT_STATUS_FILTER = STATUS_FIELD.' ~ /6|5/';
# za profile statusov
SurveyStatusProfiles :: Init($this->sid);
# za profile variabel
SurveyVariablesProfiles :: Init($this->sid, $global_user_id);
# za profil ifov
SurveyConditionProfiles :: Init($this->sid, $global_user_id);
# za profil časov
SurveyTimeProfiles :: Init($this->sid, $global_user_id);
$result = sisplet_query ("SELECT value FROM misc WHERE what='SurveyExport'");
list ($SurveyExport) = mysqli_fetch_row ($result);
$adminTypes = array(0=>$lang['forum_admin'],1=>$lang['forum_manager'],2=>$lang['forum_clan'],3=>$lang['forum_registered'] );
if ($SurveyExport<$admin_type) {
die ($lang['srv_export_no_access'].$adminTypes[$admin_type]);
}
# manjkajoče vrednosti
$this->SMV = new SurveyMissingValues($this->sid);
#preverimo datoteke
self::checkFile();
self::setUpFilter();
self::getHeaderData(); # header podatke rabimo vedno
}
/** Naredimo izvoz
*
*/
public function DoExport() {
# v odvisnosti kaj eksportiramo
switch ($_GET['m']) {
case 'sav':
self::exportSav();
break;
case 'spss':
self::exportSpss();
break;
case 'excel':
self::exportExcel();
break;
case 'excel_xls':
self::exportExcelXls();
break;
case 'txt':
self::exportText();
break;
}
}
/** Nastavimo filtre
*
*/
private function setUpFilter() {
if ($this->_fileStatus >= 0) {
$this->_HEADERS = unserialize(file_get_contents($this->_headFileName));
$this->exportSettings = array();
foreach ($_SESSION AS $pkey => $pvalue)
{
// if starts with export
if (!strncmp($pkey, "export", strlen("export")))
{
#ali iz seje ali preko requesta
$this->exportSettings[ltrim($pkey, "{export}")] = $pvalue
|| $_REQUEST[lcfirst($pvalue)];
}
}
$this->_EXPORT_HIDDEN_SYSTEM = ($this->exportSettings['HiddenSystem']) ? true : false;
$this->_EXPORT_HIDDEN_SYSTEM = ((int)$_REQUEST['hiddenSystem'] == 1 || $_REQUEST['hiddenSystem'] == 'true') ? true : $this->_EXPORT_HIDDEN_SYSTEM;
$this->_EXPORT_FULL_META = ($this->exportSettings['FullMeta'] || !$this->_EXPORT_HIDDEN_SYSTEM) ? true : false;
$this->_EXPORT_ONLY_DATA = ($this->exportSettings['OnlyData'] || !$this->_EXPORT_HIDDEN_SYSTEM) ? true : false;
$this->_SPECIAL_EXPORT = ($_REQUEST['special_export'] == 'true') ? true : false;
# filtriranje po statusih
$this->_CURRENT_STATUS_FILTER = SurveyStatusProfiles :: getStatusAsAWKString();
# ali imamo filter na testne podatke
if (isset($this->_HEADERS['testdata']['grids'][0]['variables'][0]['sequence']) && (int)$this->_HEADERS['testdata']['grids'][0]['variables'][0]['sequence'] > 0) {
$test_data_sequence = $this->_HEADERS['testdata']['grids'][0]['variables'][0]['sequence'];
$filter_testdata = SurveyStatusProfiles :: getStatusTestAsAWKString($test_data_sequence);
}
# filtriranje po časih
$_time_profile_awk = SurveyTimeProfiles :: getFilterForAWK($this->_HEADERS['unx_ins_date']['grids']['0']['variables']['0']['sequence']);
# ali imamo filter na uporabnost
if (isset($this->_HEADERS['usability']['variables'][0]['sequence']) && (int)$this->_HEADERS['usability']['variables'][0]['sequence'] > 0) {
$usability_data_sequence = $this->_HEADERS['usability']['variables'][0]['sequence'];
$filter_usability = SurveyStatusProfiles :: getStatusUsableAsAWKString($usability_data_sequence);
}
# dodamo še ife
SurveyConditionProfiles :: setHeader($this->_HEADERS);
$_condition_profile_AWK = SurveyConditionProfiles:: getAwkConditionString();
if (($_condition_profile_AWK != "" && $_condition_profile_AWK != null )
|| ($_time_profile_awk != "" && $_time_profile_awk != null)
|| ($filter_testdata != null)
|| ($filter_usability != null)) {
$this->_CURRENT_STATUS_FILTER = '('.$this->_CURRENT_STATUS_FILTER;
if ($_condition_profile_AWK != "" && $_condition_profile_AWK != null ) {
$this->_CURRENT_STATUS_FILTER .= '&&'.$_condition_profile_AWK;
}
if ($_time_profile_awk != "" && $_time_profile_awk != null) {
$this->_CURRENT_STATUS_FILTER .= '&&'.$_time_profile_awk;
}
if ($filter_testdata != null ) {
$this->_CURRENT_STATUS_FILTER .= '&&('.$filter_testdata.')';
}
if ($filter_usability != null ) {
$this->_CURRENT_STATUS_FILTER .= '&&('.$filter_usability.')';
}
$this->_CURRENT_STATUS_FILTER .= ')';
}
# FILTRI VARIABEL - Katere variable ne izpisujemo
$svp_pv = array();
# ne prikazujemo user-idja
$not_svp_pv['uid'] = 'uid';
# ne prikazujemo recnumberja
//$not_svp_pv['recnum'] = 'recnum';
# ne prikazujemo meta podatkov
if ($this->_EXPORT_FULL_META == false) {
$not_svp_pv['meta'] = 'meta';
$not_svp_pv['recnum'] = 'recnum';
}
# filtriranje po spremenljivkah
$dvp = SurveyUserSetting :: getInstance()->getSettings('default_variable_profile');
$this->_FILTRED_VARIABLES = SurveyVariablesProfiles :: getProfileVariables(SurveyVariablesProfiles :: checkDefaultProfile($dvp));
# skreiramo filter variabel za podatke
if (count($this->_HEADERS) > 0) {
// zloopamo skozi spremenljivke in sestavimo filter po stolpcih
$_tmp_filter = array();
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
# privzeto spremenljivke ne prikazujemo
$_can_show = false;
$tip = $spremenljivka['tip'];
# če spremenljivka ni v neprikazanih jo prikažemo
if (!in_array($spid, $not_svp_pv)) {
# če imamo sistemski email ali telefon, ime, priimek (v header je nastavljno "hide_system" = 1)
# potem v odvisnosti od nastavitve prikazujemo samo navadne podatke ali pa samo te sistemske, zaradizaščite podatkov
if ($this->_EXPORT_HIDDEN_SYSTEM == true && $spremenljivka['hide_system'] == '1' || $this->_SPECIAL_EXPORT == true) {
# prikazujemo sistemske, in spremenljivka je sistemska
$_can_show = true;
} else
if ( $this->_EXPORT_HIDDEN_SYSTEM == false && $spremenljivka['hide_system'] !== '1' ) {
# prikazujemo nesistemske, in spremenljivka ni sistemska
$_can_show = true;
}
}
if ($_can_show == true) {
# če mamo filter po variablah ga upoštevamo
if ( ( $tip == 'm' || $tip == 'sm' )
|| ( count($this->_FILTRED_VARIABLES) == 0 || (count($this->_FILTRED_VARIABLES) > 0 && isset($this->_FILTRED_VARIABLES[$spid])) )
|| ( $this->_EXPORT_HIDDEN_SYSTEM == true )
){
$svp_pv[$spid] = $spid;
if (count($spremenljivka['grids']) > 0 ) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
if (count ($grid['variables']) > 0) {
foreach ($grid['variables'] AS $vid => $variable ){
if (($tip !== 'sm' && $tip !== 'm') || $this->exportSettings['FullMeta'] > 0) {
$_tmp_filter[]= $variable['sequence'];
}
}
}
}
}
$spr_cont++;
}
}
}
}
# prilagodimo array profilov variabel
$this->_SVP_PV = $svp_pv;
if (count($_tmp_filter) > 0) {
$this->_VARIABLE_FILTER = implode(',',$_tmp_filter);
}
}
}
/** polovimo array z header podatki
*
*/
function getHeaderData() {
if ($this->_headFileName != null && $this->_headFileName != '') {
$this->_HEADERS = unserialize(file_get_contents($this->_headFileName));
} else {
echo 'Error! Empty file name!';
}
}
/** naredimo izvoz za excel - xls
*
*/
function exportExcelXls() {
global $site_path;
global $site_path;
$folder = $site_path . EXPORT_FOLDER.'/';
if ($this->_fileStatus >= 0 && $this->_dataFileName !== null && $this->_dataFileName !== '' && $this->_headFileName !== null && $this->_headFileName !== '') {
#zapišemo v temp file
$file_handler = fopen($this->_dataFileName.'.xls',"w");
$output1 = '';
$output2 = '';
# naredimo header row
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid])) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
foreach ($grid['variables'] AS $vid => $variable ){
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
$output1 .= '<td>'.strip_tags($variable['variable']).'</td>';
$output2 .= '<td>'.strip_tags($variable['naslov']).'</td>';
}
}
}
}
}
fwrite($file_handler,$output1."\r\n");
fwrite($file_handler,$output2."\r\n");
fclose($file_handler);
# sfiltriramo podatke
exec ('awk -F'.$this->_QUOTE.STR_DLMT.$this->_QUOTE.' '.$this->_QUOTE.$this->_CURRENT_STATUS_FILTER.' {print $0}'.$this->_QUOTE.' '.$this->_dataFileName.' > '.$this->_dataFileName .'_data1'.TMP_EXT);
if (IS_WINDOWS) {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d "|" -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
} else {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d \'|\' -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
}
$out1_1 = shell_exec($cmdLn1_1);
# zamenjamo | z </td><td>
exec('sed '.$this->_QUOTE.'s/|/<\/td><td align="center">/g'.$this->_QUOTE.' '.$this->_dataFileName .'_data1_1'.TMP_EXT.' >> '.$this->_dataFileName.'.xls');
$convertType = 1; // kateri tip konvertiranja uporabimo
$convertTypes[1] = array('charSet' => "windows-1250",
'delimit' => ";",
'newLine' => "\n",
'BOMchar' => "\xEF\xBB\xBF");
# izvedemo download
if ($fd = fopen ($this->_dataFileName.'.xls', "r")) {
// clean the output buffer
ob_clean();
$fsize = filesize($this->_dataFileName.'.xls');
$path_parts = pathinfo($this->_dataFileName.'.xls');
$ext = strtolower($path_parts["extension"]);
header('Content-type: application/vnd.ms-excel; charset='.$convertTypes[$convertType]['charSet']);
header('Content-Disposition: attachment; filename="anketa'.$this->sid.'-'.date('Y-m-d').'.xls"');
# header('Content-length: '.$fsize);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
ob_flush();
# dodami boomchar za utf-8
echo $convertTypes[$convertType]['BOMchar'];
// Izpisemo celo tabelo
echo '<table border="1">'."\r\n";
$cnt=0;
while ($line = fgets ($fd)) {
if($cnt > 1) echo '<tr><td align="center">';
else print('</tr>');
$line = str_replace(array("\r","\n"), array("",""), $line);
print($line);
if($cnt > 1) print('</td></tr>');
else print('</tr>');
print("\r\n");
$cnt++;
}
echo '</table>';
}
else {
echo "Napaka";
}
fclose ($fd);
#pobrišemo vse tmp datoteke
foreach (glob($folder . 'export_data_'.$this->sid.'_*'.TMP_EXT) as $fileToDelete) {
unlink($fileToDelete);
}
unlink ($this->_dataFileName.'.xls');
} else {
echo '';
}
exit;
}
/** naredimo izvoz za excel
*
*/
function exportExcel() {
global $site_path;
$folder = $site_path . EXPORT_FOLDER.'/';
session_start();
if ($this->_fileStatus >= 0 && $this->_dataFileName !== null && $this->_headFileName !== null) {
if ($_POST['export_delimit'] == 0) {
$field_delimit = ';';
$replace_what = $_POST['replace_what0'];
$replace_with = $_POST['replace_with0'];
} else {
$field_delimit = ',';
$replace_what = $_POST['replace_what1'];
$replace_with = $_POST['replace_with1'];
}
#zapišemo v temp file
$file_handler = fopen($this->_dataFileName.'.csv',"w");
$output1 = '';
$output2 = '';
fclose($file_handler);
# sfiltriramo podatke
exec ('awk -F'.$this->_QUOTE.STR_DLMT.$this->_QUOTE.' '.$this->_QUOTE.$this->_CURRENT_STATUS_FILTER.' {print $0}'.$this->_QUOTE.' '.$this->_dataFileName.' > '.$this->_dataFileName .'_data1'.TMP_EXT);
if (IS_WINDOWS) {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d "|" -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
} else {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d \'|\' -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
}
$out1_1 = shell_exec($cmdLn1_1);
# zamenjamo uporabniške znake
if (is_array($replace_what) && count($replace_what) > 0 && is_array($replace_with) && count($replace_with) > 0) {
$_new_filename = '_data1_1';
$cnt_replace = min(count($replace_what),count($replace_with));
for ($i = 0; $i < $cnt_replace; $i++) {
exec('sed '.$this->_QUOTE .'s/'.$replace_what[$i].'/'.$replace_with[$i].'/g'.$this->_QUOTE .' '.$this->_dataFileName .'_data1_'.($i+1).TMP_EXT.' > '.$this->_dataFileName .'_data1_'.($i+2).TMP_EXT);
$_new_filename = '_data1_'.($i+2);
}
} else {
$_new_filename = '_data1_1';
}
# zamenjamo | z ;
exec('sed '.$this->_QUOTE.'s/|/\x22'.$field_delimit.'=\x22/g'.$this->_QUOTE.' '.$this->_dataFileName .$_new_filename.TMP_EXT.' >> '.$this->_dataFileName.'.csv');
$convertType = 1; // kateri tip konvertiranja uporabimo
$convertTypes[1] = array('charSet' => 'windows-1250',
'delimit' => ';',
'newLine' => "\n",
'BOMchar' => "\xEF\xBB\xBF");
# izvedemo download
if ($fd = fopen ($this->_dataFileName.'.csv', "r")) {
$fsize = filesize($this->_dataFileName.'.csv');
$path_parts = pathinfo($this->_dataFileName.'.csv');
$ext = strtolower($path_parts["extension"]);
#ob_clean();
#header('Content-type: application/vnd.ms-excel; charset='.$convertTypes[$convertType]['charSet']);
header('Content-type: text/csv; charset='.$convertTypes[$convertType]['charSet']);
header('Content-Disposition: attachment; filename="anketa'.$this->sid.'-'.date('Y-m-d').'.csv"');
# ker iz zacasne datoteke preberemo samo podatke brez headerja (header izpisujemo posebej)
# ne moremo podati content-lenght. Razen če bi predhodno vsae zapisali v tmp datoteko in potem prebrali dolžino
# header('Content-length: '.$fsize);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
#ob_flush();
# dodami boomchar za utf-8
echo $convertTypes[$convertType]['BOMchar'];
# naredimo header row
if ((int)$_POST['export_labels'] == 1) {
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid])) {
if (count($spremenljivka['grids']) > 0) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
foreach ($grid['variables'] AS $vid => $variable ){
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
$output1 .= str_replace($replace_what, $replace_with, strip_tags($variable['variable'])) . $field_delimit;
$output2 .= str_replace($replace_what, $replace_with, strip_tags($variable['naslov'])) . $field_delimit;
}
}
}
}
}
}
echo $output1."\r\n";
echo $output2."\r\n";
}
while ($line= fgets ($fd)) {
echo '="';
$line = str_replace(array("\r","\n"), array("",""), $line);
print ($line);
print ('"');
print ("\r\n");
}
}
else {
echo 'x1:Napaka';
}
fclose ($fd);
#pobrišemo vse tmp datoteke
foreach (glob($folder . 'export_data_'.$this->sid.'*dat_data*'.TMP_EXT) as $fileToDelete) {
unlink($fileToDelete);
}
unlink ($this->_dataFileName.'.csv');
}
else {
echo 'x2:Napaka!';
}
exit;
}
/** naredimo izvoz za txt
*
*/
function exportText() {
global $site_path;
$folder = $site_path . EXPORT_FOLDER.'/';
if ($this->_fileStatus >= 0 && $this->_dataFileName !== null && $this->_dataFileName !== '' && $this->_headFileName !== null && $this->_headFileName !== '') {
#zapišemo v temp file
$file_handler = fopen($this->_dataFileName.'.txt',"w");
$output1 = '';
$output2 = '';
// array za labele (ce jih izpisujemo)
$display_labels = true;
$labels = array();
# naredimo header row
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid])) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
foreach ($grid['variables'] AS $vid => $variable ){
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
$output1 .= strip_tags($variable['variable']).';';
$output2 .= strip_tags($variable['naslov']).';';
}
}
}
}
// Ce izpisujemo tudi labele
if($display_labels && isset($spremenljivka['spr_id'])){
if(in_array($spremenljivka['tip'], array('1','3','6','16'))){
$sequences = array();
$sequences = explode('_', $spremenljivka['sequences']);
$vars = $this->getVariableLabels($spremenljivka['spr_id']);
foreach($sequences as $sequence){
$labels[$sequence] = $vars;
}
}
}
}
fwrite($file_handler,$output1."\n");
fwrite($file_handler,$output2."\n");
fclose($file_handler);
# sfiltriramo podatke
exec ('awk -F'.$this->_QUOTE.STR_DLMT.$this->_QUOTE.' '.$this->_QUOTE.$this->_CURRENT_STATUS_FILTER.' {print $0}'.$this->_QUOTE.' '.$this->_dataFileName.' > '.$this->_dataFileName .'_data1'.TMP_EXT);
if (IS_WINDOWS) {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d "|" -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
} else {
#filtri spremenljivk
$cmdLn1_1 = 'cut -d \'|\' -f '.$this->_VARIABLE_FILTER.' '.$this->_dataFileName .'_data1'.TMP_EXT.' > '.$this->_dataFileName .'_data1_1'.TMP_EXT;
}
$out1_1 = shell_exec($cmdLn1_1);
# zamenjamo | z ;
exec('sed '.$this->_QUOTE.'s/|/;/g'.$this->_QUOTE.' '.$this->_dataFileName .'_data1_1'.TMP_EXT.' >> '.$this->_dataFileName.'.txt');
$convertType = 1; // kateri tip konvertiranja uporabimo
$convertTypes[1] = array('charSet' => "windows-1250",
'delimit' => ";",
'newLine' => "\n",
'BOMchar' => "\xEF\xBB\xBF");
# izvedemo download
if ($fd = fopen ($this->_dataFileName.'.txt', "r")) {
// clean the output buffer
ob_clean();
$fsize = filesize($this->_dataFileName.'.txt');
$path_parts = pathinfo($this->_dataFileName.'.txt');
$ext = strtolower($path_parts["extension"]);
header('Content-type: text/plain; charset='.$convertTypes[$convertType]['charSet']);
header('Content-Disposition: attachment; filename="anketa'.$this->sid.'-'.date('Y-m-d').'.txt"');
# header('Content-length: '.$fsize);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
ob_flush();
# dodami boomchar za utf-8
echo $convertTypes[$convertType]['BOMchar'];
/*while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer.'';
}*/
$i=0;
// Loop po vrsticah
while(($line = fgets($fd)) !== false) {
// Samo naslovni vrstici z metapodatki oz. vse vrstice ce nimamo label
if($i < 2 || !$display_labels){
echo $line;
}
// Izpisujemo labele v podatkovnih vrsticah
else{
// Vrstico s podatki razbijemo, dodamo labele in jo nazaj sestavimo
$line_array = explode(';', $line);
if(count($line_array) > 0){
foreach($line_array as $seq => $val){
// Izpisemo vrednost
echo $val;
// Izpisemo labelo
$seq += 3;
if(isset($labels[$seq][0]['values'][$val])){
echo ' ("'.$labels[$seq][0]['values'][$val].'")';
}
// Vsem razen zadnjemu dodamo se separator
if($seq < count($line_array)+2)
echo ';';
}
}
}
$i++;
}
}
else {
echo "Napaka";
}
fclose ($fd);
#pobrišemo vse tmp datoteke
foreach (glob($folder . 'export_data_'.$this->sid.'_*'.TMP_EXT) as $fileToDelete) {
unlink($fileToDelete);
}
unlink ($this->_dataFileName.'.txt');
}
else {
echo '';
}
exit;
}
// shranim SPS in A00, potem pokličem spss in je.
private function exportSav () {
// izbriši staro
// pač... RM dela :-)
@unlink ($this->folder .'tmp_spss2sav' .$this->sid .'.a00');
@unlink ($this->folder .'tmp_spss2sav' .$this->sid .'.sps');
// spss + a00
$this->exportSpss("save", true, true);
$this->exportSpss("save", false, true);
// convert
//echo "Diagnostics for developers (link is below): <br>";
passthru ('pspp ' .$this->folder .'tmp_spss2sav' .$this->sid .'.sps');
//echo '<br><br><strong><a href="SurveyData/' .'tmp_spss2sav' .$this->sid .'.SAV">Link</a></strong>';
// Tole ne dela ker kessira star file
//header ('location: SurveyData/' .'tmp_spss2sav' .$this->sid .'.SAV');
$file_url = 'SurveyData/' .'tmp_spss2sav' .$this->sid .'.SAV';
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\"");
readfile($file_url);
}
/**
* mode download - klasično, pač skrani SAV + A00
* mode save - shrani fajla
*
* pa porinem si noter še data_par (true - a00, false - sps).
*/
private function exportSpss($mode = "download", $data_param = false, $pspp=false) {
global $site_path, $lang;
$folder = $site_path . EXPORT_FOLDER.'/';
$tmp_files = $this->folder.'tmp_spss_'.$this->sid.'.php';
#polovimo max št znakov za posamezne sekvence
if (IS_WINDOWS) {
$command = 'awk -F"|" "BEGIN {{OFS=\"\"} {ORS=\"\n\"} {FS=\"\x7C\"} {SUBSEP=\"\x7C\"}} '
.'{if (MaxFields < NF) MaxFields = NF; for (i=1; i<=NF; i++) { Field[NR, i] = $i; l = length($i); if (l < 1) l = 1; if (Length[i] < l) Length[i] = l; };} '
.'END {print\"\x3C\x3Fphp\"; for (i=1; i<=MaxFields; i++) { print \"$spss_length[\",i,\"]\",\"=\",Length[i],\";\"}; print\"\x3F\x3E\"}" '
.$this->_dataFileName. ' > '.$tmp_files ;
} else {
$command = 'awk -F"|" \'BEGIN {{OFS=""} {ORS="\n"} {FS="\x7C"} {SUBSEP="\x7C"}} '
.'{if (MaxFields < NF) MaxFields = NF; for (i=1; i<=NF; i++) { Field[NR, i] = $i; l = length($i); if (l < 1) l = 1; if (Length[i] < l) Length[i] = l; };} '
.'END {print"\x3C\x3Fphp"; for (i=1; i<=MaxFields; i++) { print "$spss_length[",i,"]","=",Length[i],";"}; print"\x3F\x3E"}\' '
.$this->_dataFileName. ' > '.$this->folder.'tmp_spss_'.$this->sid.'.php';
}
$out = shell_exec($command);
include($tmp_files );
# pobrišemo inkludan fajl, ker jih več ne rabimo
if (file_exists($tmp_files )) {
unlink($tmp_files );
}
if ($this->_fileStatus >= 0 && $this->_dataFileName !== null && $this->_dataFileName !== '' && $this->_headFileName !== null && $this->_headFileName !== '') {
#ali lovimo datoteko s strukturo ali datoteko z podatki
$data = false;
if ((isset($_REQUEST['exportData']) && (int)$_REQUEST['exportData'] == 1) || $data_param == true) {
$data = true;
}
# delamo datoteko s strukturo
if ( $data == false ) {
# TODO - odstranit šumnike iz header datoteke
#$str = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $str);
$_value_labels_numbers = ''; # temp variabla kamor shranimo imena variabel numeričnih odgovorov
$_value_labels_text = ''; # temp variabla kamor shranimo imena variabel tekstovnih odgovorov
#preberemo HEADERS iz datoteke
$this->_HEADERS = unserialize(file_get_contents($this->_headFileName));
# poiščemo maximalno število znakov pri missing vrednostih za tekstovne in number odgovore
$_all_missing_values = SurveyMissingValues::GetMissingValuesForSurvey(array(1,2,3));
$_max_text_missing_chars = 0;
$_max_number_missing_chars = 0;
# polovimo maximalne dolžine znakov
foreach ($_all_missing_values AS $mkey => $missing) {
$_max_text_missing_chars = max($_max_text_missing_chars, strlen($mkey . ': '. $missing));
$_max_number_missing_chars = max($_max_number_missing_chars, strlen($mkey));
}
$maxLengthForSpr = self::create_array_SPSS(max($_max_text_missing_chars,$_max_number_missing_chars));
//$resultString .= .NEW_LINE;
$resultString = $lang['srv_spss_export_base_instructions'];
$resultString .= NEW_LINE.'.'.NEW_LINE.NEW_LINE;
$resultString .= 'PRESERVE.'.NEW_LINE;
// TOLE NE DELA OK ZA DECIMALKE V NOVIH SPSSih
/*if ($pspp == false) {
$resultString .= 'SET UNICODE ON.'.NEW_LINE;
}
else {
$resultString .= "SET LOCALE='UTF-8'.".NEW_LINE;
}*/
$resultString .= "SET LOCALE='en_US'.".NEW_LINE;
$resultString .= 'SET UNICODE ON.'.NEW_LINE;
$resultString .= 'SET DECIMAL DOT.'.NEW_LINE.NEW_LINE;
# seznam spremenljivk in opis formata
$resultString .= 'GET DATA'.NEW_LINE;
$resultString .= ' /TYPE = TXT'.NEW_LINE;
if ($mode == "download") {
$resultString .= ' /FILE = \'C:\anketa'.$this->sid.'-'.date('Y-m-d').'_podatki.txt\''.NEW_LINE;
}
else {
$resultString .= ' /FILE = \'' .$this->folder .'tmp_spss2sav' .$this->sid .'.a00\''.NEW_LINE;
}
//.$lang['srv_spss_export_file_instructions'].NEW_LINE;
$resultString .= ' /ARRANGEMENT = DELIMITED'.NEW_LINE;
$resultString .= ' /FIRSTCASE = 1'.NEW_LINE;
$resultString .= ' /IMPORTCASE = ALL'.NEW_LINE;
$resultString .= ' /DELIMITERS = " "'.NEW_LINE;
$resultString .= ' /QUALIFIER = "\'"'.NEW_LINE;
$resultString .= ' /VARIABLES = '.NEW_LINE;
# dodamo seznam variabel z tipi podatkov
if (count($this->_HEADERS) > 0) {
$cnt = 1;
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid]) && count($spremenljivka['grids']) > 0) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
if (count($grid['variables']) > 0) {
foreach ($grid['variables'] AS $vid => $variable ){
$seq=$variable['sequence'];
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
# vsako v svojo vrstico
if (substr($variable['spss'],0,1) == 'F') {
# pri številih
$_number = explode('.',substr($variable['spss'],1));
$_cela = isset($_number[0]) && $_number[0] > 0 ? $_number[0] : 0;
$_decimalna = isset($_number[1]) && $_number[1] > 0 ? $_number[1] : 0;
$_spss_chars = 'F'.max($_max_number_missing_chars,$_cela,1).'.'.$_decimalna;
} else if ($variable['spss'] == 'DATETIMEw') {
# pri tekstovnih odgovorih
#$_spss_chars = 'A'.$_max_text_missing_chars;
#polovimo po novi metodi
$_spss_chars = 'A'.$spss_length[$seq];
} else {
# pri tekstovnih odgovorih
#$_spss_chars = substr($variable['spss'],0,1) . max($maxLengthForSpr[$spid],$_max_text_missing_chars,substr($variable['spss'],1),1);
#polovimo po novi metodi
$_spss_chars = 'A'.$spss_length[$seq];
}
// Language meta moramo preimenovati za spss, ker drugace je podvojen z language spremenljivko
if($variable['variable'] == 'Language')
$resultString .= ' Language_meta '.$_spss_chars.NEW_LINE;
else
$resultString .= ' ' . preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']) . ' '.$_spss_chars.NEW_LINE;
# polovimo imena variable za missing vrednosti Nagovora ne dodajmo
if (isset($spremenljivka['tip']) && $spremenljivka['tip'] != 'm' && $spremenljivka['tip'] != 'sm' && $spremenljivka['tip'] != 5) {
if (substr($variable['spss'],0,1) == 'F') {
$_value_labels_numbers .= $variable['variable'].' ';
// Dodamo prelom vsakih 10 variabel zaradi max dolzine vrstice
if($cnt > 10){
$_value_labels_numbers .= NEW_LINE;
$cnt = 0;
}
$cnt++;
}
else if (substr($variable['spss'],0,1) == 'A') {
$_value_labels_text .= $variable['variable'].' ';
// Dodamo prelom vsakih 10 variabel zaradi max dolzine vrstice
if($cnt > 10){
$_value_labels_text .= NEW_LINE;
$cnt = 0;
}
$cnt++;
}
}
}
}
}
}
}
}
}
$resultString .= ' .'.NEW_LINE.NEW_LINE;
#ime ankete brez presledkov
// pspp ne mara _
if ($pspp == false)
$resultString .= 'DATASET NAME ' . preg_replace("/[^a-zA-Z0-9_]/",'_',$this->survey['naslov']) . ' WINDOW=FRONT.' . NEW_LINE.NEW_LINE;
else
$resultString .= 'DATASET NAME ' . preg_replace("/[^a-zA-Z0-9_]/",'',$this->survey['naslov']) . ' WINDOW=FRONT.' . NEW_LINE.NEW_LINE;
#labele vprasanj ==> VARIABLE LABELS
# seznam spremenljivk in opis formata (pika na koncu vsake labele)
if (count($this->_HEADERS) > 0) {
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid]) && count($spremenljivka['grids']) > 0) {
foreach ($spremenljivka['grids'] AS $gid => $grid) {
if (count($grid['variables']) > 0) {
foreach ($grid['variables'] AS $vid => $variable ){
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
switch ($spremenljivka['tip']) {
case '2':
case '6':
$variable_label = substr($spremenljivka['naslov'],0,30).': '.$variable['naslov'];
$_variable = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']);
break;
case '7':
if (isset($spremenljivka['enota'])) {
$variable_label= substr($spremenljivka['naslov'],0,30) .' ('.$variable['naslov'].')';
} else {
$variable_label= substr($spremenljivka['naslov'],0,30) ;
}
$_variable = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']);
break;
case '16':
case '19':
case '20':
$variable_label= substr($spremenljivka['naslov'],0,15) .': '.$grid['naslov'].': '.$variable['naslov'];
$_variable = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']);
break;
case '21':
$variable_label= substr($spremenljivka['naslov'],0,30) .' ('.$variable['naslov'].')';
$_variable = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']);
break;
default:
$variable_label = $variable['naslov'];
$_variable = preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable['variable']);
break;
}
if($variable['other'] == 1 && $variable['text'] == 1) {
$variable_label .= ' '.$lang['srv_sppss_text_other'];
}
$variable_label = $this->getCleanString($variable_label);
// Language meta moramo preimenovati za spss, ker drugace je podvojen z language spremenljivko
if($variable['variable'] == 'Language')
$resultString .= 'VARIABLE LABELS Language_meta \''.$variable_label.'\' .'.NEW_LINE;
else
$resultString .= 'VARIABLE LABELS '.$_variable.' \''.$variable_label.'\' .'.NEW_LINE;
}
}
}
}
}
}
$resultString .=NEW_LINE;
}
# labele vrednosti ==> VALUE LABELS
# seznam label vrednosti spremenljivk (pika na koncu vsakega sklopa)
if (count($this->_HEADERS) > 0) {
foreach ($this->_HEADERS AS $spid => $spremenljivka) {
if (isset($this->_SVP_PV[$spid]) && count($spremenljivka['grids']) > 0) {
if (isset($spremenljivka['options'])) {
$resultString .= 'VALUE LABELS';
foreach ($spremenljivka['grids'] AS $gid => $grid) {
if (count($grid['variables']) > 0) {
foreach ($grid['variables'] AS $vid => $variable ){
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
if ($variable['other'] != 1) {
$variable = $this->getCleanString($variable['variable']);
$resultString .= ' '.preg_replace ("/[^a-zA-Z0-9_\/]/", "_", $variable);
}
}
}
}
}
// pspp ne mara newline, hoče presledek vmes.
if ($pspp == false) $resultString .= NEW_LINE;
else $resultString .= ' ';
if (count($spremenljivka['options']) > 0) {
foreach ($spremenljivka['options'] AS $okey =>$option) {
if(($spremenljivka['tip'] !== 'sm' && $spremenljivka['tip'] !== 'm') || $this->exportSettings['FullMeta'] > 0){
if ($spremenljivka['tip'] == 2 || $spremenljivka['tip'] == 16) {
# pri čekboxu prevedemo
if ($pspp == false){
$resultString .= $okey. ' \''.$lang['srv_sppss_checkbox_value_'.$option].'\''.NEW_LINE;
}
else {
$resultString .= $okey. ' \''.$lang['srv_sppss_checkbox_value_'.$option].'\''.' ';
}
}
else {
$option = $this->getCleanString($option);
if ($pspp ==false) $resultString .= $okey. ' \''.$option.'\''.NEW_LINE;
else {
if (strpos ($option, "'")===false) {
$resultString .= $okey. ' \''.$option.'\''.' ';
}
else {
$resultString .= $okey. ' \"'.str_replace ("'", "'", $option) .'\"'.' ';
}
}
}
}
}
}
$resultString .='.'.NEW_LINE.NEW_LINE;
}
}
}
}
# missing vrednosti ==> MISSING VALUES
# seznam - razpon mising vrednosti ( pika na koncu ukaza)
/*
* Manjkajoče vrednosti se definirajo samo za številske (format F) spremenljivke, saj določanje intervala za
* tekstovne (format A) ni podprto. Interval manjkajočih vrednosti označi uporabnik v vmesniku za izvoz, privzeto
* je od -999 do -1. Uporabnik lahko izbere tudi, da ne želi definirati manjkajočih vrednosti – v tem primeru se
* spodnja koda ne vključi v sintakso.
* MISSING VALUES Q1 Q2 (...) Qn (a thru b).
* Q1, Q2, ..., Qn: imena številskih spremenljivk.
*/
$_unset = SurveyMissingValues::GetUnsetValuesForSurvey();
$_missings = SurveyMissingValues::GetMissingValuesForSurvey();
#poiščemo razpon missingov, najmanjči in največji
$_min = null;
$_max = null;
if (count($_unset) > 0) {
foreach ( $_unset AS $key => $_mising_value) {
$_min = ($_min == null) ? $key : min($_min,$key);
$_max = ($_max == null) ? $key : max($_max,$key);
}
}
if (count($_missings) > 0) {
foreach ( $_missings AS $key => $_mising_value) {
$_min = ($_min == null) ? $key : min($_min,$key);
$_max = ($_max == null) ? $key : max($_max,$key);
}
}
if ($_min == null) $_min = -99; # privzeto
if ($_max == null) $_max = -1; # privzeto
if (count($this->_HEADERS) > 0 && $_value_labels_numbers != '') {
$resultString .='MISSING VALUES ';
$resultString .= $_value_labels_numbers . ' ('.$_min.' thru '.$_max.')';
$resultString .='.'.NEW_LINE.NEW_LINE;
}
# missing labele ==> ADD VALUE LABELS
# seznam label za missinge ( pika na koncu seznama) Naredimo dvakrat, 1x za števila in 1x za texte
/** Labele za manjkajoče vrednosti se definirajo za številska in besedilna vprašanja in sicer ločeno.
* Labele se dobijo iz sistemskih nastavitev manjkajočih vrednosti v 1KA (npr. neodgovor itd.)
*/
# za number odgovore
if ( (count($_missings)+count($_unset)) > 0 && $_value_labels_numbers != '') {
if ($pspp == false)
$resultString .='ADD VALUE LABELS ' . $_value_labels_numbers.NEW_LINE;
else
$resultString .='VALUE LABELS ' . $_value_labels_numbers.' ';
if (count($_missings) > 0) {
foreach ( $_missings AS $mkey => $missing_value) {
if ($pspp == false)
$resultString .= $mkey . ' \'' . $this->getCleanString($missing_value).'\''.NEW_LINE;
else {
if (strpos ($this->getCleanString($unset_value), "'")===false) {
$resultString .= $mkey . ' "' . $this->getCleanString($missing_value).'"'.' ';
}
else {
$resultString .= $mkey . ' "' . str_replace ("'", "'", $this->getCleanString($missing_value)) .'"'.' ';
}
}
}
}
if (count($_unset) > 0) {
foreach ( $_unset AS $ukey => $unset_value) {
if ($pspp == false) $resultString .= $ukey . ' \'' . $this->getCleanString($unset_value).'\''.NEW_LINE;
else {
if (strpos ($this->getCleanString($unset_value), "'")===false) {
$resultString .= $ukey . ' \'' . $this->getCleanString($unset_value).'\''.' ';
}
else {
$resultString .= $ukey . ' "' . str_replace ("'", "'", $this->getCleanString($unset_value)).'"'.' ';
}
}
}
}
$resultString .='.'.NEW_LINE.NEW_LINE;
}
# za tekstovne odgovore prekodiramo missinge
// ne smeš, ker prideš preko dovoljene dolžine. V A5 pač ne gre 20 znakov...
// SPSS ima sicer komando "alter" za spremeniti string, ampak ker pspp ne podpira, delam labele!
if ( (count($_missings)+count($_unset)) > 0 && $_value_labels_text != '') {
$cnt = 1;
$resultString .= 'VALUE LABELS ' .$_value_labels_text .' '.NEW_LINE;
if (count($_missings) > 0) {
foreach ( $_missings AS $mkey => $missing_value) {
$resultString .= '\'' .$mkey . '\' \'' .$mkey . ': '. $this->getCleanString($missing_value).'\' ';
$resultString .= NEW_LINE;
}
}
if (count($_unset) > 0) {
foreach ( $_unset AS $ukey => $unset_value) {
if ($pspp == false){
$resultString .= '\'' . $ukey . '\' \'' . $ukey . ': '. $this->getCleanString($unset_value).'\' ';
$resultString .= NEW_LINE;
}
}
}
$resultString .= '.' . NEW_LINE.NEW_LINE;
}
if ($mode != "download") {
$resultString .= 'SAVE /OUTFILE \'' .$this->folder .'tmp_spss2sav' .$this->sid .'.SAV\'.' .NEW_LINE;
}
# povrnemo narejene spremembe v spssu
$resultString .='EXECUTE.'.NEW_LINE;
$resultString .='RESTORE.';
$convertType = 1; // kateri tip konvertiranja uporabimo
$convertTypes[1] = array('charSet' => "windows-1250",
'delimit' => ";",
'newLine' => "\n",
'BOMchar' => "\xEF\xBB\xBF");
// downloadaj
if ($mode == "download") {
ob_clean();
header('Content-type: text/plain; charset='.$convertTypes[$convertType]['charSet']);
header('Content-Disposition: attachment; filename="anketa'.$this->sid.'-'.date('Y-m-d').'.sps"');
# header("Content-length: $fsize");
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
ob_flush();
#$resultString = iconv("UTF-8", "CP1250", $resultString);
# dodami boomchar za utf-8
echo $convertTypes[$convertType]['BOMchar'];
echo $resultString;
}
// shrani nekam na disk če imaš "save" namesto "download"
else {
$fh = fopen($this->folder .'tmp_spss2sav' .$this->sid.'.sps', 'w');
fwrite($fh, $resultString);
fclose($fh);
}
// end if data = false
}
else {
#lovimo podatke
// | -> \x7C
// ` -> \x60
// ' -> \x27
// " -> \x22
$tmp_files = array( 'original' => $this->_dataFileName,
'first' => $this->_dataFileName.'_first',
'first1' => $this->_dataFileName.'_first_1',
'second' => $this->_dataFileName.'_second',
'third' => $this->_dataFileName.'_third',
'fourth' => $this->_dataFileName.'_fourth');
if (IS_WINDOWS) {
# polovimo vrstice z statusom
$cmdLn1 = 'awk -F"'.STR_DLMT.'" "'.$this->_CURRENT_STATUS_FILTER.' {print $0}" '.$tmp_files['original'].' > '.$tmp_files['first'];
#filtri spremenljivk
$cmdLn1_1 = 'cut -d "|" -f '.$this->_VARIABLE_FILTER.' '.$tmp_files['first'].' > '.$tmp_files['first1'];
#zamenjamo ' => `
$cmdLn2 = 'sed "s/\x27/\x60/g" '.$tmp_files['first1'].' > '.$tmp_files['second'];
# zamenjamo | z ' '
$cmdLn3 = 'sed "s/'.STR_DLMT.'/\x27 \x27/g" '.$tmp_files['second'].' > '.$tmp_files['third'];
# dodamo ' na začetek in konec
$cmdLn4 = 'awk '.$this->_QUOTE.'{print \"\'\"$0\"\'\"}'.$this->_QUOTE.' '.$tmp_files['third'].' > '.$tmp_files['fourth'];
} else {
# polovimo vrstice z statusom
$cmdLn1 = "awk -F'\x7C' '".$this->_CURRENT_STATUS_FILTER." {print $0}' ".$tmp_files['original'].' > '.$tmp_files['first'];
#filtri spremenljivk
$cmdLn1_1 = 'cut -d \'|\' -f '.$this->_VARIABLE_FILTER.' '.$tmp_files['first'].' > '.$tmp_files['first1'];
#zamenjamo ' => `
$cmdLn2 = 'sed \'s/\x27/\x60/g\' '.$tmp_files['first1'].' > '.$tmp_files['second'];
# zamenjamo | z ' '
$cmdLn3 = 'sed \'s/'.STR_DLMT.'/\x27 \x27/g\' '.$tmp_files['second'].' > '.$tmp_files['third'];
# dodamo ' na začetek in konec
$this->_QUOTE = '\'';
$cmdLn4 = 'awk \'{print "\x27"$0"\x27"}\' '.$tmp_files['third'].' > '.$tmp_files['fourth'];
}
$out1 = shell_exec($cmdLn1);
$out1_1 = shell_exec($cmdLn1_1);
$out2 = shell_exec($cmdLn2);
$out3 = shell_exec($cmdLn3);
$out4 = shell_exec($cmdLn4);
if ($_GET['debug'] == 1) {
print_r('<br>'.$cmdLn1);
print_r('<br>'.$cmdLn2);
print_r('<br>'.$cmdLn3);
print_r('<br>'.$cmdLn4);
}
# nardimo output
$convertType = 1; // kateri tip konvertiranja uporabimo
$convertTypes[1] = array('charSet' => "windows-1250",
'delimit' => ";",
'newLine' => "\n",
'BOMchar' => "\xEF\xBB\xBF");
if ($mode == "download") {
# izvedemo download
if ($fd = fopen ($tmp_files['fourth'], "r")) {
ob_clean();
$fsize = filesize($tmp_files['fourth']);
$path_parts = pathinfo($tmp_files['fourth']);
$ext = strtolower($path_parts["extension"]);
header('Content-type: text/plain; charset='.$convertTypes[$convertType]['charSet']);
header('Content-Disposition: attachment; filename="anketa'.$this->sid.'-'.date('Y-m-d').'_podatki.txt"');
#header("Content-length: $fsize");
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Transfer-Encoding: binary');
ob_flush();
# dodami boomchar za utf-8
echo $convertTypes[$convertType]['BOMchar'];
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
else {
echo "Napaka";
}
fclose ($fd);
}
// priprava za SAV
else {
copy ($tmp_files['fourth'], $this->folder .'tmp_spss2sav' .$this->sid.'.a00');
}
#pobrišemo vse tmp datoteke
if (file_exists($tmp_files['first'])) { unlink($tmp_files['first']); }
if (file_exists($tmp_files['first1'])) { unlink($tmp_files['first1']); }
if (file_exists($tmp_files['second'])) { unlink($tmp_files['second']); }
if (file_exists($tmp_files['third'])) { unlink($tmp_files['third']); }
if (file_exists($tmp_files['fourth'])) { unlink($tmp_files['fourth']); }
} // end if data = true
}
else {
}
if ($mode == "download") {
ob_flush();
exit;
}
else {
return;
}
}
/** Preveri ali obstajata datoteki z podatki in headerji in ali sta zadnji ažurni
*
*/
public function checkFile() {
$SDF = SurveyDataFile::get_instance();
$SDF->init($this->sid);
$this->_headFileName = $SDF->getHeaderFileName();
$this->_dataFileName = $SDF->getDataFileName();
$this->_fileStatus = $SDF->getStatus();
return $this->_fileStatus;
}
private function create_array_SPSS($max_missing) {
$array_SPSS = array();
$db_table = ($this->survey['db_table'] == 1) ? '_active' : '';
# poberemo max dolžine iz srv_data_text max(text1,text2)
$str_query = 'SELECT dt.spr_id, MAX(LENGTH(dt.text)) AS length, MAX(LENGTH(dt.text2)) AS length2 FROM srv_data_text'.$db_table.' dt, srv_grupa g, srv_spremenljivka s WHERE dt.spr_id = s.id AND s.gru_id=g.id AND g.ank_id='.$this->sid.' GROUP BY dt.spr_id';
$_qry_SPSS = sisplet_query($str_query);
while (list($spr_id,$text,$text2) = mysqli_fetch_row($_qry_SPSS)) {
$array_SPSS[$spr_id] = max((int)$text,(int)$text2,$max_missing);
}
$str_query = 'SELECT dt.spr_id, MAX(LENGTH(dt.text)) AS length FROM srv_data_textgrid'.$db_table.' AS dt, srv_grupa g, srv_spremenljivka s WHERE dt.spr_id = s.id AND s.gru_id=g.id AND g.ank_id='.$this->sid.' GROUP BY dt.spr_id';
$_qry_SPSS = sisplet_query($str_query);
while (list($spr_id,$text) = mysqli_fetch_row($_qry_SPSS)) {
#$this->_array_SPSS[$spr_id]['text2'] = ((int)$text < $this->MISSING_MAX_LENGTH ? $this->MISSING_MAX_LENGTH :$text);
$array_SPSS[$spr_id] = max((int)$text,$array_SPSS[$spr_id],$max_missing);
}
return $array_SPSS;
}
public function ajax() {
if ($_GET['a'] == 'doexport') {
self :: DoExport();
}
}
function getCleanString($string) {
// Replace quotov
$string = preg_replace ("/'/", "`", $string);
// Max dolžina stringa je 240 znakov
$string = $this->splitStringIntoLines($string);
return $string;
}
// Max dolžina stringa je 200 znakov - razbijemo v chunke za spss
private function splitStringIntoLines($string){
if(strlen($string) <= 200)
return $string;
$new_string = chunk_split($string, 200, '\'+'.NEW_LINE.'\'');
$new_string = substr($new_string, 0, -4);
return $new_string;
}
private function getVariableLabels($spr_id){
global $lang;
$s = sisplet_query("SELECT tip FROM srv_spremenljivka WHERE id = '$spr_id'");
$r = mysqli_fetch_array($s);
if ( in_array($r['tip'], array(1, 3)) ) {
$output = array();
$output['spr'] = $spr_id;
$output['tip'] = $r['tip'];
$output['values'] = array();
$sql = sisplet_query("SELECT naslov, variable FROM srv_vrednost WHERE spr_id='$spr_id' ORDER BY vrstni_red ASC");
while ($row = mysqli_fetch_array($sql)) {
$output['values'][$row['variable']] = strip_tags( $row['naslov'] );
}
$output['values']['-1'] = $lang['srv_bottom_data_legend_note_li1a'];
$output['values']['-2'] = $lang['srv_bottom_data_legend_note_li2a'];
$output['values']['-3'] = $lang['srv_bottom_data_legend_note_li3a'];
$output['values']['-4'] = $lang['srv_bottom_data_legend_note_li4a'];
$output['values']['-5'] = $lang['srv_bottom_data_legend_note_li5a'];
$response[] = $output;
} elseif ( in_array($r['tip'], array(6, 16)) ) {
$output = array();
$output['spr'] = $spr_id;
$output['tip'] = $r['tip'];
$output['values'] = array();
$sql = sisplet_query("SELECT naslov, variable FROM srv_grid WHERE spr_id='$spr_id' ORDER BY vrstni_red ASC");
while ($row = mysqli_fetch_array($sql)) {
$output['values'][$row['variable']] = strip_tags( $row['naslov'] );
}
$output['values']['-1'] = $lang['srv_bottom_data_legend_note_li1a'];
$output['values']['-2'] = $lang['srv_bottom_data_legend_note_li2a'];
$output['values']['-3'] = $lang['srv_bottom_data_legend_note_li3a'];
$output['values']['-4'] = $lang['srv_bottom_data_legend_note_li4a'];
$output['values']['-5'] = $lang['srv_bottom_data_legend_note_li5a'];
$response[] = $output;
}
return $response;
}
}
?>