From 3135c5de9d944c90b7363d07d398a8f6a827adf0 Mon Sep 17 00:00:00 2001 From: Stefan Puraner Date: Thu, 1 Jun 2017 14:09:19 +0200 Subject: [PATCH 01/10] fixed bug for string which contain character ' --- cis/private/lehre/pruefung/pruefung.js | 2 +- cis/private/lehre/pruefung/pruefung.js.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cis/private/lehre/pruefung/pruefung.js b/cis/private/lehre/pruefung/pruefung.js index 801854f19..d014353d5 100644 --- a/cis/private/lehre/pruefung/pruefung.js +++ b/cis/private/lehre/pruefung/pruefung.js @@ -324,7 +324,7 @@ function writePruefungsTable(e, data, anmeldung) else { //button = "

Anmelden (bis "+frist+"):

"; - button = "

"; + button = "

"; } } else diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index 92ab1c7c9..9606af1fd 100755 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -368,7 +368,7 @@ function writePruefungsTable(e, data, anmeldung) else { //button = "

Anmelden (bis "+frist+"):

"; - button = "

"+frist+"';>

"; + button = "

"+frist+"';>

"; } } else From 77d1708b51d13e41606ed9d042170c8b12f03c7c Mon Sep 17 00:00:00 2001 From: kindlm Date: Fri, 2 Jun 2017 11:05:32 +0200 Subject: [PATCH 02/10] =?UTF-8?q?Textfehler=20in=20Pr=C3=BCfungsprotokoll?= =?UTF-8?q?=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- system/vorlage_zip/PrProtMA.odt | Bin 313853 -> 35131 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system/vorlage_zip/PrProtMA.odt b/system/vorlage_zip/PrProtMA.odt index 9f020f837448b230a9000496f0459f699261d5c8..ee7d51a464a7b7eaf84c0756c647e5336941ccac 100755 GIT binary patch delta 23478 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 XXT;T%(9mx`BSbuK5c`TO=(hKN)GI@B literal 313853 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

RP4$!--tDP`j{0;@uX*%F@P?#Vt*G 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≶}F|2>L(?_ek&AZK8z)hzH z`<_czc{(}jt;(_PKP$f;xfLH2qV=Rp#2fkO@UT0acM+7graL$#L&{v$}mgP`tI@QN2$WX2oBz+H`4X{)|nddL@qi4l$NinoR=^ zvf;x7G&)RsM|Mp*^RO`LTjG)3SCZE){%@Y3(=4Zam+q)mDyWJb zg}3F>O1cS}>a8i%D!TjF#HsR;MzfU6;p&KnYxcv1luI&gYCUGvL5$+Uz?^5@2@27c z=WGO&)muH+kyY}8x*JiE+K6Gv`E&hd0>1fsyu1R zRngOHZAbfqd|M~4W?tI#$3JKPe6=Vht()pWxplBm>vwlmq6Q~$Uq$S2G?SV|IFe_; z<#Bs{UU-}k&5UJK&D{NSbGUO@W&hKHXsth7r56-Ptw~|FmyMjRColi9t1FIH9}&B< zopssVCo_>_x+Hn6p|WoLXND?w?3|1<6XfstIgS^Wmz5jklW(lM%F>smMb?CNG*z|{ zBCMS=SD9GtF|qdScDa(YLiNyeH6;bf6*yX_|(|k{^}t4 zUiz{4vG0zDUyA8+E4sz{(#nw}w*8KABw0QT{bD-H4}2dga@u1yX8~e-{)*L#O=Ii^Q?jYGSaU1%2dXVh~kOPErpsn zT(0@WZ8k@&>iYg_Dl<%oUObw@?{}|g6ug$9E}a@F8tUtc(GN+>OK0iDQ}fMtrM#GI zjdFZE+?y_A?(v`Ie%zFr0g2vL#HD7#1=wKQ)}1!LSbIb{*h@)U0?F&Z7lKvDQ{iKw zFn}%CJv&%N28w_<{TC^?6ui>$`Mt!wby8>yKJje&cs>SA90M6*i8IjXbZAn5n}h@g z;n+}g@hD_NR-FTYELWfYVdk5zh>Z<@;{)4#Y%_icau~xOnk_q(=xeTNFW}uMB*uFW7D#`CE^Dgyx0@aWed zI)fJA>*dJ`CI=nx`uFIPuN4ZSz9S{hH3@((wmMspw(YdVX^v_v9SGl`WHbtqg{r?1 zb86vLkAuh}ZzUGGC;dVfA_p2J$$@lQ>*lUFs*yB68c8Gv(&;=bG~795_F-$hVfw(t z#%!atjhUg*1}pMGrZ<)zEsQ8F8nK!=eY4~9I>Wd@rak~jTP&g{LVDLa>DkOMu2C$@ zkYR2ak1(4gnk<$DNisIWB1Cfy07%2n3I1DY0Jqgb_A_D48TXmXJ~}FB#G)$&Q0yMJ zN9CvoNCBiN;&QOkkpa_Y!#UX0F5r>`hX=((BX;EHdi1dWn?;-?U>$o{SV!Z From 5bda14c4b6035ed7bec1fc4abe45b6c74375088d Mon Sep 17 00:00:00 2001 From: kindlm Date: Fri, 2 Jun 2017 11:08:01 +0200 Subject: [PATCH 03/10] Coodle Update --- cis/private/coodle/coodle_autocomplete.php | 18 + cis/private/coodle/coodle_worker.php | 99 +- cis/private/coodle/stammdaten.php | 271 ++++- cis/private/coodle/termin.php | 177 ++-- cis/private/coodle/uebersicht.php | 247 ++--- cis/public/coodle.php | 1099 ++++++++++++-------- include/coodle.class.php | 119 ++- locale/de-AT/coodle.php | 35 +- locale/en-US/coodle.php | 12 +- 9 files changed, 1350 insertions(+), 727 deletions(-) diff --git a/cis/private/coodle/coodle_autocomplete.php b/cis/private/coodle/coodle_autocomplete.php index 3fbb51f48..3cd0d935b 100755 --- a/cis/private/coodle/coodle_autocomplete.php +++ b/cis/private/coodle/coodle_autocomplete.php @@ -20,6 +20,7 @@ require_once('../../../config/cis.config.inc.php'); require_once('../../../include/ort.class.php'); require_once('../../../include/benutzer.class.php'); +require_once('../../../include/gruppe.class.php'); if(!isset($_REQUEST['work'])) die('Parameter Work missing'); @@ -64,6 +65,23 @@ switch($work) $item['bezeichnung']=$row->nachname.' '.$row->vorname; $result[]=$item; } + + $gruppe = new gruppe(); + + if(!$gruppe->searchGruppen(array($q))) + die('Fehler beim Laden der Gruppe: '.$gruppe->errormsg); + + foreach($gruppe->result as $row) + { + if ($row->sichtbar) + { + $item['uid']=$row->gruppe_kurzbz; + $item['typ']='Gruppe'; + $item['bezeichnung']='Gruppe'; + $result[]=$item; + } + } + echo json_encode($result); break; default: diff --git a/cis/private/coodle/coodle_worker.php b/cis/private/coodle/coodle_worker.php index 44c697e3e..000ae50a8 100644 --- a/cis/private/coodle/coodle_worker.php +++ b/cis/private/coodle/coodle_worker.php @@ -27,6 +27,7 @@ require_once('../../../include/functions.inc.php'); require_once('../../../include/ort.class.php'); require_once('../../../include/benutzer.class.php'); require_once('../../../include/coodle.class.php'); +require_once('../../../include/gruppe.class.php'); $user = get_uid(); @@ -65,6 +66,7 @@ switch($work) $uid=''; $ort=''; $email=''; + $gruppe_kurzbz=''; $name=''; switch($typ) { @@ -74,27 +76,61 @@ switch($work) $email = $id; $name=$bezeichnung; break; + case 'Gruppe': $gruppe_kurzbz = $id; break; default: die('Ungueltiger Typ:'.$typ); break; - } - - if($coodle->RessourceExists($coodle_id, $uid, $ort, $email)) - die('Ressource ist bereits zugeteilt'); - - $coodle->coodle_id = $coodle_id; - $coodle->uid = $uid; - $coodle->ort_kurzbz = $ort; - $coodle->email = $email; - $coodle->name = $name; - $coodle->zugangscode = uniqid(); - $coodle->insertamum = date('Y-m-d H:i:s'); - $coodle->insertvon = $user; - $coodle->updateamum = date('Y-m-d H:i:s'); - $coodle->updatevon = $user; - - if($coodle->saveRessource(true)) + } + + if($typ=='Gruppe') + { + $gruppe = new gruppe(); + if(!$gruppe->loadUser($gruppe_kurzbz)) + die('Fehler: '.$gruppe->errormsg); + + foreach($gruppe->result as $row) + { + $coodle->coodle_id = $coodle_id; + $coodle->uid = $row->uid; + $coodle->ort_kurzbz = $ort; + $coodle->email = $email; + $coodle->name = $name; + $coodle->zugangscode = uniqid(); + $coodle->insertamum = date('Y-m-d H:i:s'); + $coodle->insertvon = $user; + $coodle->updateamum = date('Y-m-d H:i:s'); + $coodle->updatevon = $user; + + if(!$coodle->RessourceExists($coodle_id, $row->uid, $ort, $email)) + { + if(!$coodle->saveRessource(true)) + { + echo 'Fehler beim Speichern:'.$coodle->errormsg; + continue; + } + } + } echo 'true'; - else - echo 'Fehler beim Speichern:'.$coodle->errormsg; + } + else + { + if($coodle->RessourceExists($coodle_id, $uid, $ort, $email)) + die('Ressource ist bereits zugeteilt'); + + $coodle->coodle_id = $coodle_id; + $coodle->uid = $uid; + $coodle->ort_kurzbz = $ort; + $coodle->email = $email; + $coodle->name = $name; + $coodle->zugangscode = uniqid(); + $coodle->insertamum = date('Y-m-d H:i:s'); + $coodle->insertvon = $user; + $coodle->updateamum = date('Y-m-d H:i:s'); + $coodle->updatevon = $user; + + if($coodle->saveRessource(true)) + echo 'true'; + else + echo 'Fehler beim Speichern:'.$coodle->errormsg; + } break; case 'removeressource': @@ -122,20 +158,29 @@ switch($work) $uid=''; $ort=''; $email=''; + $gruppe=''; $name=''; switch($typ) { case 'Ort': $ort = $id; break; case 'Person': $uid = $id; break; case 'Extern': $email = $id; break; + case 'Gruppe': $gruppe = $id; break; default: die('Ungueltiger Typ'); break; } if($coodle_ressource_id = $coodle->RessourceExists($coodle_id, $uid, $ort, $email)) { - if($coodle->deleteRessource($coodle_ressource_id)) - echo 'true'; - else - echo 'Fehler:'.$coodle->errormsg; + //Person darf nur entfernt werden, wenn noch kein Termin gewaelt wurde + $coodle->getRessourceTermin($coodle_id, $coodle_ressource_id); + if (count($coodle->result) == 0) + { + if($coodle->deleteRessource($coodle_ressource_id)) + echo 'true'; + else + echo 'Fehler:'.$coodle->errormsg; + } + else + echo 'Die Person kann nicht entfern werden, da sie bereits eine Terminauswahl getroffen hat'; } else { @@ -206,10 +251,13 @@ switch($work) if($coodle->ersteller_uid!=$user) die('Diese Aktion ist nur durch den Ersteller der Umfrage möglich'); - + $coodletermin = new coodle(); if(!$coodletermin->loadTermin($coodle_termin_id)) die('Fehler: '.$coodletermin->errormsg); + + if($coodletermin->checkTerminGewaehlt($coodle_termin_id)) + die('Der Termin kann nicht verschoben werden, da er schon ausgewählt wurde'); $coodletermin->datum = $datum; $coodletermin->uhrzeit = $uhrzeit; @@ -249,6 +297,9 @@ switch($work) die('Termin und Umfrage passen nicht zusammen!'); } + if($coodletermin->checkTerminGewaehlt($coodle_termin_id)) + die('Der Termin kann nicht gelöscht werden, da er schon ausgewählt wurde'); + if($coodletermin->deleteTermin($coodle_termin_id)) echo 'true'; else diff --git a/cis/private/coodle/stammdaten.php b/cis/private/coodle/stammdaten.php index 6e01dbb21..58ab6db3c 100755 --- a/cis/private/coodle/stammdaten.php +++ b/cis/private/coodle/stammdaten.php @@ -38,17 +38,39 @@ if(!check_lektor($user)) echo ' + "http://www.w3.org/TR/html4/strict.dtd"> - + + - - + + + '.$p->t('coodle/coodle').' @@ -123,10 +236,24 @@ if(isset($_POST['save'])) { //Speichern $titel = $_POST['titel']; - $beschreibung = $_POST['beschreibung']; + $beschreibung = ($_POST['beschreibung']==''?null:$_POST['beschreibung']); $dauer = $_POST['dauer']; $endedatum = $_POST['endedatum']; $coodle_id = $_POST['coodle_id']; + if (isset($_POST['mailversand'])) + $mailversand = true; + else + $mailversand = false; + + if (isset($_POST['teilnehmer_anonym'])) + $teilnehmer_anonym = true; + else + $teilnehmer_anonym = false; + + if (isset($_POST['termin_anonym'])) + $termin_anonym = true; + else + $termin_anonym = false; $coodle = new coodle(); @@ -139,15 +266,15 @@ if(isset($_POST['save'])) { die($p->t('basis/keineBerechtigung')); } - $coodle->new=false; + $coodle->new = false; } else { - $coodle->new=true; + $coodle->new = true; $coodle->ersteller_uid = $user; $coodle->insertamum = date('Y-m-d H:i:s'); $coodle->insertvon = $user; - $coodle->coodle_status_kurzbz='neu'; + $coodle->coodle_status_kurzbz = 'neu'; } $coodle->titel = $titel; @@ -156,10 +283,25 @@ if(isset($_POST['save'])) $coodle->endedatum = $datum_obj->formatDatum($endedatum, 'Y-m-d'); $coodle->updateamum = date('Y-m-d H:i:s'); $coodle->updatevon = $user; + $coodle->mailversand = $mailversand; + $coodle->teilnehmer_anonym = $teilnehmer_anonym; + $coodle->termine_anonym = $termin_anonym; if($coodle->save()) { $message.= ''.$p->t('global/erfolgreichgespeichert').''; + //Fuer alle neuen Umfragen wird ein Termine am 01.01.1900 00:00:01 als Option fuer "Keine Auswahl" angelegt + if ($coodle->new == true) + { + $coodletermin = new coodle(); + + $coodletermin->datum = '1900-01-01'; + $coodletermin->uhrzeit = '00:00:01'; + $coodletermin->coodle_id = $coodle->coodle_id; + + if (!$coodletermin->saveTermin(true)) + $message.= ''.$coodletermin->errormsg.''; + } } else { @@ -175,9 +317,9 @@ elseif(isset($_GET['coodle_id'])) if($coodle->ersteller_uid!=$user) die($p->t('global/keineBerechtigungFuerDieseSeite')); - if($coodle->coodle_status_kurzbz!='neu') + if(($coodle->coodle_status_kurzbz!='neu') && ($coodle->coodle_status_kurzbz!='laufend')) { - // Wenn bereits gestartet, abgeschlosse oder storniert, + // Wenn bereits abgeschlosse oder storniert, // kann nicht mehr bearbeitet werden die($p->t('coodle/umfrageNichtGueltig')); } @@ -193,6 +335,7 @@ else $coodle = new coodle(); $coodle->endedatum=date('d.m.Y',strtotime("+7 day")); $coodle->dauer=60; + $coodle->mailversand=true; } echo ' << '.$p->t('coodle/zurueckZurUebersicht').'
@@ -202,6 +345,8 @@ echo '

'; if($coodle->coodle_id=='') echo $p->t('coodle/neuerEintrag'); +elseif($coodle->coodle_status_kurzbz=='laufend') + echo $p->t('coodle/laufendeUmfrageBearbeiten'); else echo $p->t('coodle/bearbeiten'); echo '

'; @@ -210,27 +355,49 @@ echo ' - - + + + - + + - - + + - - + + + + + + + + + + + + + + + + + + - +
'.$p->t('coodle/titel').''.$p->t('coodle/titel').' + + coodle_status_kurzbz=='laufend'?'disabled':'').'/>'.$p->t('coodle/titelInfotext').'
'.$p->t('coodle/beschreibung').'

'.$p->t('coodle/beschreibungInfotext').'
'.$p->t('coodle/dauer').' - + '.$p->t('coodle/dauer').' + + coodle_status_kurzbz=='laufend'?'disabled':'').'/> '.$p->t('coodle/dauerminuten').' '.$p->t('coodle/dauerInfotext').'
'.$p->t('coodle/endedatum').''.$p->t('coodle/endedatum').''.$p->t('coodle/endeInfotext').'
'.$p->t('coodle/mailversand').'mailversand=='t'?'checked':'').'/>'.$p->t('coodle/infotextMailversand').'
'.$p->t('coodle/teilnehmerAnonym').'teilnehmer_anonym=='t'?'checked':'').'/>'.$p->t('coodle/infotextTeilnehmerAnonym').'
'.$p->t('coodle/terminAnonym').'termine_anonym=='t'?'checked':'').'/>'.$p->t('coodle/infotextTerminAnonym').'
'.$message.' '.$message.'
'; @@ -241,8 +408,10 @@ echo ' if($coodle->coodle_id) { - echo ''; + echo '
'.$p->t('coodle/weiterZurTerminauswahl').'
'; } +/*elseif ($coodle->coodle_status_kurzbz=='laufend') + echo '
'.$p->t('coodle/umfrageLaeuftBereits').'
';*/ echo ' '; diff --git a/cis/private/coodle/termin.php b/cis/private/coodle/termin.php index bf34b27ef..b29e04cfa 100755 --- a/cis/private/coodle/termin.php +++ b/cis/private/coodle/termin.php @@ -55,7 +55,7 @@ if(!$coodle->load($coodle_id)) } $event_titel = $coodle->titel; -if($coodle->coodle_status_kurzbz == 'storniert' || $coodle->coodle_status_kurzbz == 'abgeschlossen' || $coodle->coodle_status_kurzbz=='laufend') +if($coodle->coodle_status_kurzbz == 'storniert' || $coodle->coodle_status_kurzbz == 'abgeschlossen') { die($p->t('coodle/umfrageNichtGueltig')); } @@ -67,7 +67,7 @@ if(isset($_POST['action']) && $_POST['action']=='start') echo ' - + @@ -132,15 +132,22 @@ if(isset($_POST['action']) && $_POST['action']=='start') $html=$anrede.'!

Sie wurden zu einer Terminumfrage zum Thema "'.$db->convert_html_chars($coodle->titel).'" eingeladen.
- Bitte folgen Sie dem Link um Ihre Terminwünsche bekannt zu geben: + Bitte folgen Sie dem Link, um Ihre Terminwünsche bekannt zu geben: Link zur Terminumfrage -

'.nl2br($sign); +

+ Beschreibung:

+ '.$coodle->beschreibung.'

+ '.nl2br($sign); $text=$anrede."!\n\nSie wurden zu einer Terminumfrage zum Thema \"".$db->convert_html_chars($coodle->titel)."\" eingeladen.\n - Bitte folgen Sie dem Link um Ihre Terminwünsche bekannt zu geben:\n - $link\n\n$sign"; + Bitte folgen Sie dem Link, um Ihre Terminwünsche bekannt zu geben:\n + $link\n\n + Beschreibung:\n\n + ".strip_tags($coodle->beschreibung)." + \n\n + $sign"; - $mail = new mail($email, $von,'Termineinladung - '.$coodle->titel, $text); + $mail = new mail($email, $von,'Terminumfrage - '.$coodle->titel, $text); $mail->setHTMLContent($html); if($mail->send()) { @@ -199,9 +206,11 @@ echo ' } #external-events h4 { - font-size: 16px; + font-size: 17px; margin-top: 0; - padding-top: 1em; + padding-top: 10px; + padding-bottom: 10px; + text-decoration: none; } .external-event { /* try to mimick the look of a real event */ @@ -211,6 +220,8 @@ echo ' color: #fff; font-size: .85em; cursor: pointer; + border-radius: 2px; + box-shadow: 3px 3px 3px #bbb; } #external-events p { @@ -239,9 +250,11 @@ echo ' } #ressourcen h4 { - font-size: 16px; + font-size: 17px; margin-top: 0; - padding-top: 1em; + padding-top: 10px; + padding-bottom: 10px; + text-decoration: none; } .ressourcen { @@ -285,9 +298,11 @@ echo ' #fertig h4 { - font-size: 16px; + font-size: 17px; margin-top: 0; - padding-top: 1em; + padding-top: 10px; + padding-bottom: 10px; + text-decoration: none; } #fertig p @@ -296,7 +311,7 @@ echo ' font-size: 11px; color: #666; } - + - - '; echo' '.$p->t('coodle/uebersicht').' - - '; + + '; $method = isset($_GET['method'])?$_GET['method']:''; // coodle umfrage löschen if($method=='delete') { - $coodle= new coodle(); - $coodle_id = isset($_GET['coodle_id'])?$_GET['coodle_id']:''; - - if($coodle->load($coodle_id)) + $coodle= new coodle(); + $coodle_id = isset($_GET['coodle_id'])?$_GET['coodle_id']:''; + + if($coodle->load($coodle_id)) { - // löschen nur von eigenen Umfragen möglich + // löschen nur von eigenen Umfragen möglich if($coodle->ersteller_uid!=$uid) $message = ''.$p->t('global/keineBerechtigung').''; - else - { - if($coodle->delete($coodle_id)) - $message ='Erfolgreich storniert!'; - else - $message =''.$p->t('coodle/umfrageKonnteNichtGeloeschtWerden').''; - } + else + { + if($coodle->delete($coodle_id)) + $message ='Erfolgreich storniert!'; + else + $message =''.$p->t('coodle/umfrageKonnteNichtGeloeschtWerden').''; + } } - else - $message = ''.$p->t('coodle/umfrageNichtGeladen').''; + else + $message = ''.$p->t('coodle/umfrageNichtGeladen').''; } -echo'

'.$p->t('coodle/uebersicht').'

-
'; +echo'

'.$p->t('coodle/uebersicht').'

'; + +echo $p->t('coodle/einfuehrungstext').'

'; if(check_lektor($uid)) { echo ' -
+

'; } echo ' -
'.$message.'
-
-
-

'.$p->t('coodle/laufendeUmfragen').'

- - - - - - - - - - '; +
'.$message.'
+
+
+

'.$p->t('coodle/laufendeUmfragen').'

+
'.$p->t('coodle/titel').''.$p->t('coodle/letzterStatus').''.$p->t('coodle/ersteller').''.$p->t('coodle/endedatum').''.$p->t('coodle/aktion').'
+ + + + + + + + + '; $beendeteUmfragen=''; $datum = new datum(); @@ -144,50 +151,52 @@ foreach($coodle->result as $c) $benutzer = new benutzer(); $benutzer->load($c->ersteller_uid); $ersteller = $benutzer->nachname.' '.$benutzer->vorname; - $row = ' - - - - - + + + + + - '; - - if($c->coodle_status_kurzbz=='laufend' || $c->coodle_status_kurzbz=='neu') + $row.=' + + '; + + if($c->coodle_status_kurzbz=='laufend' || $c->coodle_status_kurzbz=='neu') echo $row; else $beendeteUmfragen.=$row; @@ -217,17 +226,17 @@ if($beendeteUmfragen!='')

'.$p->t('coodle/beendeteUmfragen').'

'.$p->t('coodle/titel').''.$p->t('coodle/letzterStatus').''.$p->t('coodle/ersteller').''.$p->t('coodle/endedatum').''.$p->t('coodle/aktion').'
'.$coodle->convert_html_chars($c->titel).''.$coodle->convert_html_chars($coodle->status_arr[$c->coodle_status_kurzbz]).''.$coodle->convert_html_chars($ersteller).''.$coodle->convert_html_chars($datum->formatDatum($c->endedatum, 'd.m.Y')).' - '; - - // Bearbeiten Button - if(($c->coodle_status_kurzbz=='neu') && $uid==$c->ersteller_uid) - { - $row.= ' -   - '; - } - else + $row = '
'.$coodle->convert_html_chars($c->titel).''.$coodle->convert_html_chars($coodle->status_arr[$c->coodle_status_kurzbz]).''.$coodle->convert_html_chars($ersteller).''.$coodle->convert_html_chars($datum->formatDatum($c->endedatum, 'd.m.Y')).' + '; + + // Bearbeiten Button + if((($c->coodle_status_kurzbz=='neu')||($c->coodle_status_kurzbz=='laufend')) && $uid==$c->ersteller_uid) { if($c->coodle_status_kurzbz=='laufend') $title=$p->t('coodle/umfrageWurdeBereitsGestartet'); else - $title=$p->t('global/keineBerechtigung'); + $title=$p->t('coodle/bearbeiten'); + + $row.= '  + + '; + } + else + { + $title=$p->t('global/keineBerechtigung'); $row.= ' '; - } - - // Storno Button - if($uid==$c->ersteller_uid && $c->coodle_status_kurzbz!='storniert' && $c->coodle_status_kurzbz!='abgeschlossen') - { - $row.= ' -   - '; - } - else - { - $row.='  '; - } - - // Umfrage Button - if($c->coodle_status_kurzbz=='laufend' || $c->coodle_status_kurzbz=='abgeschlossen') - { - $row.= ' -   + } + + // Storno Button + if($uid==$c->ersteller_uid && $c->coodle_status_kurzbz!='storniert' && $c->coodle_status_kurzbz!='abgeschlossen') + { + $row.= '  + '; - } + } + else + { + $row.='  '; + } + + // Umfrage Button + if($c->coodle_status_kurzbz=='laufend' || $c->coodle_status_kurzbz=='abgeschlossen') + { + $row.= '  + + '; + } else { if($c->coodle_status_kurzbz=='neu') @@ -198,11 +207,11 @@ foreach($coodle->result as $c) $row.='   '; } - $row.=' -
- - - - - - - - - + + + + + + + + + - '.$beendeteUmfragen.' + '.$beendeteUmfragen.'
'.$p->t('coodle/titel').''.$p->t('coodle/letzterStatus').''.$p->t('coodle/ersteller').''.$p->t('coodle/endedatum').''.$p->t('coodle/aktion').'
'.$p->t('coodle/titel').''.$p->t('coodle/letzterStatus').''.$p->t('coodle/ersteller').''.$p->t('coodle/endedatum').''.$p->t('coodle/aktion').'
'; diff --git a/cis/public/coodle.php b/cis/public/coodle.php index 4915669f6..5750880df 100755 --- a/cis/public/coodle.php +++ b/cis/public/coodle.php @@ -46,81 +46,86 @@ $coodle_id = (isset($_GET['coodle_id'])?$_GET['coodle_id']:''); $coodle = new coodle(); if(!$coodle->load($coodle_id)) - die($coodle->errormsg); + die($coodle->errormsg); // Überprüfen ob Coodle Status laufend oder abgeschlossen hat if(!$coodle->checkStatus($coodle_id)) - die($p->t('coodle/umfrageNichtGueltig')); + die($p->t('coodle/umfrageNichtGueltig')); // authentifizierung if(!isset($_GET['zugangscode'])) { - $uid = get_uid(); - if(!$coodle->checkBerechtigung($coodle_id, $uid)) - die($p->t('coodle/keineBerechtigung')); - - // überprüfen ob ersteller gleich uid ist - if($coodle->ersteller_uid == $uid) - $ersteller = true; + $uid = get_uid(); + if(!$coodle->checkBerechtigung($coodle_id, $uid)) + die($p->t('coodle/keineBerechtigung')); + + // überprüfen ob ersteller gleich uid ist + if($coodle->ersteller_uid == $uid) + $ersteller = true; } else { - if(!$coodle->checkBerechtigung($coodle_id, '', $_GET['zugangscode'])) - die($p->t('coodle/keineBerechtigung')); + if(!$coodle->checkBerechtigung($coodle_id, '', $_GET['zugangscode'])) + die($p->t('coodle/keineBerechtigung')); } // checkboxen speichern if(isset ($_POST['save'])) { - $coodle_help = new coodle(); - $error = false; - - // Ressource ID von Zugangscode oder UID holen und Beiträge löschen - if(isset($_GET['zugangscode'])) - { - // Einträge löschen - $coodle_help->getRessourceFromUser($coodle_id, '', $_GET['zugangscode']); - $coodle_ressource_termin= $coodle_help->deleteRessourceTermin($coodle_id, $coodle_help->coodle_ressource_id); - } - else - { - if($coodle_help->RessourceExists($coodle_id, $uid)) - { - $coodle_help->getRessourceFromUser($coodle_id, $uid); - $coodle_ressource_termin= $coodle_help->deleteRessourceTermin($coodle_id, $coodle_help->coodle_ressource_id); - } - } - - // Einträge speichern - foreach($_POST as $key=>$value) - { - if(mb_substr($key, 0, 5) =='check') - { - $termin = explode('_', $key); - $ressource_id = $termin[1]; - $termin_id = $termin[2]; - - $coodle_ressource_termin = new coodle(); - $coodle_ressource_termin->coodle_ressource_id = $ressource_id; - $coodle_ressource_termin->coodle_termin_id = $termin_id; - $coodle_ressource_termin->new = true; + $coodle_help = new coodle(); + $error = false; + $teilnehmer_uid = ''; + + // Ressource ID von Zugangscode oder UID holen und Beiträge löschen + if(isset($_GET['zugangscode'])) + { + // Einträge löschen + $coodle_help->getRessourceFromUser($coodle_id, '', $_GET['zugangscode']); + $coodle_ressource_termin= $coodle_help->deleteRessourceTermin($coodle_id, $coodle_help->coodle_ressource_id); + $teilnehmer_uid = $coodle_help->coodle_ressource_id; + } + else + { + if($coodle_help->RessourceExists($coodle_id, $uid)) + { + $coodle_help->getRessourceFromUser($coodle_id, $uid); + $coodle_ressource_termin= $coodle_help->deleteRessourceTermin($coodle_id, $coodle_help->coodle_ressource_id); + $teilnehmer_uid = $coodle_help->coodle_ressource_id; + } + } + + // Einträge speichern + foreach($_POST as $key=>$value) + { + if(mb_substr($key, 0, 5) =='check') + { + $termin = explode('_', $key); + $ressource_id = $termin[1]; + $termin_id = $termin[2]; + + $coodle_ressource_termin = new coodle(); + $coodle_ressource_termin->coodle_ressource_id = $ressource_id; + $coodle_ressource_termin->coodle_termin_id = $termin_id; + $coodle_ressource_termin->new = true; - if(!$coodle_ressource_termin->saveRessourceTermin()) - $error = true; - } - } - - if($error) - { - $message.= "".$p->t('global/fehlerBeimSpeichernDerDaten')."
"; - } - else - { - // email an ersteller senden - sendBenachrichtigung($coodle_id); - - $saveOk=true; - } + if(!$coodle_ressource_termin->saveRessourceTermin()) + $error = true; + } + } + + if($error) + { + $message.= "".$p->t('global/fehlerBeimSpeichernDerDaten')."
"; + } + else + { + $coodle_help->load($coodle_id); + // email an ersteller senden wenn option aktiviert + if ($coodle_help->mailversand) + sendBenachrichtigung($coodle_id,$teilnehmer_uid); + + $saveOk=true; + } } // endgültige auswahl des termins speichern @@ -128,43 +133,43 @@ if(isset($_POST['auswahl_termin'])) { if($ersteller) { - $auswahl = $_POST['auswahl_termin']; - if($auswahl!='') - { - // setzte auswahl von termin_id auf true - $coodle_help = new coodle(); - $coodle_help->loadTermin($auswahl); - $coodle_help->auswahl = true; - - // alle termine der coodle_id auf false setzen - if(!$coodle_help->setTerminFalse($coodle_id)) - exit('Fehler beim Update aufgetreten'); + $auswahl = $_POST['auswahl_termin']; + if($auswahl!='') + { + // setzte auswahl von termin_id auf true + $coodle_help = new coodle(); + $coodle_help->loadTermin($auswahl); + $coodle_help->auswahl = true; + + // alle termine der coodle_id auf false setzen + if(!$coodle_help->setTerminFalse($coodle_id)) + exit('Fehler beim Update aufgetreten'); - if(!$coodle_help->saveTermin(false)) - $message.="".$p->t('global/fehlerBeimSpeichernDerDaten')."
"; - else + if(!$coodle_help->saveTermin(false)) + $message.="".$p->t('global/fehlerBeimSpeichernDerDaten')."
"; + else $saveOk=true; - - $coodle_status = new coodle(); - $coodle_status->load($coodle_id); - $coodle_status->coodle_status_kurzbz = 'abgeschlossen'; - $coodle_status->new = false; - $coodle_status->save(); - - sendEmail($coodle_id); - - - if($coodle_help->datumgetRaumeFromId($coodle_id); - - //Ende Uhrzeit berechnen - $date = new DateTime($coodle_help->datum.' '.$coodle_help->uhrzeit); - $interval =new DateInterval('PT'.$coodle->dauer.'M'); - $date->add($interval); - $uhrzeit_ende = $date->format('H:i:s'); + + $coodle_status = new coodle(); + $coodle_status->load($coodle_id); + $coodle_status->coodle_status_kurzbz = 'abgeschlossen'; + $coodle_status->new = false; + $coodle_status->save(); + + sendEmail($coodle_id); + + + if($coodle_help->datumgetRaumeFromId($coodle_id); + + //Ende Uhrzeit berechnen + $date = new DateTime($coodle_help->datum.' '.$coodle_help->uhrzeit); + $interval =new DateInterval('PT'.$coodle->dauer.'M'); + $date->add($interval); + $uhrzeit_ende = $date->format('H:i:s'); foreach($coodle_raum->result as $raum) { @@ -178,20 +183,20 @@ if(isset($_POST['auswahl_termin'])) // Stunden reservieren foreach($stunden as $stunde) { - $raum_reservierung = new reservierung(); - $raum_reservierung->studiengang_kz = '0'; - $raum_reservierung->uid = $uid; - $raum_reservierung->ort_kurzbz = $raum->ort_kurzbz; - $raum_reservierung->datum = $coodle_help->datum; - $raum_reservierung->stunde = $stunde; - $raum_reservierung->titel = mb_substr($coodle->titel,0,10); - $raum_reservierung->beschreibung = mb_substr($coodle->titel, 0, 32); - $raum_reservierung->insertamum = date('Y-m-d H:i:s'); - $raum_reservierung->insertvon = $uid; - - //$message.= "Reserviere $raum->ort_kurzbz Stunde $stunde:"; - if(!$raum_reservierung->save(true)) - $reservierung_error=true; + $raum_reservierung = new reservierung(); + $raum_reservierung->studiengang_kz = '0'; + $raum_reservierung->uid = $uid; + $raum_reservierung->ort_kurzbz = $raum->ort_kurzbz; + $raum_reservierung->datum = $coodle_help->datum; + $raum_reservierung->stunde = $stunde; + $raum_reservierung->titel = mb_substr($coodle->titel,0,10); + $raum_reservierung->beschreibung = mb_substr($coodle->titel, 0, 32); + $raum_reservierung->insertamum = date('Y-m-d H:i:s'); + $raum_reservierung->insertvon = $uid; + + //$message.= "Reserviere $raum->ort_kurzbz Stunde $stunde:"; + if(!$raum_reservierung->save(true)) + $reservierung_error=true; } $message.= $p->t('coodle/raumErfolgreichReserviert', array($raum->ort_kurzbz)).'
'; } @@ -199,13 +204,13 @@ if(isset($_POST['auswahl_termin'])) { $message.=''.$p->t('coodle/raumBelegt', array($raum->ort_kurzbz)).'
'; } - } - } - else - { - $message.=''.$p->t('coodle/raumNichtReserviert', array($datum_obj->formatDatum(RES_TAGE_LEKTOR_BIS, 'd.m.Y'))).'
'; - } - } + } + } + else + { + $message.=''.$p->t('coodle/raumNichtReserviert', array($datum_obj->formatDatum(RES_TAGE_LEKTOR_BIS, 'd.m.Y'))).'
'; + } + } } else $message.= ''.$p-t('global/keineBerechtigung').''; @@ -215,80 +220,139 @@ if(isset($_POST['auswahl_termin'])) $coodle->load($coodle_id); if($coodle->coodle_status_kurzbz == 'abgeschlossen') - $abgeschlossen = true; + $abgeschlossen = true; if(isset($_GET['resend'])) { - if($ersteller && $abgeschlossen) - sendEmail ($coodle_id); + if($ersteller && $abgeschlossen) + sendEmail ($coodle_id); } ?> - - + + - <?php echo $p->t('coodle/terminauswahl');?> - - + .infotext + { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; + padding: 6px; + } + .abgeschlossen + { + width: 70%; + color: #3c763d; + background-color: #dff0d8; + padding: 15px; + border: 1px solid #d6e9c6; + } + << ".$p->t('coodle/zurueckZurUebersicht').""; echo '

