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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

template.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 13.19 KiB


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  ?>