source: trunk/jpdd/class.jpdd.pdf.php @ 1365

Last change on this file since 1365 was 1365, checked in by Daniel Kahn Gillmor, 7 years ago

remove one more call-time pass-by-reference

File size: 13.4 KB
Line 
1<?php
2//
3
4
5if ( ! class_exists ('JPDD_PDF') ) {
6
7  require_once('class.dkg.pdf.php');
8
9  class JPDD_PDF extends DKG_PDF {
10        function JPDD_PDF($paper = 'letter') {
11          $this->DKG_PDF($paper);
12          $this->_body_fsize = 14;
13          $this->_font = 'helvetica';
14          $this->_line_sp = 1.4;
15        }
16
17        // returns the font size of the full header text, which might help scale things afterwards.
18        function createHeader() {
19          global $jpdd;
20          $this->SetXY($this->_margin, $this->_margin);
21          //      $this->SetMargins($this->_margin, $this->_margin);
22
23          // header is 1 inch (72 points) tall:
24          $headerheight = 72;
25          $headerfontsize = $this->fitSingleLine($this->_page_width - (2*$this->_margin), $headerheight, $jpdd->getSiteName(), $this->_font, 'B');
26         
27          $nexty = $this->_margin + $headerheight/2 + $headerfontsize/2;
28
29          if (is_null($jpdd->getSiteSubtitle())) {
30                $this->SetXY($this->_margin, $nexty);
31          } else {
32                $this->SetXY(2*$this->_margin, $nexty);
33                $this->fitSingleLine($this->_page_width - (4*$this->_margin), $headerfontsize, $jpdd->getSiteSubtitle(), $this->_font, 'I', $headerfontsize * 0.8);
34                $nexty += $headerfontsize;
35                $this->SetXY($this->_margin, $nexty);
36          }
37
38          if (is_null($jpdd->getSiteDate())) {
39                $this->SetXY($this->_margin, $nexty);
40          } else {
41                $this->SetFont($this->_font, '', $headerfontsize * 0.8);
42                $this->Cell($this->_page_width - (4*$this->_margin), $headerfontsize, $jpdd->getSiteDate(), 0, 0, 'C');
43                $nexty += $headerfontsize;
44                $this->SetXY($this->_margin, $nexty);
45          }
46
47          return $headerfontsize;
48        }
49
50        function Header() {
51          if (!is_null($this->_workshop)) {
52                // otherwise, we've got a workshop to set up.
53                $txt = html_entity_decode($this->_workshop->getTitle());
54                if ($this->_workshop_page > 0) {
55                  $txt .= ' [cont\'d]';
56                }
57                $this->SetXY($this->_margin, $this->_margin);
58                // header is at most 1in tall:
59                $headerheight = 72;
60                $hfsize =  $this->pickOptimalFontSize($txt, $this->_page_width - (2*$this->_margin), $headerheight, $this->_font, $this->_line_sp, 'B');
61                $this->SetFont($this->_font, 'B', $hfsize);
62                $this->MultiCell($this->_page_width - (2*$this->_margin), $hfsize*$this->_line_sp, $txt, 0, 'C', 0);
63                $rr = $this->_workshop->getAssignedRoom();
64                $this->SetXY($this->_margin, $this->_margin + $headerheight);
65                if (!is_null($rr)) {
66                  $pcount = $this->_workshop->getTotalPeopleCount();
67                  $x = $this->GetX();
68                  $y = $this->GetY();
69                  $this->SetFont($this->_font, 'B', $this->_body_fsize);
70                  $this->Cell($this->_page_width - (2*$this->_margin), $this->_body_fsize * $this->_line_sp, 'Room '.$rr->getTitle(), 1, 1);
71                  $this->SetXY($x,$y);
72                  $this->Cell($this->_page_width - (2*$this->_margin), $this->_body_fsize * $this->_line_sp, 'Total People: '.$pcount, 0, 1, 'R');
73                }
74                $this->_workshop_page++;
75          } elseif (!is_null($this->_org)) {
76                $txt = html_entity_decode($this->_org->getTitle());
77                if ($this->_org_page > 0) {
78                  $txt .= ' [cont\'d]';
79                }
80                $this->SetXY($this->_margin, $this->_margin);
81                // header is at most 1in tall:
82                $headerheight = 72;
83                $realheight = $this->fitSingleLine($this->_page_width - (2*$this->_margin), $headerheight, $txt, $this->_font, 'B', $headerheight/$this->_line_sp);
84                $this->Ln();
85                $this->_org_page++;
86          }
87        }
88         
89         
90        function Footer() {
91//        if (!is_null($this->_workshop)) {
92//              $this->SetFont($this->_font, '', $this->_body_fsize);
93//              $this->SetXY(0, $this->_page_height - ($this->_margin + $this->_body_fsize * $this->_line_sp));
94//              $this->Cell($this->_page_width, $this->_body_fsize * $this->_line_sp, 'page '.$this->_workshop_page, 0, 0, 'C');
95//        }
96        }
97
98        function displayList($title, $l, $f) {
99          if (count($l)) {
100                $this->SetFont($this->_font, 'B', $this->_body_fsize);
101                $this->Cell($this->_page_width - 2*$this->_margin, $this->_body_fsize * $this->_line_sp, iconv("UTF-8", "ISO-8859-1//TRANSLIT", $title), 0, 1);
102                $this->SetFont($this->_font, '', $this->_body_fsize);
103                reset($l);
104                while (list(,$p) = each($l)) {
105                  $this->SetX($this->GetX() + $this->_body_fsize * $this->_line_sp);
106                  $this->Cell($this->_page_width - 2*$this->_margin, $this->_body_fsize * $this->_line_sp, iconv("UTF-8", "ISO-8859-1//TRANSLIT", $f($p)), 0, 1);
107                }
108          }
109        }
110
111
112        function addSignupSheet($workshop) {
113          global $jpdd;
114          $this->_workshop = $workshop;
115          $this->_workshop_page = 0;
116          $this->_body_fsize = 12;
117          $this->addPage();
118
119          // display presenters
120          $pres = $workshop->getM2MPeers('person', 'presenter');
121          $this->displayList(ucfirst(count($pres) == 1 ? $jpdd->getPresenterName() : $jpdd->getPresenterNamePlural()).':', $pres, create_function('$x', 'global $jpdd; $af = $x->getAffiliationString(); return html_entity_decode($x->getTitle().($jpdd->isEmpty($af) ? "" : " - ".$af));'));
122         
123          // make a table with participants, school(s), present ? e-mail address
124          $audience = $workshop->getM2MPeers('person', 'audience');
125          $fstr = 'Initial';
126          $linehi = $this->_body_fsize * $this->_line_sp;
127          $totwid = $this->_page_width - 2*$this->_margin;
128          $this->SetFont($this->_font, 'B', $this->_body_fsize);
129          $preswid = $this->GetStringWidth($fstr) + $linehi;
130          $cellwid = ($totwid - $preswid)/3;
131
132          // make header row:
133          $this->SetFillColor(192);
134          $this->Cell($preswid, $linehi, $fstr, 1, 0, 'C', 1);
135          $this->Cell($cellwid, $linehi, 'Person', 1, 0, 'C', 1);
136          $this->Cell($cellwid, $linehi, 'School', 1, 0, 'C', 1);
137          $this->Cell($cellwid, $linehi, 'e-mail address', 1, 0, 'C', 1);
138          $this->SetFont($this->_font, '', $this->_body_fsize);
139
140          $ypos = $this->GetY();
141         
142          reset($audience);
143          while (list(,$a) = each($audience)) {
144                $this->Ln();
145                $ypos = $this->GetY();
146                $xpos = $this->GetX();
147                $this->Rect($xpos, $ypos, $preswid, $linehi);
148                $xpos += $preswid;
149                $this->SetXY($xpos, $ypos);
150                $this->Rect($this->GetX(), $this->GetY(), $cellwid, $linehi);
151                $x = iconv("UTF-8", "ISO-8859-1//TRANSLIT", html_entity_decode($a->getTitle()));
152                if ('' != $x)
153                  $this->fitSingleLine($cellwid - $linehi/2, $linehi, $x, $this->_font, '', $this->_body_fsize, 'L');
154                $xpos += $cellwid;
155                $this->SetXY($xpos, $ypos);
156
157                $this->Rect($this->GetX(), $this->GetY(), $cellwid, $linehi);
158                $x = iconv("UTF-8", "ISO-8859-1//TRANSLIT", html_entity_decode($a->getAffiliationString()));
159                if ('' != $x)
160                  $this->fitSingleLine($cellwid - $linehi/2, $linehi, $x, $this->_font, '', $this->_body_fsize, 'L');
161                $xpos += $cellwid;
162                $this->SetXY($xpos, $ypos);
163
164                $this->Rect($this->GetX(), $this->GetY(), $cellwid, $linehi);
165                $x = $a->_email;
166                if ('' != $x)
167                  $this->fitSingleLine($cellwid - $linehi/2, $linehi, $x, 'courier', '', $this->_body_fsize, 'L');
168                $xpos += $cellwid;
169                $this->SetXY($xpos, $ypos);
170          }
171          $ypos += $linehi;
172
173          // FIXME:  indicate the max_attendees cutoff with a sharp line!
174          // and make rows of blank lines until we get to the bottom of the page.
175          while ($ypos < $this->_page_height - ($this->_margin + 2*$linehi)) {
176                $xpos = $this->_margin;
177                $this->Rect($xpos, $ypos, $preswid, $linehi);
178                $xpos += $preswid;
179                $this->Rect($xpos, $ypos, $cellwid, $linehi);
180                $xpos += $cellwid;
181                $this->Rect($xpos, $ypos, $cellwid, $linehi);
182                $xpos += $cellwid;
183                $this->Rect($xpos, $ypos, $cellwid, $linehi);
184
185                $ypos += $linehi;
186          }
187          $this->_workshop = NULL;
188        }
189
190        function addAttendanceLocationsPage($org) {
191          global $jpdd;
192          $this->_org = $org;
193          $this->_org_page = 0;
194
195          $headersize = 16;
196          $namesize = 12;
197
198          $peops = $org->getM2MPeers('person', 'affiliation');
199
200          $linehi = $namesize * $this->_line_sp;
201          $linewid = $this->_page_width - 2*$this->_margin;
202          $roomtxt = 'Room #';
203
204          $header = false;
205          reset($peops);
206          while(list(,$p) = each($peops)) {
207                $ws = $p->getM2MPeers('workshop', 'attendance', 'AND event_id = '.$jpdd->getActiveEventID());
208                if (count($ws) > 0) {
209                  if (!$header) {
210                        $this->addPage();
211                        $this->SetFont($this->_font, 'B', $namesize);
212                        $rmwid = $this->GetStringWidth($roomtxt) + $linehi;
213                        $cellwid = ($linewid - $rmwid)/2;
214                        $this->SetFillColor(192);
215                       
216                        // headers
217                        $this->Cell($cellwid, $linehi, 'Name (last, first)', 1, 0, 'C', 1);
218                        $this->Cell($cellwid, $linehi, 'Workshop', 1, 0, 'C', 1);
219                        $this->Cell($rmwid, $linehi, $roomtxt, 1, 0, 'C', 1);
220                        $this->SetFont($this->_font, '', $namesize);
221                       
222                       
223                        // display the peops!
224                        $this->SetFillColor(224);
225                        $fill = 0;
226                        $header = true;
227                  }
228                  $wstxt = join('/', array_map(create_function('$w', 'return html_entity_decode($w->getShortTitle());'), $ws));
229                  $rmtxt = join('/', array_map(create_function('$w', 'return html_entity_decode($w->getAssignedRoomTitle());'), $ws));
230                  $this->Ln();
231                  $this->Cell($cellwid, $linehi, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $p->getReversedName()), 0, 0, 'L', $fill);
232                  $this->Cell($cellwid, $linehi, $wstxt, 0, 0, 'L', $fill);
233                  $this->Cell($rmwid, $linehi, $rmtxt, 0, 0, 'L', $fill);
234                  $fill = ($fill == 1 ? 0 : 1);
235                }
236          }
237          $this->_org = NULL;
238        }
239
240        // start a new set of pages listing all attendees:
241        function addAttendeeIndex($pagecount = 2, $columns = 2) {
242          global $jpdd;
243          $gutter = $this->_margin;
244          $colwid = ($this->_page_width - (($columns - 1)*$gutter + 2*$this->_margin))/$columns;
245          $peops = $jpdd->getSeriesFromSQL('SELECT last_name, first_name, middle_name, CASE WHEN workshop.short_title IS NOT NULL THEN workshop.short_title ELSE workshop.title END AS workshop, room.title AS room FROM '.
246                                                                           'person JOIN attendance ON (person.id = person_id) JOIN workshop ON (workshop_id = workshop.id) '.
247                                                                           'LEFT JOIN room ON (room.id = room_id) '.
248                                                                           'WHERE event_id = '.$jpdd->getActiveEventID().
249                                                                           'ORDER BY lower(last_name),lower(first_name),lower(middle_name)');
250          $peopspercol = ceil(count($peops)/($columns*$pagecount));
251          $linehi = ($this->_page_height - 2*$this->_margin)/($peopspercol + 1); // adding 1 to account for the column header:
252
253          $fontsize = min($linehi*0.8,12);
254          $this->SetFont($this->_font, '', $fontsize);
255          $this->_font_size = $fontsize;
256          $page = 0;
257          while (count($peops) > 0) {
258                $col = 0;
259                $this->addPage();
260                while ($col < $columns) {
261                  $row = 0;
262                  // column header
263                  $this->SetXY($this->_margin + $col*($colwid + $gutter), $this->_margin);
264                  $this->SetFont($this->_font, 'B');
265                  $this->fitCell($colwid/2, $linehi, 'Name', 1);
266                  $this->fitCell($colwid/3, $linehi, 'Workshop', 1);
267                  $this->fitCell($colwid/6, $linehi, 'Room', 1);
268                  $this->SetFont($this->_font, '');
269
270          $this->SetFillColor(224);
271
272                  while ((count($peops) > 0) && ($row < $peopspercol)) {
273                        $peop = array_shift($peops);
274                        $this->SetXY($this->_margin + $col*($colwid + $gutter), $this->_margin + ($row+1)*$linehi);
275            $fillthisrow = floor($row/4)%2;
276                        $this->fitCell($colwid/2, $linehi, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $peop['last_name'].', '.$peop['first_name'].' '.$peop['middle_name']), 0, 0, 'L', $fillthisrow);
277                        $this->fitCell($colwid/3, $linehi, $jpdd->isEmpty($peop['workshop']) ? ' ' : $peop['workshop'], 0, 0, 'L', $fillthisrow);
278                        $this->fitCell($colwid/6, $linehi, $jpdd->isEmpty($peop['room']) ? ' ' : $peop['room'], 0, 0, 'R', $fillthisrow);
279                        $row++;
280                  }
281                  $col++;
282                  // make a dividing line:
283                  if ($col < $columns) {
284                        $x = $this->_margin + ($colwid+$gutter)*$col - $gutter/2;
285                        $this->Line($x, $this->_margin + $linehi, $x, $this->_page_height - $this->_margin);
286                  }
287                }
288          }
289        }
290
291
292        function addDoorPage($workshop) {
293          global $jpdd;
294          $this->_workshop = $workshop;
295          $this->_workshop_page = 0;
296          $this->addPage();
297         
298          // display presenters
299          $pres = $workshop->getM2MPeers('person', 'presenter');
300          $this->displayList(ucfirst(count($pres) == 1 ? $jpdd->getPresenterName() : $jpdd->getPresenterNamePlural()).':', $pres, create_function('$x', 'global $jpdd; $af = $x->getAffiliationString(); return html_entity_decode($x->getTitle().($jpdd->isEmpty($af) ? "" : " - ".$af));'));
301
302          // display audience
303          $audience = $workshop->getM2MPeers('person', 'audience');
304          $this->displayList('Participants:', $audience, create_function('$x', 'return $x->getTitle();'));
305          //      $this->Footer();
306          $this->_workshop = NULL;
307        }
308
309        function getDirections() {
310          return 'Julia Richman Education Complex
311317 East 67th Street (between First and Second avenues)
312closest subway:  #6, 68th St. station (Hunter College)';
313        }
314        function addDirections() {
315          $this->setX($this->_margin * 2);
316          $this->SetFont($this->_font, '', $this->_body_fsize);
317          $this->MultiCell($this->_page_width - (4*$this->_margin), $this->_body_fsize * $this->_line_sp, $this->getDirections(), 'T', 'L');
318        }
319
320        function addParticipantPage($person) {
321          global $jpdd;
322          $attendences = $person->getAttendingWorkshops('audience');
323          $orgs = $person->getM2MPeers('organization', 'affiliation');
324
325          $this->newPage();
326          $txt = '';
327
328          $headerfontsize = $this->createHeader();
329
330          $this->SetY($this->GetY() + $headerfontsize);
331          $this->SetFont($this->_font, '', $this->_body_fsize);
332
333          if (count($attendences) > 0) {
334                $orgtxt = '';
335                if (count($orgs) > 0) 
336                  $orgtxt = ' ('.join(', ', array_map(create_function('$x', 'return $x->getTitle();'), $orgs)).')';
337                $txt .= 'Thanks for registering, '.$person->getTitle().$orgtxt."\n\n";
338
339                // do something with each workshop.
340                reset($attendences);
341                while (list(,$ws) = each($attendences)) {
342                  $room = $ws->getAssignedRoom();
343                  $txt .= 'You will be attending "'.$ws->getTitle().'"'.(is_null($room) ? '' : ' in room '.$room->getTitle());
344                }
345          } else {
346                $txt .= 'You have not signed up for any workshop!  You might want to do that.';
347          }
348          $this->MultiCell($this->_page_width - ($this->_margin + $this->_margin), $this->_body_fsize*$this->_line_sp, $txt, 0, 1, 'L');
349
350          $this->SetY($this->GetY() + 4*$headerfontsize);
351         
352          $this->addDirections();
353        }
354
355  }
356}
357?>
Note: See TracBrowser for help on using the repository browser.