'; echo '
'; - + $coodle_help = new coodle(); $coodle_help->load($coodle_id); - + $alt = strtotime($coodle_help->insertamum) ; $differenz = time() - $alt; $differenz = $differenz / 86400; $benutzer = new benutzer(); $benutzer->load($coodle->ersteller_uid); -$ersteller_name = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); +//$ersteller_name = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); +$ersteller_name = trim($benutzer->vorname.' '.$benutzer->nachname); echo '

'.$coodle->titel.'

'; $erstellt = array($ersteller_name, round($differenz)); echo ''.$p->t('coodle/erstelltVon', $erstellt).'

'; // echo '
Erstellt von '.$coodle->ersteller_uid.' ( vor '.round($differenz).' Tagen)
'; echo $coodle->beschreibung; -echo ' -
-

+echo '
'; + +if($abgeschlossen) +{ + $datum = new datum(); + $coodle_abgeschlossen = new coodle(); + $termin_id = $coodle_abgeschlossen->getTerminAuswahl($coodle_id); + $coodle_abgeschlossen->loadTermin($termin_id); + echo '

'.$p->t('coodle/umfrageAbgeschlossen',array($datum->formatDatum($coodle_abgeschlossen->datum, 'd.m.Y').' '.$coodle_abgeschlossen->uhrzeit)).'
'; +} + +echo '

'; - - $coodle_ressourcen = new coodle(); - $coodle_ressourcen->getRessourcen($coodle_id); - - // alle termine der coodle umfrage holen - $coodle_termine = new coodle(); - $coodle_termine->getTermine($coodle_id); - - $datum = new datum(); - - echo "
-
+ + $coodle_ressourcen = new coodle(); + $coodle_ressourcen->getRessourcen($coodle_id); + + // alle termine der coodle umfrage holen + $coodle_termine = new coodle(); + $coodle_termine->getTermine($coodle_id); - - "; - foreach($coodle_termine->result as $termin) - { - $class_auswahl='normal'; - $time = strtotime($termin->uhrzeit); - $coodle_auswahl = new coodle(); - - // Falls es schon eine Auswahl gibt - hervorheben - if($coodle_auswahl->checkTerminAuswahl($coodle_id, $termin->coodle_termin_id)) - $class_auswahl = 'auswahl'; - - echo ""; - } - if($ersteller) - echo ''; - echo ""; - - // ressourcen durchlaufen - foreach($coodle_ressourcen->result as $ressource) - { - $name = ''; - $class ='normal'; - $benutzer = new benutzer(); - - // wenn uid gesetzt ist nimm uid - if($ressource->uid != '') - { - $benutzer->load($ressource->uid); - $name =($benutzer->titelpre!='')?$benutzer->titelpre.' ':''; - $name.= $benutzer->vorname.' '; - $name.=$benutzer->nachname.' '; - $name.=$benutzer->titelpost; - } + $datum = new datum(); + $datum_colspan = ''; + $mailadressen = '?subject=Coodle%20Umfrage%20'.htmlspecialchars($coodle->titel).'&bcc='; - // wenn uid nicht gesetzt ist nimm zugangscode - if($ressource->zugangscode !='' && $ressource->uid =='') - $name = $ressource->name; - - if($ressource->ort_kurzbz != '') - continue; - - // eigene Reihe farbig hervorheben - if(isset($_GET['zugangscode']) && $_GET['zugangscode'] == $ressource->zugangscode) - $class ='owner'; - if(!isset($_GET['zugangscode']) && $ressource->uid == $uid) - $class = 'owner'; - - echo ""; - // termine zu ressourcen anzeigen - foreach($coodle_termine->result as $termin) - { - $checked =''; - $disabled=''; - if($coodle_termine->checkTermin($termin->coodle_termin_id, $ressource->coodle_ressource_id)) - $checked = 'checked'; - - $coodle_help = new coodle(); - if(isset($_GET['zugangscode'])) - { - $coodle_help->getRessourceFromUser($coodle_id, '', $_GET['zugangscode']); - if($ressource->coodle_ressource_id != $coodle_help->coodle_ressource_id) - $disabled = 'disabled'; - }else - { - $coodle_help->getRessourceFromUser($coodle_id, $uid); - if($ressource->coodle_ressource_id != $coodle_help->coodle_ressource_id) - $disabled = 'disabled'; - } - - if($abgeschlossen) - $disabled='disabled'; - - echo ""; - } - if($ersteller) - echo ''; - echo ''; - } - - $disabled = $abgeschlossen?'disabled':''; - - if($ersteller) - { - // buttons für auswahl des endgültigen termins - echo ''; - foreach($coodle_termine->result as $termin) - { - $checked=($termin->auswahl)?'checked':''; - echo ''; - } - echo ''; - echo ""; - } + echo "
+ - - echo " -
-
".$datum->formatDatum($termin->datum, 'd.m.Y').'
'.date('H:i',$time)."
'.$p->t('coodle/keineAuswahl').'
".$name."
'.$p->t('coodle/auswahlEndtermin').'
 
"; - + + "; + // Für Colspan bei Datum + $max_colspan = array(); + foreach($coodle_termine->result as $termin) + { + $max_colspan[] .= $termin->datum; + } + + foreach($coodle_termine->result as $termin) + { + $class_auswahl = 'normal'; + $time = strtotime($termin->uhrzeit); + $coodle_auswahl = new coodle(); + + // Falls es schon eine Auswahl gibt - hervorheben + if($coodle_auswahl->checkTerminAuswahl($coodle_id, $termin->coodle_termin_id)) + $class_auswahl = 'auswahl'; + + // Colspan für Datum berechnen + $count = array_count_values($max_colspan); + $colspan = $count[$termin->datum]; + + if($datum_colspan != $termin->datum && $termin->datum != '1900-01-01') + echo ""; + + $datum_colspan = $termin->datum; + } + if($ersteller) + echo ''; + echo ""; + + foreach($coodle_termine->result as $termin) + { + $class_auswahl='normal_uhrzeit'; + $time = strtotime($termin->uhrzeit); + $coodle_auswahl = new coodle(); + + // Falls es schon eine Auswahl gibt - hervorheben + if($coodle_auswahl->checkTerminAuswahl($coodle_id, $termin->coodle_termin_id)) + $class_auswahl = 'auswahl_uhrzeit'; + + if($termin->datum != '1900-01-01') + echo ""; + else + echo ''; + } + echo ""; + + foreach($coodle_ressourcen->result as $ressource) + { + $name = ''; + $benutzer = new benutzer(); + + // wenn uid gesetzt ist nimm uid + if($ressource->uid != '') + { + $benutzer->load($ressource->uid); + //$name .= ($benutzer->titelpre!='')?$benutzer->titelpre.' ':''; + $name .= $benutzer->vorname.' '; + $name .= $benutzer->nachname.' '; + //$name .= $benutzer->titelpost; + + $mailadressen .= $ressource->uid.'@'.DOMAIN.';'; + + $ressource->anzeigename = $name; + $ressource->vorname = $benutzer->vorname; + $ressource->nachname = $benutzer->nachname; + } + + // wenn uid nicht gesetzt ist nimm zugangscode + if($ressource->zugangscode != '' && $ressource->uid == '') + { + $name = $ressource->name; + $ressource->anzeigename = $name; + $ressource->vorname = $name; + $ressource->nachname = $name; + + $mailadressen .= ';'.$ressource->email; + } + + + } + + //Sortiert die Ressourcen alphabetisch nach anzeigename + function sortRessourcen($a, $b) + { + return strcmp($a->nachname.''.$a->vorname, $b->nachname.''.$b->vorname); + } + usort($coodle_ressourcen->result, "sortRessourcen"); + + $owner = false; + // ressourcen durchlaufen + foreach($coodle_ressourcen->result as $ressource) + { + $owner = false; + // Ist der User ident mit einer Ressource + if(isset($_GET['zugangscode']) && $_GET['zugangscode'] == $ressource->zugangscode) + $owner = true; + if(!isset($_GET['zugangscode']) && $ressource->uid == $uid) + $owner = true; + + if ($coodle_help->teilnehmer_anonym && !$owner) + continue; + else + { + + // Ort-Ressourcen ueberspringen + if($ressource->ort_kurzbz != '') + continue; + + $class = 'normal'; + // eigene Reihe farbig hervorheben + if ($owner) + $class = 'owner'; + // Bei anonymen TeilnehmerInnen entfaellt das Hervorheben + if ($coodle_help->teilnehmer_anonym) + $class = 'normal'; + + echo ""; + + $termin_datum = ''; + $disabled = false; + $checked = false; + + $coodle_ressource = new coodle(); + if (isset($_GET['zugangscode'])) + { + $coodle_ressource->getRessourceFromUser($coodle_id, '', $_GET['zugangscode']); + if($ressource->coodle_ressource_id != $coodle_ressource->coodle_ressource_id) + $disabled = true; + } + else + { + $coodle_ressource->getRessourceFromUser($coodle_id, $uid); + if($ressource->coodle_ressource_id != $coodle_ressource->coodle_ressource_id) + $disabled = true; + } + + if($abgeschlossen) + $disabled = true; + + // termine zu ressourcen anzeigen + foreach($coodle_termine->result as $termin) + { + $checked = false; + $style = ''; + if($coodle_termine->checkTermin($termin->coodle_termin_id, $ressource->coodle_ressource_id)) + $checked = true; + + if ($termin_datum != '' && $termin_datum != $termin->datum) + $style = 'style="border-left: 1px solid #DCDDDF;"'; + + if ($coodle_help->termine_anonym && !$owner && !$ersteller) + echo ""; + else + { + if ($disabled) + { + if ($checked) + echo ''; + else + echo ''; + } + else + { + // Der 01.01.1900 wird fuer "Keine Auswahl" verwendet. Beim anklicken der Checkbox werden alle anderen Checkboxen deaktiviert + echo ''; + } + } + + $termin_datum = $termin->datum; + } + if($ersteller) + echo ""; + echo ''; + } + } + + $disabled = $abgeschlossen?'disabled':''; + + // Counter fuer Anzahl der Auswahlen pro Termin + $counter_arr = array(); + foreach($coodle_termine->result as $termin) + { + $countTermine = new coodle(); + $countTermine->countTermin($termin->coodle_termin_id); + + $counter_arr[] = $countTermine->anzahl; + } + if ($coodle_help->teilnehmer_anonym) + echo ''; + elseif ($coodle_help->termine_anonym) + echo ''; + + echo ''; + foreach($coodle_termine->result as $termin) + { + $countTermine = new coodle(); + $countTermine->countTermin($termin->coodle_termin_id); + + if ($countTermine->anzahl == max($counter_arr)) + echo ''; + else + echo ''; + } + if($ersteller) + echo ''; + echo ""; + + if($ersteller) + { + // buttons für auswahl des endgültigen termins + echo ''; + foreach($coodle_termine->result as $termin) + { + $checked=($termin->auswahl)?'checked':''; + if ($termin->datum != '1900-01-01') + echo ''; + else + echo ''; + } + echo ''; + echo ""; + } + if($ersteller && $abgeschlossen) + echo ' '; + echo ' + -
".$datum->formatDatum($termin->datum, 'd.m.Y')."
".date('H:i',$time)."'.$p->t('coodle/keinTerminMoeglich').'
".$ressource->anzeigename." + datum == '1900-01-01'?'id="disableCheckboxes"':'').' + name="check_'.$ressource->coodle_ressource_id.'_'.$termin->coodle_termin_id.'"> +
Die TeilnehmerInnen dieser Umfrage sind anonym
Die Terminwahl dieser Umfrage erfolgt anonym
Summe der Einträge'.$countTermine->anzahl.''.$countTermine->anzahl.''.$p->t('coodle/keineAuswahl').'
'.$p->t('coodle/auswahlEndtermin').'
Mail an alle schicken
'; + if($ersteller && $abgeschlossen) echo ''; if($saveOk===true) echo ' '.$p->t('global/erfolgreichgespeichert').''; echo "
- ".$message.'
'.$mailMessage; - if($abgeschlossen) - echo '

'.$p->t('coodle/umfrageAbgeschlossen').''; - - ?> - - +
+
".$message.'
'.$mailMessage; + + ?> +
+ @@ -454,37 +663,49 @@ echo ' * Sendet eine Email an den Ersteller der Umfrage * @param type $ersteller */ -function sendBenachrichtigung($coodle_id) +function sendBenachrichtigung($coodle_id,$teilnehmer_id) { - $coodle_send = new coodle(); - if(!$coodle_send->load($coodle_id)) - { - die("Fehler beim senden aufgetreten"); - } - - $email = ''; - $mitarbeiter = new mitarbeiter(); - $mitarbeiter->load($coodle_send->ersteller_uid); - $person = new person(); - $person->load($mitarbeiter->person_id); - - $name = ''; - $name.= ($person->titelpre != '')?$person->titelpre.' ':''; - $name.= $person->vorname.' '.$person->nachname; - $name.= ($person->titelpost != '')?' '.$person->titelpost:''; - - - if($person->geschlecht == 'w') - $email.= 'Sehr geehrte Frau '.$name."!

"; - else - $email.="Sehr geehrter Herr ".$name."!

"; - - $email.="Ein Termin Ihrer Coodle-Umfrage wurde ausgewählt
Link zu Ihrer Coodle Übersicht

Mit freundlichen Grüßen

- Fachhochschule Technikum Wien
- Höchstädtplatz 6
- 1200 Wien"; - - $mail = new mail($coodle_send->ersteller_uid.'@'.DOMAIN, 'no-reply', 'Coodle Umfrage', 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.'); + $coodle_send = new coodle(); + if(!$coodle_send->load($coodle_id)) + { + die("Fehler beim senden aufgetreten"); + } + + $mitarbeiter = new mitarbeiter(); + $person = new person(); + $teilnehmer = new coodle(); + + $teilnehmer->getRessourceFromId($teilnehmer_id); + if ($teilnehmer->zugangscode!='') + $tn = $teilnehmer->name; + else + { + $mitarbeiter->load($teilnehmer->uid); + $person->load($mitarbeiter->person_id); + $tn = $person->vorname." ".$person->nachname; + } + $mitarbeiter->load($coodle_send->ersteller_uid); + $person->load($mitarbeiter->person_id); + + $email = ''; + + $name = ''; + $name.= ($person->titelpre != '')?$person->titelpre.' ':''; + $name.= $person->vorname.' '.$person->nachname; + $name.= ($person->titelpost != '')?' '.$person->titelpost:''; + + + if($person->geschlecht == 'w') + $email.= 'Sehr geehrte Frau '.$name."!

"; + else + $email.="Sehr geehrter Herr ".$name."!

"; + + $email.= $tn." hat einen Termin Ihrer Coodle-Umfrage ausgewählt
Link zu Ihrer Coodle Übersicht

Mit freundlichen Grüßen

+ Fachhochschule Technikum Wien
+ Höchstädtplatz 6
+ 1200 Wien"; + + $mail = new mail($coodle_send->ersteller_uid.'@'.DOMAIN, 'no-reply', 'Coodle Umfrage', 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.'); $mail->setHTMLContent($email); if(!$mail->send()) die("Fehler beim senden des Mails aufgetreten"); @@ -499,64 +720,64 @@ function sendBenachrichtigung($coodle_id) function sendEmail($coodle_id) { global $mailMessage; - global $p; - $coodle_help = new coodle(); - $termin_id = $coodle_help->getTerminAuswahl($coodle_id); - $coodle_help->loadTermin($termin_id); - - $coodle_ressource = new coodle(); - $coodle_ressource->getRessourcen($coodle_id); - $coodle= new coodle(); - $coodle->load($coodle_id); - $ort=''; - $teilnehmer=''; - foreach($coodle_ressource->result as $row) - { - if($row->ort_kurzbz!='') - { - if($ort!='') - $ort.=', '; - $ort.="$row->ort_kurzbz"; - } - else - { - if($row->uid!='') - { - $benutzer = new benutzer(); - $benutzer->load($row->uid); - $name = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); - $mail = $row->uid.'@'.DOMAIN; - } - else - { - $mail = $row->email; - $name = $row->name; - } - $coodle_ressource_termin = new coodle(); - $partstat=''; - if($coodle_ressource_termin->checkTermin($termin_id, $row->coodle_ressource_id)) - $partstat='ACCEPTED'; - else - $partstat='TENTATIVE'; - - $teilnehmer.='ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT='.$partstat.';CN='.$name."\n :MAILTO:".$mail."\n"; - } - } - $date = new DateTime($coodle_help->datum.' '.$coodle_help->uhrzeit); - //Datum des Termins ins richtige Format bringen - $dtstart = $date->format('Ymd\THis'); + global $p; + $coodle_help = new coodle(); + $termin_id = $coodle_help->getTerminAuswahl($coodle_id); + $coodle_help->loadTermin($termin_id); + + $coodle_ressource = new coodle(); + $coodle_ressource->getRessourcen($coodle_id); + $coodle= new coodle(); + $coodle->load($coodle_id); + $ort=''; + $teilnehmer=''; + foreach($coodle_ressource->result as $row) + { + if($row->ort_kurzbz!='') + { + if($ort!='') + $ort.=', '; + $ort.="$row->ort_kurzbz"; + } + else + { + if($row->uid!='') + { + $benutzer = new benutzer(); + $benutzer->load($row->uid); + $name = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); + $mail = $row->uid.'@'.DOMAIN; + } + else + { + $mail = $row->email; + $name = $row->name; + } + $coodle_ressource_termin = new coodle(); + $partstat=''; + if($coodle_ressource_termin->checkTermin($termin_id, $row->coodle_ressource_id)) + $partstat='ACCEPTED'; + else + $partstat='TENTATIVE'; + + $teilnehmer.='ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT='.$partstat.';CN='.$name."\n :MAILTO:".$mail."\n"; + } + } + $date = new DateTime($coodle_help->datum.' '.$coodle_help->uhrzeit); + //Datum des Termins ins richtige Format bringen + $dtstart = $date->format('Ymd\THis'); - //Ende Datum berechnen - $interval =new DateInterval('PT'.$coodle->dauer.'M'); - $date->add($interval); - $dtend = $date->format('Ymd\THis'); - $date = new DateTime(); - $dtstamp = $date->format('Ymd\THis'); - $benutzer = new benutzer(); - $benutzer->load($coodle->ersteller_uid); - $erstellername = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); - //Ical File erstellen - $ical = "BEGIN:VCALENDAR + //Ende Datum berechnen + $interval =new DateInterval('PT'.$coodle->dauer.'M'); + $date->add($interval); + $dtend = $date->format('Ymd\THis'); + $date = new DateTime(); + $dtstamp = $date->format('Ymd\THis'); + $benutzer = new benutzer(); + $benutzer->load($coodle->ersteller_uid); + $erstellername = trim($benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost); + //Ical File erstellen + $ical = "BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN VERSION:2.0 METHOD:PUBLISH @@ -594,69 +815,69 @@ CLASS:PUBLIC END:VEVENT END:VCALENDAR"; - if(count($coodle_ressource->result)>0) - { - foreach($coodle_ressource->result as $row) - { - if($row->uid!='') - { - $benutzer = new benutzer(); - if(!$benutzer->load($row->uid)) - { - $mailMessage.="Fehler beim Laden des Benutzers ".$coodle_ressource->convert_html_chars($row->uid); - continue; - } - - if($benutzer->geschlecht=='w') - $anrede = "Sehr geehrte Frau "; - else - $anrede = "Sehr geehrter Herr "; - - $anrede.= $benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost; - - // Interner Teilnehmer - $email = $row->uid.'@'.DOMAIN; - } - elseif($row->email!='') - { - // Externe Teilnehmer - $email = $row->email; - $anrede='Sehr geehrte(r) Herr/Frau '.$row->name; - } - else + if(count($coodle_ressource->result)>0) + { + foreach($coodle_ressource->result as $row) + { + if($row->uid!='') { - // Raueme bekommen kein Mail - continue; - } - $anrede = trim($anrede); - $sign = $p->t('mail/signatur'); + $benutzer = new benutzer(); + if(!$benutzer->load($row->uid)) + { + $mailMessage.="Fehler beim Laden des Benutzers ".$coodle_ressource->convert_html_chars($row->uid); + continue; + } - $datum = new datum(); + if($benutzer->geschlecht=='w') + $anrede = "Sehr geehrte Frau "; + else + $anrede = "Sehr geehrter Herr "; - $html=$anrede.'!

- Die Terminumfrage zum Thema "'.$coodle_ressource->convert_html_chars($coodle->titel).'" ist beendet. -
- Der Termin wurde auf den '.$datum->formatDatum($coodle_help->datum, 'd.m.Y').' '.$coodle_help->uhrzeit.' festgelegt. -

'.nl2br($sign); + $anrede.= $benutzer->titelpre.' '.$benutzer->vorname.' '.$benutzer->nachname.' '.$benutzer->titelpost; - $text=$anrede."!\n\nDie Terminumfrage zum Thema \"".$coodle_help->convert_html_chars($coodle->titel).'"\" ist beendet.\n - Der Termin wurde auf den '.$datum->formatDatum($coodle_help->datum, 'd.m.Y').' '.$coodle_help->uhrzeit." festgelegt\n. - \n\n$sign"; + // Interner Teilnehmer + $email = $row->uid.'@'.DOMAIN; + } + elseif($row->email!='') + { + // Externe Teilnehmer + $email = $row->email; + $anrede='Sehr geehrte(r) Herr/Frau '.$row->name; + } + else + { + // Raueme bekommen kein Mail + continue; + } + $anrede = trim($anrede); + $sign = $p->t('mail/signatur'); - $mail = new mail($email, 'no-reply@'.DOMAIN,'Terminbestätigung - '.$coodle->titel, $text); - $mail->setHTMLContent($html); - //ICal Termineinladung hinzufuegen - $mail->addAttachmentPlain($ical, 'text/calendar', 'meeting.ics'); - if($mail->send()) - { - $mailMessage.= $p->t('coodle/mailVersandtAn',array($email))."
"; - } - } - } - else - { - die($p->t('coodle/keineRessourcenVorhanden')); - } + $datum = new datum(); + + $html=$anrede.'!

+ Die Terminumfrage zum Thema "'.$coodle_ressource->convert_html_chars($coodle->titel).'" ist beendet. +
+ Der Termin wurde auf den '.$datum->formatDatum($coodle_help->datum, 'd.m.Y').' '.$coodle_help->uhrzeit.' festgelegt. +

'.nl2br($sign); + + $text=$anrede."!\n\nDie Terminumfrage zum Thema \"".$coodle_help->convert_html_chars($coodle->titel).'"\" ist beendet.\n + Der Termin wurde auf den '.$datum->formatDatum($coodle_help->datum, 'd.m.Y').' '.$coodle_help->uhrzeit." festgelegt\n. + \n\n$sign"; + + $mail = new mail($email, 'no-reply@'.DOMAIN,'Terminbestätigung - '.$coodle->titel, $text); + $mail->setHTMLContent($html); + //ICal Termineinladung hinzufuegen + $mail->addAttachmentPlain($ical, 'text/calendar', 'meeting.ics'); + if($mail->send()) + { + $mailMessage.= $p->t('coodle/mailVersandtAn',array($email))."
"; + } + } + } + else + { + die($p->t('coodle/keineRessourcenVorhanden')); + } } /** diff --git a/include/coodle.class.php b/include/coodle.class.php index 1a4ac0f68..739a8ed25 100755 --- a/include/coodle.class.php +++ b/include/coodle.class.php @@ -40,6 +40,9 @@ class coodle extends basis_db public $updatevon; // varchar(32) public $insertamum; // timestamp public $insertvon; // varchar(32) + public $mailversand; // boolean + public $teilnehmer_anonym; // boolean + public $termine_anonym; // boolean // tbl_coodle_ressource public $coodle_ressource_id; // integer @@ -105,6 +108,9 @@ class coodle extends basis_db $this->updatevon = $row->updatevon; $this->insertamum = $row->insertamum; $this->insertvon = $row->insertvon; + $this->mailversand = $this->db_parse_bool($row->mailversand); + $this->teilnehmer_anonym = $this->db_parse_bool($row->teilnehmer_anonym); + $this->termine_anonym = $this->db_parse_bool($row->termine_anonym); } else { @@ -156,7 +162,7 @@ class coodle extends basis_db { //Neuen Datensatz einfuegen $qry='BEGIN;INSERT INTO campus.tbl_coodle(ersteller_uid, coodle_status_kurzbz, titel, beschreibung, - dauer, endedatum, insertamum, insertvon, updateamum, updatevon) VALUES('. + dauer, endedatum, insertamum, insertvon, updateamum, updatevon, mailversand, teilnehmer_anonym, termine_anonym) VALUES('. $this->db_add_param($this->ersteller_uid).', '. $this->db_add_param($this->coodle_status_kurzbz).', '. $this->db_add_param($this->titel).', '. @@ -166,7 +172,10 @@ class coodle extends basis_db $this->db_add_param($this->insertamum).', '. $this->db_add_param($this->insertvon).', '. $this->db_add_param($this->updateamum).', '. - $this->db_add_param($this->updatevon).');'; + $this->db_add_param($this->updatevon).', '. + $this->db_add_param($this->mailversand, FHC_BOOLEAN, true).', '. + $this->db_add_param($this->teilnehmer_anonym, FHC_BOOLEAN, true).', '. + $this->db_add_param($this->termine_anonym, FHC_BOOLEAN, true).');'; } else { @@ -184,7 +193,10 @@ class coodle extends basis_db ' dauer='.$this->db_add_param($this->dauer).', '. ' endedatum='.$this->db_add_param($this->endedatum).', '. ' updateamum='.$this->db_add_param($this->updateamum).', '. - ' updatevon='.$this->db_add_param($this->updatevon).' '. + ' updatevon='.$this->db_add_param($this->updatevon).', '. + ' mailversand='.$this->db_add_param($this->mailversand, FHC_BOOLEAN).', '. + ' teilnehmer_anonym='.$this->db_add_param($this->teilnehmer_anonym, FHC_BOOLEAN).', '. + ' termine_anonym='.$this->db_add_param($this->termine_anonym, FHC_BOOLEAN).' '. 'WHERE coodle_id='.$this->db_add_param($this->coodle_id, FHC_INTEGER, false).';'; } @@ -383,6 +395,9 @@ class coodle extends basis_db $coodle->updatevon = $row->updatevon; $coodle->endedatum = $row->endedatum; $coodle->ersteller_uid = $row->ersteller_uid; + $coodle->mailversand = $row->mailversand; + $coodle->teilnehmer_anonym = $row->teilnehmer_anonym; + $coodle->termine_anonym = $row->termine_anonym; $this->result[] = $coodle; } @@ -505,7 +520,7 @@ class coodle extends basis_db } /** - * Speichert die aktuelle Ressource in die Datenbank + * Speichert die Terminwahl der Ressource in die Datenbank * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt * andernfalls wird der Datensatz mit der ID in $coodle_id aktualisiert * @return true wenn ok, false im Fehlerfall @@ -650,6 +665,70 @@ class coodle extends basis_db return false; } + /** + * Überprüft ob der übergebenen Termin schon von einer Ressource gewählt wurde + * @param Integer $termin_id + * @return boolean true, wenn schon ein Termin schon gewaehlt wurde, sonst false + */ + public function checkTerminGewaehlt($termin_id) + { + if( $termin_id == '' || !is_numeric($termin_id)) + { + $this->errormsg = 'Ungültige ID übergeben'; + return false; + } + + $qry="SELECT * FROM campus.tbl_coodle_ressource_termin + WHERE coodle_termin_id=".$this->db_add_param($termin_id, FHC_INTEGER).';'; + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_row($result)) + { + return true; + } + return false; + } + + return false; + } + + /** + * Zählt, wie oft ein Termin gewählt wurde + * @param Integer $termin_id + * @param Integer $ressource_id + * @return boolean + */ + public function countTermin($termin_id) + { + if($termin_id == '' || !is_numeric($termin_id)) + { + $this->errormsg = 'Ungültige ID übergeben'; + return false; + } + + $qry="SELECT count(*) AS anzahl FROM campus.tbl_coodle_ressource_termin + WHERE coodle_termin_id=".$this->db_add_param($termin_id, FHC_INTEGER).';'; + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + $this->anzahl = $row->anzahl; + } + else + { + return false; + } + return true; + } + else + { + $this->errormsg = "Fehler bei der Abfrage aufgetreten"; + return false; + } + } + /** * * Laedt alle Termine einer Umfrage zu denen eine Ressource zugesagt hat @@ -844,20 +923,28 @@ class coodle extends basis_db /** * Laedt die Terminvorschlaege zu einer Umfrage + * Das Datum 1900-01-01 wird an die letzte Stelle sortiert, da es fuer "Keine Auswahl" benoetigt wird * @param $coodle_id * @return boolean */ public function getTermine($coodle_id) { - if($coodle_id == '' || !is_numeric($coodle_id)) - { - $this->errormsg = "Ungültige Coodle_id"; - return false; - } - - $qry = "SELECT * FROM campus.tbl_coodle_termin - WHERE coodle_id=".$this->db_add_param($coodle_id, FHC_INTEGER, false).' - ORDER BY datum, uhrzeit;'; + if($coodle_id == '' || !is_numeric($coodle_id)) + { + $this->errormsg = "Ungültige Coodle_id"; + return false; + } + + $qry = "(SELECT * FROM campus.tbl_coodle_termin + WHERE coodle_id=".$this->db_add_param($coodle_id, FHC_INTEGER, false)." + AND datum != '1900-01-01' + ORDER BY datum, uhrzeit) + + UNION ALL + + (SELECT * FROM campus.tbl_coodle_termin + WHERE coodle_id=".$this->db_add_param($coodle_id, FHC_INTEGER, false)." + AND datum = '1900-01-01');"; if($result = $this->db_query($qry)) { @@ -910,6 +997,9 @@ class coodle extends basis_db $coodle->insertvon = $row->insertvon; $coodle->updateamum = $row->updateamum; $coodle->updatevon = $row->updatevon; + $coodle->mailversand = $row->mailversand; + $coodle->teilnehmer_anonym = $row->teilnehmer_anonym; + $coodle->termine_anonym = $row->termine_anonym; $this->result[] = $coodle; } @@ -1210,6 +1300,9 @@ class coodle extends basis_db $coodle->updatevon = $row->updatevon; $coodle->endedatum = $row->endedatum; $coodle->ersteller_uid = $row->ersteller_uid; + $coodle->mailversand = $row->mailversand; + $coodle->teilnehmer_anonym = $row->teilnehmer_anonym; + $coodle->termine_anonym = $row->termine_anonym; $this->result[] = $coodle; } diff --git a/locale/de-AT/coodle.php b/locale/de-AT/coodle.php index 195cf743f..73e7477a6 100755 --- a/locale/de-AT/coodle.php +++ b/locale/de-AT/coodle.php @@ -1,13 +1,16 @@ phrasen['coodle/coodle']='Coodle'; $this->phrasen['coodle/titel']='Titel'; -$this->phrasen['coodle/beschreibung']='Beschreibung'; +$this->phrasen['coodle/beschreibung']='Beschreibung
(optional)'; $this->phrasen['coodle/dauer']='Termindauer'; $this->phrasen['coodle/dauerminuten']='Minuten'; $this->phrasen['coodle/endedatum']='Umfrageende'; $this->phrasen['coodle/neuerEintrag']='Neue Umfrage'; $this->phrasen['coodle/bearbeiten']='Umfrage editieren'; +$this->phrasen['coodle/laufendeUmfrageBearbeiten']='Laufende Umfrage editieren'; $this->phrasen['coodle/uebersicht']='Coodle - Übersicht'; +$this->phrasen['coodle/einfuehrungstext']='Coodle hilft Ihnen dabei, Termine mit mehreren Personen zu organisieren. Sie sehen dabei schon vorab die Verfügbarkeit der Personen (gestützt durch die FreeBusy-URL) und Räume. +
Der Vorteil ist eine effizientere Planung und schnellere Terminfindung.'; $this->phrasen['coodle/umfrageKonnteNichtGeloeschtWerden']='Umfrage konnte nicht gelöscht werden'; $this->phrasen['coodle/umfrageNichtGeladen']='Umfrage konnte nicht geladen werden'; $this->phrasen['coodle/coodleId']='Coodle_id'; @@ -17,13 +20,14 @@ $this->phrasen['coodle/aktion']='Aktion'; $this->phrasen['coodle/neueUmfrage']='Neue Umfrage anlegen'; $this->phrasen['coodle/termine']='Termine verwalten'; $this->phrasen['coodle/dragEvent']='Termin'; -$this->phrasen['coodle/terminZiehenBeschreibung']='Ziehen Sie den Termin an die gewünschte Position um Terminvorschläge zu setzen'; -$this->phrasen['coodle/ressourcenBeschreibung']='Hier können Sie Räume und Personen zur Umfrage hinzufügen.

Tippen sie dazu den Namen in das Textfeld und wählen Sie den entsprechenden Eintrag aus.'; -$this->phrasen['coodle/ressourcen']='Ressourcen / TeilnehmerIn'; +$this->phrasen['coodle/terminZiehenBeschreibung']='Ziehen Sie den Termin an die gewünschte(n) Position(en) um Terminvorschläge zu setzen'; +$this->phrasen['coodle/ressourcenBeschreibung']='Hier können Sie Personen, Gruppen und Räume zur Umfrage hinzufügen.

Tippen Sie dazu den Namen in das Textfeld und wählen Sie den entsprechenden Eintrag aus.'; +$this->phrasen['coodle/ressourcen']='Ressourcen / TeilnehmerInnen / Gruppen'; $this->phrasen['coodle/weiterZurTerminauswahl']='Weiter zur Terminauswahl'; +$this->phrasen['coodle/umfrageLaeuftBereits']='Die Umfrage läuft bereits. Sie können keine Änderungen an den Terminen vornehmen.'; $this->phrasen['coodle/ressourceEntfernen']='Ressource entfernen'; $this->phrasen['coodle/umfrageStarten']='Umfrage starten'; -$this->phrasen['coodle/startBeschreibung']='Klicken Sie hier um die Teilnehmer zu Informieren und die Umfrage zu starten'; +$this->phrasen['coodle/startBeschreibung']='Klicken Sie hier, um die TeilnehmerInnen zu informieren und die Umfrage zu starten'; $this->phrasen['coodle/keineTermineVorhanden']='Es sind noch keine Termine für diese Umfrage vorhanden'; $this->phrasen['coodle/keineRessourcenVorhanden']='Es sind noch keine Teilnehmer zugeordnet'; $this->phrasen['coodle/mailVersandtAn']='Mail wurde erfolgreich an %s versandt'; @@ -44,18 +48,33 @@ $this->phrasen['coodle/terminauswahl']='Coodle Terminauswahl'; $this->phrasen['coodle/erstelltVon']='Erstellt von %s (vor %s Tagen)'; $this->phrasen['coodle/zurueckZurUebersicht']='Zurück zur Übersicht'; $this->phrasen['coodle/einladungNeuVerschicken']='Einladungen neu verschicken'; -$this->phrasen['coodle/umfrageAbgeschlossen']='Die Umfrage ist abgeschlossen'; +$this->phrasen['coodle/umfrageAbgeschlossen']='Die Umfrage ist abgeschlossen. Der Termin wurde auf %s festgelegt'; $this->phrasen['coodle/loeschen']='Umfrage stornieren'; $this->phrasen['coodle/zurUmfrage']='Zur Umfrage'; -$this->phrasen['coodle/ressource']='Ressource / TeilnehmerIn'; +$this->phrasen['coodle/ressource']='Ressource / TeilnehmerIn / Gruppe'; $this->phrasen['coodle/raumBelegt']='Der Raum %s kann nicht reserviert werden, da er belegt ist!'; $this->phrasen['coodle/laufendeUmfragen']='Laufende Umfragen'; $this->phrasen['coodle/beendeteUmfragen']='Beendete Umfragen'; $this->phrasen['coodle/ReservierungNichtMoeglich']='Bitte beachten Sie, dass Raumreservierungen nach dem %s noch nicht möglich sind.'; $this->phrasen['coodle/raumNichtReserviert']='Achtung: Ihr Raum wurde nicht reserviert, da Raumreservierungen nach dem %s derzeit noch nicht möglich sind.'; $this->phrasen['coodle/auswahlEndtermin']='Auswahl des Endtermins'; -$this->phrasen['coodle/auswahlHinweis']='Durch diese Auswahl wird der endgültige Termin ausgewählt und die Umfrage beendet. Dieser Vorgang kann nicht rückgängig gemacht werden.'; +$this->phrasen['coodle/auswahlHinweis']='Das Speichern des Endtermins beendet die Umfrage und informiert alle TeilnehmerInnen über das Ergebnis.
Dieser Vorgang kann nicht rückgängig gemacht werden.'; $this->phrasen['coodle/keineAuswahl']='Keine Auswahl'; $this->phrasen['coodle/umfrageWurdeBereitsGestartet']='Umfrage wurde bereits gestartet'; $this->phrasen['coodle/umfrageNochNichtGestartet']='Umfrage wurde noch nicht gestartet'; +$this->phrasen['coodle/titelEingeben']='Titel eingeben'; +$this->phrasen['coodle/titelInfotext']='Geben Sie Ihrer Umfrage einen aussagekräftigen Titel. Dieser wird auch im Betreff der E-Mail angezeigt.'; +$this->phrasen['coodle/beschreibungInfotext']='Erläutern Sie hier Details zum Termin. Diese werden auch im Text der E-Mail angezeigt.'; +$this->phrasen['coodle/dauerInfotext']='Wählen Sie hier die vermutliche Dauer des Termins.'; +$this->phrasen['coodle/endeInfotext']='Sie erhalten eine E-Mail, sobald das Endedatum der Umfrage überschritten wurde.'; +$this->phrasen['coodle/mailversand']='Mailversand'; +$this->phrasen['coodle/infotextMailversand']='Wenn Sie diese Option aktivieren, erhalten Sie bei jeder Terminänderung eines Teilnehmers/einer Teilnehmerin eine Benachrichtigung'; +$this->phrasen['coodle/teilnehmerAnonym']='Anonyme TeilnehmerInnen'; +$this->phrasen['coodle/infotextTeilnehmerAnonym']='Wenn Sie diese Option aktivieren, sehen die TeilnehmerInnen weder die Namen, noch die Anzahl der anderen TeilnehmerInnen, sondern nur die Summen der Einträge'; +$this->phrasen['coodle/terminAnonym']='Anonyme Terminwahl'; +$this->phrasen['coodle/infotextTerminAnonym']='Wenn Sie diese Option aktivieren, sehen die TeilnehmerInnen nicht, ob und welche Termine von den anderen TeilnehmerInnen gewählt wurden, jedoch die Namen der TeilnehmerInnen und die Summe der Einträge'; +$this->phrasen['coodle/dieTeilnehmerDieserUmfrageSindAnonym']='Die TeilnehmerInnen dieser Umfrage sind anonym.'; +$this->phrasen['coodle/dieTermineDieserUmfrageSindAnonym']='Die Terminwahl der TeilnehmerInnen dieser Umfrage ist anonym.'; +$this->phrasen['coodle/TerminInDerVergangenheit']='Dieser Termin liegt in der Vergangenheit und kann nicht gewählt werden'; +$this->phrasen['coodle/keinTerminMoeglich']='Kein Termin möglich'; ?> diff --git a/locale/en-US/coodle.php b/locale/en-US/coodle.php index d8dba30dc..9dcc907bd 100755 --- a/locale/en-US/coodle.php +++ b/locale/en-US/coodle.php @@ -17,7 +17,7 @@ $this->phrasen['coodle/aktion']='Action'; $this->phrasen['coodle/neueUmfrage']='Create a new poll'; $this->phrasen['coodle/termine']='Manage appointments'; $this->phrasen['coodle/dragEvent']='Appointment'; -$this->phrasen['coodle/terminZiehenBeschreibung']='Drag the appointment to the date and time you would like to suggest it take place'; +$this->phrasen['coodle/terminZiehenBeschreibung']='Drag the appointment to the date(s) and time(s) you would like to suggest it take place'; $this->phrasen['coodle/ressourcenBeschreibung']='You can add rooms and people to the poll here.
Simply type the name in the textbox and select the appropriate entry.'; $this->phrasen['coodle/ressourcen']='Ressources'; $this->phrasen['coodle/weiterZurTerminauswahl']='Continue to appointment selection'; @@ -43,7 +43,7 @@ $this->phrasen['coodle/keineOderMehrereRäume']='No room or multiple rooms have $this->phrasen['coodle/terminauswahl']='Coodle appointment selection'; $this->phrasen['coodle/erstelltVon']='Created from %s (%s days ago)'; $this->phrasen['coodle/einladungNeuVerschicken']='Send invitations again'; -$this->phrasen['coodle/umfrageAbgeschlossen']='The poll is closed'; +$this->phrasen['coodle/umfrageAbgeschlossen']='The poll is closed. The date has been scheduled on %s'; $this->phrasen['coodle/loeschen']='Cancel poll'; $this->phrasen['coodle/zurUmfrage']='To the poll'; $this->phrasen['coodle/ressource']='Ressource'; @@ -57,5 +57,11 @@ $this->phrasen['coodle/auswahlHinweis']='Once you have made this selection, the $this->phrasen['coodle/keineAuswahl']='No Item selected'; $this->phrasen['coodle/umfrageWurdeBereitsGestartet']='Poll has already been started.'; $this->phrasen['coodle/umfrageNochNichtGestartet']='Poll has not yet been started.'; - +$this->phrasen['coodle/titelEingeben']='Enter Title'; +$this->phrasen['coodle/titelInfotext']='Geben Sie Ihrer Umfrage einen aussagekräftigen Titel. Dieser wird auch im Betreff der E-Mail angezeigt.'; +$this->phrasen['coodle/beschreibungInfotext']='Erläutern Sie hier Details zum Termin. Diese werden auch im Text der E-Mail angezeigt.'; +$this->phrasen['coodle/dauerInfotext']='Wählen Sie hier die vermutliche Dauer des Termins.'; +$this->phrasen['coodle/endeInfotext']='?'; +$this->phrasen['coodle/TerminInDerVergangenheit']='Dieser Termin liegt in der Vergangenheit und kann nicht gewählt werden'; +$this->phrasen['coodle/keinTerminMoeglich']='Kein Termin möglich'; ?> From 45b4c847643bd7c28e5707bee85668df0f70d921 Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 6 Jun 2017 15:21:22 +0200 Subject: [PATCH 04/10] Task #1355: - If the sender of a message is an admin: show all the vorlage with mimetype = text/html - If the sender of a message is NOT an admin: show all the vorlage that belongs to the organisation units of the user and the parents of those organisation units until the root of the organisation unit tree Changes: - Added method isAdminByPersonId to model Benutzerrolle_model - Added method _getAllHTMLVorlage to Vorlage_widget - Added method _getUserVorlage to Vorlage_widget --- application/controllers/system/Messages.php | 31 +++-- .../models/person/Benutzerfunktion_model.php | 2 +- .../models/system/Benutzerrolle_model.php | 29 +++- application/views/system/messageWrite.php | 2 +- application/widgets/vorlage_widget.php | 126 +++++++++++++++--- 5 files changed, 160 insertions(+), 30 deletions(-) diff --git a/application/controllers/system/Messages.php b/application/controllers/system/Messages.php index 5fac9c95c..472f818d5 100755 --- a/application/controllers/system/Messages.php +++ b/application/controllers/system/Messages.php @@ -40,14 +40,13 @@ class Messages extends VileSci_Controller } // Get variables - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $prestudent = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); - if ($prestudent->error) + $this->load->model('system/Message_model', 'MessageModel'); + $msgVarsDataByPrestudentId = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); + if ($msgVarsDataByPrestudentId->error) { - show_error($prestudent->retval); + show_error($msgVarsDataByPrestudentId->retval); } - $this->load->model('system/Message_model', 'MessageModel'); if (!hasData($variables = $this->MessageModel->getMessageVars())) { unset($variables); @@ -65,21 +64,33 @@ class Messages extends VileSci_Controller array_shift($variables->retval); // Remove person_id array_shift($variables->retval); // Remove prestudent_id - // - $oe_kurzbz = null; + // Organisation units + $oe_kurzbz = array(); // A person can have more organisation units $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $benutzerResult = $this->BenutzerfunktionModel->getByPersonId($sender_id); if (hasData($benutzerResult)) { - $oe_kurzbz = $benutzerResult->retval[0]->oe_kurzbz; + foreach($benutzerResult->retval as $val) + { + $oe_kurzbz[] = $val->oe_kurzbz; + } + } + + // Admin or commoner? + $this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel'); + $isAdmin = $this->BenutzerrolleModel->isAdminByPersonId($sender_id); + if (isError($isAdmin)) + { + show_error($isAdmin->retval); } $data = array ( 'sender_id' => $sender_id, - 'receivers' => $prestudent->retval, + 'receivers' => $msgVarsDataByPrestudentId->retval, 'message' => $msg, 'variables' => $variablesArray, - 'oe_kurzbz' => $oe_kurzbz + 'oe_kurzbz' => $oe_kurzbz, + 'isAdmin' => $isAdmin->retval ); $v = $this->load->view('system/messageWrite', $data); diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php index c76dbd00d..e75540d92 100644 --- a/application/models/person/Benutzerfunktion_model.php +++ b/application/models/person/Benutzerfunktion_model.php @@ -13,7 +13,7 @@ class Benutzerfunktion_model extends DB_Model } /** - * + * Get the Benutzerfunktion using the person_id */ public function getByPersonId($person_id) { diff --git a/application/models/system/Benutzerrolle_model.php b/application/models/system/Benutzerrolle_model.php index 95ca90e71..13ebf57b6 100644 --- a/application/models/system/Benutzerrolle_model.php +++ b/application/models/system/Benutzerrolle_model.php @@ -1,7 +1,7 @@ dbTable = 'system.tbl_benutzerrolle'; $this->pk = 'benutzerberechtigung_id'; } -} + + /** + * Checks if the given user is an admin + */ + public function isAdminByPersonId($person_id) + { + // Join with the table tbl_benutzer + $this->addJoin('public.tbl_benutzer', 'uid'); + + $result = $this->loadWhere(array('person_id' => $person_id, 'rolle_kurzbz' => 'admin')); + + if (!isError($result)) + { + if (hasData($result)) + { + $result = success(true); + } + else if (!hasData($result)) + { + $result = success(false); + } + } + + return $result; + } +} \ No newline at end of file diff --git a/application/views/system/messageWrite.php b/application/views/system/messageWrite.php index 384d2a8db..4f4ea7427 100644 --- a/application/views/system/messageWrite.php +++ b/application/views/system/messageWrite.php @@ -93,7 +93,7 @@ widgetlib->widget( 'Vorlage_widget', - array('oe_kurzbz' => $oe_kurzbz), + array('oe_kurzbz' => $oe_kurzbz, 'isAdmin' => $isAdmin), array('name' => 'vorlage', 'id' => 'vorlageDnD') ); ?> diff --git a/application/widgets/vorlage_widget.php b/application/widgets/vorlage_widget.php index 50065d1c7..91cba301f 100644 --- a/application/widgets/vorlage_widget.php +++ b/application/widgets/vorlage_widget.php @@ -4,23 +4,25 @@ class Vorlage_widget extends DropdownWidget { public function display($widgetData) { - // Loads - $this->load->library('OrganisationseinheitLib'); + // All organization units to which the user belongs + $oe_kurzbz = $widgetData['oe_kurzbz']; + $idAdmin = $widgetData['isAdmin']; - $vorlage = $this->organisationseinheitlib->treeSearchEntire( - '( - SELECT v.vorlage_kurzbz, v.bezeichnung, vs.version, vs.oe_kurzbz, vs.aktiv, vs.subject, vs.text, v.mimetype - FROM tbl_vorlagestudiengang vs INNER JOIN tbl_vorlage v USING(vorlage_kurzbz) - ) templates', - 'templates', - array("templates.vorlage_kurzbz AS id", "UPPER(templates.oe_kurzbz) || ' - ' || templates.bezeichnung || ' - V' || templates.version AS description"), - 'templates.aktiv = TRUE - AND templates.subject IS NOT NULL - AND templates.text IS NOT NULL - AND templates.mimetype = \'text/html\'', - "description ASC", - $widgetData['oe_kurzbz'] - ); + $vorlage = null; + + // If the user is an admin + if ($idAdmin === true) + { + // Get all the vorlage with mimetype = text/html + $vorlage = $this->_getAllHTMLVorlage(); + } + else + { + // Get all the vorlage that belongs to the organisation units of the user + // and the parents of those organisation units until the root of the + // organisation unit tree + $vorlage = $this->_getUserVorlage($oe_kurzbz); + } $this->setElementsArray( $vorlage, @@ -31,4 +33,96 @@ class Vorlage_widget extends DropdownWidget $this->loadDropDownView($widgetData); } + + /** + * Get all the vorlage with mimetype = text/html + */ + private function _getAllHTMLVorlage() + { + $this->load->model('system/Vorlage_model', 'VorlageModel'); + $this->VorlageModel->addOrder('vorlage_kurzbz'); + + $this->addSelectToModel($this->VorlageModel, 'vorlage_kurzbz', 'bezeichnung'); + + return $this->VorlageModel->loadWhere(array('mimetype' => 'text/html')); + } + + /** + * Get all the vorlage that belongs to the organisation units of the user + * and the parents of those organisation units until the root of the + * organisation unit tree + */ + private function _getUserVorlage($oe_kurzbz) + { + // Loads library OrganisationseinheitLib + $this->load->library('OrganisationseinheitLib'); + + $vorlage = success(array()); // Default value + + $table = '( + SELECT v.vorlage_kurzbz, v.bezeichnung, vs.version, vs.oe_kurzbz, vs.aktiv, vs.subject, vs.text, v.mimetype + FROM tbl_vorlagestudiengang vs INNER JOIN tbl_vorlage v USING(vorlage_kurzbz) + ) templates'; + $alias = 'templates'; + $fields = array("templates.vorlage_kurzbz AS id", "UPPER(templates.oe_kurzbz) || ' - ' || templates.bezeichnung || ' - V' || templates.version AS description"); + $where = 'templates.aktiv = TRUE + AND templates.subject IS NOT NULL + AND templates.text IS NOT NULL + AND templates.mimetype = \'text/html\''; + $order_by = 'description ASC'; + + if (!is_array($oe_kurzbz)) + { + $vorlage = $this->organisationseinheitlib->treeSearchEntire( + $table, + $alias, + $fields, + $where, + $order_by, + $oe_kurzbz + ); + } + else // is an array + { + // Get the vorlage for each organisation unit + foreach($oe_kurzbz as $val) + { + $tmpVorlage = $this->organisationseinheitlib->treeSearchEntire( + $table, + $alias, + $fields, + $where, + $order_by, + $val + ); + + // Everything is ok and data are inside + if (hasData($tmpVorlage)) + { + // If it's the first vorlage copy it + if (count($vorlage->retval) == 0) + { + $vorlage->retval = $tmpVorlage->retval; + } + else // checks for duplicates, if it's not already present push it into the array $vorlage->retval + { + for ($i = 0; $i < count($vorlage->retval); $i++) + { + for ($j = 0; $j < count($tmpVorlage->retval); $j++) + { + if ($vorlage->retval[$i]->_pk != $tmpVorlage->retval[$j]->_pk + && $vorlage->retval[$i]->_ppk != $tmpVorlage->retval[$j]->_ppk + && $vorlage->retval[$i]->_jtpk != $tmpVorlage->retval[$j]->_jtpk) + { + array_push($vorlage->retval, $tmpVorlage->retval[$j]); + } + } + } + } + } + } + } + + return $vorlage; + } } \ No newline at end of file From 60ab8fdd1b0f9b3fb69dae9b6a7e666a7a53e768 Mon Sep 17 00:00:00 2001 From: Andreas Oesterreicher Date: Wed, 7 Jun 2017 18:16:11 +0200 Subject: [PATCH 05/10] Fixed PHP7 Depecated Warnings --- content/statistik/mitarbeiterexport.xls.php | 26 +++--- include/Excel/BIFFwriter.php | 2 +- include/Excel/File.php | 4 +- include/Excel/Format.php | 14 ++-- include/Excel/OLE.php | 2 +- include/Excel/PEAR.php | 4 +- include/Excel/PPS.php | 2 +- include/Excel/Parser.php | 2 +- include/Excel/Root.php | 4 +- include/Excel/Validator.php | 2 +- include/Excel/Workbook.php | 4 +- include/Excel/Worksheet.php | 4 +- include/Excel/Writer.php | 4 +- include/xslfo2pdf/fpdf/fpdf.php | 2 +- include/xslfo2pdf/fpdf/myfpdf.php | 90 ++++++++++----------- 15 files changed, 83 insertions(+), 83 deletions(-) diff --git a/content/statistik/mitarbeiterexport.xls.php b/content/statistik/mitarbeiterexport.xls.php index 8ad9b8c5c..31463b29c 100644 --- a/content/statistik/mitarbeiterexport.xls.php +++ b/content/statistik/mitarbeiterexport.xls.php @@ -93,7 +93,7 @@ $mitarbeiterDAO->getPersonal($fix, $stgl, $fbl, $aktiv, $karenziert, $ausgeschie //sondern richtig mitsortiert $vorname=array(); $nachname=array(); - + $umlaute = array('ö','Ö','ü','Ü','ä','Ä'); $umlauterep = array('o','O','u','U','a','A'); foreach ($mitarbeiterDAO->result as $key=>$foo) @@ -102,7 +102,7 @@ foreach ($mitarbeiterDAO->result as $key=>$foo) $nachname[$key]=str_replace($umlaute, $umlauterep, $foo->nachname); } array_multisort($nachname, SORT_ASC, $vorname, SORT_ASC, $mitarbeiterDAO->result); - + // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); $workbook->setVersion(8); @@ -112,7 +112,7 @@ array_multisort($nachname, SORT_ASC, $vorname, SORT_ASC, $mitarbeiterDAO->result // Creating a worksheet $worksheet =& $workbook->addWorksheet("Mitarbeiter"); $worksheet->setInputEncoding('utf-8'); - + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -145,20 +145,20 @@ array_multisort($nachname, SORT_ASC, $vorname, SORT_ASC, $mitarbeiterDAO->result //Spalten ausgeben for ($i=0;$i<$anzSpalten;$i++) { - if(is_bool($mitarbeiter->$spalte[$i])) - $mitarbeiter->$spalte[$i] = ($mitarbeiter->$spalte[$i]?'Ja':'Nein'); - - if(mb_strlen($mitarbeiter->$spalte[$i])>$maxlength[$i]) - $maxlength[$i] = mb_strlen($mitarbeiter->$spalte[$i]); - $worksheet->write($j,$i, $mitarbeiter->$spalte[$i]); + if(is_bool($mitarbeiter->{$spalte[$i]})) + $mitarbeiter->{$spalte[$i]} = ($mitarbeiter->{$spalte[$i]}?'Ja':'Nein'); + + if(mb_strlen($mitarbeiter->{$spalte[$i]})>$maxlength[$i]) + $maxlength[$i] = mb_strlen($mitarbeiter->{$spalte[$i]}); + $worksheet->write($j,$i, $mitarbeiter->{$spalte[$i]}); } - + //Zustelladresse aus der Datenbank holen und dazuhaengen $qry = "SELECT * FROM public.tbl_adresse WHERE person_id='$mitarbeiter->person_id' AND zustelladresse=true LIMIT 1"; if($result = $db->db_query($qry)) { if($row = $db->db_fetch_object($result)) - { + { if(mb_strlen($row->strasse)>$maxlength[$i]) $maxlength[$i]=mb_strlen($row->strasse); $worksheet->write($j,$i, $row->strasse); @@ -168,7 +168,7 @@ array_multisort($nachname, SORT_ASC, $vorname, SORT_ASC, $mitarbeiterDAO->result if(mb_strlen($row->ort)>$maxlength[$i+2]) $maxlength[$i+2]=mb_strlen($row->ort); $worksheet->write($j,$i+2, $row->ort); - + if($row->firma_id!='') { $qry = "SELECT * FROM public.tbl_firma WHERE firma_id='$row->firma_id'"; @@ -184,7 +184,7 @@ array_multisort($nachname, SORT_ASC, $vorname, SORT_ASC, $mitarbeiterDAO->result } } } - + $j++; } diff --git a/include/Excel/BIFFwriter.php b/include/Excel/BIFFwriter.php index c8fbb1bd1..f6b659fa1 100644 --- a/include/Excel/BIFFwriter.php +++ b/include/Excel/BIFFwriter.php @@ -88,7 +88,7 @@ class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR * * @access public */ - function Spreadsheet_Excel_Writer_BIFFwriter() + function __construct() { $this->_byte_order = ''; $this->_data = ''; diff --git a/include/Excel/File.php b/include/Excel/File.php index ec2c8376e..090ebe6c5 100644 --- a/include/Excel/File.php +++ b/include/Excel/File.php @@ -43,10 +43,10 @@ class OLE_PPS_File extends OLE_PPS * @param string $name The name of the file (in Unicode) * @see OLE::Asc2Ucs() */ - function OLE_PPS_File($name) + function __construct($name) { $this->_tmp_dir = ''; - $this->OLE_PPS( + parent::__construct( null, $name, OLE_PPS_TYPE_FILE, diff --git a/include/Excel/Format.php b/include/Excel/Format.php index 829c3e353..074ec6cec 100644 --- a/include/Excel/Format.php +++ b/include/Excel/Format.php @@ -248,7 +248,7 @@ class Spreadsheet_Excel_Writer_Format extends PEAR * @param integer $index the XF index for the format. * @param array $properties array with properties to be set on initialization. */ - function Spreadsheet_Excel_Writer_Format($BIFF_version, $index = 0, $properties = array()) + function __construct($BIFF_version, $index = 0, $properties = array()) { $this->_xf_index = $index; $this->_BIFF_version = $BIFF_version; @@ -431,12 +431,12 @@ class Spreadsheet_Excel_Writer_Format extends PEAR //$rotation = 0x00; //oesi fix rotation mit utf8 switch($this->_rotation) - { - case 0: $rotation = 0; break; - case 1: $rotation = 255; break; - case 2: $rotation = 90; break; - case 3: $rotation = 180; break; - default: $rotation = 0; break; + { + case 0: $rotation = 0; break; + case 1: $rotation = 255; break; + case 2: $rotation = 90; break; + case 3: $rotation = 180; break; + default: $rotation = 0; break; } $biff8_options = 0x00; $data = pack("vvvC", $ifnt, $ifmt, $style, $align); diff --git a/include/Excel/OLE.php b/include/Excel/OLE.php index 9cbf18742..bda705b88 100644 --- a/include/Excel/OLE.php +++ b/include/Excel/OLE.php @@ -57,7 +57,7 @@ class OLE extends PEAR * Remember to use ampersand when creating an OLE object ($my_ole =& new OLE();) * @access public */ - function OLE() + function __construct() { $this->_list = array(); } diff --git a/include/Excel/PEAR.php b/include/Excel/PEAR.php index cf9724bc9..09f980021 100644 --- a/include/Excel/PEAR.php +++ b/include/Excel/PEAR.php @@ -167,7 +167,7 @@ class PEAR * @access public * @return void */ - function PEAR($error_class = null) + function __construct($error_class = null) { $classname = strtolower(get_class($this)); if ($this->_debug) { @@ -842,7 +842,7 @@ class PEAR_Error * @access public * */ - function PEAR_Error($message = 'unknown error', $code = null, + function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { if ($mode === null) { diff --git a/include/Excel/PPS.php b/include/Excel/PPS.php index 38ddbf926..ffb1e033f 100644 --- a/include/Excel/PPS.php +++ b/include/Excel/PPS.php @@ -116,7 +116,7 @@ class OLE_PPS extends PEAR * @param integer $time_2nd A timestamp * @param array $children Array containing children PPS for this PPS */ - function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) { $this->No = $No; $this->Name = $name; diff --git a/include/Excel/Parser.php b/include/Excel/Parser.php index 5d7a7e169..79a5eeb76 100644 --- a/include/Excel/Parser.php +++ b/include/Excel/Parser.php @@ -164,7 +164,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR * @param integer $byte_order The byte order (Little endian or Big endian) of the architecture (optional). 1 => big endian, 0 (default) little endian. */ - function Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version) + function __construct($byte_order, $biff_version) { $this->_current_char = 0; $this->_BIFF_version = $biff_version; diff --git a/include/Excel/Root.php b/include/Excel/Root.php index e3fd631dc..dc883f633 100644 --- a/include/Excel/Root.php +++ b/include/Excel/Root.php @@ -43,11 +43,11 @@ class OLE_PPS_Root extends OLE_PPS * @param integer $time_1st A timestamp * @param integer $time_2nd A timestamp */ - function OLE_PPS_Root($time_1st, $time_2nd, $raChild) + function __construct($time_1st, $time_2nd, $raChild) { $ole_obj = new OLE(); $this->_tmp_dir = ''; - $this->OLE_PPS( + parent::__construct( null, $ole_obj->Asc2Ucs('Root Entry'), OLE_PPS_TYPE_ROOT, diff --git a/include/Excel/Validator.php b/include/Excel/Validator.php index 9a776c6c3..cf68c57e3 100644 --- a/include/Excel/Validator.php +++ b/include/Excel/Validator.php @@ -66,7 +66,7 @@ class Spreadsheet_Excel_Writer_Validator */ var $_parser; - function Spreadsheet_Excel_Writer_Validator(&$parser) + function __construct(&$parser) { $this->_parser = $parser; $this->_type = 0x01; // FIXME: add method for setting datatype diff --git a/include/Excel/Workbook.php b/include/Excel/Workbook.php index f8d1149cd..a0fb64eb9 100644 --- a/include/Excel/Workbook.php +++ b/include/Excel/Workbook.php @@ -171,10 +171,10 @@ class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwri * @param string filename for storing the workbook. "-" for writing to stdout. * @access public */ - function Spreadsheet_Excel_Writer_Workbook($filename) + function __construct($filename) { // It needs to call its parent's constructor explicitly - $this->Spreadsheet_Excel_Writer_BIFFwriter(); + parent::__construct(); $this->_filename = $filename; $this->_parser = new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); diff --git a/include/Excel/Worksheet.php b/include/Excel/Worksheet.php index e92a2beed..0a5d3fbed 100644 --- a/include/Excel/Worksheet.php +++ b/include/Excel/Worksheet.php @@ -364,14 +364,14 @@ class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwr * @param mixed &$parser The formula parser created for the Workbook * @access private */ - function Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, + function __construct($BIFF_version, $name, $index, &$activesheet, &$firstsheet, &$str_total, &$str_unique, &$str_table, &$url_format, &$parser) { // It needs to call its parent's constructor explicitly - $this->Spreadsheet_Excel_Writer_BIFFwriter(); + parent::__construct(); $this->_BIFF_version = $BIFF_version; $rowmax = 65536; // 16384 in Excel 5 $colmax = 256; diff --git a/include/Excel/Writer.php b/include/Excel/Writer.php index 4ae1e04d2..90e62b3f5 100644 --- a/include/Excel/Writer.php +++ b/include/Excel/Writer.php @@ -49,10 +49,10 @@ class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook * @param string $filename The optional filename for the Workbook. * @return Spreadsheet_Excel_Writer_Workbook The Workbook created */ - function Spreadsheet_Excel_Writer($filename = '') + function __construct($filename = '') { $this->_filename = $filename; - $this->Spreadsheet_Excel_Writer_Workbook($filename); + parent::__construct($filename); } /** diff --git a/include/xslfo2pdf/fpdf/fpdf.php b/include/xslfo2pdf/fpdf/fpdf.php index d2d23b3fb..11dfb5b98 100644 --- a/include/xslfo2pdf/fpdf/fpdf.php +++ b/include/xslfo2pdf/fpdf/fpdf.php @@ -75,7 +75,7 @@ if(!class_exists('FPDF')) * Public methods * * * *******************************************************************************/ - function FPDF($orientation='P',$unit='mm',$format='A4') + function __construct($orientation='P',$unit='mm',$format='A4') { //Some checks $this->_dochecks(); diff --git a/include/xslfo2pdf/fpdf/myfpdf.php b/include/xslfo2pdf/fpdf/myfpdf.php index e1852c7bd..80ab014b5 100644 --- a/include/xslfo2pdf/fpdf/myfpdf.php +++ b/include/xslfo2pdf/fpdf/myfpdf.php @@ -25,7 +25,7 @@ require_once("fpdf.php"); class MyPdf extends FPDF { - + /** * Konstruktor * @@ -43,12 +43,12 @@ class MyPdf extends FPDF { * letter * legal */ - function MyPdf($orientation='P',$unit='mm',$format='A4') + function __construct($orientation='P',$unit='mm',$format='A4') { //Call parent constructor $this->FPDF($orientation,$unit,$format); } - + /** * Additional getter methods **/ @@ -79,14 +79,14 @@ class MyPdf extends FPDF { function GetPageWidth() { return $this->w-$this->rMargin-$this->lMargin; } - + function GetLineWidth() { return $this->LineWidth; } function FontExists($family, $style='') { $fontkey=$family.$style; - return isset($this->fonts[$fontkey]) || + return isset($this->fonts[$fontkey]) || isset($this->CoreFonts[$fontkey]); } @@ -94,7 +94,7 @@ class MyPdf extends FPDF { * Methods to capture output */ function startCapture() { - if($this->state==2) { + if($this->state==2) { $buf = $this->pages[$this->page]; $this->pages[$this->page] = ""; return $buf; @@ -103,11 +103,11 @@ class MyPdf extends FPDF { $buf = $this->buffer; $this->buffer = ""; return $buf; - } + } } - function endCapture($buffer) { - if($this->state==2) { + function endCapture($buffer) { + if($this->state==2) { $buf = $this->pages[$this->page]; $this->pages[$this->page] = $buffer; return $buf; @@ -116,17 +116,17 @@ class MyPdf extends FPDF { $buf = $this->buffer; $this->buffer = $buffer; return $buf; - } + } } function appendBuffer($buffer) { - if($this->state==2) { + if($this->state==2) { $this->pages[$this->page] .= $buffer; } else { $this->buffer .= $buffer; } - + } /** @@ -165,14 +165,14 @@ class MyPdf extends FPDF { * Write string regarding to \n as line breaks * Return an array containing number of line, width and height * of this textual block. The align paramtere accepts L, R and C - * get values using: + * get values using: * list($width, $height, $no, $firstX, $firstY, $lastX, $lastYl) = $pdf->Text2(); **/ function Text2($x, $y, $text, $align="L", $lineHeight=NULL, $xNewLine=NULL, $width=NULL) { if (!$xNewLine) { $xNewLine = $x; } - + $lines = explode('\n', $text); $height = ($lineHeight)?$lineHeight:$this->FontSize; //oesi - add parameter width for set the content-width of fo:block @@ -187,29 +187,29 @@ class MyPdf extends FPDF { $maxWidth = 0; $sx = $x; $sy = $y; - foreach($lines as $line) - { - - $width = $this->GetStringWidth($line); - do + foreach($lines as $line) + { + + $width = $this->GetStringWidth($line); + do { - //$w=$this->w-$this->rMargin-$x; + //$w=$this->w-$this->rMargin-$x; $w = $pw-$x; //oesi - changed //echo "w:$w
"; //$wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $noc = $this->GetNumberOfChars($w, $line); //echo "noc:$noc xNewLine: $xNewLine x:$x w:$w strlen:".strlen($line)." line:$line
"; - if ($noc == -1) + if ($noc == -1) { - if ($x == $xNewLine) + if ($x == $xNewLine) { //word has not enough space on one line, draw it beyond borders $noc = strlen($line); } - else + else { //echo "NEWLINE"; - if ($nb == 0) + if ($nb == 0) { $sy += $height; $sx = $xNewLine; @@ -221,12 +221,12 @@ class MyPdf extends FPDF { continue; } } - + $showLine = substr($line, 0, $noc); $textWidth = $this->GetStringWidth($showLine); //echo "showline: $showLine
"; //echo "nb:$nb x:$x w:$w textwidth:$textWidth showline:$showLine
"; - switch ($align) + switch ($align) { case "R": $tx = $pw-$textWidth; @@ -238,12 +238,12 @@ class MyPdf extends FPDF { default: $tx = $x; } - + $this->Text($tx, $y+$height, $showLine); $line = trim(substr($line, $noc)); $width = $this->GetStringWidth($line); - - if ($textWidth > $maxWidth) + + if ($textWidth > $maxWidth) { $maxWidth = $textWidth; } @@ -263,7 +263,7 @@ class MyPdf extends FPDF { return array($maxWidth, $tot_height, $nb, $sx, $sy, $tx+$textWidth, $y-$height); } - + /* This extension allows to set a dash pattern and draw dashed lines or rectangles. $pdf->SetDash(4,2); //4mm on, 2mm off @@ -327,22 +327,22 @@ class MyPdf extends FPDF { $yc = $y+$r; $this->_out(sprintf('%.2f %.2f l', $xc*$k,($hp-$y)*$k )); - $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, + $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc); $xc = $x+$w-$r ; $yc = $y+$h-$r; $this->_out(sprintf('%.2f %.2f l',($x+$w)*$k,($hp-$yc)*$k)); - $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, + $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r); $xc = $x+$r ; $yc = $y+$h-$r; $this->_out(sprintf('%.2f %.2f l',$xc*$k,($hp-($y+$h))*$k)); - $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, + $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc); $xc = $x+$r ; $yc = $y+$r; $this->_out(sprintf('%.2f %.2f l',($x)*$k,($hp-$yc)*$k )); - $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, + $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r); $this->_out($op); } @@ -352,7 +352,7 @@ class MyPdf extends FPDF { * $pdf->Rotate($angle,$x,$y); * $pdf->Text($x,$y,$txt); * $pdf->Rotate(0); - */ + */ function Rotate($angle,$x=-1,$y=-1) { if($x==-1) $x=$this->x; @@ -420,7 +420,7 @@ class MyPdf extends FPDF { $op = 'S'; break; } - + if ($rx) { if (!$ry) $ry = $rx; @@ -443,7 +443,7 @@ class MyPdf extends FPDF { $this->_out(sprintf('q %.2f %.2f %.2f %.2f %.2f %.2f cm', cos($a), -1 * sin($a), sin($a), cos($a), $x0*10, $y0*10)); $x0 = 0; $y0 = 0; - } + } $t1 = $astart; $a0 = $x0 + ($rx * cos($t1)); @@ -484,7 +484,7 @@ class MyPdf extends FPDF { $op='B'; else $op='S'; - + $this->_out(sprintf('h %s', $op)); } @@ -495,7 +495,7 @@ class MyPdf extends FPDF { $op='B'; else $op='S'; - + $this->_out(sprintf('%s', $op)); } @@ -520,7 +520,7 @@ class MyPdf extends FPDF { function _Point($x, $y) { $this->_out(sprintf('%.2f %.2f m', $x * $this->k, ($this->h - $y) * $this->k)); } - + // Draws a B�zier curve from last draw point // Parameters: // - x1, y1: Control point 1 @@ -528,9 +528,9 @@ class MyPdf extends FPDF { // - x3, y3: End point function _Curve($x1, $y1, $x2, $y2, $x3, $y3) { $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); - } + } + - // Draws a cubic B�zier curve from last draw point // Parameters: // - x2, y2: Control point 2 @@ -547,7 +547,7 @@ class MyPdf extends FPDF { function _CurveRef2($x1, $y1, $x3, $y3) { $this->_out(sprintf('%.2f %.2f %.2f %.2f y', $x1 * $this->k, ($this->h - $y1) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); - } + } // Draws a line from last draw point // Parameters: @@ -593,7 +593,7 @@ class MyPdf extends FPDF { //echo "X2:$x0:$y0
"; //$x0 -= cos($a); //$y0 -= $ry * sin($a); - } + } $t1 = $astart; $a0 = $x0 + ($rx * cos($t1)); @@ -627,4 +627,4 @@ class MyPdf extends FPDF { } -?> \ No newline at end of file +?> From bff6e480f87c335ae60352ad8679c4af09c8879b Mon Sep 17 00:00:00 2001 From: Andreas Oesterreicher Date: Wed, 7 Jun 2017 18:43:31 +0200 Subject: [PATCH 06/10] Fixed PHP7 Constructor --- include/pdf.inc.php | 6 +- include/pdf/fpdf.php | 4 +- include/pdf/fpdf.php.ie | 1618 ---------------------------- include/pdf/tutorial/20k_c1.txt | 10 - include/pdf/tutorial/20k_c2.txt | 23 - include/pdf/tutorial/calligra.afm | 275 ----- include/pdf/tutorial/calligra.php | 24 - include/pdf/tutorial/calligra.ttf | Bin 40120 -> 0 bytes include/pdf/tutorial/calligra.z | Bin 25604 -> 0 bytes include/pdf/tutorial/countries.txt | 15 - include/pdf/tutorial/index.htm | 18 - include/pdf/tutorial/logo.png | Bin 2373 -> 0 bytes include/pdf/tutorial/logo_pb.png | Bin 2656 -> 0 bytes include/pdf/tutorial/makefont.php | 6 - include/pdf/tutorial/tuto1.htm | 92 -- include/pdf/tutorial/tuto1.php | 10 - include/pdf/tutorial/tuto2.htm | 50 - include/pdf/tutorial/tuto2.php | 42 - include/pdf/tutorial/tuto3.htm | 43 - include/pdf/tutorial/tuto3.php | 84 -- include/pdf/tutorial/tuto4.htm | 34 - include/pdf/tutorial/tuto4.php | 114 -- include/pdf/tutorial/tuto5.htm | 43 - include/pdf/tutorial/tuto5.php | 102 -- include/pdf/tutorial/tuto6.htm | 68 -- include/pdf/tutorial/tuto6.php | 123 --- include/pdf/tutorial/tuto7.htm | 316 ------ include/pdf/tutorial/tuto7.php | 10 - 28 files changed, 5 insertions(+), 3125 deletions(-) delete mode 100644 include/pdf/fpdf.php.ie delete mode 100644 include/pdf/tutorial/20k_c1.txt delete mode 100644 include/pdf/tutorial/20k_c2.txt delete mode 100644 include/pdf/tutorial/calligra.afm delete mode 100644 include/pdf/tutorial/calligra.php delete mode 100644 include/pdf/tutorial/calligra.ttf delete mode 100644 include/pdf/tutorial/calligra.z delete mode 100644 include/pdf/tutorial/countries.txt delete mode 100644 include/pdf/tutorial/index.htm delete mode 100644 include/pdf/tutorial/logo.png delete mode 100644 include/pdf/tutorial/logo_pb.png delete mode 100644 include/pdf/tutorial/makefont.php delete mode 100644 include/pdf/tutorial/tuto1.htm delete mode 100644 include/pdf/tutorial/tuto1.php delete mode 100644 include/pdf/tutorial/tuto2.htm delete mode 100644 include/pdf/tutorial/tuto2.php delete mode 100644 include/pdf/tutorial/tuto3.htm delete mode 100644 include/pdf/tutorial/tuto3.php delete mode 100644 include/pdf/tutorial/tuto4.htm delete mode 100644 include/pdf/tutorial/tuto4.php delete mode 100644 include/pdf/tutorial/tuto5.htm delete mode 100644 include/pdf/tutorial/tuto5.php delete mode 100644 include/pdf/tutorial/tuto6.htm delete mode 100644 include/pdf/tutorial/tuto6.php delete mode 100644 include/pdf/tutorial/tuto7.htm delete mode 100644 include/pdf/tutorial/tuto7.php diff --git a/include/pdf.inc.php b/include/pdf.inc.php index 19e3ade5a..90279675a 100644 --- a/include/pdf.inc.php +++ b/include/pdf.inc.php @@ -27,10 +27,10 @@ class PDF extends FPDF * letter * legal */ - function PDF($orientation='P',$unit='mm',$format='A4') + function __construct($orientation='P',$unit='mm',$format='A4') { //Call parent constructor - $this->FPDF($orientation,$unit,$format); + parent::__construct($orientation,$unit,$format); //Initialization $this->B=0; $this->I=0; @@ -188,4 +188,4 @@ class PDF extends FPDF } } -?> \ No newline at end of file +?> diff --git a/include/pdf/fpdf.php b/include/pdf/fpdf.php index dc4efd5c0..c86e9ee68 100644 --- a/include/pdf/fpdf.php +++ b/include/pdf/fpdf.php @@ -6,7 +6,7 @@ * Date: 2008-08-03 * * Author: Olivier PLATHEY * *******************************************************************************/ -if (!defined('FPDF_VERSION')) +if (!defined('FPDF_VERSION')) define('FPDF_VERSION','1.6'); class FPDF @@ -72,7 +72,7 @@ var $PDFVersion; //PDF version number * Public methods * * * *******************************************************************************/ -function FPDF($orientation='P', $unit='mm', $format='A4') +function __construct($orientation='P', $unit='mm', $format='A4') { //Some checks $this->_dochecks(); diff --git a/include/pdf/fpdf.php.ie b/include/pdf/fpdf.php.ie deleted file mode 100644 index 631ab7f1e..000000000 --- a/include/pdf/fpdf.php.ie +++ /dev/null @@ -1,1618 +0,0 @@ -_dochecks(); - //Initialization of properties - $this->page=0; - $this->n=2; - $this->buffer=''; - $this->pages=array(); - $this->OrientationChanges=array(); - $this->state=0; - $this->fonts=array(); - $this->FontFiles=array(); - $this->diffs=array(); - $this->images=array(); - $this->links=array(); - $this->InFooter=false; - $this->lasth=0; - $this->FontFamily=''; - $this->FontStyle=''; - $this->FontSizePt=12; - $this->underline=false; - $this->DrawColor='0 G'; - $this->FillColor='0 g'; - $this->TextColor='0 g'; - $this->ColorFlag=false; - $this->ws=0; - //Standard fonts - $this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique', - 'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique', - 'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic', - 'symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats'); - //Scale factor - if($unit=='pt') - $this->k=1; - elseif($unit=='mm') - $this->k=72/25.4; - elseif($unit=='cm') - $this->k=72/2.54; - elseif($unit=='in') - $this->k=72; - else - $this->Error('Incorrect unit: '.$unit); - //Page format - if(is_string($format)) - { - $format=strtolower($format); - if($format=='a3') - $format=array(841.89,1190.55); - elseif($format=='a4') - $format=array(595.28,841.89); - elseif($format=='a5') - $format=array(420.94,595.28); - elseif($format=='letter') - $format=array(612,792); - elseif($format=='legal') - $format=array(612,1008); - else - $this->Error('Unknown page format: '.$format); - $this->fwPt=$format[0]; - $this->fhPt=$format[1]; - } - else - { - $this->fwPt=$format[0]*$this->k; - $this->fhPt=$format[1]*$this->k; - } - $this->fw=$this->fwPt/$this->k; - $this->fh=$this->fhPt/$this->k; - //Page orientation - $orientation=strtolower($orientation); - if($orientation=='p' or $orientation=='portrait') - { - $this->DefOrientation='P'; - $this->wPt=$this->fwPt; - $this->hPt=$this->fhPt; - } - elseif($orientation=='l' or $orientation=='landscape') - { - $this->DefOrientation='L'; - $this->wPt=$this->fhPt; - $this->hPt=$this->fwPt; - } - else - $this->Error('Incorrect orientation: '.$orientation); - $this->CurOrientation=$this->DefOrientation; - $this->w=$this->wPt/$this->k; - $this->h=$this->hPt/$this->k; - //Page margins (1 cm) - $margin=28.35/$this->k; - $this->SetMargins($margin,$margin); - //Interior cell margin (1 mm) - $this->cMargin=$margin/10; - //Line width (0.2 mm) - $this->LineWidth=.567/$this->k; - //Automatic page break - $this->SetAutoPageBreak(true,2*$margin); - //Full width display mode - $this->SetDisplayMode('fullwidth'); - //Compression - $this->SetCompression(true); -} - -function SetMargins($left,$top,$right=-1) -{ - //Set left, top and right margins - $this->lMargin=$left; - $this->tMargin=$top; - if($right==-1) - $right=$left; - $this->rMargin=$right; -} - -function SetLeftMargin($margin) -{ - //Set left margin - $this->lMargin=$margin; - if($this->page>0 and $this->x<$margin) - $this->x=$margin; -} - -function SetTopMargin($margin) -{ - //Set top margin - $this->tMargin=$margin; -} - -function SetRightMargin($margin) -{ - //Set right margin - $this->rMargin=$margin; -} - -function SetAutoPageBreak($auto,$margin=0) -{ - //Set auto page break mode and triggering margin - $this->AutoPageBreak=$auto; - $this->bMargin=$margin; - $this->PageBreakTrigger=$this->h-$margin; -} - -function SetDisplayMode($zoom,$layout='continuous') -{ - //Set display mode in viewer - if($zoom=='fullpage' or $zoom=='fullwidth' or $zoom=='real' or $zoom=='default' or !is_string($zoom)) - $this->ZoomMode=$zoom; - else - $this->Error('Incorrect zoom display mode: '.$zoom); - if($layout=='single' or $layout=='continuous' or $layout=='two' or $layout=='default') - $this->LayoutMode=$layout; - else - $this->Error('Incorrect layout display mode: '.$layout); -} - -function SetCompression($compress) -{ - //Set page compression - if(function_exists('gzcompress')) - $this->compress=$compress; - else - $this->compress=false; -} - -function SetTitle($title) -{ - //Title of document - $this->title=$title; -} - -function SetSubject($subject) -{ - //Subject of document - $this->subject=$subject; -} - -function SetAuthor($author) -{ - //Author of document - $this->author=$author; -} - -function SetKeywords($keywords) -{ - //Keywords of document - $this->keywords=$keywords; -} - -function SetCreator($creator) -{ - //Creator of document - $this->creator=$creator; -} - -function AliasNbPages($alias='{nb}') -{ - //Define an alias for total number of pages - $this->AliasNbPages=$alias; -} - -function Error($msg) -{ - //Fatal error - die('FPDF error: '.$msg); -} - -function Open() -{ - //Begin document - if($this->state==0) - $this->_begindoc(); -} - -function Close() -{ - //Terminate document - if($this->state==3) - return; - if($this->page==0) - $this->AddPage(); - //Page footer - $this->InFooter=true; - $this->Footer(); - $this->InFooter=false; - //Close page - $this->_endpage(); - //Close document - $this->_enddoc(); -} - -function AddPage($orientation='') -{ - //Start a new page - if($this->state==0) - $this->Open(); - $family=$this->FontFamily; - $style=$this->FontStyle.($this->underline ? 'U' : ''); - $size=$this->FontSizePt; - $lw=$this->LineWidth; - $dc=$this->DrawColor; - $fc=$this->FillColor; - $tc=$this->TextColor; - $cf=$this->ColorFlag; - if($this->page>0) - { - //Page footer - $this->InFooter=true; - $this->Footer(); - $this->InFooter=false; - //Close page - $this->_endpage(); - } - //Start new page - $this->_beginpage($orientation); - //Set line cap style to square - $this->_out('2 J'); - //Set line width - $this->LineWidth=$lw; - $this->_out(sprintf('%.2f w',$lw*$this->k)); - //Set font - if($family) - $this->SetFont($family,$style,$size); - //Set colors - $this->DrawColor=$dc; - if($dc!='0 G') - $this->_out($dc); - $this->FillColor=$fc; - if($fc!='0 g') - $this->_out($fc); - $this->TextColor=$tc; - $this->ColorFlag=$cf; - //Page header - $this->Header(); - //Restore line width - if($this->LineWidth!=$lw) - { - $this->LineWidth=$lw; - $this->_out(sprintf('%.2f w',$lw*$this->k)); - } - //Restore font - if($family) - $this->SetFont($family,$style,$size); - //Restore colors - if($this->DrawColor!=$dc) - { - $this->DrawColor=$dc; - $this->_out($dc); - } - if($this->FillColor!=$fc) - { - $this->FillColor=$fc; - $this->_out($fc); - } - $this->TextColor=$tc; - $this->ColorFlag=$cf; -} - -function Header() -{ - //To be implemented in your own inherited class -} - -function Footer() -{ - //To be implemented in your own inherited class -} - -function PageNo() -{ - //Get current page number - return $this->page; -} - -function SetDrawColor($r,$g=-1,$b=-1) -{ - //Set color for all stroking operations - if(($r==0 and $g==0 and $b==0) or $g==-1) - $this->DrawColor=sprintf('%.3f G',$r/255); - else - $this->DrawColor=sprintf('%.3f %.3f %.3f RG',$r/255,$g/255,$b/255); - if($this->page>0) - $this->_out($this->DrawColor); -} - -function SetFillColor($r,$g=-1,$b=-1) -{ - //Set color for all filling operations - if(($r==0 and $g==0 and $b==0) or $g==-1) - $this->FillColor=sprintf('%.3f g',$r/255); - else - $this->FillColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); - $this->ColorFlag=($this->FillColor!=$this->TextColor); - if($this->page>0) - $this->_out($this->FillColor); -} - -function SetTextColor($r,$g=-1,$b=-1) -{ - //Set color for text - if(($r==0 and $g==0 and $b==0) or $g==-1) - $this->TextColor=sprintf('%.3f g',$r/255); - else - $this->TextColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); - $this->ColorFlag=($this->FillColor!=$this->TextColor); -} - -function GetStringWidth($s) -{ - //Get width of a string in the current font - $s=(string)$s; - $cw=&$this->CurrentFont['cw']; - $w=0; - $l=strlen($s); - for($i=0;$i<$l;$i++) - $w+=$cw[$s{$i}]; - return $w*$this->FontSize/1000; -} - -function SetLineWidth($width) -{ - //Set line width - $this->LineWidth=$width; - if($this->page>0) - $this->_out(sprintf('%.2f w',$width*$this->k)); -} - -function Line($x1,$y1,$x2,$y2) -{ - //Draw a line - $this->_out(sprintf('%.2f %.2f m %.2f %.2f l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); -} - -function Rect($x,$y,$w,$h,$style='') -{ - //Draw a rectangle - if($style=='F') - $op='f'; - elseif($style=='FD' or $style=='DF') - $op='B'; - else - $op='S'; - $this->_out(sprintf('%.2f %.2f %.2f %.2f re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); -} - -function AddFont($family,$style='',$file='') -{ - //Add a TrueType or Type1 font - $family=strtolower($family); - if($family=='arial') - $family='helvetica'; - $style=strtoupper($style); - if($style=='IB') - $style='BI'; - if(isset($this->fonts[$family.$style])) - $this->Error('Font already added: '.$family.' '.$style); - if($file=='') - $file=str_replace(' ','',$family).strtolower($style).'.php'; - if(defined('FPDF_FONTPATH')) - $file=FPDF_FONTPATH.$file; - include($file); - if(!isset($name)) - $this->Error('Could not include font definition file'); - $i=count($this->fonts)+1; - $this->fonts[$family.$style]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file); - if($diff) - { - //Search existing encodings - $d=0; - $nb=count($this->diffs); - for($i=1;$i<=$nb;$i++) - if($this->diffs[$i]==$diff) - { - $d=$i; - break; - } - if($d==0) - { - $d=$nb+1; - $this->diffs[$d]=$diff; - } - $this->fonts[$family.$style]['diff']=$d; - } - if($file) - { - if($type=='TrueType') - $this->FontFiles[$file]=array('length1'=>$originalsize); - else - $this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2); - } -} - -function SetFont($family,$style='',$size=0) -{ - //Select a font; size given in points - global $fpdf_charwidths; - - $family=strtolower($family); - if($family=='') - $family=$this->FontFamily; - if($family=='arial') - $family='helvetica'; - elseif($family=='symbol' or $family=='zapfdingbats') - $style=''; - $style=strtoupper($style); - if(is_int(strpos($style,'U'))) - { - $this->underline=true; - $style=str_replace('U','',$style); - } - else - $this->underline=false; - if($style=='IB') - $style='BI'; - if($size==0) - $size=$this->FontSizePt; - //Test if font is already selected - if($this->FontFamily==$family and $this->FontStyle==$style and $this->FontSizePt==$size) - return; - //Test if used for the first time - $fontkey=$family.$style; - if(!isset($this->fonts[$fontkey])) - { - //Check if one of the standard fonts - if(isset($this->CoreFonts[$fontkey])) - { - if(!isset($fpdf_charwidths[$fontkey])) - { - //Load metric file - $file=$family; - if($family=='times' or $family=='helvetica') - $file.=strtolower($style); - $file.='.php'; - if(defined('FPDF_FONTPATH')) - $file=FPDF_FONTPATH.$file; - include($file); - if(!isset($fpdf_charwidths[$fontkey])) - $this->Error('Could not include font metric file'); - } - $i=count($this->fonts)+1; - $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]); - } - else - $this->Error('Undefined font: '.$family.' '.$style); - } - //Select it - $this->FontFamily=$family; - $this->FontStyle=$style; - $this->FontSizePt=$size; - $this->FontSize=$size/$this->k; - $this->CurrentFont=&$this->fonts[$fontkey]; - if($this->page>0) - $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); -} - -function SetFontSize($size) -{ - //Set font size in points - if($this->FontSizePt==$size) - return; - $this->FontSizePt=$size; - $this->FontSize=$size/$this->k; - if($this->page>0) - $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); -} - -function AddLink() -{ - //Create a new internal link - $n=count($this->links)+1; - $this->links[$n]=array(0,0); - return $n; -} - -function SetLink($link,$y=0,$page=-1) -{ - //Set destination of internal link - if($y==-1) - $y=$this->y; - if($page==-1) - $page=$this->page; - $this->links[$link]=array($page,$y); -} - -function Link($x,$y,$w,$h,$link) -{ - //Put a link on the page - $this->PageLinks[$this->page][]=array($x*$this->k,$this->hPt-$y*$this->k,$w*$this->k,$h*$this->k,$link); -} - -function Text($x,$y,$txt) -{ - //Output a string - $s=sprintf('BT %.2f %.2f Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); - if($this->underline and $txt!='') - $s.=' '.$this->_dounderline($x,$y,$txt); - if($this->ColorFlag) - $s='q '.$this->TextColor.' '.$s.' Q'; - $this->_out($s); -} - -function AcceptPageBreak() -{ - //Accept automatic page break or not - return $this->AutoPageBreak; -} - -function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='') -{ - //Output a cell - $k=$this->k; - if($this->y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) - { - //Automatic page break - $x=$this->x; - $ws=$this->ws; - if($ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->AddPage($this->CurOrientation); - $this->x=$x; - if($ws>0) - { - $this->ws=$ws; - $this->_out(sprintf('%.3f Tw',$ws*$k)); - } - } - if($w==0) - $w=$this->w-$this->rMargin-$this->x; - $s=''; - if($fill==1 or $border==1) - { - if($fill==1) - $op=($border==1) ? 'B' : 'f'; - else - $op='S'; - $s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); - } - if(is_string($border)) - { - $x=$this->x; - $y=$this->y; - if(is_int(strpos($border,'L'))) - $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); - if(is_int(strpos($border,'T'))) - $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); - if(is_int(strpos($border,'R'))) - $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); - if(is_int(strpos($border,'B'))) - $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); - } - if($txt!='') - { - if($align=='R') - $dx=$w-$this->cMargin-$this->GetStringWidth($txt); - elseif($align=='C') - $dx=($w-$this->GetStringWidth($txt))/2; - else - $dx=$this->cMargin; - if($this->ColorFlag) - $s.='q '.$this->TextColor.' '; - $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); - $s.=sprintf('BT %.2f %.2f Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); - if($this->underline) - $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); - if($this->ColorFlag) - $s.=' Q'; - if($link) - $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); - } - if($s) - $this->_out($s); - $this->lasth=$h; - if($ln>0) - { - //Go to next line - $this->y+=$h; - if($ln==1) - $this->x=$this->lMargin; - } - else - $this->x+=$w; -} - -function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0) -{ - //Output text with automatic or explicit line breaks - $cw=&$this->CurrentFont['cw']; - if($w==0) - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $s=str_replace("\r",'',$txt); - $nb=strlen($s); - if($nb>0 and $s[$nb-1]=="\n") - $nb--; - $b=0; - if($border) - { - if($border==1) - { - $border='LTRB'; - $b='LRT'; - $b2='LR'; - } - else - { - $b2=''; - if(is_int(strpos($border,'L'))) - $b2.='L'; - if(is_int(strpos($border,'R'))) - $b2.='R'; - $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2; - } - } - $sep=-1; - $i=0; - $j=0; - $l=0; - $ns=0; - $nl=1; - while($i<$nb) - { - //Get next character - $c=$s{$i}; - if($c=="\n") - { - //Explicit line break - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - $i++; - $sep=-1; - $j=$i; - $l=0; - $ns=0; - $nl++; - if($border and $nl==2) - $b=$b2; - continue; - } - if($c==' ') - { - $sep=$i; - $ls=$l; - $ns++; - } - $l+=$cw[$c]; - if($l>$wmax) - { - //Automatic line break - if($sep==-1) - { - if($i==$j) - $i++; - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - } - else - { - if($align=='J') - { - $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; - $this->_out(sprintf('%.3f Tw',$this->ws*$this->k)); - } - $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); - $i=$sep+1; - } - $sep=-1; - $j=$i; - $l=0; - $ns=0; - $nl++; - if($border and $nl==2) - $b=$b2; - } - else - $i++; - } - //Last chunk - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - if($border and is_int(strpos($border,'B'))) - $b.='B'; - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - $this->x=$this->lMargin; -} - -function Write($h,$txt,$link='') -{ - //Output text in flowing mode - $cw=&$this->CurrentFont['cw']; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $s=str_replace("\r",'',$txt); - $nb=strlen($s); - $sep=-1; - $i=0; - $j=0; - $l=0; - $nl=1; - while($i<$nb) - { - //Get next character - $c=$s{$i}; - if($c=="\n") - { - //Explicit line break - $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); - $i++; - $sep=-1; - $j=$i; - $l=0; - if($nl==1) - { - $this->x=$this->lMargin; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - } - $nl++; - continue; - } - if($c==' ') - $sep=$i; - $l+=$cw[$c]; - if($l>$wmax) - { - //Automatic line break - if($sep==-1) - { - if($this->x>$this->lMargin) - { - //Move to next line - $this->x=$this->lMargin; - $this->y+=$h; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $i++; - $nl++; - continue; - } - if($i==$j) - $i++; - $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); - } - else - { - $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); - $i=$sep+1; - } - $sep=-1; - $j=$i; - $l=0; - if($nl==1) - { - $this->x=$this->lMargin; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - } - $nl++; - } - else - $i++; - } - //Last chunk - if($i!=$j) - $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); -} - -function Image($file,$x,$y,$w=0,$h=0,$type='',$link='') -{ - //Put an image on the page - if(!isset($this->images[$file])) - { - //First use of image, get info - if($type=='') - { - $pos=strrpos($file,'.'); - if(!$pos) - $this->Error('Image file has no extension and no type was specified: '.$file); - $type=substr($file,$pos+1); - } - $type=strtolower($type); - $mqr=get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - if($type=='jpg' or $type=='jpeg') - $info=$this->_parsejpg($file); - elseif($type=='png') - $info=$this->_parsepng($file); - else - { - //Allow for additional formats - $mtd='_parse'.$type; - if(!method_exists($this,$mtd)) - $this->Error('Unsupported image type: '.$type); - $info=$this->$mtd($file); - } - set_magic_quotes_runtime($mqr); - $info['i']=count($this->images)+1; - $this->images[$file]=$info; - } - else - $info=$this->images[$file]; - //Automatic width and height calculation if needed - if($w==0 and $h==0) - { - //Put image at 72 dpi - $w=$info['w']/$this->k; - $h=$info['h']/$this->k; - } - if($w==0) - $w=$h*$info['w']/$info['h']; - if($h==0) - $h=$w*$info['h']/$info['w']; - $this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); - if($link) - $this->Link($x,$y,$w,$h,$link); -} - -function Ln($h='') -{ - //Line feed; default value is last cell height - $this->x=$this->lMargin; - if(is_string($h)) - $this->y+=$this->lasth; - else - $this->y+=$h; -} - -function GetX() -{ - //Get x position - return $this->x; -} - -function SetX($x) -{ - //Set x position - if($x>=0) - $this->x=$x; - else - $this->x=$this->w+$x; -} - -function GetY() -{ - //Get y position - return $this->y; -} - -function SetY($y) -{ - //Set y position and reset x - $this->x=$this->lMargin; - if($y>=0) - $this->y=$y; - else - $this->y=$this->h+$y; -} - -function SetXY($x,$y) -{ - //Set x and y positions - $this->SetY($y); - $this->SetX($x); -} - -function Output($name='',$dest='') -{ - //Output PDF to some destination - global $HTTP_SERVER_VARS; - - //Finish document if necessary - if($this->state<3) - $this->Close(); - //Normalize parameters - if(is_bool($dest)) - $dest=$dest ? 'D' : 'F'; - $dest=strtoupper($dest); - if($dest=='') - { - if($name=='') - { - $name='doc.pdf'; - $dest='I'; - } - else - $dest='F'; - } - switch($dest) - { - case 'I': - //Send to standard output - if(isset($HTTP_SERVER_VARS['SERVER_NAME'])) - { - //We send to a browser - Header('Content-Type: application/pdf'); - if(headers_sent()) - $this->Error('Some data has already been output to browser, can\'t send PDF file'); - Header('Content-Length: '.strlen($this->buffer)); - Header('Content-disposition: inline; filename='.$name); - } - echo $this->buffer; - break; - case 'D': - //Download file - if(isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']) and strpos($HTTP_SERVER_VARS['HTTP_USER_AGENT'],'MSIE')) - Header('Content-Type: application/force-download'); - else - Header('Content-Type: application/octet-stream'); - if(headers_sent()) - $this->Error('Some data has already been output to browser, can\'t send PDF file'); - Header('Content-Length: '.strlen($this->buffer)); - Header('Content-disposition: attachment; filename='.$name); - echo $this->buffer; - break; - case 'F': - //Save to local file - $f=fopen($name,'wb'); - if(!$f) - $this->Error('Unable to create output file: '.$name); - fwrite($f,$this->buffer,strlen($this->buffer)); - fclose($f); - break; - case 'S': - //Return as a string - return $this->buffer; - default: - $this->Error('Incorrect output destination: '.$dest); - } - return ''; -} - -/******************************************************************************* -* * -* Protected methods * -* * -*******************************************************************************/ -function _dochecks() -{ - //Check for locale-related bug - if(1.1==1) - $this->Error('Don\'t alter the locale before including class file'); - //Check for decimal separator - if(sprintf('%.1f',1.0)!='1.0') - setlocale(LC_NUMERIC,'C'); -} - -function _begindoc() -{ - //Start document - $this->state=1; - $this->_out('%PDF-1.3'); -} - -function _putpages() -{ - $nb=$this->page; - if(!empty($this->AliasNbPages)) - { - //Replace number of pages - for($n=1;$n<=$nb;$n++) - $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); - } - if($this->DefOrientation=='P') - { - $wPt=$this->fwPt; - $hPt=$this->fhPt; - } - else - { - $wPt=$this->fhPt; - $hPt=$this->fwPt; - } - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - for($n=1;$n<=$nb;$n++) - { - //Page - $this->_newobj(); - $this->_out('<_out('/Parent 1 0 R'); - if(isset($this->OrientationChanges[$n])) - $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt)); - $this->_out('/Resources 2 0 R'); - if(isset($this->PageLinks[$n])) - { - //Links - $annots='/Annots ['; - foreach($this->PageLinks[$n] as $pl) - { - $rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); - $annots.='<_textstring($pl[4]).'>>>>'; - else - { - $l=$this->links[$pl[4]]; - $h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt; - $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*$l[0],$h-$l[1]*$this->k); - } - } - $this->_out($annots.']'); - } - $this->_out('/Contents '.($this->n+1).' 0 R>>'); - $this->_out('endobj'); - //Page content - $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; - $this->_newobj(); - $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); - $this->_putstream($p); - $this->_out('endobj'); - } - //Pages root - $this->offsets[1]=strlen($this->buffer); - $this->_out('1 0 obj'); - $this->_out('<_out($kids.']'); - $this->_out('/Count '.$nb); - $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt)); - $this->_out('>>'); - $this->_out('endobj'); -} - -function _putfonts() -{ - $nf=$this->n; - foreach($this->diffs as $diff) - { - //Encodings - $this->_newobj(); - $this->_out('<>'); - $this->_out('endobj'); - } - $mqr=get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - foreach($this->FontFiles as $file=>$info) - { - //Font file embedding - $this->_newobj(); - $this->FontFiles[$file]['n']=$this->n; - if(defined('FPDF_FONTPATH')) - $file=FPDF_FONTPATH.$file; - $size=filesize($file); - if(!$size) - $this->Error('Font file not found'); - $this->_out('<_out('/Filter /FlateDecode'); - $this->_out('/Length1 '.$info['length1']); - if(isset($info['length2'])) - $this->_out('/Length2 '.$info['length2'].' /Length3 0'); - $this->_out('>>'); - $f=fopen($file,'rb'); - $this->_putstream(fread($f,$size)); - fclose($f); - $this->_out('endobj'); - } - set_magic_quotes_runtime($mqr); - foreach($this->fonts as $k=>$font) - { - //Font objects - $this->fonts[$k]['n']=$this->n+1; - $type=$font['type']; - $name=$font['name']; - if($type=='core') - { - //Standard font - $this->_newobj(); - $this->_out('<_out('/BaseFont /'.$name); - $this->_out('/Subtype /Type1'); - if($name!='Symbol' and $name!='ZapfDingbats') - $this->_out('/Encoding /WinAnsiEncoding'); - $this->_out('>>'); - $this->_out('endobj'); - } - elseif($type=='Type1' or $type=='TrueType') - { - //Additional Type1 or TrueType font - $this->_newobj(); - $this->_out('<_out('/BaseFont /'.$name); - $this->_out('/Subtype /'.$type); - $this->_out('/FirstChar 32 /LastChar 255'); - $this->_out('/Widths '.($this->n+1).' 0 R'); - $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); - if($font['enc']) - { - if(isset($font['diff'])) - $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); - else - $this->_out('/Encoding /WinAnsiEncoding'); - } - $this->_out('>>'); - $this->_out('endobj'); - //Widths - $this->_newobj(); - $cw=&$font['cw']; - $s='['; - for($i=32;$i<=255;$i++) - $s.=$cw[chr($i)].' '; - $this->_out($s.']'); - $this->_out('endobj'); - //Descriptor - $this->_newobj(); - $s='<$v) - $s.=' /'.$k.' '.$v; - $file=$font['file']; - if($file) - $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; - $this->_out($s.'>>'); - $this->_out('endobj'); - } - else - { - //Allow for additional types - $mtd='_put'.strtolower($type); - if(!method_exists($this,$mtd)) - $this->Error('Unsupported font type: '.$type); - $this->$mtd($font); - } - } -} - -function _putimages() -{ - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->images); - while(list($file,$info)=each($this->images)) - { - $this->_newobj(); - $this->images[$file]['n']=$this->n; - $this->_out('<_out('/Subtype /Image'); - $this->_out('/Width '.$info['w']); - $this->_out('/Height '.$info['h']); - if($info['cs']=='Indexed') - $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); - else - { - $this->_out('/ColorSpace /'.$info['cs']); - if($info['cs']=='DeviceCMYK') - $this->_out('/Decode [1 0 1 0 1 0 1 0]'); - } - $this->_out('/BitsPerComponent '.$info['bpc']); - $this->_out('/Filter /'.$info['f']); - if(isset($info['parms'])) - $this->_out($info['parms']); - if(isset($info['trns']) and is_array($info['trns'])) - { - $trns=''; - for($i=0;$i_out('/Mask ['.$trns.']'); - } - $this->_out('/Length '.strlen($info['data']).'>>'); - $this->_putstream($info['data']); - unset($this->images[$file]['data']); - $this->_out('endobj'); - //Palette - if($info['cs']=='Indexed') - { - $this->_newobj(); - $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; - $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); - $this->_putstream($pal); - $this->_out('endobj'); - } - } -} - -function _putresources() -{ - $this->_putfonts(); - $this->_putimages(); - //Resource dictionary - $this->offsets[2]=strlen($this->buffer); - $this->_out('2 0 obj'); - $this->_out('<_out('/Font <<'); - foreach($this->fonts as $font) - $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - if(count($this->images)) - { - $this->_out('/XObject <<'); - foreach($this->images as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - $this->_out('>>'); - } - $this->_out('>>'); - $this->_out('endobj'); -} - -function _putinfo() -{ - $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); - if(!empty($this->title)) - $this->_out('/Title '.$this->_textstring($this->title)); - if(!empty($this->subject)) - $this->_out('/Subject '.$this->_textstring($this->subject)); - if(!empty($this->author)) - $this->_out('/Author '.$this->_textstring($this->author)); - if(!empty($this->keywords)) - $this->_out('/Keywords '.$this->_textstring($this->keywords)); - if(!empty($this->creator)) - $this->_out('/Creator '.$this->_textstring($this->creator)); - $this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis'))); -} - -function _putcatalog() -{ - $this->_out('/Type /Catalog'); - $this->_out('/Pages 1 0 R'); - if($this->ZoomMode=='fullpage') - $this->_out('/OpenAction [3 0 R /Fit]'); - elseif($this->ZoomMode=='fullwidth') - $this->_out('/OpenAction [3 0 R /FitH null]'); - elseif($this->ZoomMode=='real') - $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); - elseif(!is_string($this->ZoomMode)) - $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); - if($this->LayoutMode=='single') - $this->_out('/PageLayout /SinglePage'); - elseif($this->LayoutMode=='continuous') - $this->_out('/PageLayout /OneColumn'); - elseif($this->LayoutMode=='two') - $this->_out('/PageLayout /TwoColumnLeft'); -} - -function _puttrailer() -{ - $this->_out('/Size '.($this->n+1)); - $this->_out('/Root '.$this->n.' 0 R'); - $this->_out('/Info '.($this->n-1).' 0 R'); -} - -function _enddoc() -{ - $this->_putpages(); - $this->_putresources(); - //Info - $this->_newobj(); - $this->_out('<<'); - $this->_putinfo(); - $this->_out('>>'); - $this->_out('endobj'); - //Catalog - $this->_newobj(); - $this->_out('<<'); - $this->_putcatalog(); - $this->_out('>>'); - $this->_out('endobj'); - //Cross-ref - $o=strlen($this->buffer); - $this->_out('xref'); - $this->_out('0 '.($this->n+1)); - $this->_out('0000000000 65535 f '); - for($i=1;$i<=$this->n;$i++) - $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); - //Trailer - $this->_out('trailer'); - $this->_out('<<'); - $this->_puttrailer(); - $this->_out('>>'); - $this->_out('startxref'); - $this->_out($o); - $this->_out('%%EOF'); - $this->state=3; -} - -function _beginpage($orientation) -{ - $this->page++; - $this->pages[$this->page]=''; - $this->state=2; - $this->x=$this->lMargin; - $this->y=$this->tMargin; - $this->FontFamily=''; - //Page orientation - if(!$orientation) - $orientation=$this->DefOrientation; - else - { - $orientation=strtoupper($orientation{0}); - if($orientation!=$this->DefOrientation) - $this->OrientationChanges[$this->page]=true; - } - if($orientation!=$this->CurOrientation) - { - //Change orientation - if($orientation=='P') - { - $this->wPt=$this->fwPt; - $this->hPt=$this->fhPt; - $this->w=$this->fw; - $this->h=$this->fh; - } - else - { - $this->wPt=$this->fhPt; - $this->hPt=$this->fwPt; - $this->w=$this->fh; - $this->h=$this->fw; - } - $this->PageBreakTrigger=$this->h-$this->bMargin; - $this->CurOrientation=$orientation; - } -} - -function _endpage() -{ - //End of page contents - $this->state=1; -} - -function _newobj() -{ - //Begin a new object - $this->n++; - $this->offsets[$this->n]=strlen($this->buffer); - $this->_out($this->n.' 0 obj'); -} - -function _dounderline($x,$y,$txt) -{ - //Underline text - $up=$this->CurrentFont['up']; - $ut=$this->CurrentFont['ut']; - $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); - return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); -} - -function _parsejpg($file) -{ - //Extract info from a JPEG file - $a=GetImageSize($file); - if(!$a) - $this->Error('Missing or incorrect image file: '.$file); - if($a[2]!=2) - $this->Error('Not a JPEG file: '.$file); - if(!isset($a['channels']) or $a['channels']==3) - $colspace='DeviceRGB'; - elseif($a['channels']==4) - $colspace='DeviceCMYK'; - else - $colspace='DeviceGray'; - $bpc=isset($a['bits']) ? $a['bits'] : 8; - //Read whole file - $f=fopen($file,'rb'); - $data=''; - while(!feof($f)) - $data.=fread($f,4096); - fclose($f); - return array('w'=>$a[0],'h'=>$a[1],'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data); -} - -function _parsepng($file) -{ - //Extract info from a PNG file - $f=fopen($file,'rb'); - if(!$f) - $this->Error('Can\'t open image file: '.$file); - //Check signature - if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) - $this->Error('Not a PNG file: '.$file); - //Read header chunk - fread($f,4); - if(fread($f,4)!='IHDR') - $this->Error('Incorrect PNG file: '.$file); - $w=$this->_freadint($f); - $h=$this->_freadint($f); - $bpc=ord(fread($f,1)); - if($bpc>8) - $this->Error('16-bit depth not supported: '.$file); - $ct=ord(fread($f,1)); - if($ct==0) - $colspace='DeviceGray'; - elseif($ct==2) - $colspace='DeviceRGB'; - elseif($ct==3) - $colspace='Indexed'; - else - $this->Error('Alpha channel not supported: '.$file); - if(ord(fread($f,1))!=0) - $this->Error('Unknown compression method: '.$file); - if(ord(fread($f,1))!=0) - $this->Error('Unknown filter method: '.$file); - if(ord(fread($f,1))!=0) - $this->Error('Interlacing not supported: '.$file); - fread($f,4); - $parms='/DecodeParms <>'; - //Scan chunks looking for palette, transparency and image data - $pal=''; - $trns=''; - $data=''; - do - { - $n=$this->_freadint($f); - $type=fread($f,4); - if($type=='PLTE') - { - //Read palette - $pal=fread($f,$n); - fread($f,4); - } - elseif($type=='tRNS') - { - //Read transparency info - $t=fread($f,$n); - if($ct==0) - $trns=array(ord(substr($t,1,1))); - elseif($ct==2) - $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); - else - { - $pos=strpos($t,chr(0)); - if(is_int($pos)) - $trns=array($pos); - } - fread($f,4); - } - elseif($type=='IDAT') - { - //Read image data block - $data.=fread($f,$n); - fread($f,4); - } - elseif($type=='IEND') - break; - else - fread($f,$n+4); - } - while($n); - if($colspace=='Indexed' and empty($pal)) - $this->Error('Missing palette in '.$file); - fclose($f); - return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data); -} - -function _freadint($f) -{ - //Read a 4-byte integer from file - $i=ord(fread($f,1))<<24; - $i+=ord(fread($f,1))<<16; - $i+=ord(fread($f,1))<<8; - $i+=ord(fread($f,1)); - return $i; -} - -function _textstring($s) -{ - //Format a text string - return '('.$this->_escape($s).')'; -} - -function _escape($s) -{ - //Add \ before \, ( and ) - return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s))); -} - -function _putstream($s) -{ - $this->_out('stream'); - $this->_out($s); - $this->_out('endstream'); -} - -function _out($s) -{ - //Add a line to the document - if($this->state==2) - $this->pages[$this->page].=$s."\n"; - else - $this->buffer.=$s."\n"; -} -//End of class -} - -//Handle special IE contype request -if(isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']) and $HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype') -{ - Header('Content-Type: application/pdf'); - exit; -} - -} -?> diff --git a/include/pdf/tutorial/20k_c1.txt b/include/pdf/tutorial/20k_c1.txt deleted file mode 100644 index 0b09f265f..000000000 --- a/include/pdf/tutorial/20k_c1.txt +++ /dev/null @@ -1,10 +0,0 @@ -The year 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten. Without getting into those rumors that upset civilians in the seaports and deranged the public mind even far inland, it must be said that professional seamen were especially alarmed. Traders, shipowners, captains of vessels, skippers, and master mariners from Europe and America, naval officers from every country, and at their heels the various national governments on these two continents, were all extremely disturbed by the business. -In essence, over a period of time several ships had encountered "an enormous thing" at sea, a long spindle-shaped object, sometimes giving off a phosphorescent glow, infinitely bigger and faster than any whale. -The relevant data on this apparition, as recorded in various logbooks, agreed pretty closely as to the structure of the object or creature in question, its unprecedented speed of movement, its startling locomotive power, and the unique vitality with which it seemed to be gifted. If it was a cetacean, it exceeded in bulk any whale previously classified by science. No naturalist, neither Cuvier nor Lacépède, neither Professor Dumeril nor Professor de Quatrefages, would have accepted the existence of such a monster sight unseen -- specifically, unseen by their own scientific eyes. -Striking an average of observations taken at different times -- rejecting those timid estimates that gave the object a length of 200 feet, and ignoring those exaggerated views that saw it as a mile wide and three long--you could still assert that this phenomenal creature greatly exceeded the dimensions of anything then known to ichthyologists, if it existed at all. -Now then, it did exist, this was an undeniable fact; and since the human mind dotes on objects of wonder, you can understand the worldwide excitement caused by this unearthly apparition. As for relegating it to the realm of fiction, that charge had to be dropped. -In essence, on July 20, 1866, the steamer Governor Higginson, from the Calcutta & Burnach Steam Navigation Co., encountered this moving mass five miles off the eastern shores of Australia. Captain Baker at first thought he was in the presence of an unknown reef; he was even about to fix its exact position when two waterspouts shot out of this inexplicable object and sprang hissing into the air some 150 feet. So, unless this reef was subject to the intermittent eruptions of a geyser, the Governor Higginson had fair and honest dealings with some aquatic mammal, until then unknown, that could spurt from its blowholes waterspouts mixed with air and steam. -Similar events were likewise observed in Pacific seas, on July 23 of the same year, by the Christopher Columbus from the West India & Pacific Steam Navigation Co. Consequently, this extraordinary cetacean could transfer itself from one locality to another with startling swiftness, since within an interval of just three days, the Governor Higginson and the Christopher Columbus had observed it at two positions on the charts separated by a distance of more than 700 nautical leagues. -Fifteen days later and 2,000 leagues farther, the Helvetia from the Compagnie Nationale and the Shannon from the Royal Mail line, running on opposite tacks in that part of the Atlantic lying between the United States and Europe, respectively signaled each other that the monster had been sighted in latitude 42 degrees 15' north and longitude 60 degrees 35' west of the meridian of Greenwich. From their simultaneous observations, they were able to estimate the mammal's minimum length at more than 350 English feet; this was because both the Shannon and the Helvetia were of smaller dimensions, although each measured 100 meters stem to stern. Now then, the biggest whales, those rorqual whales that frequent the waterways of the Aleutian Islands, have never exceeded a length of 56 meters--if they reach even that. -One after another, reports arrived that would profoundly affect public opinion: new observations taken by the transatlantic liner Pereire, the Inman line's Etna running afoul of the monster, an official report drawn up by officers on the French frigate Normandy, dead-earnest reckonings obtained by the general staff of Commodore Fitz-James aboard the Lord Clyde. In lighthearted countries, people joked about this phenomenon, but such serious, practical countries as England, America, and Germany were deeply concerned. -In every big city the monster was the latest rage; they sang about it in the coffee houses, they ridiculed it in the newspapers, they dramatized it in the theaters. The tabloids found it a fine opportunity for hatching all sorts of hoaxes. In those newspapers short of copy, you saw the reappearance of every gigantic imaginary creature, from "Moby Dick," that dreadful white whale from the High Arctic regions, to the stupendous kraken whose tentacles could entwine a 500-ton craft and drag it into the ocean depths. They even reprinted reports from ancient times: the views of Aristotle and Pliny accepting the existence of such monsters, then the Norwegian stories of Bishop Pontoppidan, the narratives of Paul Egede, and finally the reports of Captain Harrington -- whose good faith is above suspicion--in which he claims he saw, while aboard the Castilian in 1857, one of those enormous serpents that, until then, had frequented only the seas of France's old extremist newspaper, The Constitutionalist. diff --git a/include/pdf/tutorial/20k_c2.txt b/include/pdf/tutorial/20k_c2.txt deleted file mode 100644 index 096dbd193..000000000 --- a/include/pdf/tutorial/20k_c2.txt +++ /dev/null @@ -1,23 +0,0 @@ -During the period in which these developments were occurring, I had returned from a scientific undertaking organized to explore the Nebraska badlands in the United States. In my capacity as Assistant Professor at the Paris Museum of Natural History, I had been attached to this expedition by the French government. After spending six months in Nebraska, I arrived in New York laden with valuable collections near the end of March. My departure for France was set for early May. In the meantime, then, I was busy classifying my mineralogical, botanical, and zoological treasures when that incident took place with the Scotia. -I was perfectly abreast of this question, which was the big news of the day, and how could I not have been? I had read and reread every American and European newspaper without being any farther along. This mystery puzzled me. Finding it impossible to form any views, I drifted from one extreme to the other. Something was out there, that much was certain, and any doubting Thomas was invited to place his finger on the Scotia's wound. -When I arrived in New York, the question was at the boiling point. The hypothesis of a drifting islet or an elusive reef, put forward by people not quite in their right minds, was completely eliminated. And indeed, unless this reef had an engine in its belly, how could it move about with such prodigious speed? -Also discredited was the idea of a floating hull or some other enormous wreckage, and again because of this speed of movement. -So only two possible solutions to the question were left, creating two very distinct groups of supporters: on one side, those favoring a monster of colossal strength; on the other, those favoring an "underwater boat" of tremendous motor power. -Now then, although the latter hypothesis was completely admissible, it couldn't stand up to inquiries conducted in both the New World and the Old. That a private individual had such a mechanism at his disposal was less than probable. Where and when had he built it, and how could he have built it in secret? -Only some government could own such an engine of destruction, and in these disaster-filled times, when men tax their ingenuity to build increasingly powerful aggressive weapons, it was possible that, unknown to the rest of the world, some nation could have been testing such a fearsome machine. The Chassepot rifle led to the torpedo, and the torpedo has led to this underwater battering ram, which in turn will lead to the world putting its foot down. At least I hope it will. -But this hypothesis of a war machine collapsed in the face of formal denials from the various governments. Since the public interest was at stake and transoceanic travel was suffering, the sincerity of these governments could not be doubted. Besides, how could the assembly of this underwater boat have escaped public notice? Keeping a secret under such circumstances would be difficult enough for an individual, and certainly impossible for a nation whose every move is under constant surveillance by rival powers. -So, after inquiries conducted in England, France, Russia, Prussia, Spain, Italy, America, and even Turkey, the hypothesis of an underwater Monitor was ultimately rejected. -After I arrived in New York, several people did me the honor of consulting me on the phenomenon in question. In France I had published a two-volume work, in quarto, entitled The Mysteries of the Great Ocean Depths. Well received in scholarly circles, this book had established me as a specialist in this pretty obscure field of natural history. My views were in demand. As long as I could deny the reality of the business, I confined myself to a flat "no comment." But soon, pinned to the wall, I had to explain myself straight out. And in this vein, "the honorable Pierre Aronnax, Professor at the Paris Museum," was summoned by The New York Herald to formulate his views no matter what. -I complied. Since I could no longer hold my tongue, I let it wag. I discussed the question in its every aspect, both political and scientific, and this is an excerpt from the well-padded article I published in the issue of April 30. - -"Therefore," I wrote, "after examining these different hypotheses one by one, we are forced, every other supposition having been refuted, to accept the existence of an extremely powerful marine animal. -"The deepest parts of the ocean are totally unknown to us. No soundings have been able to reach them. What goes on in those distant depths? What creatures inhabit, or could inhabit, those regions twelve or fifteen miles beneath the surface of the water? What is the constitution of these animals? It's almost beyond conjecture. -"However, the solution to this problem submitted to me can take the form of a choice between two alternatives. -"Either we know every variety of creature populating our planet, or we do not. -"If we do not know every one of them, if nature still keeps ichthyological secrets from us, nothing is more admissible than to accept the existence of fish or cetaceans of new species or even new genera, animals with a basically 'cast-iron' constitution that inhabit strata beyond the reach of our soundings, and which some development or other, an urge or a whim if you prefer, can bring to the upper level of the ocean for long intervals. -"If, on the other hand, we do know every living species, we must look for the animal in question among those marine creatures already cataloged, and in this event I would be inclined to accept the existence of a giant narwhale. -"The common narwhale, or sea unicorn, often reaches a length of sixty feet. Increase its dimensions fivefold or even tenfold, then give this cetacean a strength in proportion to its size while enlarging its offensive weapons, and you have the animal we're looking for. It would have the proportions determined by the officers of the Shannon, the instrument needed to perforate the Scotia, and the power to pierce a steamer's hull. -"In essence, the narwhale is armed with a sort of ivory sword, or lance, as certain naturalists have expressed it. It's a king-sized tooth as hard as steel. Some of these teeth have been found buried in the bodies of baleen whales, which the narwhale attacks with invariable success. Others have been wrenched, not without difficulty, from the undersides of vessels that narwhales have pierced clean through, as a gimlet pierces a wine barrel. The museum at the Faculty of Medicine in Paris owns one of these tusks with a length of 2.25 meters and a width at its base of forty-eight centimeters! -"All right then! Imagine this weapon to be ten times stronger and the animal ten times more powerful, launch it at a speed of twenty miles per hour, multiply its mass times its velocity, and you get just the collision we need to cause the specified catastrophe. -"So, until information becomes more abundant, I plump for a sea unicorn of colossal dimensions, no longer armed with a mere lance but with an actual spur, like ironclad frigates or those warships called 'rams,' whose mass and motor power it would possess simultaneously. -"This inexplicable phenomenon is thus explained away--unless it's something else entirely, which, despite everything that has been sighted, studied, explored and experienced, is still possible!" diff --git a/include/pdf/tutorial/calligra.afm b/include/pdf/tutorial/calligra.afm deleted file mode 100644 index 806685eae..000000000 --- a/include/pdf/tutorial/calligra.afm +++ /dev/null @@ -1,275 +0,0 @@ -StartFontMetrics 4.1 -FontName Calligrapher-Regular -FullName Calligrapher Regular -Notice Generated by Fontographer 3.5 -EncodingScheme FontSpecific -FamilyName Calligrapher -Weight Regular -Version (Altsys Fontographer 3.5 5/26/92) -Characters 215 -ItalicAngle 0.0 -Ascender 899 -Descender -234 -UnderlineThickness 20 -UnderlinePosition -200 -IsFixedPitch false -FontBBox -50 -234 1328 899 -StartCharMetrics 256 -C 0 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 1 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 2 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 3 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 4 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 5 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 6 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 7 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 8 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 9 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 10 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 11 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 12 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 13 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 14 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 15 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 16 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 17 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 18 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 19 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 20 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 21 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 22 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 23 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 24 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 25 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 26 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 27 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 28 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 29 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 30 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 31 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 32 ; WX 282 ; N space ; B 67 -16 251 718 ; -C 33 ; WX 324 ; N exclam ; B 67 -16 251 718 ; -C 34 ; WX 405 ; N quotedbl ; B 60 460 353 718 ; -C 35 ; WX 584 ; N numbersign ; B 35 0 549 701 ; -C 36 ; WX 632 ; N dollar ; B 32 -126 595 814 ; -C 37 ; WX 980 ; N percent ; B 35 -16 945 703 ; -C 38 ; WX 776 ; N ampersand ; B 41 -17 811 670 ; -C 39 ; WX 259 ; N quotesingle ; B 72 460 206 718 ; -C 40 ; WX 299 ; N parenleft ; B 57 -119 299 785 ; -C 41 ; WX 299 ; N parenright ; B 0 -119 242 785 ; -C 42 ; WX 377 ; N asterisk ; B 35 407 342 714 ; -C 43 ; WX 600 ; N plus ; B 47 0 553 506 ; -C 44 ; WX 259 ; N comma ; B 35 -67 224 162 ; -C 45 ; WX 432 ; N hyphen ; B 28 249 404 377 ; -C 46 ; WX 254 ; N period ; B 43 -16 227 162 ; -C 47 ; WX 597 ; N slash ; B 7 -14 591 714 ; -C 48 ; WX 529 ; N zero ; B 21 -18 508 583 ; -C 49 ; WX 298 ; N one ; B 8 -15 233 582 ; -C 50 ; WX 451 ; N two ; B 17 -8 430 588 ; -C 51 ; WX 359 ; N three ; B 11 -54 337 582 ; -C 52 ; WX 525 ; N four ; B 18 -20 519 602 ; -C 53 ; WX 423 ; N five ; B 10 -55 420 582 ; -C 54 ; WX 464 ; N six ; B 23 -14 447 589 ; -C 55 ; WX 417 ; N seven ; B 8 -18 415 589 ; -C 56 ; WX 457 ; N eight ; B 19 -16 432 583 ; -C 57 ; WX 479 ; N nine ; B 26 -16 450 588 ; -C 58 ; WX 275 ; N colon ; B 59 -16 242 491 ; -C 59 ; WX 282 ; N semicolon ; B 54 -67 245 491 ; -C 60 ; WX 600 ; N less ; B 47 -8 553 514 ; -C 61 ; WX 600 ; N equal ; B 47 98 553 408 ; -C 62 ; WX 600 ; N greater ; B 47 -8 553 514 ; -C 63 ; WX 501 ; N question ; B 21 -16 473 721 ; -C 64 ; WX 800 ; N at ; B 29 -12 771 730 ; -C 65 ; WX 743 ; N A ; B -23 -14 754 723 ; -C 66 ; WX 636 ; N B ; B -42 -7 608 706 ; -C 67 ; WX 598 ; N C ; B 27 -12 572 712 ; -C 68 ; WX 712 ; N D ; B -42 -11 684 705 ; -C 69 ; WX 608 ; N E ; B -21 0 608 708 ; -C 70 ; WX 562 ; N F ; B -21 -18 584 716 ; -C 71 ; WX 680 ; N G ; B 29 -8 668 714 ; -C 72 ; WX 756 ; N H ; B 70 -17 777 728 ; -C 73 ; WX 308 ; N I ; B 14 -15 238 718 ; -C 74 ; WX 314 ; N J ; B 7 -223 244 727 ; -C 75 ; WX 676 ; N K ; B 14 -16 683 725 ; -C 76 ; WX 552 ; N L ; B 14 -8 580 713 ; -C 77 ; WX 1041 ; N M ; B 42 -17 1017 739 ; -C 78 ; WX 817 ; N N ; B -42 -17 747 736 ; -C 79 ; WX 729 ; N O ; B 32 -16 698 709 ; -C 80 ; WX 569 ; N P ; B -35 -15 570 716 ; -C 81 ; WX 698 ; N Q ; B 27 -201 1328 715 ; -C 82 ; WX 674 ; N R ; B -35 -20 696 712 ; -C 83 ; WX 618 ; N S ; B 31 -16 589 709 ; -C 84 ; WX 673 ; N T ; B -21 -20 702 714 ; -C 85 ; WX 805 ; N U ; B 0 -19 804 722 ; -C 86 ; WX 753 ; N V ; B -28 -20 788 729 ; -C 87 ; WX 1238 ; N W ; B -28 -17 1273 736 ; -C 88 ; WX 716 ; N X ; B 7 -38 709 731 ; -C 89 ; WX 754 ; N Y ; B -35 -17 789 747 ; -C 90 ; WX 599 ; N Z ; B 30 -5 584 748 ; -C 91 ; WX 315 ; N bracketleft ; B 93 -124 322 718 ; -C 92 ; WX 463 ; N backslash ; B -21 -18 484 736 ; -C 93 ; WX 315 ; N bracketright ; B -7 -124 222 718 ; -C 94 ; WX 600 ; N asciicircum ; B 63 266 537 658 ; -C 95 ; WX 547 ; N underscore ; B -7 -198 554 -163 ; -C 96 ; WX 278 ; N grave ; B -1 541 214 693 ; -C 97 ; WX 581 ; N a ; B 21 -16 581 494 ; -C 98 ; WX 564 ; N b ; B -24 -17 543 793 ; -C 99 ; WX 440 ; N c ; B 21 -17 422 490 ; -C 100 ; WX 571 ; N d ; B 0 -15 550 659 ; -C 101 ; WX 450 ; N e ; B 28 -23 428 493 ; -C 102 ; WX 347 ; N f ; B -35 -14 474 785 ; -C 103 ; WX 628 ; N g ; B 19 -219 612 496 ; -C 104 ; WX 611 ; N h ; B -29 -18 569 785 ; -C 105 ; WX 283 ; N i ; B -14 -15 241 679 ; -C 106 ; WX 283 ; N j ; B -14 -234 241 679 ; -C 107 ; WX 560 ; N k ; B -24 -15 582 789 ; -C 108 ; WX 252 ; N l ; B -28 -15 210 789 ; -C 109 ; WX 976 ; N m ; B -21 -16 927 494 ; -C 110 ; WX 595 ; N n ; B -28 -15 574 493 ; -C 111 ; WX 508 ; N o ; B 27 -17 485 490 ; -C 112 ; WX 549 ; N p ; B -28 -216 526 496 ; -C 113 ; WX 540 ; N q ; B 28 -219 491 493 ; -C 114 ; WX 395 ; N r ; B -21 -19 430 492 ; -C 115 ; WX 441 ; N s ; B 34 -15 413 493 ; -C 116 ; WX 307 ; N t ; B -21 -16 378 621 ; -C 117 ; WX 614 ; N u ; B -14 -18 558 501 ; -C 118 ; WX 556 ; N v ; B -28 -20 569 483 ; -C 119 ; WX 915 ; N w ; B -28 -17 928 495 ; -C 120 ; WX 559 ; N x ; B 14 -17 546 500 ; -C 121 ; WX 597 ; N y ; B -21 -227 541 500 ; -C 122 ; WX 452 ; N z ; B 28 -5 442 515 ; -C 123 ; WX 315 ; N braceleft ; B 6 -118 309 718 ; -C 124 ; WX 222 ; N bar ; B 63 -18 159 730 ; -C 125 ; WX 315 ; N braceright ; B 6 -118 309 718 ; -C 126 ; WX 600 ; N asciitilde ; B 69 166 531 340 ; -C 127 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 128 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 129 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 130 ; WX 0 ; N quotesinglbase ; B -23 -14 754 877 ; -C 131 ; WX 0 ; N florin ; B 0 -19 804 854 ; -C 132 ; WX 0 ; N quotedblbase ; B -23 -14 754 877 ; -C 133 ; WX 780 ; N ellipsis ; B 43 -16 747 162 ; -C 134 ; WX 0 ; N dagger ; B 27 -122 437 592 ; -C 135 ; WX 0 ; N daggerdbl ; B 43 278 227 456 ; -C 136 ; WX 278 ; N circumflex ; B -14 557 292 677 ; -C 137 ; WX 0 ; N perthousand ; B -23 -14 754 877 ; -C 138 ; WX 0 ; N Scaron ; B 0 0 0 100 ; -C 139 ; WX 0 ; N guilsinglleft ; B 43 278 227 456 ; -C 140 ; WX 1064 ; N OE ; B 32 -16 1055 709 ; -C 141 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 142 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 143 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 144 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 145 ; WX 259 ; N quoteleft ; B 35 489 224 717 ; -C 146 ; WX 259 ; N quoteright ; B 35 489 224 717 ; -C 147 ; WX 470 ; N quotedblleft ; B 35 489 443 717 ; -C 148 ; WX 470 ; N quotedblright ; B 35 487 443 717 ; -C 149 ; WX 500 ; N bullet ; B 70 179 430 539 ; -C 150 ; WX 300 ; N endash ; B 0 245 300 350 ; -C 151 ; WX 600 ; N emdash ; B 0 245 600 350 ; -C 152 ; WX 278 ; N tilde ; B -44 563 326 689 ; -C 153 ; WX 990 ; N trademark ; B 62 306 928 718 ; -C 154 ; WX 0 ; N scaron ; B 0 0 0 100 ; -C 155 ; WX 0 ; N guilsinglright ; B 43 278 227 456 ; -C 156 ; WX 790 ; N oe ; B 27 -23 764 493 ; -C 157 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 158 ; WX 800 ; N .notdef ; B 50 0 750 800 ; -C 159 ; WX 754 ; N Ydieresis ; B -35 -17 789 882 ; -C 160 ; WX 282 ; N nbspace ; B -23 -14 754 893 ; -C 161 ; WX 324 ; N exclamdown ; B 69 -203 253 531 ; -C 162 ; WX 450 ; N cent ; B 27 -122 437 592 ; -C 163 ; WX 640 ; N sterling ; B 0 -9 619 716 ; -C 164 ; WX 518 ; N currency ; B 3 72 515 586 ; -C 165 ; WX 603 ; N yen ; B -28 -65 631 747 ; -C 166 ; WX 0 ; N brokenbar ; B 0 0 0 100 ; -C 167 ; WX 519 ; N section ; B -50 -216 524 762 ; -C 168 ; WX 254 ; N dieresis ; B -20 554 308 682 ; -C 169 ; WX 800 ; N copyright ; B 29 -12 771 730 ; -C 170 ; WX 349 ; N ordfeminine ; B 13 385 349 717 ; -C 171 ; WX 0 ; N guillemotleft ; B 43 -16 747 162 ; -C 172 ; WX 0 ; N logicalnot ; B 30 0 730 700 ; -C 173 ; WX 432 ; N hyphen ; B 28 249 404 377 ; -C 174 ; WX 800 ; N registered ; B 29 -12 771 730 ; -C 175 ; WX 278 ; N macron ; B -47 584 325 665 ; -C 176 ; WX 0 ; N degree ; B 27 -122 437 592 ; -C 177 ; WX 0 ; N plusminus ; B 29 -8 668 877 ; -C 178 ; WX 0 ; N twosuperior ; B 0 0 0 100 ; -C 179 ; WX 0 ; N threesuperior ; B 0 0 0 100 ; -C 180 ; WX 278 ; N acute ; B 49 536 279 693 ; -C 181 ; WX 614 ; N mu ; B -14 -231 558 501 ; -C 182 ; WX 0 ; N paragraph ; B -35 -15 668 785 ; -C 183 ; WX 254 ; N periodcentered ; B 43 278 227 456 ; -C 184 ; WX 278 ; N cedilla ; B -8 -216 231 6 ; -C 185 ; WX 0 ; N onesuperior ; B 0 0 0 100 ; -C 186 ; WX 305 ; N ordmasculine ; B 16 373 291 702 ; -C 187 ; WX 0 ; N guillemotright ; B 43 -16 747 162 ; -C 188 ; WX 0 ; N onequarter ; B 0 0 0 100 ; -C 189 ; WX 0 ; N onehalf ; B 0 0 0 100 ; -C 190 ; WX 0 ; N threequarters ; B 0 0 0 100 ; -C 191 ; WX 501 ; N questiondown ; B 15 -196 467 541 ; -C 192 ; WX 743 ; N Agrave ; B -23 -14 754 893 ; -C 193 ; WX 743 ; N Aacute ; B -23 -14 754 893 ; -C 194 ; WX 743 ; N Acircumflex ; B -23 -14 754 877 ; -C 195 ; WX 743 ; N Atilde ; B -23 -14 754 889 ; -C 196 ; WX 743 ; N Adieresis ; B -23 -14 754 882 ; -C 197 ; WX 743 ; N Aring ; B -23 -14 754 899 ; -C 198 ; WX 1060 ; N AE ; B -29 -14 1053 708 ; -C 199 ; WX 598 ; N Ccedilla ; B 27 -183 572 712 ; -C 200 ; WX 608 ; N Egrave ; B -21 0 608 893 ; -C 201 ; WX 608 ; N Eacute ; B -21 0 608 893 ; -C 202 ; WX 608 ; N Ecircumflex ; B -21 0 608 877 ; -C 203 ; WX 608 ; N Edieresis ; B -21 0 608 882 ; -C 204 ; WX 308 ; N Igrave ; B 14 -15 264 893 ; -C 205 ; WX 308 ; N Iacute ; B 14 -15 274 893 ; -C 206 ; WX 308 ; N Icircumflex ; B 1 -15 307 877 ; -C 207 ; WX 308 ; N Idieresis ; B -15 -15 313 882 ; -C 208 ; WX 0 ; N Eth ; B 0 0 0 100 ; -C 209 ; WX 817 ; N Ntilde ; B -42 -17 747 889 ; -C 210 ; WX 729 ; N Ograve ; B 32 -16 698 893 ; -C 211 ; WX 729 ; N Oacute ; B 32 -16 698 893 ; -C 212 ; WX 729 ; N Ocircumflex ; B 32 -16 698 877 ; -C 213 ; WX 729 ; N Otilde ; B 32 -16 698 889 ; -C 214 ; WX 729 ; N Odieresis ; B 32 -16 698 882 ; -C 215 ; WX 0 ; N multiply ; B 0 0 0 100 ; -C 216 ; WX 729 ; N Oslash ; B 14 -24 724 709 ; -C 217 ; WX 805 ; N Ugrave ; B 0 -19 804 893 ; -C 218 ; WX 805 ; N Uacute ; B 0 -19 804 893 ; -C 219 ; WX 805 ; N Ucircumflex ; B 0 -19 804 877 ; -C 220 ; WX 805 ; N Udieresis ; B 0 -19 804 882 ; -C 221 ; WX 0 ; N _235 ; B 0 0 0 100 ; -C 222 ; WX 0 ; N Thorn ; B 0 0 0 100 ; -C 223 ; WX 688 ; N germandbls ; B -35 -15 668 785 ; -C 224 ; WX 581 ; N agrave ; B 21 -16 581 693 ; -C 225 ; WX 581 ; N aacute ; B 21 -16 581 693 ; -C 226 ; WX 581 ; N acircumflex ; B 21 -16 581 677 ; -C 227 ; WX 581 ; N atilde ; B 21 -16 581 689 ; -C 228 ; WX 581 ; N adieresis ; B 21 -16 581 682 ; -C 229 ; WX 581 ; N aring ; B 21 -16 581 734 ; -C 230 ; WX 792 ; N ae ; B 21 -23 773 494 ; -C 231 ; WX 440 ; N ccedilla ; B 21 -183 422 490 ; -C 232 ; WX 450 ; N egrave ; B 28 -23 428 693 ; -C 233 ; WX 450 ; N eacute ; B 28 -23 428 693 ; -C 234 ; WX 450 ; N ecircumflex ; B 28 -23 432 677 ; -C 235 ; WX 450 ; N edieresis ; B 28 -23 428 682 ; -C 236 ; WX 283 ; N igrave ; B -14 -15 244 693 ; -C 237 ; WX 283 ; N iacute ; B -14 -15 269 693 ; -C 238 ; WX 283 ; N icircumflex ; B -14 -15 297 677 ; -C 239 ; WX 283 ; N idieresis ; B -25 -15 303 682 ; -C 240 ; WX 0 ; N Yacute ; B 0 0 0 100 ; -C 241 ; WX 595 ; N ntilde ; B -28 -15 574 689 ; -C 242 ; WX 508 ; N ograve ; B 27 -17 485 693 ; -C 243 ; WX 508 ; N oacute ; B 27 -17 485 693 ; -C 244 ; WX 508 ; N ocircumflex ; B 27 -17 485 677 ; -C 245 ; WX 508 ; N otilde ; B 27 -17 485 689 ; -C 246 ; WX 508 ; N odieresis ; B 27 -17 485 682 ; -C 247 ; WX 0 ; N divide ; B 35 0 760 727 ; -C 248 ; WX 508 ; N oslash ; B -8 -54 496 589 ; -C 249 ; WX 614 ; N ugrave ; B -14 -18 558 693 ; -C 250 ; WX 614 ; N uacute ; B -14 -18 558 693 ; -C 251 ; WX 614 ; N ucircumflex ; B -14 -18 558 677 ; -C 252 ; WX 614 ; N udieresis ; B -14 -18 558 682 ; -C 253 ; WX 0 ; N yacute ; B 0 0 0 100 ; -C 254 ; WX 0 ; N thorn ; B 0 0 0 100 ; -C 255 ; WX 597 ; N ydieresis ; B -21 -227 541 682 ; -EndCharMetrics -EndFontMetrics diff --git a/include/pdf/tutorial/calligra.php b/include/pdf/tutorial/calligra.php deleted file mode 100644 index 1af82ac82..000000000 --- a/include/pdf/tutorial/calligra.php +++ /dev/null @@ -1,24 +0,0 @@ -899,'Descent'=>-234,'CapHeight'=>731,'Flags'=>32,'FontBBox'=>'[-50 -234 1328 899]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>800); -$up=-200; -$ut=20; -$cw=array( - chr(0)=>800,chr(1)=>800,chr(2)=>800,chr(3)=>800,chr(4)=>800,chr(5)=>800,chr(6)=>800,chr(7)=>800,chr(8)=>800,chr(9)=>800,chr(10)=>800,chr(11)=>800,chr(12)=>800,chr(13)=>800,chr(14)=>800,chr(15)=>800,chr(16)=>800,chr(17)=>800,chr(18)=>800,chr(19)=>800,chr(20)=>800,chr(21)=>800, - chr(22)=>800,chr(23)=>800,chr(24)=>800,chr(25)=>800,chr(26)=>800,chr(27)=>800,chr(28)=>800,chr(29)=>800,chr(30)=>800,chr(31)=>800,' '=>282,'!'=>324,'"'=>405,'#'=>584,'$'=>632,'%'=>980,'&'=>776,'\''=>259,'('=>299,')'=>299,'*'=>377,'+'=>600, - ','=>259,'-'=>432,'.'=>254,'/'=>597,'0'=>529,'1'=>298,'2'=>451,'3'=>359,'4'=>525,'5'=>423,'6'=>464,'7'=>417,'8'=>457,'9'=>479,':'=>275,';'=>282,'<'=>600,'='=>600,'>'=>600,'?'=>501,'@'=>800,'A'=>743, - 'B'=>636,'C'=>598,'D'=>712,'E'=>608,'F'=>562,'G'=>680,'H'=>756,'I'=>308,'J'=>314,'K'=>676,'L'=>552,'M'=>1041,'N'=>817,'O'=>729,'P'=>569,'Q'=>698,'R'=>674,'S'=>618,'T'=>673,'U'=>805,'V'=>753,'W'=>1238, - 'X'=>716,'Y'=>754,'Z'=>599,'['=>315,'\\'=>463,']'=>315,'^'=>600,'_'=>547,'`'=>278,'a'=>581,'b'=>564,'c'=>440,'d'=>571,'e'=>450,'f'=>347,'g'=>628,'h'=>611,'i'=>283,'j'=>283,'k'=>560,'l'=>252,'m'=>976, - 'n'=>595,'o'=>508,'p'=>549,'q'=>540,'r'=>395,'s'=>441,'t'=>307,'u'=>614,'v'=>556,'w'=>915,'x'=>559,'y'=>597,'z'=>452,'{'=>315,'|'=>222,'}'=>315,'~'=>600,chr(127)=>800,chr(128)=>800,chr(129)=>800,chr(130)=>0,chr(131)=>0, - chr(132)=>0,chr(133)=>780,chr(134)=>0,chr(135)=>0,chr(136)=>278,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>1064,chr(141)=>800,chr(142)=>800,chr(143)=>800,chr(144)=>800,chr(145)=>259,chr(146)=>259,chr(147)=>470,chr(148)=>470,chr(149)=>500,chr(150)=>300,chr(151)=>600,chr(152)=>278,chr(153)=>990, - chr(154)=>0,chr(155)=>0,chr(156)=>790,chr(157)=>800,chr(158)=>800,chr(159)=>754,chr(160)=>282,chr(161)=>324,chr(162)=>450,chr(163)=>640,chr(164)=>518,chr(165)=>603,chr(166)=>0,chr(167)=>519,chr(168)=>254,chr(169)=>800,chr(170)=>349,chr(171)=>0,chr(172)=>0,chr(173)=>432,chr(174)=>800,chr(175)=>278, - chr(176)=>0,chr(177)=>0,chr(178)=>0,chr(179)=>0,chr(180)=>278,chr(181)=>614,chr(182)=>0,chr(183)=>254,chr(184)=>278,chr(185)=>0,chr(186)=>305,chr(187)=>0,chr(188)=>0,chr(189)=>0,chr(190)=>0,chr(191)=>501,chr(192)=>743,chr(193)=>743,chr(194)=>743,chr(195)=>743,chr(196)=>743,chr(197)=>743, - chr(198)=>1060,chr(199)=>598,chr(200)=>608,chr(201)=>608,chr(202)=>608,chr(203)=>608,chr(204)=>308,chr(205)=>308,chr(206)=>308,chr(207)=>308,chr(208)=>0,chr(209)=>817,chr(210)=>729,chr(211)=>729,chr(212)=>729,chr(213)=>729,chr(214)=>729,chr(215)=>0,chr(216)=>729,chr(217)=>805,chr(218)=>805,chr(219)=>805, - chr(220)=>805,chr(221)=>0,chr(222)=>0,chr(223)=>688,chr(224)=>581,chr(225)=>581,chr(226)=>581,chr(227)=>581,chr(228)=>581,chr(229)=>581,chr(230)=>792,chr(231)=>440,chr(232)=>450,chr(233)=>450,chr(234)=>450,chr(235)=>450,chr(236)=>283,chr(237)=>283,chr(238)=>283,chr(239)=>283,chr(240)=>800,chr(241)=>595, - chr(242)=>508,chr(243)=>508,chr(244)=>508,chr(245)=>508,chr(246)=>508,chr(247)=>0,chr(248)=>508,chr(249)=>614,chr(250)=>614,chr(251)=>614,chr(252)=>614,chr(253)=>0,chr(254)=>0,chr(255)=>597); -$enc='cp1252'; -$diff=''; -$file='calligra.z'; -$originalsize=40120; -?> diff --git a/include/pdf/tutorial/calligra.ttf b/include/pdf/tutorial/calligra.ttf deleted file mode 100644 index 9713c468ca29f5bfcecb65d96e52711aaa5f50e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40120 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 EJEXL@qyPW_ diff --git a/include/pdf/tutorial/calligra.z b/include/pdf/tutorial/calligra.z deleted file mode 100644 index 1c0bebd20b3f68fe84a44520cc93c7cee39f2792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25604 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 jkH^DoB9A@c#fz}Vaf2UWPe| - - -Tutorials - - - -

