diff options
Diffstat (limited to 'mayor-mod/www/include')
-rw-r--r-- | mayor-mod/www/include/modules/naplo/share/file.php | 662 |
1 files changed, 662 insertions, 0 deletions
diff --git a/mayor-mod/www/include/modules/naplo/share/file.php b/mayor-mod/www/include/modules/naplo/share/file.php new file mode 100644 index 00000000..1e6c7595 --- /dev/null +++ b/mayor-mod/www/include/modules/naplo/share/file.php @@ -0,0 +1,662 @@ +<?php + + require_once('include/share/print/pdf.php'); + + if (file_exists("lang/$lang/module-naplo/share/file.php")) { + require_once("lang/$lang/module-naplo/share/file.php"); + } elseif (file_exists('lang/'._DEFAULT_LANG.'/module-naplo/share/file.php')) { + require_once('lang/'._DEFAULT_LANG.'/module-naplo/share/file.php'); + } else { + echo $lang; + } + + $Attrs = array( + + 'diakid' => _ATTR_DIAKID, + 'oid' => _ATTR_OID, + 'diakigazolvanyszam' => _ATTR_IGAZOLVANYSZAM, + 'viseltnevelotag' => _ATTR_VNE, + 'viseltcsaladinev' => _ATTR_VCSN, + 'viseltutonev' => _ATTR_VUN, + 'szuleteskorinevelotag' => _ATTR_SZNE, + 'szuleteskoricsaladinev' => _ATTR_SZCSN, + 'szuleteskoriutonev' => _ATTR_SZUN, + 'szuletesihely' => _ATTR_SZH, + 'szuletesiido' => _ATTR_SZI, + 'anyanevelotag' => _ATTR_ANE, + 'anyacsaladinev' => _ATTR_ACSN, + 'anyautoneve' => _ATTR_AUN, + 'kezdotanev' => _ATTR_KEZDO_TANEV, + 'kezdoszemeszter' => _ATTR_KEZDO_SZEMESZTER, + 'vegzotanev' => _ATTR_VEGZO_TANEV, + 'vegzoszemeszter' => _ATTR_VEGZO_SZEMESZTER, + 'adoazonosito' => _ATTR_ADOAZONOSITO, + 'allampolgarsag' => _ATTR_ALLAMPOLGARSAG, + 'anyaid' => _ATTR_ANYAID, + 'apaid' => _ATTR_APAID, + 'gondviseloid' => _ATTR_GONDVISELOID, + 'neveloid' => _ATTR_NEVELOID, + 'diaknaplosorszam' => _ATTR_DIAKNAPLOSORSZAM, + 'elozoiskolaomkod' => _ATTR_ELOZOISKOLAOMKOD, + 'email' => _ATTR_EMAIL, + 'fogyatekossag' => _ATTR_FOGYATEKOSSAG, + 'gondozasiszam' => _ATTR_GONDOZASISZAM, + 'jogviszonykezdete' => _ATTR_JOGVISZONYKEZDETE, + 'jogviszonyvege' => _ATTR_JOGVISZONYVEGE, + + 'lakhelyorszag' => _ATTR_LAKHELY_ORSZAG, + 'lakhelyirsz' => _ATTR_LAKHELY_IRSZ, + 'lakhelyhelyseg' => _ATTR_LAKHELY_HELYSEG, + 'lakhelykozteruletnev' => _ATTR_LAKHELY_KOZTERULETNEV, + 'lakhelykozteruletjelleg' => _ATTR_LAKHELY_KOZTERULETJELLEG, + 'lakhelyhazszam' => _ATTR_LAKHELY_HAZSZAM, + 'lakhelyemelet' => _ATTR_LAKHELY_EMELET, + 'lakhelyajto' => _ATTR_LAKHELY_AJTO, + + 'tartorszag' => _ATTR_TART_ORSZAG, + 'tartirsz' => _ATTR_TART_IRSZ, + 'tarthelyseg' => _ATTR_TART_HELYSEG, + 'tartkozteruletnev' => _ATTR_TART_KOZTERULETNEV, + 'tartkozteruletjelleg' => _ATTR_TART_KOZTERULETJELLEG, + 'tarthazszam' => _ATTR_TART_HAZSZAM, + 'tartemelet' => _ATTR_TART_EMELET, + 'tartajto' => _ATTR_TART_AJTO, + + 'tajszam' => _ATTR_TAJSZAM, + 'osztalyjel' => _ATTR_OSZTALYJEL, + 'penzugyistatusz' => _ATTR_PENZUGYISTATUSZ, + 'szemelyiigazolvanyszam' => _ATTR_SZEMELYIIGAZOLVANYSZAM, + 'szocialishelyzet' => _ATTR_SZOCIALISHELYZET, + 'statusz' => _ATTR_STATUSZ, + 'tartozkodasiokiratszam' => _ATTR_TARTOZKODASIOKIRATSZAM, + 'torvenyeskepviselo' => _ATTR_TORVENYESKEPVISELO, + 'telefon' => _ATTR_TELEFON, + 'mobil' => _ATTR_MOBIL, + 'nem' => _ATTR_NEM, + 'lakohelyijellemzo' => _ATTR_LAKOHELYIJELLEMZO, + 'megjegyzes' => _ATTR_MEGJEGYZES, + ); + + function readUpdateFile($fileName, $mezo_elvalaszto = ' ') { + + + $ADATOK = array(); + if ($fp = @fopen($fileName,'r')) { + // Az első 50 sor beolvasása - minta a mező-hozzárendeléshez + $i=0; + while (($sor = fgets($fp,1024)) and ($i<50)) { + $ADATOK[$i] = explode($mezo_elvalaszto,chop($sor)); + $i++; + } + fclose($fp); + } else { + $_SESSION['alert'][] = 'message:file_open_error:'.$fileName; + } + + return $ADATOK; + } +/* + * Lekérdezi egy adatbázis (naplo_intezmeny, naplo (tanév)) egy adott táblájának mezőit. + * Ha szükséges ezek listáját kiegészíti az extraAttrs tömbben felsorolt mezőkkel. + * A mezőnevekhez nyelvi konstansokat rendelhetünk ($Attrs tömb és lang/.../share/file.php) + */ + function getTableFields($table, $db = 'naplo_intezmeny', $extraAttrs = array(), $SET = array('withType' => false)) { + + global $Attrs; + + $return = $type = $name = array(); + $q = "SHOW FIELDS FROM `%s`"; + $r = db_query($q, array('fv' => 'getTableFields','modul' => $db, 'result' => 'indexed', 'values' => array($table))); + for ($i = 0; $i < count($r); $i++) { + if ($SET['withType']) { + if (substr($r[$i]['Type'],0,7) == 'varchar') $type[ $r[$i]['Field'] ] = 'string'; + elseif (substr($r[$i]['Type'],0,4) == 'enum') $type[ $r[$i]['Field'] ] = 'enum'; + elseif (substr($r[$i]['Type'],0,4) == 'date') $type[ $r[$i]['Field'] ] = 'date'; + elseif (strpos($r[$i]['Type'],'int(') !== false) $type[ $r[$i]['Field'] ] = 'int'; + else $type[ $r[$i]['Field'] ] = 'string'; + } + if ($Attrs[kisbetus($r[$i]['Field'])] != '') $name[$r[$i]['Field']] = $Attrs[kisbetus($r[$i]['Field'])]; + else $name[$r[$i]['Field']] = $r[$i]['Field']; + } + for ($i = 0; $i < count($extraAttrs); $i++) { + if (!isset($name[$extraAttrs[$i]])) { + if ($Attrs[kisbetus($extraAttrs[$i])] != '') $name[$extraAttrs[$i]] = $Attrs[kisbetus($extraAttrs[$i])]; + else $name[$extraAttrs[$i]] = $extraAttrs[$i]; + } + } + ksort($name); + + if ($SET['withType']) return array('names' => $name, 'types' => $type); + return $name; + + } + + + function getEnumField($modul, $table, $field) { + + $table = '`'.str_replace('.','`.`',$table).'`'; + $q = "SHOW FIELDS FROM %s LIKE '%s'"; + $v = array($table, $field); + $field = db_query($q, array('fv' => 'getEnumField', 'modul' => $modul, 'result' => 'record', 'values' => $v)); + $enum = substr($field['Type'], 6, -2); + $values = explode("','", $enum); + + return $values; + } + + function getSetField($modul, $table, $field) { + + $table = '`'.str_replace('.','`.`',$table).'`'; + $q = "SHOW FIELDS FROM %s LIKE '%s'"; + $v = array($table, $field); + $field = db_query($q, array('fv' => 'getSetField', 'modul' => $modul, 'result' => 'record', 'values' => $v)); + $set = substr($field['Type'], 5, -2); + $values = explode("','", $set); + + return $values; + } + + + function updateTable($table, $file, $MEZO_LISTA, $KULCS_MEZOK, $mezo_elvalaszto = ' ', $rovatfej = false, $db = 'naplo_intezmeny') { + + + if (!file_exists($file)) { + $_SESSION['alert'][] = 'message:file_not_found:updateTable:'.$file; + return false; + } + + if (!is_array($MEZO_LISTA)) { + $_SESSION['alert'][] = 'message:wrong_data:updateTable:MEZO_LISTA'; + return false; + } + + if (!is_array($KULCS_MEZOK)) { + $_SESSION['alert'][] = 'message:wrong_data:updateTable:KULCS_MEZOK'; + return false; + } + + // A frissítendő attribútumok listája + $attrList = array_values(array_filter($MEZO_LISTA)); + + $fp = fopen($file,'r'); + if (!$fp) { + $_SESSION['alert'][] = 'message:file_open_error:updateTable:'.$file; + return false; + } + + $lr = db_connect($db, array('fv' => 'updateTable')); + if (!$lr) { + $_SESSION['alert'][] = 'message:db_connect_failure:updateTable'; + fclose($fp); + return false; + } + db_start_trans($lr); + + // Az első sor kihagyása + if ($rovatfej) $sor = fgets($fp,1024); + while ($sor = fgets($fp,1024)) { + + $insertValues = $insertPatterns = array(); + $adatSor = explode($mezo_elvalaszto,chop($sor)); + $update = false; + + // keresési feltétel összerakása + $where = $v = $vw = array(); + for ($i = 0; $i < count($KULCS_MEZOK); $i++) { + if ($adatSor[$KULCS_MEZOK[$i]] != '') { + $where[] = "`%s`='%s'"; + array_push($vw, $MEZO_LISTA[$KULCS_MEZOK[$i]], $adatSor[$KULCS_MEZOK[$i]]); + } + } + $num = 0; + if (count($where) != 0) { + $q = 'SELECT COUNT(*) FROM `%s` WHERE '.implode(' AND ', $where); + array_unshift($vw, $table); + $num = db_query($q, array('fv' => 'updateTable', 'values' => $vw, 'result' => 'value', 'modul' => $db), $lr); + } + if ($num == 1 && _SKIP_ON_DUP === true) { $_SESSION['alert'][] = 'info:_SKIP_ON_DUP:'.serialize($sor); continue; } + if ($num == 1) { // update + $v = $vw; + array_shift($v); //$table kivétele + $UPDATE = array(); + for ($i = 0; $i < count($MEZO_LISTA); $i++) { + if ( + $MEZO_LISTA[$i] != '' + and $adatSor[$i] != '' + and !in_array($i,$KULCS_MEZOK) + ) { + if ($adatSor[$i] == '\N') { + array_unshift($UPDATE, "`%s`=NULL"); + array_unshift($v, $MEZO_LISTA[$i]); + } else { + array_unshift($UPDATE, "`%s`='%s'"); + array_unshift($v, $MEZO_LISTA[$i], $adatSor[$i]); + } + } + } + if (count($UPDATE) > 0) { + array_unshift($v, $table); + $q = 'UPDATE `%s` SET '.implode(',',$UPDATE).' WHERE '.implode(' AND ', $where); + $r = db_query($q, array('fv' => 'updateTable/update', 'values' => $v, 'modul' => $db, 'rollback' => true), $lr); + if (!$r) { + db_close($lr); + return false; + } + } + } elseif ($num == 0) { // insert + for ($i = 0; $i < count($MEZO_LISTA); $i++) { + if ($MEZO_LISTA[$i] != '') { + if ($adatSor[$i] == '\N') { + $insertValues[] = 'NULL'; + $insertPatterns[] = '%s'; + } else { + $insertValues[] = $adatSor[$i]; + $insertPatterns[] = "'%s'"; + } + } + } + $q = 'INSERT INTO `%s` ('.implode(',', array_fill(0, count($attrList), '%s')).') + VALUES ('.implode(',', $insertPatterns).')'; + $v = mayor_array_join(array($table), $attrList, $insertValues); + $r = db_query($q, array('fv' => 'updateTable/insert', 'modul' => $db, 'values' => $v, 'rollback' => true), $lr); + if (!$r) { + db_close($lr); + return false; + } + } else { + $_SESSION['alert'][] = 'message:wrong_data:updateTable:több illeszkedő rekord is van, túl laza a kulcs feltétel (' + .call_user_func_array('sprintf', array_merge(array('%s tábla, '.implode(' AND ',$where)), $vw)).')'; + db_rollback($lr); + db_close($lr); + return false; + } + } // while + db_commit($lr); + db_close($lr); + + fclose($fp); + + } + + function generatePDF($outputFile, $outputDir, $str, $booklet=false) { + + + // A szöveg file-ba írása + if (!$fp = fopen($outputDir.'/'.$outputFile.'-u8.tex', 'w')) { + $_SESSION['alert'][] = 'message:file_open_failure:generatePDF:'.$outputDir.'/'.$outputFile.'-u8.tex'; + return false; + } + if (!fwrite($fp, $str)) { + $_SESSION['alert'][] = 'message:file_write_failure:generatePDF:'.$outputDir.'/'.$outputFile.'-u8.tex'; + return false; + } + fclose($fp); + if (__NYOMTATAS_XETEX===true) { + $ret = exec('cd '.$outputDir.'; cat <<EOF > '.$outputFile.'.tex +%\font\kicsi=ecrm0500 +%\font\nagy=ecbx1200 +%\font\vastag=ecsx0800 +%\font\nagyss=ecsx1200 +%\font\normal=ecss0800 +%\font\dolt=ecsi0800 + +\font\kicsi="Linux Libertine O" at 5pt +\font\nagy="Linux Libertine O/B" at 12pt +\font\nagyss="Arial/B" at 12pt +\font\normal="Linux Biolinum O" at 8pt +\font\dolt="Linux Biolinum O/I" at 8pt +\normal + +EOF +'); + $ret = exec('cd '.$outputDir.'; cat '.$outputFile.'-u8.tex >> '.$outputFile.'.tex'); + $ret = exec('cd '.$outputDir.'; xetex -fmt '._MAYOR_DIR.'/print/module-naplo/xetex/mayor-xetex '.$outputFile.'.tex'); +#ex -fmt '._MAYOR_DIR.'/print/module-naplo/tex/mayor '.$outputFile.'.tex'); + } else { + // utf8 --> cork (t1) + $ret = exec('cd '.$outputDir.'; cat '.$outputFile.'-u8.tex | sed -e "s/\xc2\xa0/\x20/g" | recode u8..T1 > '.$outputFile.'.tex'); + // DVI, PS, PFD generálás (a rotate miatt nem megy a pdftex közvetlenül :o( + $ret = exec('cd '.$outputDir.'; tex -fmt '._MAYOR_DIR.'/print/module-naplo/tex/mayor '.$outputFile.'.tex'); + if ($ret === false) { $_SESSION['alert'][] = 'message:futási_hiba:generatePDF:tex'; return false; } +# LOG $ret = exec('cd '.$outputDir.'; dvips '.$outputFile.'.dvi 2>&1 | tee -a /tmp/x.log '); + $ret = exec('HOME=/tmp && export HOME && cd '.$outputDir.'; dvips '.$outputFile.'.dvi '); + if ($ret === false) { $_SESSION['alert'][] = 'message:futási_hiba:generatePDF:ps'; return false; } + $ret = exec('cd '.$outputDir.'; ps2pdf -sPAPERSIZE=a4 -dAutoRotatePages=/None '.$outputFile.'.ps'); + if (strpos($ret, 'error') !== false) { $_SESSION['alert'][] = 'message:futási_hiba:generatePDF:pdf'; return false; } + + } + if ($booklet) { + $ret = exec('cd '.$outputDir.'; mv '.$outputFile.'.pdf '.$outputFile.'-A4.pdf; pdfbook --short-edge --outfile '.$outputFile.'.pdf '.$outputFile.'-A4.pdf'); + } + return true; + } + + function generateXLS($fileName, $Table, $title) { + + global $policy, $page, $sub, $f; + + if (dirname($fileName) == '.') $fileName = _DOWNLOADDIR."/$policy/$page/$sub/$f/$fileName"; + $fp = fopen($fileName, 'w'); + if (!$fp) { + $_SESSION['alert'][] = 'message:file_open_failure:'.$fileName; + return false; + } + + fputs($fp, '<?xml version="1.0"?>'."\r\n"); + fputs($fp, '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:x="urn:schemas-microsoft-com:office:excel" + xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" + xmlns:html="http://www.w3.org/TR/REC-html40">'."\r\n"); + fputs($fp, ' <Styles>'."\r\n" + .' <Style ss:ID="s21">'."\r\n".' <NumberFormat ss:Format="Short Date" />'."\r\n".' </Style>'."\r\n" + .' <Style ss:ID="s22">'."\r\n".' <NumberFormat ss:Format="yyyy\.m\.d\.\ h:mm" />'."\r\n".' </Style>'."\r\n" + ."\r\n".' </Styles>'."\r\n"); + + fputs($fp, '<Worksheet ss:Name="'.$title.'">'."\r\n"); + fputs($fp, '<Table>'."\r\n"); + + for ($i = 0; $i < count($Table); $i++) { + fputs($fp, ' <Row>'."\r\n"); + foreach ($Table[$i] as $index => $value) { + if (is_numeric($value)) + fputs($fp, " <Cell><Data ss:Type=\"Number\">".$value."</Data></Cell>\r\n"); + elseif (strtotime($value)) + if (strlen($value) > 10) { + fputs($fp, " <Cell ss:StyleID=\"s22\"><Data ss:Type=\"DateTime\">".str_replace(' ','T',$value).'.000'."</Data></Cell>\r\n"); + } else { + fputs($fp, " <Cell ss:StyleID=\"s21\"><Data ss:Type=\"DateTime\">".$value.'T08:40:00.000'."</Data></Cell>\r\n"); + } + else + fputs($fp, " <Cell><Data ss:Type=\"String\">".$value."</Data></Cell>\r\n"); + } + fputs($fp, ' </Row>'."\r\n"); + } + + fputs($fp, '</Table>'."\r\n"); + fputs($fp, '</Worksheet>'."\r\n"); + fputs($fp, '</Workbook>'."\r\n"); + + fclose($fp); + return true; + + } + + function generateCSV($fileName, $Table, $title, $mezoElvalaszto=' ') { + + global $policy, $page, $sub, $f; + + if (dirname($fileName) == '.') $fileName = _DOWNLOADDIR."/$policy/$page/$sub/$f/$fileName"; + $fp = fopen($fileName, 'w'); + if (!$fp) { + $_SESSION['alert'][] = 'message:file_open_failure:'.$fileName; + return false; + } + + if ($title !='') fputs($fp, $title."\n"); + for ($i = 0; $i < count($Table); $i++) fputs($fp, implode($mezoElvalaszto, $Table[$i])."\n"); + + fclose($fp); + return true; + + } + + function generateODS($fileName, $Table, $title) { + + global $policy, $page, $sub, $f; + + if (dirname($fileName) == '.') $fileName = _DOWNLOADDIR."/$policy/$page/$sub/$f/$fileName"; + define('TMPZIP','/tmp/'.substr(basename($fileName), 0, strpos(basename($fileName), '.'))); + define('ODS_MIMETIPE','application/vnd.oasis.opendocument.spreadsheet'); + define('ODS_MANIFEST','<?xml version="1.0" encoding="UTF-8"?> +<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"> + <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.spreadsheet" manifest:version="1.2" manifest:full-path="/"/> + <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/> +</manifest:manifest>'); + define('ODS_START_XMLDOCUMENT','<?xml version="1.0" encoding="UTF-8"?> +<office:document-content + xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" + xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" + xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" + xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" + xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" + xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" + xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" + xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" + xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" + xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" + xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" + xmlns:math="http://www.w3.org/1998/Math/MathML" + xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" + xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" + xmlns:ooo="http://openoffice.org/2004/office" + xmlns:ooow="http://openoffice.org/2004/writer" + xmlns:oooc="http://openoffice.org/2004/calc" + xmlns:dom="http://www.w3.org/2001/xml-events" + xmlns:xforms="http://www.w3.org/2002/xforms" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:rpt="http://openoffice.org/2005/report" + xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + xmlns:grddl="http://www.w3.org/2003/g/data-view#" + xmlns:tableooo="http://openoffice.org/2009/table" + xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" + xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" + office:version="1.2" grddl:transformation="http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl">'); + define('ODS_ASTYLES','<office:automatic-styles> + <number:date-style style:name="N84"> + <number:year number:style="long"/> + <number:text>-</number:text> + <number:month number:style="long"/> + <number:text>-</number:text> + <number:day number:style="long"/> + </number:date-style> + <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N84"/> + </office:automatic-styles>'); + define('ODS_START_SPREADSHEET','<office:body><office:spreadsheet>'); + define('ODS_START_TABLE','<table:table table:name="Export">'); + define('ODS_START_ROW','<table:table-row>'); + define('ODS_END_ROW','</table:table-row>'); + define('ODS_END_TABLE','</table:table>'); + define('ODS_END_SPREADSHEET','</office:spreadsheet></office:body>'); + define('ODS_END_XMLDOCUMENT','</office:document-content>'); + + $content = ODS_START_XMLDOCUMENT . ODS_ASTYLES . ODS_START_SPREADSHEET . ODS_START_TABLE; + for ($i = 0; $i < count($Table); $i++) { + $content .= ODS_START_ROW; + foreach ($Table[$i] as $index => $value) { + if (is_numeric($value)) + $content .= '<table:table-cell office:value-type="float" office:value="'.$value.'"/>'."\n"; + elseif (strtotime($value)) + if (strlen($value) > 10) { + $content .= '<table:table-cell table:style-name="ce1" office:value-type="date" office:date-value="'.$value.'"/>'."\n"; + } else { + $content .= '<table:table-cell table:style-name="ce1" office:value-type="date" office:date-value="'.$value.'"/>'."\n"; + } + elseif ($value[0] == '=') $content .= '<table:table-cell table:formula="'.$value.'" office:value-type="float"/>'."\n"; + // formula példa: $value = 'of:=SUM([.A1:.B1])*2+[.A1]' + else $content .= '<table:table-cell office:value-type="string"><text:p>'.$value.'</text:p></table:table-cell>'."\n"; + } + $content .= ODS_END_ROW; + } + $content .= ODS_END_TABLE . ODS_END_SPREADSHEET . ODS_END_XMLDOCUMENT; + + mkdir(TMPZIP); + mkdir(TMPZIP."/META-INF"); + file_put_contents(TMPZIP."/META-INF/manifest.xml", ODS_MANIFEST); + file_put_contents(TMPZIP."/content.xml", $content); + file_put_contents(TMPZIP."/mimetype", ODS_MIMETIPE); + system("cd ".TMPZIP."; zip -mr ".$fileName." mimetype META-INF/* content.xml >/dev/null"); + rmdir(TMPZIP."/META-INF"); + rmdir(TMPZIP); + + return true; + } + +/* --------------------------------------- */ + + function _template2array($fp, $type, &$aTeX) { + $vege = false; + $aTeX[$type] = array(); + while (!$vege && ($sor = fgets($fp, 1024))) { + $sor = chop($sor); + if ($sor == "%}$type") { + $vege = true; + } elseif (substr($sor, 0, 2) != '%!') { // A feldolgozást végző függvény megadása + if (substr($sor, 0, 2) == '%}') { + echo "HIBA #1 Megnyitás előtti blokk lezárás a {$type} blokkban: $sor<hr>"; + } else { + if (substr($sor, 0, 2) == '%{') { + $_type = substr($sor, 2); + _template2array($fp, $_type, $aTeX); + $aTeX[$type][] = '%{'.$_type.'}'; + } else { + // feltételes szövegrészek + $condArray = explode('%?', $sor); + for ($i = 1; $i < count($condArray); $i = $i + 2) { + $str = $condArray[$i]; + $tmpArray = explode('|', $str); + $j = 0; while (is_array($aTeX['conditional']["$j".$tmpArray[0]])) $j++; + $newCondition = "$j".$tmpArray[0]; + $aTeX['conditional'][$newCondition] = array(true => $tmpArray[1], false => $tmpArray[2], 'orig' => $tmpArray[0]); + $sor = str_replace($str.'%?', $newCondition, $sor); + } +// $aTeX[$type][] = $sor; + // lezáró eset + $finalArray = explode('%>', $sor); + for ($i = 1; $i < count($finalArray); $i = $i + 2) { + $str = $finalArray[$i]; + $tmpArray = explode('<!>', $str); + $j = 0; while (is_array($aTeX['finalCase']["$j".$type])) $j++; + $newCondition = "$j".$type; + $aTeX['finalCase'][$newCondition] = array(true => $tmpArray[0], false => $tmpArray[1]); + $sor = str_replace($str.'%>', $newCondition, $sor); + } + $aTeX[$type][] = $sor; + } + } + } + } + } + + function _array2text($type, $id, $mit, $mire, $aTeX, $ADAT, $flag = null) { + $ret = ''; + if (is_null($id)) $A = $ADAT[$type]; + else $A = $ADAT[$type][$id]; + + // A cserélendő attribútumok + if (is_array($A)) foreach ($A as $attr => $value) { + if (!is_array($value)) { + if (true || !is_bool($value)) { // feltételes szövegrészek külön kezelendők ??? Miért is? Az általánosabb feltételes kiíráshoz kell! + if (in_array('%$'.$attr, $mit)) { // A már szereplő mintát felülírjuk! + $key = array_search('%$'.$attr, $mit); + $mit[$key] = '%$'.$attr; + $mire[$key] = $value; + } else { + $mit[] = '%$'.$attr; + $mire[] = $value; + } + } + } + } + + // aTeX feldolgozása + $TeX = $aTeX[$type]; + for ($i = 0; $i < count($TeX); $i++) { + $sor = $TeX[$i]; + if (substr($sor, 0, 2) == '%{') { + // Almodul feldolgozása + $_type = substr($sor, 2, -1); + if (is_array($A[$_type])) { + if (is_null($id)) { + foreach ($A[$_type] as $key => $_id) $ret .= _array2text($_type, $_id, $mit, $mire, $aTeX, $ADAT); + } else { + $count = count($A[$_type]); $db = 0; + foreach ($A[$_type] as $_id => $_data) { + $db++; if ($count == $db) $_flag = 'final'; else $_flag = null; + if (!is_array($ADAT[$_type][$_id]) && !is_array($_data)) { + echo '<br>HIBA#2!!! '.$_type.':'.$_id.':'.$_data.'<hr />'; +// return false; + } else { + if (!is_array($ADAT[$_type][$_id])) $ADAT[$_type][$_id] = array(); + elseif (!is_array($_data)) $_data = array(); + $ADAT[$_type][$_id] = $ADAT[$_type][$_id] + $_data; + $ret .= _array2text($_type, $_id, $mit, $mire, $aTeX, $ADAT, $_flag); + } + } + } + } elseif (__DEBUG === true) { echo '<br>HIBA#3: '.$sor.'<br />'.$_type.':'; var_dump($A[$_type]); echo '<hr />';} + } else { + // Csere - lezáró eset + if (strpos($sor, '%>') !== false) foreach ($aTeX['finalCase'] as $attr => $values) { + $sor = str_replace('%>'.$attr, $values[ $flag === 'final' ], $sor); + } + // Csete - feltételes kiírás + if (strpos($sor, '%?') !== false) foreach ($aTeX['conditional'] as $attr => $values) { + // Nem csak az adott szintről veszi az értéket, hanem feljebbről is (a feljebbi a meghatározó - ez nem biztos, hogy jó...) + if ($key = array_search('%$'.$values['orig'], $mit)) $_val = $mire[$key]; + else $_val = $A[$values['orig']]; + $sor = str_replace('%?'.$attr, $values[ $_val==true ], $sor); + //$sor = str_replace('%?'.$attr, $values[ $A[$values['orig']]==true ], $sor); + } + // Kiírás + $ret .= str_replace($mit, $mire, $sor)."\n"; + } + } + + return $ret; + } + + function template2text($templateFile, $ADAT) { + + $mit = $mire = array(); + $aTeX = array('conditional' => array()); + + $fp = fopen($templateFile, 'r'); + _template2array($fp, 'base', $aTeX); + fclose($fp); + return _array2text('base', null, $mit, $mire, $aTeX, $ADAT); + + } + + function template2file($templateFile, $ADAT) { + + global $policy, $page, $sub, $f; + + $mit = $mire = array(); + $aTeX = array('conditional' => array()); + + $fp = fopen($templateFile, 'r'); + // A feldolgozást végző függvény neve + $sor = fgets($fp, 1024); + rewind($fp); + if (substr($sor, 0, 2) == '%!') { + list($func,$ext,$opt) = explode(' ', substr(chop($sor), 2)); + if (!function_exists($func)) unset($func); + } + if ($ext=='') $ext = 'txt'; + _template2array($fp, 'base', $aTeX); + fclose($fp); + $text = _array2text('base', null, $mit, $mire, $aTeX, $ADAT); +//die(); + if ($text === false) return false; + $success = true; + if (isset($func)) { + $success = $func($text, $ADAT['file'], $opt); + } else { + $fp = fopen(_DOWNLOADDIR."/$policy/$page/$sub/$f/".$ADAT['file'].'.'.$ext, 'w'); + fputs($fp, $text); + fclose($fp); + } + if ($success) return $ADAT['file'].".$ext"; + else return false; + + } + + + +?> |