Verzeichnisstruktur phpBB-3.0.0
- Veröffentlicht
- 12.12.2007
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
template.php
001 <?php
002 /**
003 *
004 * @package phpBB3
005 * @version $Id$
006 * @copyright (c) 2005 phpBB Group, sections (c) 2001 ispi of Lincoln Inc
007 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008 *
009 */
010
011 /**
012 * @ignore
013 */
014 if (!defined('IN_PHPBB'))
015 {
016 exit;
017 }
018
019 /**
020 * Base Template class.
021 * @package phpBB3
022 */
023 class template
024 {
025 /** variable that holds all the data we'll be substituting into
026 * the compiled templates. Takes form:
027 * --> $this->_tpldata[block][iteration#][child][iteration#][child2][iteration#][variablename] == value
028 * if it's a root-level variable, it'll be like this:
029 * --> $this->_tpldata[.][0][varname] == value
030 */
031 var $_tpldata = array('.' => array(0 => array()));
032 var $_rootref;
033
034 // Root dir and hash of filenames for each template handle.
035 var $root = '';
036 var $cachepath = '';
037 var $files = array();
038 var $filename = array();
039
040 // this will hash handle names to the compiled/uncompiled code for that handle.
041 var $compiled_code = array();
042
043 /**
044 * Set template location
045 * @access public
046 */
047 function set_template()
048 {
049 global $phpbb_root_path, $user;
050
051 if (file_exists($phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template'))
052 {
053 $this->root = $phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template';
054 $this->cachepath = $phpbb_root_path . 'cache/tpl_' . $user->theme['template_path'] . '_';
055 }
056 else
057 {
058 trigger_error('Template path could not be found: styles/' . $user->theme['template_path'] . '/template', E_USER_ERROR);
059 }
060
061 $this->_rootref = &$this->_tpldata['.'][0];
062
063 return true;
064 }
065
066 /**
067 * Set custom template location (able to use directory outside of phpBB)
068 * @access public
069 */
070 function set_custom_template($template_path, $template_name)
071 {
072 global $phpbb_root_path;
073
074 $this->root = $template_path;
075 $this->cachepath = $phpbb_root_path . 'cache/ctpl_' . $template_name . '_';
076
077 return true;
078 }
079
080 /**
081 * Sets the template filenames for handles. $filename_array
082 * should be a hash of handle => filename pairs.
083 * @access public
084 */
085 function set_filenames($filename_array)
086 {
087 if (!is_array($filename_array))
088 {
089 return false;
090 }
091
092 foreach ($filename_array as $handle => $filename)
093 {
094 if (empty($filename))
095 {
096 trigger_error("template->set_filenames: Empty filename specified for $handle", E_USER_ERROR);
097 }
098
099 $this->filename[$handle] = $filename;
100 $this->files[$handle] = $this->root . '/' . $filename;
101 }
102
103 return true;
104 }
105
106 /**
107 * Destroy template data set
108 * @access public
109 */
110 function destroy()
111 {
112 $this->_tpldata = array('.' => array(0 => array()));
113 }
114
115 /**
116 * Reset/empty complete block
117 * @access public
118 */
119 function destroy_block_vars($blockname)
120 {
121 if (strpos($blockname, '.') !== false)
122 {
123 // Nested block.
124 $blocks = explode('.', $blockname);
125 $blockcount = sizeof($blocks) - 1;
126
127 $str = &$this->_tpldata;
128 for ($i = 0; $i < $blockcount; $i++)
129 {
130 $str = &$str[$blocks[$i]];
131 $str = &$str[sizeof($str) - 1];
132 }
133
134 unset($str[$blocks[$blockcount]]);
135 }
136 else
137 {
138 // Top-level block.
139 unset($this->_tpldata[$blockname]);
140 }
141
142 return true;
143 }
144
145 /**
146 * Display handle
147 * @access public
148 */
149 function display($handle, $include_once = true)
150 {
151 global $user, $phpbb_hook;
152
153 if (!empty($phpbb_hook) && $phpbb_hook->call_hook(array(__CLASS__, __FUNCTION__), $handle, $include_once))
154 {
155 if ($phpbb_hook->hook_return(array(__CLASS__, __FUNCTION__)))
156 {
157 return $phpbb_hook->hook_return_result(array(__CLASS__, __FUNCTION__));
158 }
159 }
160
161 if (defined('IN_ERROR_HANDLER'))
162 {
163 if ((E_NOTICE & error_reporting()) == E_NOTICE)
164 {
165 error_reporting(error_reporting() ^ E_NOTICE);
166 }
167 }
168
169 if ($filename = $this->_tpl_load($handle))
170 {
171 ($include_once) ? include_once($filename) : include($filename);
172 }
173 else
174 {
175 eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
176 }
177
178 return true;
179 }
180
181 /**
182 * Display the handle and assign the output to a template variable or return the compiled result.
183 * @access public
184 */
185 function assign_display($handle, $template_var = '', $return_content = true, $include_once = false)
186 {
187 ob_start();
188 $this->display($handle, $include_once);
189 $contents = ob_get_clean();
190
191 if ($return_content)
192 {
193 return $contents;
194 }
195
196 $this->assign_var($template_var, $contents);
197
198 return true;
199 }
200
201 /**
202 * Load a compiled template if possible, if not, recompile it
203 * @access private
204 */
205 function _tpl_load(&$handle)
206 {
207 global $user, $phpEx, $config;
208
209 $filename = $this->cachepath . str_replace('/', '.', $this->filename[$handle]) . '.' . $phpEx;
210
211 $recompile = (($config['load_tplcompile'] && @filemtime($filename) < filemtime($this->files[$handle])) || !file_exists($filename) || @filesize($filename) === 0) ? true : false;
212
213 // Recompile page if the original template is newer, otherwise load the compiled version
214 if (!$recompile)
215 {
216 return $filename;
217 }
218
219 global $db, $phpbb_root_path;
220
221 if (!class_exists('template_compile'))
222 {
223 include($phpbb_root_path . 'includes/functions_template.' . $phpEx);
224 }
225
226 $compile = new template_compile($this);
227
228 // If we don't have a file assigned to this handle, die.
229 if (!isset($this->files[$handle]))
230 {
231 trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
232 }
233
234 // Just compile if no user object is present (happens within the installer)
235 if (!$user)
236 {
237 $compile->_tpl_load_file($handle);
238 return false;
239 }
240
241 if (isset($user->theme['template_storedb']) && $user->theme['template_storedb'])
242 {
243 $sql = 'SELECT *
244 FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
245 WHERE template_id = ' . $user->theme['template_id'] . "
246 AND (template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
247 OR template_included " . $db->sql_like_expression($db->any_char . $this->filename[$handle] . ':' . $db->any_char) . ')';
248 $result = $db->sql_query($sql);
249 $row = $db->sql_fetchrow($result);
250
251 if ($row)
252 {
253 do
254 {
255 if ($row['template_mtime'] < filemtime($phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template/' . $row['template_filename']))
256 {
257 if ($row['template_filename'] == $this->filename[$handle])
258 {
259 $compile->_tpl_load_file($handle);
260 }
261 else
262 {
263 $this->files[$row['template_filename']] = $this->root . '/' . $row['template_filename'];
264 $compile->_tpl_load_file($row['template_filename']);
265 unset($this->compiled_code[$row['template_filename']]);
266 unset($this->files[$row['template_filename']]);
267 unset($this->filename[$row['template_filename']]);
268 }
269 }
270
271 if ($row['template_filename'] == $this->filename[$handle])
272 {
273 $this->compiled_code[$handle] = $compile->compile(trim($row['template_data']));
274 $compile->compile_write($handle, $this->compiled_code[$handle]);
275 }
276 else
277 {
278 // Only bother compiling if it doesn't already exist
279 if (!file_exists($this->cachepath . str_replace('/', '.', $row['template_filename']) . '.' . $phpEx))
280 {
281 $this->filename[$row['template_filename']] = $row['template_filename'];
282 $compile->compile_write($row['template_filename'], $compile->compile(trim($row['template_data'])));
283 unset($this->filename[$row['template_filename']]);
284 }
285 }
286 }
287 while ($row = $db->sql_fetchrow($result));
288 }
289 else
290 {
291 // Try to load from filesystem and instruct to insert into the styles table...
292 $compile->_tpl_load_file($handle, true);
293 return false;
294 }
295 $db->sql_freeresult($result);
296
297 return false;
298 }
299
300 $compile->_tpl_load_file($handle);
301 return false;
302 }
303
304 /**
305 * Assign key variable pairs from an array
306 * @access public
307 */
308 function assign_vars($vararray)
309 {
310 foreach ($vararray as $key => $val)
311 {
312 $this->_rootref[$key] = $val;
313 }
314
315 return true;
316 }
317
318 /**
319 * Assign a single variable to a single key
320 * @access public
321 */
322 function assign_var($varname, $varval)
323 {
324 $this->_rootref[$varname] = $varval;
325
326 return true;
327 }
328
329 /**
330 * Assign key variable pairs from an array to a specified block
331 * @access public
332 */
333 function assign_block_vars($blockname, $vararray)
334 {
335 if (strpos($blockname, '.') !== false)
336 {
337 // Nested block.
338 $blocks = explode('.', $blockname);
339 $blockcount = sizeof($blocks) - 1;
340
341 $str = &$this->_tpldata;
342 for ($i = 0; $i < $blockcount; $i++)
343 {
344 $str = &$str[$blocks[$i]];
345 $str = &$str[sizeof($str) - 1];
346 }
347
348 $s_row_count = isset($str[$blocks[$blockcount]]) ? sizeof($str[$blocks[$blockcount]]) : 0;
349 $vararray['S_ROW_COUNT'] = $s_row_count;
350
351 // Assign S_FIRST_ROW
352 if (!$s_row_count)
353 {
354 $vararray['S_FIRST_ROW'] = true;
355 }
356
357 // Now the tricky part, we always assign S_LAST_ROW and remove the entry before
358 // This is much more clever than going through the complete template data on display (phew)
359 $vararray['S_LAST_ROW'] = true;
360 if ($s_row_count > 0)
361 {
362 unset($str[$blocks[$blockcount]][($s_row_count - 1)]['S_LAST_ROW']);
363 }
364
365 // Now we add the block that we're actually assigning to.
366 // We're adding a new iteration to this block with the given
367 // variable assignments.
368 $str[$blocks[$blockcount]][] = $vararray;
369 }
370 else
371 {
372 // Top-level block.
373 $s_row_count = (isset($this->_tpldata[$blockname])) ? sizeof($this->_tpldata[$blockname]) : 0;
374 $vararray['S_ROW_COUNT'] = $s_row_count;
375
376 // Assign S_FIRST_ROW
377 if (!$s_row_count)
378 {
379 $vararray['S_FIRST_ROW'] = true;
380 }
381
382 // We always assign S_LAST_ROW and remove the entry before
383 $vararray['S_LAST_ROW'] = true;
384 if ($s_row_count > 0)
385 {
386 unset($this->_tpldata[$blockname][($s_row_count - 1)]['S_LAST_ROW']);
387 }
388
389 // Add a new iteration to this block with the variable assignments we were given.
390 $this->_tpldata[$blockname][] = $vararray;
391 }
392
393 return true;
394 }
395
396 /**
397 * Change already assigned key variable pair (one-dimensional - single loop entry)
398 *
399 * An example of how to use this function:
400 * {@example alter_block_array.php}
401 *
402 * @param string $blockname the blockname, for example 'loop'
403 * @param array $vararray the var array to insert/add or merge
404 * @param mixed $key Key to search for
405 *
406 * array: KEY => VALUE [the key/value pair to search for within the loop to determine the correct position]
407 *
408 * int: Position [the position to change or insert at directly given]
409 *
410 * If key is false the position is set to 0
411 * If key is true the position is set to the last entry
412 *
413 * @param string $mode Mode to execute (valid modes are 'insert' and 'change')
414 *
415 * If insert, the vararray is inserted at the given position (position counting from zero).
416 * If change, the current block gets merged with the vararray (resulting in new key/value pairs be added and existing keys be replaced by the new value).
417 *
418 * Since counting begins by zero, inserting at the last position will result in this array: array(vararray, last positioned array)
419 * and inserting at position 1 will result in this array: array(first positioned array, vararray, following vars)
420 *
421 * @return bool false on error, true on success
422 * @access public
423 */
424 function alter_block_array($blockname, $vararray, $key = false, $mode = 'insert')
425 {
426 if (strpos($blockname, '.') !== false)
427 {
428 // Nested blocks are not supported
429 return false;
430 }
431
432 // Change key to zero (change first position) if false and to last position if true
433 if ($key === false || $key === true)
434 {
435 $key = ($key === false) ? 0 : sizeof($this->_tpldata[$blockname]);
436 }
437
438 // Get correct position if array given
439 if (is_array($key))
440 {
441 // Search array to get correct position
442 list($search_key, $search_value) = @each($key);
443
444 $key = NULL;
445 foreach ($this->_tpldata[$blockname] as $i => $val_ary)
446 {
447 if ($val_ary[$search_key] === $search_value)
448 {
449 $key = $i;
450 break;
451 }
452 }
453
454 // key/value pair not found
455 if ($key === NULL)
456 {
457 return false;
458 }
459 }
460
461 // Insert Block
462 if ($mode == 'insert')
463 {
464 // Make sure we are not exceeding the last iteration
465 if ($key >= sizeof($this->_tpldata[$blockname]))
466 {
467 $key = sizeof($this->_tpldata[$blockname]);
468 unset($this->_tpldata[$blockname][($key - 1)]['S_LAST_ROW']);
469 $vararray['S_LAST_ROW'] = true;
470 }
471 else if ($key === 0)
472 {
473 unset($this->_tpldata[$blockname][0]['S_FIRST_ROW']);
474 $vararray['S_FIRST_ROW'] = true;
475 }
476
477 // Re-position template blocks
478 for ($i = sizeof($this->_tpldata[$blockname]); $i > $key; $i--)
479 {
480 $this->_tpldata[$blockname][$i] = $this->_tpldata[$blockname][$i-1];
481 $this->_tpldata[$blockname][$i]['S_ROW_COUNT'] = $i;
482 }
483
484 // Insert vararray at given position
485 $vararray['S_ROW_COUNT'] = $key;
486 $this->_tpldata[$blockname][$key] = $vararray;
487
488 return true;
489 }
490
491 // Which block to change?
492 if ($mode == 'change')
493 {
494 if ($key == sizeof($this->_tpldata[$blockname]))
495 {
496 $key--;
497 }
498
499 $this->_tpldata[$blockname][$key] = array_merge($this->_tpldata[$blockname][$key], $vararray);
500 return true;
501 }
502
503 return false;
504 }
505
506 /**
507 * Include a separate template
508 * @access private
509 */
510 function _tpl_include($filename, $include = true)
511 {
512 $handle = $filename;
513 $this->filename[$handle] = $filename;
514 $this->files[$handle] = $this->root . '/' . $filename;
515
516 $filename = $this->_tpl_load($handle);
517
518 if ($include)
519 {
520 global $user;
521
522 if ($filename)
523 {
524 include($filename);
525 return;
526 }
527 eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
528 }
529 }
530 }
531
532 ?>