Tutorials

-The different examples rapidly show how to use FPDF. You will find all main features explained.

-
Tutorial 1: Minimal example
-Tutorial 2: Header, footer, page break and image
-Tutorial 3: Line breaks and colors
-Tutorial 4: Multi-columns
-Tutorial 5: Tables
-Tutorial 6: Links and flowing text
-Tutorial 7: Adding new fonts and encoding support
- - diff --git a/include/pdf/tutorial/logo.png b/include/pdf/tutorial/logo.png deleted file mode 100644 index 284a0071c850b5a2f1ba86f16775c5c0da9fe082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 zcmV-L3A*-)P) zS%_F?mvV!)Wp=3lzjR1ZZHtquk)+#ujl{EuRFL;#2d9Y_EG2qsBHK~#90?U`$Hsz?xqBTOMI!)?Y&BDz(mToO~E7{;QGM&SSd ztL>QqykIFJODXr%nV!DR2p=YRXz_s#4F?{<&J9~1a7 zn?218?_>JcqaP`+aa*(ZO?=H5#F`cxrfJ&VZe0=s#ewTQ z#-W5zN>8`-ykIvOaV#JAO+$23$oAJS+(=Bb+`K>RiJ7y=q{|%xovz&L^sA1V2IFNS zNv7xTN|M0iZeBiY-DhkZor1En>&F);^@Kq{@iN(h6sp2oNTa|0nr|LO6->hnUFeL| z{j3|@q^ni31Z}rVfUMw&xeC0mx9OuRzn~goy+$Z0G--&o0+P^D3TV~@Q)2Jl$_GnT zL`>7_TGO;M)CC5i7Oaq_9jRwAa7SX>yN?I`*8(MqqVG`%F|dM_b{a^sN}dUQ;-Qd8 zz28UTUwuNc3z7hlCQV1Ar5)%dg!K0#Rmz%))IRD++C{NY-1UVhy%CZ{X_?yI$FD~M zYTFh#Q6#fhUnfurKumxv>w;v)bn_OP_IiGqyV;FY=2(Fws{W1yAY>_>gSJ-r_QGw` z|5%(;X65Vq2;@W^XL2tjs8MWPl2q>E%1v$4{yN!#EED3bHzUwO>p`MQ1L+FI+7Sp^ z#1=^DR<^&7VIwfMp6A(%d!X}>u1OQxr>-L{;qta1$)0rPa2m&{g-2~EH#Es<=nWah z*)Ofd$RHzK0Y~31I}$9~p(>O{RycA)7S;+xUOJUjJiflZ&N(&s>+7e`yrNWN#^0R| z5@Z_65h|pU@t(2ejUsZ~=sVEsD<=R_q|Z4aS0ER+<^Zz&x6@jB*S&HCs?I>A0m1@Q z@(>UQDnKshhtJQK1BnFa;DWdz{1CWZdzGZGmm#ECY##1{41z&aKBFZtBnV?dD+mc2 z0_0+076g7+daf+ekh~#^ztC!TJtaBSS&c$jXbGZZ-baKZgb5^XLot9v)Yy>5vlFcc z2|xH>y&q;QU0*jPr&6xNeT_;5l4Vjg0uZABniBdtlt^gnxz;&pH}86Drl;%cBIT7P z*AO-?Kx7V}kTxA?A|fhr_;~?Z*+FRbWdZ?7#*}Z;o1k_8ks)=&;G9sbKs6&AKp_qR zV)UsK&A~R%Imz6ur|(Wt*;X=2UG6Fn5g^)tS_u-ah&0lffy@DfC5VV_5qDdyxgu6a zQlkV6eLLSzb=x29P@Kus5m$gj!;`ikt?Waj603>3f>RP)3XtqUFr|pTy7e?_+1uqH z*mKQos$2f_n)75J38G~Oih7VB5#e#QVh=FbP8CRSk_0lR*NcKuW}c%~uxCL)<81<0 zwFJ#O&}0mH{hUuZC5XIyDv;p7;Kd7>pKPJqwz=&vz_D&|o)#TQ>eOC4P~TAro}gHH zrRS`ULnp`=t_fR%s1_vD_U#*-rvhn{OMSOnsL8eGq!&9*?kqM3Un%%?YgEagDMweN zego9B9(4j))(Qr2DA4E-mlwrxv)LSPMFTHVIDuS)E<+NE`teJ*0>xp)t?S*AljlxB z#2LxG&fP@KcnTzbHZ)Q(LE;iHFmU2vyjkBA(I#!%h_eU{&vGY%>7GbZUGFE8mS7~) z2Oz;o5*C`Cc{4{N;ilJl?gR!Jg_}1;V6TQL&YHc9Q6XfhXV`v0MA}x8_s*K!Gr-2T;ry zCQbK3BZ}3MW(dfJfL0tc-CBtg%g)D~{wAoB^|fy&B-93w6|;yIg~20@!4wk0@Id!! zN{)3AP+;L!gLMn`^F04hd6jebaOCQmJU@t}HJJ4vW?6`lTqtvj!f~8D!)i$}6;K-D z{ho@WmG@`9y*sb21>Ez*}pidXeo` z)YyHzknceb%x18OwvvQHtpjN&2oS!gFsbDM4XogKW{`5S7w=@T3~Hr&A)T)8gp?a$ zh};mCNG)=QCXxi#vr4x*zrifr%ZNlk9#n|X_C!jzmg@xs->K4!V!6BEHriuKVY+Ko zNIJ)EeCDJDny7$uv4#RId#0QLYOhJuQs;qv*W<8R#d?fF@r_WHhe)-ZNHegDt<#dv zE4G&)7KqGQWcD;G3>`WpgbzK*T3Kv-bhyy7uoWm1x4+O;gWGE@ag9(Pwytbi3lQT* z;(LJ+I_f3^ecuZ2AQ9AqeO#*0RqiHr#N7&;gYS-dB$iRc!-H*yI#ze^Tx@g(LG7V* zsrIAqW_i^e&L_MIh+cJn&Z|m-jLIm>stSf`1IcrBBKoKmW+gIhK0! zLk{FFP)jL-V-O-8=c(YZqM>dU_723~U6uXWS^SvulqLP8HNN0@~J(ZS{^iQ%D$a}ghP-vv}RRgkVd0{VOXhDs?}%MpYGfRIQC zv6z5iLMS8z0)o#6JRab30hpb0lvJxo zTuoxA2H>PhNvbgo0Z3e>0ct|ZC8TUZE+h${A#f6?H9$qGDI`YXN{t#JRWee+)8GnH zEhjNCsT67mHHlN?QWAqnrGP|vgq%qrbV3Gc07Xt6k&u{3gHb*3Nt8<{*d)p(6f8o{ zAmo+=LL(4JL#W7qOHi~jQY9w;1ye{SA*YiBP5`QeoK#aK1SG~Mfs#4QE1>0x1k6A}WP*EhzX12m?(?Ra`z9ja$bb$@~UVd)4 z8UOR+#jtZ*c7;QG5RKln-l(~)<%085T?0ko0rQHG0Bh7ClFg`BVCRFY&0I4KzxPa= zyH;VnQ29p%(e=jewq9l8pWc(F2ZwJBmXLeO$vBJ3o|VQ-r%4m9`xEvnS7qGTU7BIJ zg}z8&|NQdAF|&IA89|Bgl$TSG(RruiCV$zO=jX95dAA0xO#3o(Q_jeZ`k7n5Tz&8P zpGOayj%|79lT?RU^*9c0bGl>6F*VOW;x%+-f#3&zt*KL?)jRXMwwnWJ-J z_gY0KZ8jCgnm`-51Rh%ox%~?Q zpzH?=nzW=3U4*HNZm5bH#;v_~H9zaSkfx~e?e0roIQzo}=r^l#JxLy}*GFT?gy!Ly zmoIqxdb6FEDDAGl>DW0HTbCF$;y&20CVu*6+SsWC^FJzG?my-H7~e?Guvvg+PCQ^7 zeIj~SwjnAiws1H;Ye(ao#1yN6U%zI=#6VW-Cr2I|-u1tWb~n#{H#U`X>tmXecSG}e zC@Lm8(#*d~axRlR#|PXaIy;BvpPW83*L?q4pS853hP@MO)CH2uarx;pvK4Q6vn!^D zFK;o~mW8Z-bLMT+nYgo0yK47w?9<@I_j2k2Y}F3>yG?EuX+5s#^B8D%@J(n4+xU+g zuk)7CG1d5o{E?KK--F(SDSHn*UeXW$c=ze{FM5$}j7*LT$v8awu(^(oj@|~l%H!of z%I?a|-Isk%r*r?@{9BUsx`rS5%_r}3dM-huB}c$O#iqS?ex93` z8j-c^qodb}%gJFDNxML?MZ@q8Y;cs=li6F_7I$a!-F4ow{?08(4Yu0XCc988Ki%!D zOMhr+=*8}`^A}H-TCbDs?QnUz%y!8~NRsBgR2a}v8vrMU2YHb4;_HLoI1hqrr)h6R zuWl+YYJ3!r3e@+jgbbAAAF#GPVUt6QQDGMrDe9< zhY2mjxm17nokzD__92%Od%oJUYIT3RzNO1#R^Yr(Z|8;-pr14SQJ1ho1y$Q4=qvut zyzyk;KD+xr-FA9@`vJ~AC13k%zI^dtumBnAeU+IpFUccAe7$7VgI#5bJG%E5<#Ddh zW!pYr)_TQ#Iv(hkn!b+feM&=~@1!ja*MZhXB@uFv)&y4trI2 ziRlqPy))4by|>HfZe1)~oq{$5yXv-=N*jWPHz$wAJEa=bGdHAGbJ9m?%ahmk`?oPt zKMWdv`USh}4?n2u_|LTi#v6U)U(0?8aj+QU9T^MVD$c6;_%S1)VP<=~SF+30WUIWc zPE}Af?~;3gcu!1*~CUfL}=@kK2E<<|s}5_qSKqW;R1D0<%)oo?v*+KKrX-G!cNslA(3eqsJk11|S-s!* zw5j0U9p(6|@HE#0v&pEa%96z&w?zh;Uhw*RT~^1^?|FCKi!b`!H9GV)xqh9+OcTip z-O!iG+p=1#jENQ6`42-67Ms4vzhzv7KdHAhdp64;_vVt{TLMz{X8$a#8LWG1^6SC2 znxiN429AxNJQ@ASqu1Z@rM~~f%fkH|E|eK8Q=1^MUyTy%vdhLgM=~=*@}5MDO+{3% zx_xHgWcrAor(a2%{_HQcKim|kYi)Mx4kN>Do}3=|NFJdhWCz_|Rcq6P+;UpFN4VDZ z^THOyXQ{Vr!}FR)rMXaSOKgho(I_-$7Bs%R=|vc1uqJV%UH65Zuj{U?+*q&EFznnU z^IWzm_*Cf5goM+$$NO3PhO>sYSeG?S~s%X!jTauyEqHoQI3d`)5-&_fIy6=7fIR;(zY5A_` z<-#SxU9yE<-huZFgv(28;^Utfbl!@Xv(QV(lLVjD#0-DeX~nS@Dy_;_|9+1lL8}9= IayK9PFK}2WsQ>@~ diff --git a/include/pdf/tutorial/makefont.php b/include/pdf/tutorial/makefont.php deleted file mode 100644 index 3773429bd..000000000 --- a/include/pdf/tutorial/makefont.php +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/include/pdf/tutorial/tuto1.htm b/include/pdf/tutorial/tuto1.htm deleted file mode 100644 index 34f0480b7..000000000 --- a/include/pdf/tutorial/tuto1.htm +++ /dev/null @@ -1,92 +0,0 @@ - - - -Minimal example - - - -

