1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
$wgAutoloadClasses['SRFCHistoricalDate'] = dirname( __FILE__ ) |
4
|
|
|
. '/SRFC_HistoricalDate.php'; |
5
|
|
|
|
6
|
|
|
/** |
7
|
|
|
* Result printer that prints query results as a monthly calendar. |
8
|
|
|
* |
9
|
|
|
* @file SRF_Calendar.php |
10
|
|
|
* @ingroup SemanticResultFormats |
11
|
|
|
* |
12
|
|
|
* @author Yaron Koren |
13
|
|
|
*/ |
14
|
|
|
class SRFCalendar extends SMWResultPrinter { |
15
|
|
|
|
16
|
|
|
protected $mTemplate; |
17
|
|
|
protected $mUserParam; |
18
|
|
|
protected $mRealUserLang = null; |
19
|
|
|
protected $mStartMonth; |
20
|
|
|
protected $mStartYear; |
21
|
|
|
|
22
|
|
|
protected function setColors( $colorsText ) { |
23
|
|
|
$colors = []; |
24
|
|
|
$colorElements = explode( ',', $colorsText ); |
25
|
|
|
foreach ( $colorElements as $colorElem ) { |
26
|
|
|
$propAndColor = explode( '=>', $colorElem ); |
27
|
|
|
if ( count( $propAndColor ) == 2 ) { |
28
|
|
|
$colors[$propAndColor[0]] = $propAndColor[1]; |
29
|
|
|
} |
30
|
|
|
} |
31
|
|
|
$this->mColors = $colors; |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
protected function handleParameters( array $params, $outputmode ) { |
35
|
|
|
parent::handleParameters( $params, $outputmode ); |
36
|
|
|
|
37
|
|
|
$this->mTemplate = trim( $params['template'] ); |
38
|
|
|
$this->mUserParam = trim( $params['userparam'] ); |
39
|
|
|
// startmonth is initialized with current month by default |
40
|
|
|
$this->mStartMonth = trim( $params['startmonth'] ); |
41
|
|
|
// startyear is initialized with current year by default |
42
|
|
|
$this->mStartYear = trim( $params['startyear'] ); |
43
|
|
|
|
44
|
|
|
if ( $params['lang'] !== false ) { |
45
|
|
|
global $wgLang; |
46
|
|
|
// Store the actual user's language, so we can revert |
47
|
|
|
// back to it after printing the calendar. |
48
|
|
|
$this->mRealUserLang = clone ( $wgLang ); |
49
|
|
|
$wgLang = Language::factory( trim( $params['lang'] ) ); |
50
|
|
|
} |
51
|
|
|
|
52
|
|
|
$this->setColors( $params['colors'] ); |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
public function getName() { |
56
|
|
|
return wfMessage( 'srf_printername_calendar' )->text(); |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
/** |
60
|
|
|
* @see SMWResultPrinter::buildResult |
61
|
|
|
* |
62
|
|
|
* @since 1.8 |
63
|
|
|
* |
64
|
|
|
* @param SMWQueryResult $results |
65
|
|
|
* |
66
|
|
|
* @return string |
67
|
|
|
*/ |
68
|
|
|
protected function buildResult( SMWQueryResult $results ) { |
69
|
|
|
$this->isHTML = false; |
70
|
|
|
$this->hasTemplates = false; |
71
|
|
|
|
72
|
|
|
// Skip checks - results with 0 entries are normal. |
73
|
|
|
return $this->getResultText( $results, SMW_OUTPUT_HTML ); |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
/** |
77
|
|
|
* (non-PHPdoc) |
78
|
|
|
* @see SMWResultPrinter::getResultText() |
79
|
|
|
* |
80
|
|
|
* @todo Split up megamoth |
81
|
|
|
*/ |
82
|
|
|
protected function getResultText( SMWQueryResult $res, $outputmode ) { |
83
|
|
|
$events = []; |
84
|
|
|
|
85
|
|
|
// Print all result rows. |
86
|
|
|
while ( $row = $res->getNext() ) { |
87
|
|
|
$dates = []; |
88
|
|
|
$title = $text = $color = ''; |
89
|
|
|
|
90
|
|
|
if ( $this->mTemplate != '' ) { |
91
|
|
|
// Build template code |
92
|
|
|
$this->hasTemplates = true; |
93
|
|
|
|
94
|
|
|
if ( $this->mUserParam ) { |
95
|
|
|
$text = "|userparam=$this->mUserParam"; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
foreach ( $row as $i => $field ) { |
99
|
|
|
$pr = $field->getPrintRequest(); |
100
|
|
|
$text .= '|' . ( $i + 1 ) . '='; |
101
|
|
|
|
102
|
|
|
while ( |
103
|
|
|
( $object = $field->getNextDataValue() ) !== false |
104
|
|
|
) { |
105
|
|
|
if ( $object->getTypeID() == '_dat' ) { |
106
|
|
|
$text .= $object->getLongWikiText(); |
107
|
|
|
|
108
|
|
|
// use shorter "LongText" for wikipage |
109
|
|
|
} elseif ( $object->getTypeID() == '_wpg' ) { |
110
|
|
|
// handling of "link=" param |
111
|
|
|
if ( $this->mLinkOthers ) { |
112
|
|
|
$text .= |
113
|
|
|
$object->getLongText( $outputmode, null ); |
114
|
|
|
} else { |
115
|
|
|
$text .= $object->getWikiValue(); |
116
|
|
|
} |
117
|
|
|
} else { |
118
|
|
|
$text .= $object->getShortText( $outputmode, null ); |
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
if ( |
122
|
|
|
$pr->getMode() == SMWPrintRequest::PRINT_PROP && |
123
|
|
|
$pr->getTypeID() == '_dat' |
124
|
|
|
) { |
125
|
|
|
$datePropLabel = $pr->getLabel(); |
126
|
|
|
if ( !array_key_exists( $datePropLabel, $dates ) ) { |
127
|
|
|
$dates[$datePropLabel] = []; |
128
|
|
|
} |
129
|
|
|
$dates[$datePropLabel][] = |
130
|
|
|
$this->formatDateStr( $object ); |
131
|
|
|
} |
132
|
|
|
} |
133
|
|
|
} |
134
|
|
|
} else { |
135
|
|
|
// Build simple text. |
136
|
|
|
$numNonDateProperties = 0; |
137
|
|
|
// Cycle through a 'row', which is the page |
138
|
|
|
// name (the first field) plus all its |
139
|
|
|
// properties. |
140
|
|
|
foreach ( $row as $i => $field ) { |
141
|
|
|
$pr = $field->getPrintRequest(); |
142
|
|
|
// A property can have more than one |
143
|
|
|
// value - cycle through all the values |
144
|
|
|
// for this property. |
145
|
|
|
$textForProperty = ''; |
146
|
|
|
|
147
|
|
|
while ( |
148
|
|
|
( $object = $field->getNextDataValue() ) !== false |
149
|
|
|
) { |
150
|
|
|
if ( $object->getTypeID() == '_dat' ) { |
151
|
|
|
// Don't add date values to the display. |
152
|
|
|
|
153
|
|
|
// use shorter "LongText" for wikipage |
154
|
|
|
} elseif ( $object->getTypeID() == '_wpg' ) { |
155
|
|
|
if ( $i == 0 ) { |
156
|
|
|
$title = Title::newFromText( |
157
|
|
|
$object->getShortWikiText( false ) |
158
|
|
|
); |
159
|
|
|
} else { |
160
|
|
|
$numNonDateProperties++; |
161
|
|
|
|
162
|
|
|
// handling of "headers=" param |
163
|
|
|
if ( $this->mShowHeaders == SMW_HEADERS_SHOW ) { |
164
|
|
|
$textForProperty .= $pr->getHTMLText( |
165
|
|
|
smwfGetLinker() |
166
|
|
|
) . ' '; |
167
|
|
|
} elseif ( |
168
|
|
|
$this->mShowHeaders == SMW_HEADERS_PLAIN |
169
|
|
|
) { |
170
|
|
|
$textForProperty .= $pr->getLabel() . ' '; |
171
|
|
|
} |
172
|
|
|
|
173
|
|
|
// If $this->mShowHeaders == SMW_HEADERS_HIDE, |
174
|
|
|
// print nothing. |
175
|
|
|
// handling of "link=" param |
176
|
|
|
if ( $this->mLinkOthers ) { |
177
|
|
|
$textForProperty .= $object->getLongText( |
178
|
|
|
$outputmode, |
179
|
|
|
smwfGetLinker() |
180
|
|
|
); |
181
|
|
|
} else { |
182
|
|
|
$textForProperty .= $object->getWikiValue(); |
183
|
|
|
} |
184
|
|
|
} |
185
|
|
|
} else { |
186
|
|
|
$numNonDateProperties++; |
187
|
|
|
$textForProperty .= |
188
|
|
|
$pr->getHTMLText( smwfGetLinker() ) |
189
|
|
|
. ' ' . $object->getShortText( |
190
|
|
|
$outputmode, |
191
|
|
|
smwfGetLinker() |
192
|
|
|
); |
193
|
|
|
} |
194
|
|
|
if ( |
195
|
|
|
$pr->getMode() == SMWPrintRequest::PRINT_PROP && |
196
|
|
|
$pr->getTypeID() == '_dat' |
197
|
|
|
) { |
198
|
|
|
$datePropLabel = $pr->getLabel(); |
199
|
|
|
if ( !array_key_exists( $datePropLabel, $dates ) ) { |
200
|
|
|
$dates[$datePropLabel] = []; |
201
|
|
|
} |
202
|
|
|
$dates[$datePropLabel][] = |
203
|
|
|
$this->formatDateStr( $object ); |
204
|
|
|
} |
205
|
|
|
} |
206
|
|
|
|
207
|
|
|
// Add the text for this property to |
208
|
|
|
// the main text, adding on parentheses |
209
|
|
|
// or commas as needed. |
210
|
|
|
if ( $numNonDateProperties == 1 ) { |
211
|
|
|
$text .= ' ('; |
212
|
|
|
} elseif ( $numNonDateProperties > 1 ) { |
213
|
|
|
$text .= ', '; |
214
|
|
|
} |
215
|
|
|
$text .= $textForProperty; |
216
|
|
|
} |
217
|
|
|
if ( $numNonDateProperties > 0 ) { |
218
|
|
|
$text .= ')'; |
219
|
|
|
} |
220
|
|
|
} |
221
|
|
|
|
222
|
|
|
if ( count( $dates ) > 0 ) { |
223
|
|
|
// Handle the 'color=' value, whether it came |
224
|
|
|
// from a compound query or a regular one. |
225
|
|
|
$resSubject = $field->getResultSubject(); |
|
|
|
|
226
|
|
|
if ( isset( $resSubject->display_options ) |
227
|
|
|
&& is_array( $resSubject->display_options ) ) { |
228
|
|
|
if ( array_key_exists( |
229
|
|
|
'color', |
230
|
|
|
$resSubject->display_options |
231
|
|
|
) |
232
|
|
|
) { |
233
|
|
|
$color = $resSubject->display_options['color']; |
234
|
|
|
} |
235
|
|
|
if ( |
236
|
|
|
array_key_exists( |
237
|
|
|
'colors', |
238
|
|
|
$resSubject->display_options |
239
|
|
|
) |
240
|
|
|
) { |
241
|
|
|
$this->setColors( |
242
|
|
|
$resSubject->display_options['colors'] |
243
|
|
|
); |
244
|
|
|
} |
245
|
|
|
} |
246
|
|
|
|
247
|
|
|
foreach ( $dates as $label => $datesForLabel ) { |
248
|
|
|
foreach ( $datesForLabel as $date ) { |
249
|
|
|
$curText = $text; |
250
|
|
|
// If there's more than one |
251
|
|
|
// label, i.e. more than one |
252
|
|
|
// date property being displayed, |
253
|
|
|
// show the name of the current |
254
|
|
|
// property in parentheses. |
255
|
|
|
if ( count( $dates ) > 1 ) { |
256
|
|
|
$curText = "($label) " . $curText; |
257
|
|
|
} |
258
|
|
|
$curColor = $color; |
259
|
|
|
if ( array_key_exists( $label, $this->mColors ) ) { |
260
|
|
|
$curColor = $this->mColors[$label]; |
261
|
|
|
} |
262
|
|
|
$events[] = [ $title, $curText, $date, $curColor ]; |
263
|
|
|
} |
264
|
|
|
} |
265
|
|
|
} |
266
|
|
|
} |
267
|
|
|
|
268
|
|
|
$result = $this->displayCalendar( $events ); |
269
|
|
|
|
270
|
|
|
// Go back to the actual user's language, in case a different |
271
|
|
|
// language had been specified for this calendar. |
272
|
|
|
if ( !is_null( $this->mRealUserLang ) ) { |
273
|
|
|
global $wgLang; |
274
|
|
|
$wgLang = $this->mRealUserLang; |
275
|
|
|
} |
276
|
|
|
|
277
|
|
|
global $wgParser; |
278
|
|
|
|
279
|
|
|
if ( is_null( $wgParser->getTitle() ) ) { |
280
|
|
|
return $result; |
281
|
|
|
} else { |
282
|
|
|
return [ $result, 'noparse' => 'true', 'isHTML' => 'true' ]; |
283
|
|
|
} |
284
|
|
|
} |
285
|
|
|
|
286
|
|
|
protected static function intToMonth( $int ) { |
287
|
|
|
$months = [ |
288
|
|
|
'1' => 'january', |
289
|
|
|
'2' => 'february', |
290
|
|
|
'3' => 'march', |
291
|
|
|
'4' => 'april', |
292
|
|
|
'5' => 'may_long', |
293
|
|
|
'6' => 'june', |
294
|
|
|
'7' => 'july', |
295
|
|
|
'8' => 'august', |
296
|
|
|
'9' => 'september', |
297
|
|
|
'10' => 'october', |
298
|
|
|
'11' => 'november', |
299
|
|
|
'12' => 'december', |
300
|
|
|
]; |
301
|
|
|
|
302
|
|
|
return wfMessage( |
303
|
|
|
array_key_exists( $int, $months ) |
304
|
|
|
? $months[$int] |
305
|
|
|
: 'january' |
306
|
|
|
)->inContentLanguage()->text(); |
307
|
|
|
} |
308
|
|
|
|
309
|
|
|
function formatDateStr( $object ) { |
|
|
|
|
310
|
|
|
// For some reason, getMonth() and getDay() sometimes return a |
311
|
|
|
// number with a leading zero - get rid of it using (int) |
312
|
|
|
return $object->getYear() |
313
|
|
|
. '-' . (int)$object->getMonth() . '-' . (int)$object->getDay(); |
314
|
|
|
} |
315
|
|
|
|
316
|
|
|
function displayCalendar( $events ) { |
|
|
|
|
317
|
|
|
global $wgParser; |
318
|
|
|
global $srfgFirstDayOfWeek; |
319
|
|
|
global $srfgScriptPath; |
320
|
|
|
|
321
|
|
|
$context = RequestContext::getMain(); |
322
|
|
|
$request = $context->getRequest(); |
323
|
|
|
if ( !$wgParser->mFirstCall ) { |
324
|
|
|
$wgParser->disableCache(); |
325
|
|
|
} |
326
|
|
|
|
327
|
|
|
$context->getOutput()->addLink( |
328
|
|
|
[ |
329
|
|
|
'rel' => 'stylesheet', |
330
|
|
|
'type' => 'text/css', |
331
|
|
|
'media' => 'screen, print', |
332
|
|
|
'href' => $srfgScriptPath |
333
|
|
|
. '/formats/calendar/resources/ext.srf.calendar.css' |
334
|
|
|
] |
335
|
|
|
); |
336
|
|
|
|
337
|
|
|
// Set variables differently depending on whether this is |
338
|
|
|
// being called from a regular page, via #ask, or from a |
339
|
|
|
// special page: most likely either Special:Ask or |
340
|
|
|
// Special:RunQuery. |
341
|
|
|
$pageTitle = $context->getTitle(); |
342
|
|
|
if ( !$pageTitle ) { |
343
|
|
|
$pageTitle = $wgParser->getTitle(); |
344
|
|
|
} |
345
|
|
|
$additionalQueryString = ''; |
346
|
|
|
$hiddenInputs = ''; |
347
|
|
|
|
348
|
|
|
if ( $pageTitle->isSpecialPage() ) { |
349
|
|
|
$requestValues = $request->getValues(); |
350
|
|
|
// Also go through the predefined PHP variable |
351
|
|
|
// $_REQUEST, because $request->getValues() for |
352
|
|
|
// some reason doesn't return array values - is |
353
|
|
|
// there a better (less hacky) way to do this? |
354
|
|
|
foreach ( $_REQUEST as $key => $value ) { |
355
|
|
|
if ( is_array( $value ) ) { |
356
|
|
|
foreach ( $value as $k2 => $v2 ) { |
357
|
|
|
$newKey = $key . '[' . $k2 . ']'; |
358
|
|
|
$requestValues[$newKey] = $v2; |
359
|
|
|
} |
360
|
|
|
} |
361
|
|
|
} |
362
|
|
|
|
363
|
|
|
foreach ( $requestValues as $key => $value ) { |
364
|
|
|
if ( $key != 'month' && $key != 'year' |
365
|
|
|
// values from 'RunQuery' |
366
|
|
|
&& $key != 'query' && $key != 'free_text' |
367
|
|
|
) { |
368
|
|
|
$additionalQueryString .= "&$key=$value"; |
369
|
|
|
$hiddenInputs .= "<input type=\"hidden\" " . |
370
|
|
|
"name=\"$key\" value=\"$value\" />"; |
371
|
|
|
} |
372
|
|
|
} |
373
|
|
|
} |
374
|
|
|
|
375
|
|
|
// Set days of the week. |
376
|
|
|
$weekDayNames = [ |
377
|
|
|
1 => wfMessage( 'sunday' )->text(), |
378
|
|
|
2 => wfMessage( 'monday' )->text(), |
379
|
|
|
3 => wfMessage( 'tuesday' )->text(), |
380
|
|
|
4 => wfMessage( 'wednesday' )->text(), |
381
|
|
|
5 => wfMessage( 'thursday' )->text(), |
382
|
|
|
6 => wfMessage( 'friday' )->text(), |
383
|
|
|
7 => wfMessage( 'saturday' )->text() |
384
|
|
|
]; |
385
|
|
|
if ( empty( $srfgFirstDayOfWeek ) ) { |
386
|
|
|
$firstDayOfWeek = 1; |
387
|
|
|
$lastDayOfWeek = 7; |
388
|
|
|
} else { |
389
|
|
|
$firstDayOfWeek = |
390
|
|
|
array_search( $srfgFirstDayOfWeek, $weekDayNames ); |
391
|
|
|
if ( $firstDayOfWeek === false ) { |
392
|
|
|
// Bad value for $srfgFirstDayOfWeek! |
393
|
|
|
print 'Warning: Bad value for $srfgFirstDayOfWeek "' . |
394
|
|
|
'(' . $srfgFirstDayOfWeek . '")'; |
395
|
|
|
$firstDayOfWeek = 1; |
396
|
|
|
} |
397
|
|
|
if ( $firstDayOfWeek == 1 ) { |
398
|
|
|
$lastDayOfWeek = 7; |
399
|
|
|
} else { |
400
|
|
|
$lastDayOfWeek = $firstDayOfWeek - 1; |
401
|
|
|
} |
402
|
|
|
} |
403
|
|
|
|
404
|
|
|
// Now create the actual array of days of the week, based on |
405
|
|
|
// the start day |
406
|
|
|
$weekDays = []; |
407
|
|
|
for ( $i = 1; $i <= 7; $i++ ) { |
408
|
|
|
$curDay = ( ( $firstDayOfWeek + $i - 2 ) % 7 ) + 1; |
409
|
|
|
$weekDays[$i] = $weekDayNames[$curDay]; |
410
|
|
|
} |
411
|
|
|
|
412
|
|
|
// Get all the date-based values we need - the current month |
413
|
|
|
// and year (i.e., the one the user is looking at - not |
414
|
|
|
// necessarily the "current" ones), the previous and next months |
415
|
|
|
// and years (same - note that the previous or next month could |
416
|
|
|
// be in a different year), the number of days in the current, |
417
|
|
|
// previous and next months, etc. |
418
|
|
|
|
419
|
|
|
if ( is_numeric( $this->mStartMonth ) && |
420
|
|
|
( intval( $this->mStartMonth ) == $this->mStartMonth ) && |
421
|
|
|
$this->mStartMonth >= 1 && $this->mStartMonth <= 12 |
422
|
|
|
) { |
423
|
|
|
$curMonthNum = $this->mStartMonth; |
424
|
|
|
} else { |
425
|
|
|
$curMonthNum = date( 'n' ); |
426
|
|
|
} |
427
|
|
|
if ( $request->getCheck( 'month' ) ) { |
428
|
|
|
$queryMonth = $request->getVal( 'month' ); |
429
|
|
|
if ( is_numeric( $queryMonth ) && |
430
|
|
|
( intval( $queryMonth ) == $queryMonth ) && |
431
|
|
|
$queryMonth >= 1 && $queryMonth <= 12 |
432
|
|
|
) { |
433
|
|
|
$curMonthNum = $request->getVal( 'month' ); |
434
|
|
|
} |
435
|
|
|
} |
436
|
|
|
|
437
|
|
|
$curMonth = self::intToMonth( $curMonthNum ); |
438
|
|
|
|
439
|
|
|
if ( is_numeric( $this->mStartYear ) && |
440
|
|
|
( intval( $this->mStartYear ) == $this->mStartYear ) |
441
|
|
|
) { |
442
|
|
|
$curYear = $this->mStartYear; |
443
|
|
|
} else { |
444
|
|
|
$curYear = date( 'Y' ); |
445
|
|
|
} |
446
|
|
|
if ( $request->getCheck( 'year' ) ) { |
447
|
|
|
$queryYear = $request->getVal( 'year' ); |
448
|
|
|
if ( is_numeric( $queryYear ) && |
449
|
|
|
intval( $queryYear ) == $queryYear |
450
|
|
|
) { |
451
|
|
|
$curYear = $request->getVal( 'year' ); |
452
|
|
|
} |
453
|
|
|
} |
454
|
|
|
|
455
|
|
|
if ( $curMonthNum == '1' ) { |
456
|
|
|
$prevMonthNum = '12'; |
457
|
|
|
$prevYear = $curYear - 1; |
458
|
|
|
} else { |
459
|
|
|
$prevMonthNum = $curMonthNum - 1; |
460
|
|
|
$prevYear = $curYear; |
461
|
|
|
} |
462
|
|
|
|
463
|
|
|
if ( $curMonthNum == '12' ) { |
464
|
|
|
$nextMonthNum = '1'; |
465
|
|
|
$nextYear = $curYear + 1; |
466
|
|
|
} else { |
467
|
|
|
$nextMonthNum = $curMonthNum + 1; |
468
|
|
|
$nextYear = $curYear; |
469
|
|
|
} |
470
|
|
|
|
471
|
|
|
// There's no year '0' - change it to '1' or '-1'. |
472
|
|
|
if ( $curYear == '0' ) { |
473
|
|
|
$curYear = '1'; |
474
|
|
|
} |
475
|
|
|
if ( $nextYear == '0' ) { |
476
|
|
|
$nextYear = '1'; |
477
|
|
|
} |
478
|
|
|
if ( $prevYear == '0' ) { |
479
|
|
|
$prevYear = '-1'; |
480
|
|
|
} |
481
|
|
|
|
482
|
|
|
$prevMonthUrl = $pageTitle->getLocalURL( |
483
|
|
|
"month=$prevMonthNum&year=$prevYear" . |
484
|
|
|
$additionalQueryString |
485
|
|
|
); |
486
|
|
|
$nextMonthUrl = $pageTitle->getLocalURL( |
487
|
|
|
"month=$nextMonthNum&year=$nextYear" . |
488
|
|
|
$additionalQueryString |
489
|
|
|
); |
490
|
|
|
$todayUrl = $pageTitle->getLocalURL( $additionalQueryString ); |
491
|
|
|
|
492
|
|
|
$todayText = wfMessage( 'srfc_today' )->text(); |
493
|
|
|
$prevMonthText = wfMessage( 'srfc_previousmonth' )->text(); |
494
|
|
|
$nextMonthText = wfMessage( 'srfc_nextmonth' )->text(); |
495
|
|
|
$goToMonthText = wfMessage( 'srfc_gotomonth' )->text(); |
496
|
|
|
|
497
|
|
|
// Get day of the week that the first of this month falls on. |
498
|
|
|
$firstDay = new SRFCHistoricalDate(); |
499
|
|
|
$firstDay->create( $curYear, $curMonthNum, 1 ); |
500
|
|
|
$startDay = $firstDayOfWeek - $firstDay->getDayOfWeek(); |
501
|
|
|
if ( $startDay > 0 ) { |
502
|
|
|
$startDay -= 7; |
503
|
|
|
} |
504
|
|
|
$daysInPrevMonth = |
505
|
|
|
SRFCHistoricalDate::daysInMonth( $prevYear, $prevMonthNum ); |
506
|
|
|
$daysInCurMonth = |
507
|
|
|
SRFCHistoricalDate::daysInMonth( $curYear, $curMonthNum ); |
508
|
|
|
$todayString = date( 'Y n j', time() ); |
509
|
|
|
$pageName = $pageTitle->getPrefixedDbKey(); |
510
|
|
|
|
511
|
|
|
// Create table for holding title and navigation information. |
512
|
|
|
$text = <<<END |
513
|
|
|
<table class="navigation_table"> |
514
|
|
|
<tr><td class="month_name">$curMonth $curYear</td> |
515
|
|
|
<td class="nav_links"><a href="$prevMonthUrl" title="$prevMonthText"> |
516
|
|
|
<img src="{$srfgScriptPath}/formats/calendar/resources/images/left-arrow.png" border="0" /> |
517
|
|
|
</a> <a href="$todayUrl">$todayText</a>  |
518
|
|
|
<a href="$nextMonthUrl" title="$nextMonthText"> |
519
|
|
|
<img src="{$srfgScriptPath}/formats/calendar/resources/images/right-arrow.png" border="0" /> |
520
|
|
|
</a></td><td class="nav_form"><form> |
521
|
|
|
<input type="hidden" name="title" value="$pageName"> |
522
|
|
|
<select name="month"> |
523
|
|
|
|
524
|
|
|
END; |
525
|
|
|
for ( $i = 1; $i <= 12; $i++ ) { |
526
|
|
|
$monthName = self::intToMonth( $i ); |
527
|
|
|
$selectedStr = ( $i == $curMonthNum ) ? "selected" : ""; |
528
|
|
|
$text .= "<option value=\"$i\" $selectedStr> |
529
|
|
|
$monthName</option>\n"; |
530
|
|
|
} |
531
|
|
|
$text .= <<<END |
532
|
|
|
</select> |
533
|
|
|
<input name="year" type="text" value="$curYear" size="4"> |
534
|
|
|
$hiddenInputs |
535
|
|
|
<input type="submit" value="$goToMonthText"> |
536
|
|
|
</form> |
537
|
|
|
</td> |
538
|
|
|
</tr> |
539
|
|
|
</table> |
540
|
|
|
|
541
|
|
|
<table class="month_calendar"> |
542
|
|
|
<tr class="weekdays"> |
543
|
|
|
|
544
|
|
|
END; |
545
|
|
|
// First row of the main table holds the days of the week |
546
|
|
|
foreach ( $weekDays as $weekDay ) { |
547
|
|
|
$text .= "<td>$weekDay</td>"; |
548
|
|
|
} |
549
|
|
|
$text .= "</tr>\n"; |
550
|
|
|
|
551
|
|
|
// Now, create the calendar itself - |
552
|
|
|
// loop through a set of weeks, from a "Sunday" (which might be |
553
|
|
|
// before the beginning of the month) to a "Saturday" (which |
554
|
|
|
// might be after the end of the month). |
555
|
|
|
// "Sunday" and "Saturday" are in quotes because the actual |
556
|
|
|
// start and end days of the week can be set by the admin. |
557
|
|
|
$dayOfTheWeek = $firstDayOfWeek; |
558
|
|
|
$isLastWeek = false; |
559
|
|
|
for ( $day = $startDay; |
560
|
|
|
( !$isLastWeek || $dayOfTheWeek != $firstDayOfWeek ); |
561
|
|
|
$day++ ) { |
562
|
|
|
if ( $dayOfTheWeek == $firstDayOfWeek ) { |
563
|
|
|
$text .= "<tr>\n"; |
564
|
|
|
} |
565
|
|
|
if ( "$curYear $curMonthNum $day" == $todayString ) { |
566
|
|
|
$text .= "<td class=\"today\">\n"; |
567
|
|
|
} elseif ( $dayOfTheWeek == 1 || $dayOfTheWeek == 7 ) { |
568
|
|
|
$text .= "<td class=\"weekend_day\">\n"; |
569
|
|
|
} else { |
570
|
|
|
$text .= "<td>\n"; |
571
|
|
|
} |
572
|
|
|
if ( $day == $daysInCurMonth || $day > 50 ) { |
573
|
|
|
$isLastWeek = true; |
574
|
|
|
} |
575
|
|
|
// If this day is before or after the current month, |
576
|
|
|
// set a "display day" to show on the calendar, and |
577
|
|
|
// use a different CSS style for it. |
578
|
|
|
if ( $day > $daysInCurMonth || $day < 1 ) { |
579
|
|
|
if ( $day < 1 ) { |
580
|
|
|
$displayDay = $day + $daysInPrevMonth; |
581
|
|
|
$dateStr = |
582
|
|
|
$prevYear . '-' . $prevMonthNum . '-' . $displayDay; |
583
|
|
|
} |
584
|
|
|
if ( $day > $daysInCurMonth ) { |
585
|
|
|
$displayDay = $day - $daysInCurMonth; |
586
|
|
|
$dateStr = |
587
|
|
|
$nextYear . '-' . $nextMonthNum . '-' . $displayDay; |
588
|
|
|
} |
589
|
|
|
$text .= |
590
|
|
|
"<div class=\"day day_other_month\">$displayDay</div>\n"; |
|
|
|
|
591
|
|
|
} else { |
592
|
|
|
$dateStr = $curYear . '-' . $curMonthNum . '-' . $day; |
593
|
|
|
$text .= "<div class=\"day\">$day</div>\n"; |
594
|
|
|
} |
595
|
|
|
// Finally, the most important step - get the events |
596
|
|
|
// that match this date, and the given set of criteria, |
597
|
|
|
// and display them in this date's box. |
598
|
|
|
$text .= "<div class=\"main\">\n"; |
599
|
|
|
if ( $events == null ) { |
600
|
|
|
$events = []; |
601
|
|
|
} |
602
|
|
|
foreach ( $events as $event ) { |
603
|
|
|
list( $eventTitle, $otherText, $eventDate, $color ) = $event; |
604
|
|
|
if ( $eventDate == $dateStr ) { |
605
|
|
|
if ( $this->mTemplate != '' ) { |
606
|
|
|
$templatetext = '{{' . $this->mTemplate . $otherText . |
607
|
|
|
'|thisdate=' . $dateStr . '}}'; |
|
|
|
|
608
|
|
|
$templatetext = |
609
|
|
|
$wgParser->replaceVariables( $templatetext ); |
610
|
|
|
$templatetext = |
611
|
|
|
$wgParser->recursiveTagParse( $templatetext ); |
612
|
|
|
$text .= $templatetext; |
613
|
|
|
} else { |
614
|
|
|
$eventStr = Linker::link( $eventTitle ); |
615
|
|
|
if ( $color != '' ) { |
616
|
|
|
$text .= "<div class=\"colored-entry\"> |
617
|
|
|
<p style=\"border-left: 7px $color solid;\"> |
618
|
|
|
$eventStr $otherText</p></div>\n"; |
619
|
|
|
} else { |
620
|
|
|
$text .= "$eventStr $otherText\n\n"; |
621
|
|
|
} |
622
|
|
|
} |
623
|
|
|
} |
624
|
|
|
} |
625
|
|
|
$text .= <<<END |
626
|
|
|
</div> |
627
|
|
|
</td> |
628
|
|
|
|
629
|
|
|
END; |
630
|
|
|
if ( $dayOfTheWeek == $lastDayOfWeek ) { |
631
|
|
|
$text .= "</tr>\n"; |
632
|
|
|
} |
633
|
|
|
if ( $dayOfTheWeek == 7 ) { |
634
|
|
|
$dayOfTheWeek = 1; |
635
|
|
|
} else { |
636
|
|
|
$dayOfTheWeek++; |
637
|
|
|
} |
638
|
|
|
} |
639
|
|
|
$text .= "</table>\n"; |
640
|
|
|
|
641
|
|
|
return $text; |
642
|
|
|
} |
643
|
|
|
|
644
|
|
|
/** |
645
|
|
|
* @see SMWResultPrinter::getParamDefinitions |
646
|
|
|
* |
647
|
|
|
* @since 1.8 |
648
|
|
|
* |
649
|
|
|
* @param $definitions array of IParamDefinition |
650
|
|
|
* |
651
|
|
|
* @return array of IParamDefinition|array |
652
|
|
|
*/ |
653
|
|
|
public function getParamDefinitions( array $definitions ) { |
654
|
|
|
$params = parent::getParamDefinitions( $definitions ); |
655
|
|
|
|
656
|
|
|
$params['lang'] = [ |
657
|
|
|
'message' => 'srf_paramdesc_calendarlang', |
658
|
|
|
'default' => false, |
659
|
|
|
'manipulatedefault' => false, |
660
|
|
|
]; |
661
|
|
|
|
662
|
|
|
$params['template'] = [ |
663
|
|
|
'message' => 'smw-paramdesc-template', |
664
|
|
|
'default' => '', |
665
|
|
|
]; |
666
|
|
|
|
667
|
|
|
$params['userparam'] = [ |
668
|
|
|
'message' => 'smw-paramdesc-userparam', |
669
|
|
|
'default' => '', |
670
|
|
|
]; |
671
|
|
|
|
672
|
|
|
$params['color'] = [ |
673
|
|
|
'message' => 'srf-paramdesc-color', |
674
|
|
|
'default' => '', |
675
|
|
|
]; |
676
|
|
|
|
677
|
|
|
$params['colors'] = [ |
678
|
|
|
'message' => 'srf_paramdesc_calendarcolors', |
679
|
|
|
'default' => '', |
680
|
|
|
]; |
681
|
|
|
|
682
|
|
|
$params['startmonth'] = [ |
683
|
|
|
'message' => 'srf-paramdesc-calendar-startmonth', |
684
|
|
|
'default' => date( 'n' ), |
685
|
|
|
]; |
686
|
|
|
|
687
|
|
|
$params['startyear'] = [ |
688
|
|
|
'message' => 'srf-paramdesc-calendar-startyear', |
689
|
|
|
'default' => date( 'Y' ), |
690
|
|
|
]; |
691
|
|
|
|
692
|
|
|
return $params; |
693
|
|
|
} |
694
|
|
|
} |
695
|
|
|
|
If you define a variable conditionally, it can happen that it is not defined for all execution paths.
Let’s take a look at an example:
In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.
Available Fixes
Check for existence of the variable explicitly:
Define a default value for the variable:
Add a value for the missing path: