2020-08-14 13:36:36 +02:00
< ? php
/**
* Created on Jun . 2010
*
* @ author : Gorazd Vesleič
*
* @ desc : za izvoze
*
* funkcije :
* - Init () - inicializacija
*
*/
2020-12-07 09:43:59 +01:00
DEFINE ( NEW_LINE , " \n " );
DEFINE ( TMP_EXT , '.tmp' );
DEFINE ( STR_DLMT , '|' );
DEFINE ( DAT_EXT , '.dat' );
2020-08-14 13:36:36 +02:00
2020-12-07 09:43:59 +01:00
define ( " EXPORT_FOLDER " , " admin/survey/SurveyData " );
2020-08-14 13:36:36 +02:00
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
2021-07-23 12:25:40 +02:00
$this -> db_table = SurveyInfo :: getInstance () -> getSurveyArchiveDBString ();
2020-08-14 13:36:36 +02:00
// 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 );
# 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 ;
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
case 'spss' :
2020-08-14 13:36:36 +02:00
self :: exportSpss ();
break ;
case 'excel' :
self :: exportExcel ();
break ;
case 'excel_xls' :
self :: exportExcelXls ();
break ;
case 'txt' :
self :: exportText ();
break ;
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
case '1ka' :
self :: export1KA ();
break ;
2020-08-14 13:36:36 +02:00
}
}
/** Nastavimo filtre
*
*/
private function setUpFilter () {
if ( $this -> _fileStatus >= 0 ) {
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
$this -> _HEADERS = unserialize ( file_get_contents ( $this -> _headFileName ));
2020-08-14 13:36:36 +02:00
$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 );
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
2020-08-14 13:36:36 +02:00
# 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 ;
}
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
/** naredimo izvoz za txt
*
*/
function export1KA () {
$this -> _EXPORT_FULL_META = true ;
$this -> _EXPORT_HIDDEN_SYSTEM = true ;
$this -> _SPECIAL_EXPORT = true ;
$this -> setUpFilter ();
global $site_path ;
$folder = $site_path . EXPORT_FOLDER . '/' ;
// če fajl obstaja, ga briši (dodaj)
if ( $this -> _fileStatus >= 0 && $this -> _dataFileName !== null && $this -> _dataFileName !== '' && $this -> _headFileName !== null && $this -> _headFileName !== '' ) {
#zapišemo v temp file
$file_handler = fopen ( $this -> _dataFileName . '.1ka' , " 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 ){
// izvozimo KOMPLET VSE
$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 );
# izvedemo download
$out_file = fopen ( $this -> _dataFileName . '.1ka' , " a " );
if ( $fd = fopen ( $this -> _dataFileName , " r " )) {
while (( $line = fgets ( $fd )) !== false ) {
fwrite ( $out_file , $line );
}
}
else {
echo " Napaka " ;
}
fclose ( $fd );
fclose ( $out_file );
if ( $fd = fopen ( $this -> _dataFileName . '.1ka' , " r " )) {
ob_clean ();
$fsize = filesize ( $this -> _dataFileName . '.1ka' );
$path_parts = pathinfo ( $this -> _dataFileName . '.1ka' );
$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 ( '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 ();
while (( $line = fgets ( $fd )) !== false ) {
echo $line ;
}
fclose ( $fd );
}
}
else {
echo '' ;
}
unlink ( $this -> _dataFileName . '.1ka' );
exit ;
}
2020-08-14 13:36:36 +02:00
// 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 ));
}
2021-07-23 12:25:40 +02:00
$maxLengthForSpr = $this -> create_array_SPSS ( max ( $_max_text_missing_chars , $_max_number_missing_chars ));
2020-08-14 13:36:36 +02:00
//$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 1 KA ( 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 ();
# poberemo max dolžine iz srv_data_text max(text1,text2)
2021-07-23 12:25:40 +02:00
$str_query = 'SELECT dt.spr_id, MAX(LENGTH(dt.text)) AS length, MAX(LENGTH(dt.text2)) AS length2 FROM srv_data_text' . $this -> 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' ;
2020-08-14 13:36:36 +02:00
$_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 );
}
2021-07-23 12:25:40 +02:00
$str_query = 'SELECT dt.spr_id, MAX(LENGTH(dt.text)) AS length FROM srv_data_textgrid' . $this -> 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' ;
2020-08-14 13:36:36 +02:00
$_qry_SPSS = sisplet_query ( $str_query );
while ( list ( $spr_id , $text ) = mysqli_fetch_row ( $_qry_SPSS )) {
$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 ;
}
}
Prilagoditev za F2F, ostalo:
Dopolnjena opomba k nastavitvi kodne tabele za SQL.
De-1KAizacija:
Ukinjenih nekaj info@1ka.si emailov, odstranjenih nekaj testnih petrovih nastavitev.
Tudi lastna instalacija ima pravico do obvestil o grdem početju (phishing ipd).
GDPR na 1KA pošljemo samo, če NI lastna instalacija.
Dopolnitve za fieldwork delo:
- 1ka data izvoz
- grupa glede na kodo in ne le kuki
Tako lahko anketar nadaljuje z anketiranjem istega respondenta z vnosom
iste kode. Prej se je grupa nastavljala le glede na kuki, kar je bilo neuporabno
za fieldwork.
- skok na isto, ne naslednjo stran na koncu
PREJ: izpolnil si 1, 2, 3 in zaprl na 3. strani. 3. stran se ni shranila,
ker nisi dal NEXT. NAslednjič ko si odprl isti link, ki nadaljeval
na *naslednji* strani (4.)
Tako si imel podatke za 1.; 2.; 4.,... stran.
ZDAJ: izpolniš 1, 2, 3, zapreš. 3. stran se seveda ni shranila, ker si zaprl.
Ko ponovno odpreš anketo, te vrže na ISTO ZADNJO stran - torej tretjo.
- možen lokalni dump podatkov iz crontaba (zaščiteno s kodo)
- settings.php ima dodano nastavitev kode za dump podatkov. Tega ni smiselno
dati v nastavitve, ker se mora poklicati iz cron joba na SERVERJU, tako da
mora itak štaufat admin, ki pripravljal laptop.
Skripte za terensko združevanje so ločen modul in jih bi porinil v ločenem
patchu.
POZOR, preveriti je treba še BodyController (ali je bil ugly hack za narobe
nastavljeno anketo, ali je bilo kaj drugega). Avtomatsko je namreč disablalo
popravljanje ankete anketarjem!
2022-11-11 14:41:51 +01:00
?>