Minimal example

-Let's start with the classic example: -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?> -
-

- -The first line defines where the font directory resides, relative to the current directory.
-Then, after including the library file, we create an FPDF object. -The FPDF() constructor is used here with the default values: pages are in A4 portrait and -the measure unit is millimeter. It could have been specified explicitly with: -
-
-
- -$pdf=new FPDF('P','mm','A4');
-
-

-It is possible to use landscape (L), other page formats (such as Letter and -Legal) and measure units (pt, cm, in). -
-
-There is no page for the moment, so we have to add one with AddPage(). The origin -is at the upper-left corner and the current position is by default placed at 1 cm from the -borders; the margins can be changed with SetMargins(). -
-
-Before we can print text, it is mandatory to select a font with SetFont(), otherwise the -document would be invalid. We choose Arial bold 16: -
-
-
- -$pdf->SetFont('Arial','B',16);
-
-

-We could have specified italics with I, underlined with U or a regular font with an empty string -(or any combination). Note that the font size is given in points, not millimeters (or another -user unit); it is the only exception. The other standard fonts are Times, Courier, Symbol and -ZapfDingbats. -
-
-We can now print a cell with Cell(). A cell is a rectangular area, possibly framed, -which contains some text. It is output at the current position. We specify its dimensions, -its text (centered or aligned), if borders should be drawn, and where the current position -moves after it (to the right, below or to the beginning of the next line). To add a frame, we would do this: -
-
-
- -$pdf->Cell(40,10,'Hello World !',1);
-
-

-To add a new cell next to it with centered text and go to the next line, we would do: -
-
-
- -$pdf->Cell(60,10,'Powered by FPDF.',0,1,'C');
-
-

-Remark : the line break can also be done with Ln(). This method allows to specify -in addition the height of the break. -
-
-Finally, the document is closed and sent to the browser with Output(). We could have saved -it in a file by passing the desired file name. -
-
-Caution: in case when the PDF is sent to the browser, nothing else must be output, not before -nor after (the least space or carriage return matters). If you send some data before, you will -get the error message: "Some data has already been output to browser, can't send PDF file". If -you send after, your browser may display a blank page. - - diff --git a/include/pdf/tutorial/tuto1.php b/include/pdf/tutorial/tuto1.php deleted file mode 100644 index 14b836242..000000000 --- a/include/pdf/tutorial/tuto1.php +++ /dev/null @@ -1,10 +0,0 @@ -AddPage(); -$pdf->SetFont('Arial','B',16); -$pdf->Cell(40,10,'Hello World!'); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto2.htm b/include/pdf/tutorial/tuto2.htm deleted file mode 100644 index 22e052d00..000000000 --- a/include/pdf/tutorial/tuto2.htm +++ /dev/null @@ -1,50 +0,0 @@ - - - -Header, footer, page break and image - - - -

Header, footer, page break and image

-Here is a two page example with header, footer and logo: -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
//Page header
function Header()
{
    
//Logo
    
$this->Image('logo_pb.png',10,8,33);
    
//Arial bold 15
    
$this->SetFont('Arial','B',15);
    
//Move to the right
    
$this->Cell(80);
    
//Title
    
$this->Cell(30,10,'Title',1,0,'C');
    
//Line break
    
$this->Ln(20);
}

//Page footer
function Footer()
{
    
//Position at 1.5 cm from bottom
    
$this->SetY(-15);
    
//Arial italic 8
    
$this->SetFont('Arial','I',8);
    
//Page number
    
$this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
}
}

//Instanciation of inherited class
$pdf=new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetFont('Times','',12);
for(
$i=1;$i<=40;$i++)
    
$pdf->Cell(0,10,'Printing line number '.$i,0,1);
$pdf->Output();
?> -
-

- -This example makes use of the Header() and Footer() methods to process page headers and -footers. They are called automatically. They already exist in the FPDF class but do nothing, -therefore we have to extend the class and override them. -
-
-The logo is printed with the Image() method by specifying its upper-left corner and -its width. The height is calculated automatically to respect the image proportions. -
-
-To print the page number, a null value is passed as the cell width. It means that the cell -should extend up to the right margin of the page; it is handy to center text. The current page -number is returned by the PageNo() method; as for the total number of pages, it is obtained -by means of the special value {nb} which will be substituted on document closure -(provided you first called AliasNbPages()). -
-Note the use of the SetY() method which allows to set position at an absolute location in -the page, starting from the top or the bottom. -
-
-Another interesting feature is used here: the automatic page breaking. As soon as a cell would -cross a limit in the page (at 2 centimeters from the bottom by default), a break is performed -and the font restored. Although the header and footer select their own font (Arial), the body -continues with Times. This mechanism of automatic restoration also applies to colors and line -width. The limit which triggers page breaks can be set with SetAutoPageBreak(). - - diff --git a/include/pdf/tutorial/tuto2.php b/include/pdf/tutorial/tuto2.php deleted file mode 100644 index 1bb8ddd05..000000000 --- a/include/pdf/tutorial/tuto2.php +++ /dev/null @@ -1,42 +0,0 @@ -Image('logo_pb.png',10,8,33); - //Arial bold 15 - $this->SetFont('Arial','B',15); - //Move to the right - $this->Cell(80); - //Title - $this->Cell(30,10,'Title',1,0,'C'); - //Line break - $this->Ln(20); -} - -//Page footer -function Footer() -{ - //Position at 1.5 cm from bottom - $this->SetY(-15); - //Arial italic 8 - $this->SetFont('Arial','I',8); - //Page number - $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); -} -} - -//Instanciation of inherited class -$pdf=new PDF(); -$pdf->AliasNbPages(); -$pdf->AddPage(); -$pdf->SetFont('Times','',12); -for($i=1;$i<=40;$i++) - $pdf->Cell(0,10,'Printing line number '.$i,0,1); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto3.htm b/include/pdf/tutorial/tuto3.htm deleted file mode 100644 index 41e434c17..000000000 --- a/include/pdf/tutorial/tuto3.htm +++ /dev/null @@ -1,43 +0,0 @@ - - - -Line breaks and colors - - - -

Line breaks and colors

-Let's continue with an example which prints justified paragraphs. It also illustrates the use -of colors. -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
function
Header()
{
    global
$title;

    
//Arial bold 15
    
$this->SetFont('Arial','B',15);
    
//Calculate width of title and position
    
$w=$this->GetStringWidth($title)+6;
    
$this->SetX((210-$w)/2);
    
//Colors of frame, background and text
    
$this->SetDrawColor(0,80,180);
    
$this->SetFillColor(230,230,0);
    
$this->SetTextColor(220,50,50);
    
//Thickness of frame (1 mm)
    
$this->SetLineWidth(1);
    
//Title
    
$this->Cell($w,9,$title,1,1,'C',1);
    
//Line break
    
$this->Ln(10);
}

function
Footer()
{
    
//Position at 1.5 cm from bottom
    
$this->SetY(-15);
    
//Arial italic 8
    
$this->SetFont('Arial','I',8);
    
//Text color in gray
    
$this->SetTextColor(128);
    
//Page number
    
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function
ChapterTitle($num,$label)
{
    
//Arial 12
    
$this->SetFont('Arial','',12);
    
//Background color
    
$this->SetFillColor(200,220,255);
    
//Title
    
$this->Cell(0,6,"Chapter $num : $label",0,1,'L',1);
    
//Line break
    
$this->Ln(4);
}

function
ChapterBody($file)
{
    
//Read text file
    
$f=fopen($file,'r');
    
$txt=fread($f,filesize($file));
    
fclose($f);
    
//Times 12
    
$this->SetFont('Times','',12);
    
//Output justified text
    
$this->MultiCell(0,5,$txt);
    
//Line break
    
$this->Ln();
    
//Mention in italics
    
$this->SetFont('','I');
    
$this->Cell(0,5,'(end of excerpt)');
}

function
PrintChapter($num,$title,$file)
{
    
$this->AddPage();
    
$this->ChapterTitle($num,$title);
    
$this->ChapterBody($file);
}
}

$pdf=new PDF();
$title='20000 Leagues Under the Seas';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
$pdf->Output();
?> -
-

- -The GetStringWidth() method allows to determine the length of a string in the current font, -which is used here to calculate the position and the width of the frame surrounding the title. -Then colors are set (via SetDrawColor(), SetFillColor() and SetTextColor()) and the -thickness of the line is set to 1 mm (against 0.2 by default) with SetLineWidth(). Finally, -we output the cell (the last parameter to 1 indicates that the background must be filled). -
-
-The method used to print the paragraphs is MultiCell(). Each time a line reaches the -right extremity of the cell or a carriage-return character is met, a line break is issued -and a new cell automatically created under the current one. Text is justified by default. -
-
-Two document properties are defined: title (SetTitle()) and author (SetAuthor()). -Properties can be viewed by two means. First is open the document directly with Acrobat Reader, -go to the File menu, Document info, General. Second, also available from the plug-in, is click -on the triangle just above the right scrollbar and choose Document info. - - diff --git a/include/pdf/tutorial/tuto3.php b/include/pdf/tutorial/tuto3.php deleted file mode 100644 index f2c38ff99..000000000 --- a/include/pdf/tutorial/tuto3.php +++ /dev/null @@ -1,84 +0,0 @@ -SetFont('Arial','B',15); - //Calculate width of title and position - $w=$this->GetStringWidth($title)+6; - $this->SetX((210-$w)/2); - //Colors of frame, background and text - $this->SetDrawColor(0,80,180); - $this->SetFillColor(230,230,0); - $this->SetTextColor(220,50,50); - //Thickness of frame (1 mm) - $this->SetLineWidth(1); - //Title - $this->Cell($w,9,$title,1,1,'C',1); - //Line break - $this->Ln(10); -} - -function Footer() -{ - //Position at 1.5 cm from bottom - $this->SetY(-15); - //Arial italic 8 - $this->SetFont('Arial','I',8); - //Text color in gray - $this->SetTextColor(128); - //Page number - $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); -} - -function ChapterTitle($num,$label) -{ - //Arial 12 - $this->SetFont('Arial','',12); - //Background color - $this->SetFillColor(200,220,255); - //Title - $this->Cell(0,6,"Chapter $num : $label",0,1,'L',1); - //Line break - $this->Ln(4); -} - -function ChapterBody($file) -{ - //Read text file - $f=fopen($file,'r'); - $txt=fread($f,filesize($file)); - fclose($f); - //Times 12 - $this->SetFont('Times','',12); - //Output justified text - $this->MultiCell(0,5,$txt); - //Line break - $this->Ln(); - //Mention in italics - $this->SetFont('','I'); - $this->Cell(0,5,'(end of excerpt)'); -} - -function PrintChapter($num,$title,$file) -{ - $this->AddPage(); - $this->ChapterTitle($num,$title); - $this->ChapterBody($file); -} -} - -$pdf=new PDF(); -$title='20000 Leagues Under the Seas'; -$pdf->SetTitle($title); -$pdf->SetAuthor('Jules Verne'); -$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); -$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto4.htm b/include/pdf/tutorial/tuto4.htm deleted file mode 100644 index 5d7ae86eb..000000000 --- a/include/pdf/tutorial/tuto4.htm +++ /dev/null @@ -1,34 +0,0 @@ - - - -Multi-columns - - - -

Multi-columns

-This example is a variant of the previous one showing how to lay the text across multiple -columns. -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
//Current column
var $col=0;
//Ordinate of column start
var $y0;

function
Header()
{
    
//Page header
    
global $title;

    
$this->SetFont('Arial','B',15);
    
$w=$this->GetStringWidth($title)+6;
    
$this->SetX((210-$w)/2);
    
$this->SetDrawColor(0,80,180);
    
$this->SetFillColor(230,230,0);
    
$this->SetTextColor(220,50,50);
    
$this->SetLineWidth(1);
    
$this->Cell($w,9,$title,1,1,'C',1);
    
$this->Ln(10);
    
//Save ordinate
    
$this->y0=$this->GetY();
}

function
Footer()
{
    
//Page footer
    
$this->SetY(-15);
    
$this->SetFont('Arial','I',8);
    
$this->SetTextColor(128);
    
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function
SetCol($col)
{
    
//Set position at a given column
    
$this->col=$col;
    
$x=10+$col*65;
    
$this->SetLeftMargin($x);
    
$this->SetX($x);
}

function
AcceptPageBreak()
{
    
//Method accepting or not automatic page break
    
if($this->col<2)
    {
        
//Go to next column
        
$this->SetCol($this->col+1);
        
//Set ordinate to top
        
$this->SetY($this->y0);
        
//Keep on page
        
return false;
    }
    else
    {
        
//Go back to first column
        
$this->SetCol(0);
        
//Page break
        
return true;
    }
}

function
ChapterTitle($num,$label)
{
    
//Title
    
$this->SetFont('Arial','',12);
    
$this->SetFillColor(200,220,255);
    
$this->Cell(0,6,"Chapter  $num : $label",0,1,'L',1);
    
$this->Ln(4);
    
//Save ordinate
    
$this->y0=$this->GetY();
}

function
ChapterBody($fichier)
{
    
//Read text file
    
$f=fopen($fichier,'r');
    
$txt=fread($f,filesize($fichier));
    
fclose($f);
    
//Font
    
$this->SetFont('Times','',12);
    
//Output text in a 6 cm width column
    
$this->MultiCell(60,5,$txt);
    
$this->Ln();
    
//Mention
    
$this->SetFont('','I');
    
$this->Cell(0,5,'(end of excerpt)');
    
//Go back to first column
    
$this->SetCol(0);
}

function
PrintChapter($num,$title,$file)
{
    
//Add chapter
    
$this->AddPage();
    
$this->ChapterTitle($num,$title);
    
$this->ChapterBody($file);
}
}

$pdf=new PDF();
$title='20000 Leagues Under the Seas';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
$pdf->Output();
?> -
-

- -The key method used is AcceptPageBreak(). It allows to accept or not an automatic page -break. By refusing it and altering the margin and current position, the desired column layout -is achieved. -
-For the rest, not much change; two properties have been added to the class to save the current -column number and the position where columns begin, and the MultiCell() call specifies a -6 centimeter width. - - diff --git a/include/pdf/tutorial/tuto4.php b/include/pdf/tutorial/tuto4.php deleted file mode 100644 index 41d6ff6fb..000000000 --- a/include/pdf/tutorial/tuto4.php +++ /dev/null @@ -1,114 +0,0 @@ -SetFont('Arial','B',15); - $w=$this->GetStringWidth($title)+6; - $this->SetX((210-$w)/2); - $this->SetDrawColor(0,80,180); - $this->SetFillColor(230,230,0); - $this->SetTextColor(220,50,50); - $this->SetLineWidth(1); - $this->Cell($w,9,$title,1,1,'C',1); - $this->Ln(10); - //Save ordinate - $this->y0=$this->GetY(); -} - -function Footer() -{ - //Page footer - $this->SetY(-15); - $this->SetFont('Arial','I',8); - $this->SetTextColor(128); - $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C'); -} - -function SetCol($col) -{ - //Set position at a given column - $this->col=$col; - $x=10+$col*65; - $this->SetLeftMargin($x); - $this->SetX($x); -} - -function AcceptPageBreak() -{ - //Method accepting or not automatic page break - if($this->col<2) - { - //Go to next column - $this->SetCol($this->col+1); - //Set ordinate to top - $this->SetY($this->y0); - //Keep on page - return false; - } - else - { - //Go back to first column - $this->SetCol(0); - //Page break - return true; - } -} - -function ChapterTitle($num,$label) -{ - //Title - $this->SetFont('Arial','',12); - $this->SetFillColor(200,220,255); - $this->Cell(0,6,"Chapter $num : $label",0,1,'L',1); - $this->Ln(4); - //Save ordinate - $this->y0=$this->GetY(); -} - -function ChapterBody($fichier) -{ - //Read text file - $f=fopen($fichier,'r'); - $txt=fread($f,filesize($fichier)); - fclose($f); - //Font - $this->SetFont('Times','',12); - //Output text in a 6 cm width column - $this->MultiCell(60,5,$txt); - $this->Ln(); - //Mention - $this->SetFont('','I'); - $this->Cell(0,5,'(end of excerpt)'); - //Go back to first column - $this->SetCol(0); -} - -function PrintChapter($num,$title,$file) -{ - //Add chapter - $this->AddPage(); - $this->ChapterTitle($num,$title); - $this->ChapterBody($file); -} -} - -$pdf=new PDF(); -$title='20000 Leagues Under the Seas'; -$pdf->SetTitle($title); -$pdf->SetAuthor('Jules Verne'); -$pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt'); -$pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt'); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto5.htm b/include/pdf/tutorial/tuto5.htm deleted file mode 100644 index b0263003e..000000000 --- a/include/pdf/tutorial/tuto5.htm +++ /dev/null @@ -1,43 +0,0 @@ - - - -Tables - - - -

Tables

-This tutorial shows how to make tables easily. -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
//Load data
function LoadData($file)
{
    
//Read file lines
    
$lines=file($file);
    
$data=array();
    foreach(
$lines as $line)
        
$data[]=explode(';',chop($line));
    return
$data;
}

//Simple table
function BasicTable($header,$data)
{
    
//Header
    
foreach($header as $col)
        
$this->Cell(40,7,$col,1);
    
$this->Ln();
    
//Data
    
foreach($data as $row)
    {
        foreach(
$row as $col)
            
$this->Cell(40,6,$col,1);
        
$this->Ln();
    }
}

//Better table
function ImprovedTable($header,$data)
{
    
//Column widths
    
$w=array(40,35,40,45);
    
//Header
    
for($i=0;$i<count($header);$i++)
        
$this->Cell($w[$i],7,$header[$i],1,0,'C');
    
$this->Ln();
    
//Data
    
foreach($data as $row)
    {
        
$this->Cell($w[0],6,$row[0],'LR');
        
$this->Cell($w[1],6,$row[1],'LR');
        
$this->Cell($w[2],6,number_format($row[2]),'LR',0,'R');
        
$this->Cell($w[3],6,number_format($row[3]),'LR',0,'R');
        
$this->Ln();
    }
    
//Closure line
    
$this->Cell(array_sum($w),0,'','T');
}

//Colored table
function FancyTable($header,$data)
{
    
//Colors, line width and bold font
    
$this->SetFillColor(255,0,0);
    
$this->SetTextColor(255);
    
$this->SetDrawColor(128,0,0);
    
$this->SetLineWidth(.3);
    
$this->SetFont('','B');
    
//Header
    
$w=array(40,35,40,45);
    for(
$i=0;$i<count($header);$i++)
        
$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
    
$this->Ln();
    
//Color and font restoration
    
$this->SetFillColor(224,235,255);
    
$this->SetTextColor(0);
    
$this->SetFont('');
    
//Data
    
$fill=0;
    foreach(
$data as $row)
    {
        
$this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
        
$this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
        
$this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill);
        
$this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill);
        
$this->Ln();
        
$fill=!$fill;
    }
    
$this->Cell(array_sum($w),0,'','T');
}
}

$pdf=new PDF();
//Column titles
$header=array('Country','Capital','Area (sq km)','Pop. (thousands)');
//Data loading
$data=$pdf->LoadData('countries.txt');
$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->BasicTable($header,$data);
$pdf->AddPage();
$pdf->ImprovedTable($header,$data);
$pdf->AddPage();
$pdf->FancyTable($header,$data);
$pdf->Output();
?> -
-

- -A table being just a collection of cells, it is natural to build one from them. The first -example is achieved in the most basic way possible: simple framed cells, all of the same size -and left aligned. The result is rudimentary but very quick to obtain. -
-
-The second table brings some improvements: each column has its own width, titles are centered -and figures right aligned. Moreover, horizontal lines have been removed. This is done by means -of the border parameter of the Cell() method, which specifies which sides of the -cell must be drawn. Here we want the left (L) and right (R) ones. It remains -the problem of the horizontal line to finish the table. There are two possibilities: either -check for the last line in the loop, in which case we use LRB for the border -parameter; or, as done here, add the line once the loop is over. -
-
-The third table is similar to the second one but uses colors. Fill, text and line colors are -simply specified. Alternate coloring for rows is obtained by using alternatively transparent -and filled cells. - - diff --git a/include/pdf/tutorial/tuto5.php b/include/pdf/tutorial/tuto5.php deleted file mode 100644 index 4b6c4535b..000000000 --- a/include/pdf/tutorial/tuto5.php +++ /dev/null @@ -1,102 +0,0 @@ -Cell(40,7,$col,1); - $this->Ln(); - //Data - foreach($data as $row) - { - foreach($row as $col) - $this->Cell(40,6,$col,1); - $this->Ln(); - } -} - -//Better table -function ImprovedTable($header,$data) -{ - //Column widths - $w=array(40,35,40,45); - //Header - for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C'); - $this->Ln(); - //Data - foreach($data as $row) - { - $this->Cell($w[0],6,$row[0],'LR'); - $this->Cell($w[1],6,$row[1],'LR'); - $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R'); - $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R'); - $this->Ln(); - } - //Closure line - $this->Cell(array_sum($w),0,'','T'); -} - -//Colored table -function FancyTable($header,$data) -{ - //Colors, line width and bold font - $this->SetFillColor(255,0,0); - $this->SetTextColor(255); - $this->SetDrawColor(128,0,0); - $this->SetLineWidth(.3); - $this->SetFont('','B'); - //Header - $w=array(40,35,40,45); - for($i=0;$iCell($w[$i],7,$header[$i],1,0,'C',1); - $this->Ln(); - //Color and font restoration - $this->SetFillColor(224,235,255); - $this->SetTextColor(0); - $this->SetFont(''); - //Data - $fill=0; - foreach($data as $row) - { - $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill); - $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill); - $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill); - $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill); - $this->Ln(); - $fill=!$fill; - } - $this->Cell(array_sum($w),0,'','T'); -} -} - -$pdf=new PDF(); -//Column titles -$header=array('Country','Capital','Area (sq km)','Pop. (thousands)'); -//Data loading -$data=$pdf->LoadData('countries.txt'); -$pdf->SetFont('Arial','',14); -$pdf->AddPage(); -$pdf->BasicTable($header,$data); -$pdf->AddPage(); -$pdf->ImprovedTable($header,$data); -$pdf->AddPage(); -$pdf->FancyTable($header,$data); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto6.htm b/include/pdf/tutorial/tuto6.htm deleted file mode 100644 index e94043ddc..000000000 --- a/include/pdf/tutorial/tuto6.htm +++ /dev/null @@ -1,68 +0,0 @@ - - - -Links and flowing text - - - -

Links and flowing text

-This tutorial explains how to insert links (internal and external) and shows a new text writing -mode. It also contains a rudimentary HTML parser. -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
var
$B;
var
$I;
var
$U;
var
$HREF;

function
PDF($orientation='P',$unit='mm',$format='A4')
{
    
//Call parent constructor
    
$this->FPDF($orientation,$unit,$format);
    
//Initialization
    
$this->B=0;
    
$this->I=0;
    
$this->U=0;
    
$this->HREF='';
}

function
WriteHTML($html)
{
    
//HTML parser
    
$html=str_replace("\n",' ',$html);
    
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach(
$a as $i=>$e)
    {
        if(
$i%2==0)
        {
            
//Text
            
if($this->HREF)
                
$this->PutLink($this->HREF,$e);
            else
                
$this->Write(5,$e);
        }
        else
        {
            
//Tag
            
if($e{0}=='/')
                
$this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                
//Extract attributes
                
$a2=explode(' ',$e);
                
$tag=strtoupper(array_shift($a2));
                
$attr=array();
                foreach(
$a2 as $v)
                    if(
ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
                        
$attr[strtoupper($a3[1])]=$a3[2];
                
$this->OpenTag($tag,$attr);
            }
        }
    }
}

function
OpenTag($tag,$attr)
{
    
//Opening tag
    
if($tag=='B' or $tag=='I' or $tag=='U')
        
$this->SetStyle($tag,true);
    if(
$tag=='A')
        
$this->HREF=$attr['HREF'];
    if(
$tag=='BR')
        
$this->Ln(5);
}

function
CloseTag($tag)
{
    
//Closing tag
    
if($tag=='B' or $tag=='I' or $tag=='U')
        
$this->SetStyle($tag,false);
    if(
$tag=='A')
        
$this->HREF='';
}

function
SetStyle($tag,$enable)
{
    
//Modify style and select corresponding font
    
$this->$tag+=($enable ? 1 : -1);
    
$style='';
    foreach(array(
'B','I','U') as $s)
        if(
$this->$s>0)
            
$style.=$s;
    
$this->SetFont('',$style);
}

function
PutLink($URL,$txt)
{
    
//Put a hyperlink
    
$this->SetTextColor(0,0,255);
    
$this->SetStyle('U',true);
    
$this->Write(5,$txt,$URL);
    
$this->SetStyle('U',false);
    
$this->SetTextColor(0);
}
}

$html='You can now easily print text mixing different
styles : <B>bold</B>, <I>italic</I>, <U>underlined</U>, or
<B><I><U>all at once</U></I></B>!<BR>You can also insert links
on text, such as <A HREF="http://www.fpdf.org">www.fpdf.org</A>,
or on an image: click on the logo.'
;

$pdf=new PDF();
//First page
$pdf->AddPage();
$pdf->SetFont('Arial','',20);
$pdf->Write(5,'To find out what\'s new in this tutorial, click ');
$pdf->SetFont('','U');
$link=$pdf->AddLink();
$pdf->Write(5,'here',$link);
$pdf->SetFont('');
//Second page
$pdf->AddPage();
$pdf->SetLink($link);
$pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org');
$pdf->SetLeftMargin(45);
$pdf->SetFontSize(14);
$pdf->WriteHTML($html);
$pdf->Output();
?> -
-

- -The new method to print text is Write(). It is very close to MultiCell(); the differences -are: -
    -
  • The end of line is at the right margin and the next line begins at the left one -
  • The current position moves at the end of the text -
-So it allows to write a chunk of text, alter the font style, then continue from the exact -place we left it. On the other hand, you cannot full justify it. -
-
-The method is used on the first page to put a link pointing to the second one. The beginning of -the sentence is written in regular style, then we switch to underline and finish it. The link -is created with AddLink(), which returns a link identifier. The identifier is -passed as third parameter of Write(). Once the second page is created, we use SetLink() to -make the link point to the beginning of the current page. -
-
-Then we put an image with a link on it. An external link points to an URL (HTTP, mailto...). -The URL is simply passed as last parameter of Image(). -Note that external links do not work when the PDF is displayed inside Netscape's plug-in. -
-
-Finally, the left margin is moved after the image with SetLeftMargin() and some text in -HTML format is output. An HTML parser is used for this, based on the regular expression splitting -function preg_split() and the option PREG_SPLIT_DELIM_CAPTURE (introduced in PHP 4.0.5) which -allows to fetch the separators as well (in this case the tags). If you use an older version of -PHP, replace the line with this one: -
-
-
- -$a=preg_split('/[<>]/',$html);
-
-

-which is less strict but gives the same results with valid HTML. -
-Recognized tags are <B>, <I>, <U>, <A> and <BR>; the others are -ignored. The parser also makes use of the Write() method. An external link is put the same way as -an internal one (third parameter of Write()). -
-Note that Cell() also allows to put links. - - diff --git a/include/pdf/tutorial/tuto6.php b/include/pdf/tutorial/tuto6.php deleted file mode 100644 index 5d9436c31..000000000 --- a/include/pdf/tutorial/tuto6.php +++ /dev/null @@ -1,123 +0,0 @@ -FPDF($orientation,$unit,$format); - //Initialization - $this->B=0; - $this->I=0; - $this->U=0; - $this->HREF=''; -} - -function WriteHTML($html) -{ - //HTML parser - $html=str_replace("\n",' ',$html); - $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); - foreach($a as $i=>$e) - { - if($i%2==0) - { - //Text - if($this->HREF) - $this->PutLink($this->HREF,$e); - else - $this->Write(5,$e); - } - else - { - //Tag - if($e{0}=='/') - $this->CloseTag(strtoupper(substr($e,1))); - else - { - //Extract attributes - $a2=explode(' ',$e); - $tag=strtoupper(array_shift($a2)); - $attr=array(); - foreach($a2 as $v) - if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3)) - $attr[strtoupper($a3[1])]=$a3[2]; - $this->OpenTag($tag,$attr); - } - } - } -} - -function OpenTag($tag,$attr) -{ - //Opening tag - if($tag=='B' or $tag=='I' or $tag=='U') - $this->SetStyle($tag,true); - if($tag=='A') - $this->HREF=$attr['HREF']; - if($tag=='BR') - $this->Ln(5); -} - -function CloseTag($tag) -{ - //Closing tag - if($tag=='B' or $tag=='I' or $tag=='U') - $this->SetStyle($tag,false); - if($tag=='A') - $this->HREF=''; -} - -function SetStyle($tag,$enable) -{ - //Modify style and select corresponding font - $this->$tag+=($enable ? 1 : -1); - $style=''; - foreach(array('B','I','U') as $s) - if($this->$s>0) - $style.=$s; - $this->SetFont('',$style); -} - -function PutLink($URL,$txt) -{ - //Put a hyperlink - $this->SetTextColor(0,0,255); - $this->SetStyle('U',true); - $this->Write(5,$txt,$URL); - $this->SetStyle('U',false); - $this->SetTextColor(0); -} -} - -$html='You can now easily print text mixing different -styles : bold, italic, underlined, or -all at once!
You can also insert links -on text, such as www.fpdf.org, -or on an image: click on the logo.'; - -$pdf=new PDF(); -//First page -$pdf->AddPage(); -$pdf->SetFont('Arial','',20); -$pdf->Write(5,'To find out what\'s new in this tutorial, click '); -$pdf->SetFont('','U'); -$link=$pdf->AddLink(); -$pdf->Write(5,'here',$link); -$pdf->SetFont(''); -//Second page -$pdf->AddPage(); -$pdf->SetLink($link); -$pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org'); -$pdf->SetLeftMargin(45); -$pdf->SetFontSize(14); -$pdf->WriteHTML($html); -$pdf->Output(); -?> diff --git a/include/pdf/tutorial/tuto7.htm b/include/pdf/tutorial/tuto7.htm deleted file mode 100644 index 69aef60fb..000000000 --- a/include/pdf/tutorial/tuto7.htm +++ /dev/null @@ -1,316 +0,0 @@ - - - -Adding new fonts and encoding support - - - -

Adding new fonts and encoding support

-This tutorial explains how to use TrueType or Type1 fonts so that you are not limited to the standard -fonts any more. The other interest is that you can choose the font encoding, which allows you to -use other languages than the Western ones (the standard fonts having too few available characters). -
-
-There are two ways to use a new font: embedding it in the PDF or not. When a font is not -embedded, it is sought in the system. The advantage is that the PDF file is lighter; on the other -hand, if it is not available, a substitution font is used. So it is preferable to ensure that the -needed font is installed on the client systems. If the file is to be viewed by a large audience, -it is better to embed. -
-
-Adding a new font requires three steps for TrueTypes: -
    -
  • Generation of the metric file (.afm) -
  • Generation of the font definition file (.php) -
  • Declaration of the font in the script -
-For Type1, the first one is theoretically not necessary because the AFM file is usually shipped -with the font. In case you have only a metric file in PFM format, use the convertor available -here. -

Generation of the metric file

-The first step for a TrueType consists in generating the AFM file. A utility exists to do this -task: ttf2pt1. The Windows binary -is available here. The command line to use is -the following: -
-
-ttf2pt1 -a font.ttf font -
-
-For example, for Comic Sans MS Regular: -
-
-ttf2pt1 -a c:\windows\fonts\comic.ttf comic -
-
-Two files are created; the one we are interested in is comic.afm. -

Generation of the font definition file

-The second step consists in generating a PHP file containing all the information needed by FPDF; -in addition, the font file is compressed. To do this, a helper script is provided in the font/makefont/ -directory of the package: makefont.php. It contains the following function: -
-
-MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]]) -
-
-fontfile -
-Path to the .ttf or .pfb file. -
-afmfile -
-Path to the .afm file. -
-enc -
-Name of the encoding to use. Default value: cp1252. -
-patch -
-Optional modification of the encoding. Empty by default. -
-type -
-Type of the font (TrueType or Type1). Default value: TrueType. -
-
-The first parameter is the name of the font file. The extension must be either .ttf or .pfb and -determines the font type. If you own a Type1 font in ASCII format (.pfa), you can convert it to -binary format with t1utils. -
-If you don't want to embed the font, pass an empty string. In this case, type is given by the -type parameter. -
-Note: in the case of a font with the same name as a standard one, for instance arial.ttf, it is -mandatory to embed. If you don't, Acrobat will use its own font. -
-
-The AFM file is the one previously generated. -
-
-The encoding defines the association between a code (from 0 to 255) and a character. The first -128 are fixed and correspond to ASCII; the following are variable. The encodings are stored in -.map files. Those available are: -
    -
  • cp1250 (Central Europe) -
  • cp1251 (Cyrillic) -
  • cp1252 (Western Europe) -
  • cp1253 (Greek) -
  • cp1254 (Turkish) -
  • cp1255 (Hebrew) -
  • cp1257 (Baltic) -
  • cp1258 (Vietnamese) -
  • cp874 (Thai) -
  • ISO-8859-1 (Western Europe) -
  • ISO-8859-2 (Central Europe) -
  • ISO-8859-4 (Baltic) -
  • ISO-8859-5 (Cyrillic) -
  • ISO-8859-7 (Greek) -
  • ISO-8859-9 (Turkish) -
  • ISO-8859-11 (Thai) -
  • ISO-8859-15 (Western Europe) -
  • ISO-8859-16 (Central Europe) -
  • KOI8-R (Russian) -
  • KOI8-U (Ukrainian) -
-Of course, the font must contain the characters corresponding to the chosen encoding. -
-In the particular case of a symbolic font (that is to say which does not contain letters, such -as Symbol or ZapfDingbats), pass an empty string. -
-The encodings which begin with cp are those used by Windows; Linux systems usually use ISO. -
-Remark: the standard fonts use cp1252. -
-
-The fourth parameter gives the possibility to alter the encoding. Sometimes you may want to add -some characters. For instance, ISO-8859-1 does not contain the euro symbol. To add it at position -164, pass array(164=>'Euro'). -
-
-The last parameter is used to give the type of the font in case it is not embedded (that is to -say the first parameter is empty). -
-
-After you have called the function (create a new file for this and include makefont.php, or -simply add the call directly inside), a .php file is created, with the same name as the .afm one. -You may rename it if you wish. If the case of embedding, the font file is compressed and gives a -second file with .z as extension (except if the compression function is not available, it -requires Zlib). You may rename it too, but in this case you have to alter the variable $file -in the .php file accordingly. -
-
-Example: -
-
-MakeFont('c:\\windows\\fonts\\comic.ttf','comic.afm','cp1252'); -
-
-which gives the files comic.php and comic.z. -
-
-Then you have to copy the generated file(s) either in the directory of the script which will use -the font, or in the directory given by FPDF_FONTPATH if the constant is defined. If the font file -could not be compressed, copy the .ttf or .pfb instead of the .z. -

Declaration of the font in the script

-The last step is the most simple. You just need to call the AddFont() method. For instance: -
-
-
- -$pdf->AddFont('Comic','','comic.php');
-
-

-or simply: -
-
-
- -$pdf->AddFont('Comic');
-
-

-And the font is now available (in regular and underlined styles), usable like the others. If we -had worked with Comic Sans MS Bold (comicbd.ttf), we would have put: -
-
-
- -$pdf->AddFont('Comic','B','comicbd.php');
-
-

-

Example

-Let's now see a small complete example. The font used is Calligrapher, available at -www.abstractfonts.com (a site -offering numerous free TrueType fonts). The first step is the generation of the AFM file: -
-
-ttf2pt1 -a calligra.ttf calligra -
-
-which gives calligra.afm (and calligra.t1a that we can delete). Then we generate the definition -file: -
-
-
- -<?php
require('../font/makefont/makefont.php');

MakeFont('calligra.ttf','calligra.afm');
?> -
-

-The function call gives the following report: -
-
-Warning: character Euro is missing
-Warning: character Zcaron is missing
-Warning: character zcaron is missing
-Warning: character eth is missing
-Font file compressed (calligra.z)
-Font definition file generated (calligra.php)
-
-The euro character is not present in the font (it is too old). Three other characters are missing -too, but we are not interested in them anyway. -
-We can now copy the two files in the font directory and write the script: -
-
-
- -<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

$pdf=new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Cell(0,10,'Enjoy new fonts with FPDF!');
$pdf->Output();
?> -
-

- -

About the euro symbol

-The euro character is not present in all encodings, and is not always placed at the same position: -
-
- - - - - - - - - - - - - - - - - - - - - - - -
EncodingPosition
cp1250128
cp1251136
cp1252128
cp1253128
cp1254128
cp1255128
cp1257128
cp1258128
cp874128
ISO-8859-1absent
ISO-8859-2absent
ISO-8859-4absent
ISO-8859-5absent
ISO-8859-7absent
ISO-8859-9absent
ISO-8859-11absent
ISO-8859-15164
ISO-8859-16164
KOI8-Rabsent
KOI8-Uabsent
-
-ISO-8859-1 is widespread but does not include the euro sign. If you need it, the simplest thing -to do is using cp1252 or ISO-8859-15 instead, which are nearly identical but contain the precious -symbol. -
-As for ISO-8859-2, it is possible to use ISO-8859-16 instead, but it contains many differences. -It is therefore simpler to patch the encoding to add the symbol to it, as explained above. The -same is true for the other encodings. -

Font synthesis under Windows

-When a TrueType font is not available in a given style, Windows is able to synthesize it from the -regular version. For instance, there is no Comic Sans MS Italic, but it can be built from Comic -Sans MS Regular. This feature can be used in a PDF file, but unfortunately requires that the -regular font be present in the system (you must not embed it). Here is how to do it: -
    -
  • Generate the definition file for the regular font without embedding (you may rename it to -reflect the desired style) -
  • Open it and append to the variable $name a comma followed by the desired style -(Italic, Bold or BoldItalic) -
-For instance, for the file comici.php: -
-
-$name='ComicSansMS,Italic'; -
-
-It can then be used normally: -
-
-
- -$pdf->AddFont('Comic','I','comici.php');
-
-

-

Reducing the size of TrueType fonts

-Font files are often quite voluminous (more than 100, even 200KB); this is due to the fact that -they contain the characters corresponding to many encodings. Zlib compression reduces them but -they remain fairly big. A technique exists to reduce them further. It consists in converting the -font to the Type1 format with ttf2pt1 by specifying the encoding you are interested in; all other -characters will be discarded. -
-For instance, the arial.ttf font shipped with Windows 98 is 267KB (it contains 1296 characters). -After compression it gives 147. Let's convert it to Type1 by keeping only cp1250 characters: -
-
-ttf2pt1 -b -L cp1250.map c:\windows\fonts\arial.ttf arial -
-
-The .map files are located in the font/makefont/ directory of the package. The command produces -arial.pfb and arial.afm. The arial.pfb file is only 35KB, and 30KB after compression. -
-
-It is possible to go even further. If you are interested only by a subset of the encoding (you -probably don't need all 217 characters), you can open the .map file and remove the lines you are -not interested in. This will reduce the file size accordingly. - - diff --git a/include/pdf/tutorial/tuto7.php b/include/pdf/tutorial/tuto7.php deleted file mode 100644 index 38caf9394..000000000 --- a/include/pdf/tutorial/tuto7.php +++ /dev/null @@ -1,10 +0,0 @@ -AddFont('Calligrapher','','calligra.php'); -$pdf->AddPage(); -$pdf->SetFont('Calligrapher','',35); -$pdf->Cell(0,10,'Enjoy new fonts with FPDF!'); -$pdf->Output(); -?> From 7b88e7052f6bec7788ecf76a0e0e56e5f86b102e Mon Sep 17 00:00:00 2001 From: kindlm Date: Thu, 8 Jun 2017 10:03:09 +0200 Subject: [PATCH 07/10] Neues Attribut Onlinebewerbung im Studienplan --- include/studienplan.class.php | 106 ++++++++++++++++----------- system/dbupdate_3.3.php | 2 +- vilesci/lehre/studienordnung.inc.php | 19 +++-- vilesci/lehre/studienordnung.js | 2 + 4 files changed, 79 insertions(+), 50 deletions(-) diff --git a/include/studienplan.class.php b/include/studienplan.class.php index 2d27917bd..58ee074f5 100644 --- a/include/studienplan.class.php +++ b/include/studienplan.class.php @@ -29,45 +29,46 @@ require_once(dirname(__FILE__).'/basis_db.class.php'); class studienplan extends basis_db { - public $new = true; // boolean - public $result = array(); // Objekte + public $new = true; // boolean + public $result = array(); // Objekte - //Tabellenspalten - public $studienplan_id; // integer (PK) - public $studienordnung_id; // integer FK Studienordnung - public $orgform_kurzbz; // varchar (3) - public $version; // varchar (256) - public $bezeichnung; // varchar (256) - public $regelstudiendauer; // integer - public $sprache; // varchar (16) FK Sprache - public $aktiv=false; // boolean - public $semesterwochen; // smallint - public $testtool_sprachwahl=true;// boolean - public $updateamum; // timestamp - public $updatevon; // varchar - public $insertamum; // timestamp - public $insertvon; // varchar - public $ects_stpl; - public $pflicht_sws; - public $pflicht_lvs; + //Tabellenspalten + public $studienplan_id; // integer (PK) + public $studienordnung_id; // integer FK Studienordnung + public $orgform_kurzbz; // varchar (3) + public $version; // varchar (256) + public $bezeichnung; // varchar (256) + public $regelstudiendauer; // integer + public $sprache; // varchar (16) FK Sprache + public $aktiv=false; // boolean + public $semesterwochen; // smallint + public $testtool_sprachwahl=true; // boolean + public $updateamum; // timestamp + public $updatevon; // varchar + public $insertamum; // timestamp + public $insertvon; // varchar + public $ects_stpl; //numeric(5,2) + public $pflicht_sws; // integer + public $pflicht_lvs; // integer + public $onlinebewerbung_studienplan; //boolean - //Tabellenspalten für Zwischentabelle tbl_studienplan_lehrveranstaltung - public $studienplan_lehrveranstaltung_id; //integer - public $lehrveranstaltung_id; //integer - public $semester; //smallint - public $studienplan_lehrveranstaltung_id_parent; //integer - public $pflicht; //boolean - public $koordinator; //varchar(32) - public $sort; + //Tabellenspalten für Zwischentabelle tbl_studienplan_lehrveranstaltung + public $studienplan_lehrveranstaltung_id; //integer + public $lehrveranstaltung_id; //integer + public $semester; //smallint + public $studienplan_lehrveranstaltung_id_parent; //integer + public $pflicht; //boolean + public $koordinator; //varchar(32) + public $sort; public $curriculum=true; public $export=true; public $genehmigung=true; /** - * Konstruktor - */ - public function __construct() - { + * Konstruktor + */ + public function __construct() + { parent::__construct(); } @@ -119,6 +120,7 @@ class studienplan extends basis_db $this->ects_stpl = $row->ects_stpl; $this->pflicht_lvs = $row->pflicht_lvs; $this->pflicht_sws = $row->pflicht_sws; + $this->onlinebewerbung_studienplan = $this->db_parse_bool($row->onlinebewerbung_studienplan); $this->updateamum = $row->updateamum; $this->updatevon = $row->updatevon; $this->insertamum = $row->insertamum; @@ -176,6 +178,7 @@ class studienplan extends basis_db $obj->ects_stpl = $row->ects_stpl; $obj->pflicht_lvs = $row->pflicht_lvs; $obj->pflicht_sws = $row->pflicht_sws; + $obj->onlinebewerbung_studienplan = $this->db_parse_bool($row->onlinebewerbung_studienplan); $obj->updateamum = $row->updateamum; $obj->updatevon = $row->updatevon; $obj->insertamum = $row->insertamum; @@ -269,7 +272,7 @@ class studienplan extends basis_db //Neuen Datensatz einfuegen $qry='BEGIN;INSERT INTO lehre.tbl_studienplan (studienordnung_id, orgform_kurzbz,version, bezeichnung, regelstudiendauer, sprache, aktiv, semesterwochen, testtool_sprachwahl, - pflicht_sws, pflicht_lvs, ects_stpl, insertamum, insertvon) VALUES ('. + pflicht_sws, pflicht_lvs, ects_stpl, onlinebewerbung_studienplan, insertamum, insertvon) VALUES ('. $this->db_add_param($this->studienordnung_id, FHC_INTEGER).', '. $this->db_add_param($this->orgform_kurzbz).', '. $this->db_add_param($this->version).', '. @@ -282,6 +285,7 @@ class studienplan extends basis_db $this->db_add_param($this->pflicht_sws) . ', ' . $this->db_add_param($this->pflicht_lvs) . ', ' . $this->db_add_param($this->ects_stpl) . ', ' . + $this->db_add_param($this->onlinebewerbung_studienplan, FHC_BOOLEAN) . ', ' . 'now(), '. $this->db_add_param($this->insertvon).');'; } @@ -298,17 +302,18 @@ class studienplan extends basis_db ' orgform_kurzbz='.$this->db_add_param($this->orgform_kurzbz).', '. ' version='.$this->db_add_param($this->version).', '. ' bezeichnung='.$this->db_add_param($this->bezeichnung).', '. - ' regelstudiendauer='.$this->db_add_param($this->regelstudiendauer, FHC_INTEGER).', '. - ' sprache='.$this->db_add_param($this->sprache).', '. - ' aktiv='.$this->db_add_param($this->aktiv, FHC_BOOLEAN).', '. - ' semesterwochen='.$this->db_add_param($this->semesterwochen, FHC_INTEGER).', '. - ' testtool_sprachwahl='.$this->db_add_param($this->testtool_sprachwahl, FHC_BOOLEAN).','. - ' ects_stpl=' . $this->db_add_param($this->ects_stpl) . ',' . - ' pflicht_sws=' . $this->db_add_param($this->pflicht_sws, FHC_INTEGER) . ',' . - ' pflicht_lvs=' . $this->db_add_param($this->pflicht_lvs, FHC_INTEGER) . ',' . - ' updateamum= now(), '. - ' updatevon='.$this->db_add_param($this->updatevon).' '. - ' WHERE studienplan_id='.$this->db_add_param($this->studienplan_id, FHC_INTEGER, false).';'; + ' regelstudiendauer='.$this->db_add_param($this->regelstudiendauer, FHC_INTEGER).', '. + ' sprache='.$this->db_add_param($this->sprache).', '. + ' aktiv='.$this->db_add_param($this->aktiv, FHC_BOOLEAN).', '. + ' semesterwochen='.$this->db_add_param($this->semesterwochen, FHC_INTEGER).', '. + ' testtool_sprachwahl='.$this->db_add_param($this->testtool_sprachwahl, FHC_BOOLEAN).','. + ' ects_stpl=' . $this->db_add_param($this->ects_stpl) . ',' . + ' pflicht_sws=' . $this->db_add_param($this->pflicht_sws, FHC_INTEGER) . ',' . + ' pflicht_lvs=' . $this->db_add_param($this->pflicht_lvs, FHC_INTEGER) . ',' . + ' onlinebewerbung_studienplan=' . $this->db_add_param($this->onlinebewerbung_studienplan, FHC_BOOLEAN) . ',' . + ' updateamum= now(), '. + ' updatevon='.$this->db_add_param($this->updatevon).' '. + ' WHERE studienplan_id='.$this->db_add_param($this->studienplan_id, FHC_INTEGER, false).';'; } if($this->db_query($qry)) @@ -719,6 +724,7 @@ class studienplan extends basis_db ects_stpl, pflicht_sws, pflicht_lvs, + onlinebewerbung_studienplan, studiengang_kz, tbl_studienordnung.version AS version_studienordnung, gueltigvon, @@ -837,6 +843,10 @@ class studienplan extends basis_db $obj->aktiv = $this->db_parse_bool($row->aktiv); $obj->semesterwochen = $row->semesterwochen; $obj->testtool_sprachwahl = $this->db_parse_bool($row->testtool_sprachwahl); + $obj->ects_stpl = $row->ects_stpl; + $obj->pflicht_lvs = $row->pflicht_lvs; + $obj->pflicht_sws = $row->pflicht_sws; + $obj->onlinebewerbung_studienplan = $this->db_parse_bool($row->onlinebewerbung_studienplan); $obj->updateamum = $row->updateamum; $obj->updatevon = $row->updatevon; $obj->insertamum = $row->insertamum; @@ -916,6 +926,10 @@ class studienplan extends basis_db $obj->aktiv = $this->db_parse_bool($row->aktiv); $obj->semesterwochen = $row->semesterwochen; $obj->testtool_sprachwahl = $this->db_parse_bool($row->testtool_sprachwahl); + $obj->ects_stpl = $row->ects_stpl; + $obj->pflicht_lvs = $row->pflicht_lvs; + $obj->pflicht_sws = $row->pflicht_sws; + $obj->onlinebewerbung_studienplan = $this->db_parse_bool($row->onlinebewerbung_studienplan); $obj->updateamum = $row->updateamum; $obj->updatevon = $row->updatevon; $obj->insertamum = $row->insertamum; @@ -1227,6 +1241,10 @@ class studienplan extends basis_db $obj->aktiv = $this->db_parse_bool($row->aktiv); $obj->semesterwochen = $row->semesterwochen; $obj->testtool_sprachwahl = $this->db_parse_bool($row->testtool_sprachwahl); + $obj->ects_stpl = $row->ects_stpl; + $obj->pflicht_lvs = $row->pflicht_lvs; + $obj->pflicht_sws = $row->pflicht_sws; + $obj->onlinebewerbung_studienplan = $this->db_parse_bool($row->onlinebewerbung_studienplan); $obj->updateamum = $row->updateamum; $obj->updatevon = $row->updatevon; $obj->insertamum = $row->insertamum; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 31eb37d72..255506ab7 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -284,7 +284,7 @@ if(!$result = @$db->db_query("SELECT mailversand FROM campus.tbl_coodle LIMIT 1; // Spalte onlinebewerbung_studienplan in lehre.tbl_studienplan if(!$result = @$db->db_query("SELECT onlinebewerbung_studienplan FROM lehre.tbl_studienplan LIMIT 1;")) { - $qry = "ALTER TABLE lehre.tbl_studienplan ADD COLUMN onlinebewerbung_studienplan boolean;"; + $qry = "ALTER TABLE lehre.tbl_studienplan ADD COLUMN onlinebewerbung_studienplan boolean NOT NULL DEFAULT true;"; if(!$db->db_query($qry)) echo 'lehre.tbl_studienplan: '.$db->db_last_error().'
'; diff --git a/vilesci/lehre/studienordnung.inc.php b/vilesci/lehre/studienordnung.inc.php index e6f37ede3..71c407b15 100644 --- a/vilesci/lehre/studienordnung.inc.php +++ b/vilesci/lehre/studienordnung.inc.php @@ -276,11 +276,11 @@ switch($method) Aktiv:'; - if($studienplan->aktiv) - $checked=' checked="checked"'; - else - $checked=''; - echo ' + if($studienplan->aktiv) + $checked=' checked="checked"'; + else + $checked=''; + echo ' @@ -295,6 +295,15 @@ switch($method) Pflicht LVS + + Onlinebewerbung:'; + if($studienplan->onlinebewerbung_studienplan) + $checked=' checked="checked"'; + else + $checked=''; + echo ' + + diff --git a/vilesci/lehre/studienordnung.js b/vilesci/lehre/studienordnung.js index c9d7e199e..95458b8d3 100755 --- a/vilesci/lehre/studienordnung.js +++ b/vilesci/lehre/studienordnung.js @@ -1336,6 +1336,7 @@ function saveStudienplan() semesterwochen = $("#semesterwochen").val(); testtool_sprachwahl = $("#testtool_sprachwahl").prop("checked"); aktiv = $("#aktiv").prop("checked"); + onlinebewerbung_studienplan = $("#onlinebewerbung_studienplan").prop("checked"); var studienplan_id = $("#studienplan_id").val(); var pflicht_sws = $("#pflicht_sws").val(); var pflicht_lvs = $("#pflicht_lvs").val(); @@ -1360,6 +1361,7 @@ function saveStudienplan() "semesterwochen":semesterwochen, "testtool_sprachwahl":testtool_sprachwahl, "aktiv":aktiv, + "onlinebewerbung_studienplan":onlinebewerbung_studienplan, "studienordnung_id":global_studienordnung_id, "ects_stpl":ects_stpl, "pflicht_sws":pflicht_sws, From 6a26d82de5748e4f5176d0eb6029b4e40f97d234 Mon Sep 17 00:00:00 2001 From: kindlm Date: Thu, 8 Jun 2017 14:20:57 +0200 Subject: [PATCH 08/10] Function getBewerbungstermine um studienplan_id erweitert --- include/bewerbungstermin.class.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/include/bewerbungstermin.class.php b/include/bewerbungstermin.class.php index f2a33efc8..c4b4d2646 100644 --- a/include/bewerbungstermin.class.php +++ b/include/bewerbungstermin.class.php @@ -104,13 +104,22 @@ class bewerbungstermin extends basis_db } /** - * Liefert alle Förderverträge + * Liefert die Bewerbungstermine eines Studiengangs + * @param integer $studiengang_kz. Kennzahl des Studiengangs, dessen Bewerbungstermine geladen werden sollen + * @param string $studiensemester_kurzbz. Optional. Default NULL. Studiensemester, dessen Bewerbungstermine geladen werden sollen + * @param $sort. Optional. Default NULL. Sortierung der Ergebnisse + * @param $studienplan_id. Optional. Default NULL. Studienplan ID, dessen Bewerbungstermine geladen werden sollen + * @return true wenn ok, false im Fehlerfall */ - public function getBewerbungstermine($studiengang_kz, $studiensemester_kurzbz=null, $sort=null) + public function getBewerbungstermine($studiengang_kz, $studiensemester_kurzbz = null, $sort = null, $studienplan_id = null) { $qry = "SELECT * FROM public.tbl_bewerbungstermine WHERE studiengang_kz=".$this->db_add_param($studiengang_kz, FHC_INTEGER); + if($studiensemester_kurzbz!=null) $qry.=" AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz); + + if($studienplan_id!=null) + $qry.=" AND studienplan_id=".$this->db_add_param($studienplan_id); if($sort != null) { From df5df5da5735258bf70dca82714a75589e78f18e Mon Sep 17 00:00:00 2001 From: Andreas Oesterreicher Date: Fri, 9 Jun 2017 09:04:33 +0200 Subject: [PATCH 09/10] =?UTF-8?q?Die=20Anwesenheits=C3=BCbersicht=20f?= =?UTF-8?q?=C3=BCr=20Lektoren=20zeigt=20zus=C3=A4tzlich=20die=20Lehrform?= =?UTF-8?q?=20der=20Lehreinheit=20im=20Dropdown=20an=20damit=20zwischen=20?= =?UTF-8?q?Pr=C3=BCfungs-LVs=20und=20normalen=20LVs=20unterschieden=20werd?= =?UTF-8?q?en=20kann?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cis/private/profile/anwesenheit_lektor.php | 16 ++++++++++++++-- include/lehreinheitmitarbeiter.class.php | 18 +++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/cis/private/profile/anwesenheit_lektor.php b/cis/private/profile/anwesenheit_lektor.php index 72e884a8c..dacf9f7bc 100644 --- a/cis/private/profile/anwesenheit_lektor.php +++ b/cis/private/profile/anwesenheit_lektor.php @@ -73,6 +73,7 @@ if(!$semester || !array_key_exists($semester, $alle_semester)) $lehreinheiten = $lema->getLehreinheiten($uid, $semester); + if(!array_key_exists($lehreinheit_id, $lehreinheiten)) { $lehreinheit_id = null; @@ -125,8 +126,19 @@ if($lehreinheit_id) foreach($lehreinheiten as $le) { + $lvdropdown_bezeichnung = $le->stg_kurzbzlang.' '.$le->lv_semester.' '.$le->lv_bezeichnung; + $lvdropdown_bezeichnung .= ' ('; + if($le->lv_lehrform_kurzbz!='') + { + $lvdropdown_bezeichnung .= $le->lv_lehrform_kurzbz; + if($le->lehrform_kurzbz!='') + $lvdropdown_bezeichnung .= ' - '.$le->lehrform_kurzbz; + $lvdropdown_bezeichnung .= ', '; + } + $lvdropdown_bezeichnung .= $le->lehreinheit_id.')'; + echo ''; } echo ' @@ -153,7 +165,7 @@ if($lehreinheit_id) $fehlstunden = $anwesenheit->getAnwesenheit($student->uid, $lehreinheit_id); $le_erledigt = $fehlstunden + $anwesenheit->getAnwesenheit($student->uid, $lehreinheit_id, true); $anwesenheit_relativ = ($stunden_gesamt - $fehlstunden) / $stunden_gesamt * 100; - + echo '
diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index c9c824411..85493cd9e 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -473,11 +473,15 @@ class lehreinheitmitarbeiter extends basis_db */ public function getLehreinheiten($mitarbeiter_uid, $studiensemester_kurzbz) { - $qry = 'SELECT DISTINCT lehreinheit_id, lv_bezeichnung, lv_kurzbz, unr, lv_lehrform_kurzbz, stg_kurzbzlang, lv_semester ' - . 'FROM campus.vw_lehreinheit ' - . 'WHERE mitarbeiter_uid = ' . $this->db_add_param($mitarbeiter_uid) - . ' AND studiensemester_kurzbz = ' . $this->db_add_param($studiensemester_kurzbz) - . ' ORDER BY lv_bezeichnung, unr '; + $qry = 'SELECT + DISTINCT lehreinheit_id, lv_bezeichnung, lv_kurzbz, unr, lv_lehrform_kurzbz, stg_kurzbzlang, + lv_semester, lehrform_kurzbz + FROM + campus.vw_lehreinheit + WHERE + mitarbeiter_uid = '.$this->db_add_param($mitarbeiter_uid).' + AND studiensemester_kurzbz = '.$this->db_add_param($studiensemester_kurzbz).' + ORDER BY lv_bezeichnung, unr '; $result = $this->db_query($qry); $ret = array(); @@ -494,7 +498,7 @@ class lehreinheitmitarbeiter extends basis_db * Laedt die Lektoren einer Lehrveranstaltung in einem Studiensemester * @param lehrveranstaltung_id * @param studiensemester_kurzbz - * @param integer lehreinheit_id Optional Lehreinheit_id + * @param integer lehreinheit_id Optional Lehreinheit_id * @return array + true wenn ok / false im Fehlerfall */ public function getMitarbeiterLV($lehrveranstaltung_id, $studiensemester_kurzbz, $lehreinheit_id=null) @@ -514,7 +518,7 @@ class lehreinheitmitarbeiter extends basis_db WHERE lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." AND tbl_lehreinheit.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz); - + if(!is_null($lehreinheit_id)) $qry .=" AND tbl_lehreinheit.lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); $qry .=" ORDER BY nachname, vorname;"; From d14730df359359c7185482cb01ac2b2a711a8cdd Mon Sep 17 00:00:00 2001 From: kindlm Date: Fri, 9 Jun 2017 15:30:02 +0200 Subject: [PATCH 10/10] Adresse.class: Corrected lenght-validation of plz --- include/adresse.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/adresse.class.php b/include/adresse.class.php index 02be2b966..25cc84e6a 100644 --- a/include/adresse.class.php +++ b/include/adresse.class.php @@ -248,9 +248,9 @@ class adresse extends basis_db $this->errormsg = 'Strasse darf nicht länger als 255 Zeichen sein'; return false; } - if(mb_strlen($this->plz)>10) + if(mb_strlen($this->plz)>16) { - $this->errormsg = 'Plz darf nicht länger als 10 Zeichen sein'; + $this->errormsg = 'Plz darf nicht länger als 16 Zeichen sein'; return false; } if(mb_strlen($this->ort)>255)