Template.php error after upgrade to 3.0.6 from 3.0.2

Get help with installation and running phpBB 3.0.x here. Please do not post bug reports, feature requests, or MOD-related questions here.
Scam Warning

Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Tritonforum.com » Sat Nov 28, 2009 3:31 am

Got this right after the upgrade to 3.0.6 Can anyone give me some insight on how to fix it?

Support Request Template
What version of phpBB are you using? phpBB 3.0.6
What is your board's URL? http://www.tritonforum.com/forum
Who do you host your board with? Bluehost
How did you install your board? I used the download package from phpBB.com
Is your board a fresh install or a conversion? Conversion from phpBB2
Do you have any MODs installed? Yes
Is registration required to reproduce this issue? Yes
What MODs do you have installed? latest posts
re: in topic
What styles do you currently have installed? Xand
What language(s) is your board currently using? English
Which database type/version are you using? MySQL 5
What is your level of experience? Comfortable with PHP and phpBB
What username can be used to view this issue? not needed
What password can be used to view this issue?not needed
When did your problem begin? after upgrade from 3.0.2. to 3.0.6
Please describe your problem. Parse error: syntax error, unexpected '}' in /home3/tritonfo/public_html/forum/includes/template.php on line 338
Generated by SRT Generator ($Rev: 3396 $)
Tritonforum.com
Registered User
 
Posts: 17
Joined: Tue Dec 11, 2007 2:30 am

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Tritonforum.com » Sat Nov 28, 2009 4:57 am

What other info do you need? I'm using the Xand orange that was for 3.0.0. Got this template.php error right away. I upgraded from 3.0.2 to 3.0.6 using the autodownloader. I can copy and paste my template.php if anyone needs to see it.
Tritonforum.com
Registered User
 
Posts: 17
Joined: Tue Dec 11, 2007 2:30 am

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Tritonforum.com » Sat Nov 28, 2009 5:17 am

Here's my template.php

Code: Select all
<?php
/**
*
* @package phpBB3
* @version $Id: template.php 10217 2009-10-09 11:12:37Z acydburn $
* @copyright (c) 2005 phpBB Group, sections (c) 2001 ispi of Lincoln Inc
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
   exit;
}

/**
* Base Template class.
* @package phpBB3
*/
class template
{
   /** variable that holds all the data we'll be substituting into
   * the compiled templates. Takes form:
   * --> $this->_tpldata[block][iteration#][child][iteration#][child2][iteration#][variablename] == value
   * if it's a root-level variable, it'll be like this:
   * --> $this->_tpldata[.][0][varname] == value
   */
   var $_tpldata = array('.' => array(0 => array()));
   var $_rootref;

   // Root dir and hash of filenames for each template handle.
   var $root = '';
   var $cachepath = '';
   var $files = array();
   var $filename = array();
   var $files_inherit = array();
   var $files_template = array();
   var $inherit_root = '';
   var $orig_tpl_storedb;
   var $orig_tpl_inherits_id;

   // this will hash handle names to the compiled/uncompiled code for that handle.
   var $compiled_code = array();

   /**
   * Set template location
   * @access public
   */
   function set_template()
   {
      global $phpbb_root_path, $user;

      if (file_exists($phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template'))
      {
         $this->root = $phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template';
         $this->cachepath = $phpbb_root_path . 'cache/tpl_' . str_replace('_', '-', $user->theme['template_path']) . '_';

         if ($this->orig_tpl_storedb === null)
         {
            $this->orig_tpl_storedb = $user->theme['template_storedb'];
         }

         if ($this->orig_tpl_inherits_id === null)
         {
            $this->orig_tpl_inherits_id = $user->theme['template_inherits_id'];
         }

         $user->theme['template_storedb'] = $this->orig_tpl_storedb;
         $user->theme['template_inherits_id'] = $this->orig_tpl_inherits_id;

         if ($user->theme['template_inherits_id'])
         {
            $this->inherit_root = $phpbb_root_path . 'styles/' . $user->theme['template_inherit_path'] . '/template';
         }
      }
      else
      {
         trigger_error('Template path could not be found: styles/' . $user->theme['template_path'] . '/template', E_USER_ERROR);
      }

      $this->_rootref = &$this->_tpldata['.'][0];

      return true;
   }

   /**
   * Set custom template location (able to use directory outside of phpBB)
   * @access public
   */
   function set_custom_template($template_path, $template_name, $template_mode = 'template')
   {
      global $phpbb_root_path, $user;

      // Make sure $template_path has no ending slash
      if (substr($template_path, -1) == '/')
      {
         $template_path = substr($template_path, 0, -1);
      }

      $this->root = $template_path;
      $this->cachepath = $phpbb_root_path . 'cache/ctpl_' . str_replace('_', '-', $template_name) . '_';

      // As the template-engine is used for more than the template (emails, etc.), we should not set $user->theme in all cases, but only on the real template.
      if ($template_mode == 'template')
      {
         $user->theme['template_storedb'] = false;
         $user->theme['template_inherits_id'] = false;
      }

      $this->_rootref = &$this->_tpldata['.'][0];

      return true;
   }

   /**
   * Sets the template filenames for handles. $filename_array
   * should be a hash of handle => filename pairs.
   * @access public
   */
   function set_filenames($filename_array)
   {
      if (!is_array($filename_array))
      {
         return false;
      }
      foreach ($filename_array as $handle => $filename)
      {
         if (empty($filename))
         {
            trigger_error("template->set_filenames: Empty filename specified for $handle", E_USER_ERROR);
         }

         $this->filename[$handle] = $filename;
         $this->files[$handle] = $this->root . '/' . $filename;

         if ($this->inherit_root)
         {
            $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
         }
      }

      return true;
   }

   /**
   * Destroy template data set
   * @access public
   */
   function destroy()
   {
      $this->_tpldata = array('.' => array(0 => array()));
      $this->_rootref = &$this->_tpldata['.'][0];
   }

   /**
   * Reset/empty complete block
   * @access public
   */
   function destroy_block_vars($blockname)
   {
      if (strpos($blockname, '.') !== false)
      {
         // Nested block.
         $blocks = explode('.', $blockname);
         $blockcount = sizeof($blocks) - 1;

         $str = &$this->_tpldata;
         for ($i = 0; $i < $blockcount; $i++)
         {
            $str = &$str[$blocks[$i]];
            $str = &$str[sizeof($str) - 1];
         }

         unset($str[$blocks[$blockcount]]);
      }
      else
      {
         // Top-level block.
         unset($this->_tpldata[$blockname]);
      }

      return true;
   }

   /**
   * Display handle
   * @access public
   */
   function display($handle, $include_once = true)
   {
      global $user, $phpbb_hook;

      if (!empty($phpbb_hook) && $phpbb_hook->call_hook(array(__CLASS__, __FUNCTION__), $handle, $include_once))
      {
         if ($phpbb_hook->hook_return(array(__CLASS__, __FUNCTION__)))
         {
            return $phpbb_hook->hook_return_result(array(__CLASS__, __FUNCTION__));
         }
      }

      if (defined('IN_ERROR_HANDLER'))
      {
         if ((E_NOTICE & error_reporting()) == E_NOTICE)
         {
            error_reporting(error_reporting() ^ E_NOTICE);
         }
      }

      if ($filename = $this->_tpl_load($handle))
      {
         ($include_once) ? include_once($filename) : include($filename);
      }
      else
      {
         eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
      }

      return true;
   }

   /**
   * Display the handle and assign the output to a template variable or return the compiled result.
   * @access public
   */
   function assign_display($handle, $template_var = '', $return_content = true, $include_once = false)
   {
      ob_start();
      $this->display($handle, $include_once);
      $contents = ob_get_clean();

      if ($return_content)
      {
         return $contents;
      }

      $this->assign_var($template_var, $contents);

      return true;
   }

   /**
   * Load a compiled template if possible, if not, recompile it
   * @access private
   */
   function _tpl_load(&$handle)
   {
      global $user, $phpEx, $config;

      if (!isset($this->filename[$handle]))
      {
         trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
      }

      $filename = $this->cachepath . str_replace('/', '.', $this->filename[$handle]) . '.' . $phpEx;
      $this->files_template[$handle] = (isset($user->theme['template_id'])) ? $user->theme['template_id'] : 0;

      $recompile = false;
      if (!file_exists($filename) || @filesize($filename) === 0)
      {
         $recompile = true;
      }
      else if ($config['load_tplcompile'])
      {
         // No way around it: we need to check inheritance here
         if ($user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
         {
            $this->files[$handle] = $this->files_inherit[$handle];
            $this->files_template[$handle] = $user->theme['template_inherits_id'];
         }
         $recompile = (@filemtime($filename) < filemtime($this->files[$handle])) ? true : false;
      }

      // Recompile page if the original template is newer, otherwise load the compiled version
      if (!$recompile)
      {
         return $filename;
      }

      global $db, $phpbb_root_path;

      if (!class_exists('template_compile'))
      {
         include($phpbb_root_path . 'includes/functions_template.' . $phpEx);
      }

      // Inheritance - we point to another template file for this one. Equality is also used for store_db
      if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
      {
         $this->files[$handle] = $this->files_inherit[$handle];
         $this->files_template[$handle] = $user->theme['template_inherits_id'];
      }

      $compile = new template_compile($this);

      // If we don't have a file assigned to this handle, die.
      if (!isset($this->files[$handle]))
      {
         trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
      }

      // Just compile if no user object is present (happens within the installer)
      if (!$user)
      {
         $compile->_tpl_load_file($handle);
         return false;
      }

      if (isset($user->theme['template_storedb']) && $user->theme['template_storedb'])
      {
         $rows = array();
         $ids = array();
         // Inheritance
         if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'])
         {
            $ids[] = $user->theme['template_inherits_id'];
         }
         $ids[] = $user->theme['template_id'];

         foreach ($ids as $id)
      {
         $sql = 'SELECT *
            FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
            WHERE template_id = ' . $id . "
               AND (template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
                  OR template_included " . $db->sql_like_expression($db->any_char . $this->filename[$handle] . ':' . $db->any_char) . ')';
         $result = $db->sql_query($sql);
            while ($row = $db->sql_fetchrow($result))
            {
               $rows[$row['template_filename']] = $row;
            }
            $db->sql_freeresult($result);
         }

         if (sizeof($rows))
      }
            foreach ($rows as $row)
            {
               $file = $this->root . '/' . $row['template_filename'];
               $force_reload = false;
               if ($row['template_id'] != $user->theme['template_id'])
               {
                  // make sure that we are not overlooking a file not in the db yet
                  if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($file))
                  {
                     $file = $this->inherit_root . '/' . $row['template_filename'];
                     $this->files[$row['template_filename']] = $file;
                     $this->files_inherit[$row['template_filename']] = $file;
                     $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
                  }
                  else if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'])
                  {
                     // Ok, we have a situation. There is a file in the subtemplate, but nothing in the DB. We have to fix that.
                     $force_reload = true;
                     $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
                  }
               }
               else
               {
                  $this->files_template[$row['template_filename']] = $user->theme['template_id'];
               }

               if ($force_reload || $row['template_mtime'] < filemtime($file))
               {
                  if ($row['template_filename'] == $this->filename[$handle])
                  {
                     $compile->_tpl_load_file($handle, true);
                  }
                  else
                  {
                     $this->files[$row['template_filename']] = $file;
                     $this->filename[$row['template_filename']] = $row['template_filename'];
                     $compile->_tpl_load_file($row['template_filename'], true);
                     unset($this->compiled_code[$row['template_filename']]);
                     unset($this->files[$row['template_filename']]);
                     unset($this->filename[$row['template_filename']]);
                  }
               }

               if ($row['template_filename'] == $this->filename[$handle])
               {
                  $this->compiled_code[$handle] = $compile->compile(trim($row['template_data']));
                  $compile->compile_write($handle, $this->compiled_code[$handle]);
               }
               else
               {
                  // Only bother compiling if it doesn't already exist
                  if (!file_exists($this->cachepath . str_replace('/', '.', $row['template_filename']) . '.' . $phpEx))
                  {
                     $this->filename[$row['template_filename']] = $row['template_filename'];
                     $compile->compile_write($row['template_filename'], $compile->compile(trim($row['template_data'])));
                     unset($this->filename[$row['template_filename']]);
                  }
               }
            }
         }
         else
         {
            $file = $this->root . '/' . $row['template_filename'];

            if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($file))
            {
               $file = $this->inherit_root . '/' . $row['template_filename'];
               $this->files[$row['template_filename']] = $file;
               $this->files_inherit[$row['template_filename']] = $file;
               $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
            }
            // Try to load from filesystem and instruct to insert into the styles table...
            $compile->_tpl_load_file($handle, true);
            return false;
         }

         return false;
      }

      $compile->_tpl_load_file($handle);
      return false;
   }

   /**
   * Assign key variable pairs from an array
   * @access public
   */
   function assign_vars($vararray)
   {
      foreach ($vararray as $key => $val)
      {
         $this->_rootref[$key] = $val;
      }

      return true;
   }

   /**
   * Assign a single variable to a single key
   * @access public
   */
   function assign_var($varname, $varval)
   {
      $this->_rootref[$varname] = $varval;

      return true;
   }

   /**
   * Assign key variable pairs from an array to a specified block
   * @access public
   */
   function assign_block_vars($blockname, $vararray)
   {
      if (strpos($blockname, '.') !== false)
      {
         // Nested block.
         $blocks = explode('.', $blockname);
         $blockcount = sizeof($blocks) - 1;

         $str = &$this->_tpldata;
         for ($i = 0; $i < $blockcount; $i++)
         {
            $str = &$str[$blocks[$i]];
            $str = &$str[sizeof($str) - 1];
         }

         $s_row_count = isset($str[$blocks[$blockcount]]) ? sizeof($str[$blocks[$blockcount]]) : 0;
         $vararray['S_ROW_COUNT'] = $s_row_count;

         // Assign S_FIRST_ROW
         if (!$s_row_count)
         {
            $vararray['S_FIRST_ROW'] = true;
         }

         // Now the tricky part, we always assign S_LAST_ROW and remove the entry before
         // This is much more clever than going through the complete template data on display (phew)
         $vararray['S_LAST_ROW'] = true;
         if ($s_row_count > 0)
         {
            unset($str[$blocks[$blockcount]][($s_row_count - 1)]['S_LAST_ROW']);
         }

         // Now we add the block that we're actually assigning to.
         // We're adding a new iteration to this block with the given
         // variable assignments.
         $str[$blocks[$blockcount]][] = $vararray;
      }
      else
      {
         // Top-level block.
         $s_row_count = (isset($this->_tpldata[$blockname])) ? sizeof($this->_tpldata[$blockname]) : 0;
         $vararray['S_ROW_COUNT'] = $s_row_count;

         // Assign S_FIRST_ROW
         if (!$s_row_count)
         {
            $vararray['S_FIRST_ROW'] = true;
         }

         // We always assign S_LAST_ROW and remove the entry before
         $vararray['S_LAST_ROW'] = true;
         if ($s_row_count > 0)
         {
            unset($this->_tpldata[$blockname][($s_row_count - 1)]['S_LAST_ROW']);
         }
         
         // Add a new iteration to this block with the variable assignments we were given.
         $this->_tpldata[$blockname][] = $vararray;
      }

      return true;
   }

   /**
   * Change already assigned key variable pair (one-dimensional - single loop entry)
   *
   * An example of how to use this function:
   * {@example alter_block_array.php}
   *
   * @param   string   $blockname   the blockname, for example 'loop'
   * @param   array   $vararray   the var array to insert/add or merge
   * @param   mixed   $key      Key to search for
   *
   * array: KEY => VALUE [the key/value pair to search for within the loop to determine the correct position]
   *
   * int: Position [the position to change or insert at directly given]
   *
   * If key is false the position is set to 0
   * If key is true the position is set to the last entry
   *
   * @param   string   $mode      Mode to execute (valid modes are 'insert' and 'change')
   *
   *   If insert, the vararray is inserted at the given position (position counting from zero).
   *   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).
   *
   * Since counting begins by zero, inserting at the last position will result in this array: array(vararray, last positioned array)
   * and inserting at position 1 will result in this array: array(first positioned array, vararray, following vars)
   *
   * @return bool false on error, true on success
   * @access public
   */
   function alter_block_array($blockname, $vararray, $key = false, $mode = 'insert')
   {
      if (strpos($blockname, '.') !== false)
      {
         // Nested blocks are not supported
         return false;
      }
      
      // Change key to zero (change first position) if false and to last position if true
      if ($key === false || $key === true)
      {
         $key = ($key === false) ? 0 : sizeof($this->_tpldata[$blockname]);
      }

      // Get correct position if array given
      if (is_array($key))
      {
         // Search array to get correct position
         list($search_key, $search_value) = @each($key);

         $key = NULL;
         foreach ($this->_tpldata[$blockname] as $i => $val_ary)
         {
            if ($val_ary[$search_key] === $search_value)
            {
               $key = $i;
               break;
            }
         }

         // key/value pair not found
         if ($key === NULL)
         {
            return false;
         }
      }

      // Insert Block
      if ($mode == 'insert')
      {
         // Make sure we are not exceeding the last iteration
         if ($key >= sizeof($this->_tpldata[$blockname]))
         {
            $key = sizeof($this->_tpldata[$blockname]);
            unset($this->_tpldata[$blockname][($key - 1)]['S_LAST_ROW']);
            $vararray['S_LAST_ROW'] = true;
         }
         else if ($key === 0)
         {
            unset($this->_tpldata[$blockname][0]['S_FIRST_ROW']);
            $vararray['S_FIRST_ROW'] = true;
         }

         // Re-position template blocks
         for ($i = sizeof($this->_tpldata[$blockname]); $i > $key; $i--)
         {
            $this->_tpldata[$blockname][$i] = $this->_tpldata[$blockname][$i-1];
            $this->_tpldata[$blockname][$i]['S_ROW_COUNT'] = $i;
         }

         // Insert vararray at given position
         $vararray['S_ROW_COUNT'] = $key;
         $this->_tpldata[$blockname][$key] = $vararray;

         return true;
      }

      // Which block to change?
      if ($mode == 'change')
      {
         if ($key == sizeof($this->_tpldata[$blockname]))
         {
            $key--;
         }

         $this->_tpldata[$blockname][$key] = array_merge($this->_tpldata[$blockname][$key], $vararray);
         return true;
      }

      return false;
   }

   /**
   * Include a separate template
   * @access private
   */
   function _tpl_include($filename, $include = true)
   {
      $handle = $filename;
      $this->filename[$handle] = $filename;
      $this->files[$handle] = $this->root . '/' . $filename;
      if ($this->inherit_root)
      {
         $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
      }

       $filename = $this->_tpl_load($handle);

      if ($include)
      {
         global $user;

         if ($filename)
         {
            include($filename);
            return;
         }
         eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
      }
   }

   /**
   * Include a php-file
   * @access private
   */
   function _php_include($filename)
   {
      global $phpbb_root_path;

      $file = $phpbb_root_path . $filename;

      if (!file_exists($file))
      {
         // trigger_error cannot be used here, as the output already started
         echo 'template->_php_include(): File ' . htmlspecialchars($file) . ' does not exist or is empty';
         return;
      }
      include($file);
   }
}

?>
Tritonforum.com
Registered User
 
Posts: 17
Joined: Tue Dec 11, 2007 2:30 am

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby AdamR » Sat Nov 28, 2009 5:23 am

Try downloading the full 3.0.6 zip from here and re-uploading a fresh copy of template.php

If any of your MODs made changes to this file, redo just those.

Before revisiting the board, clear the contnets of the cache/ folder except .htaccess and index.html

- Adam
phpBB Support: Welcome | Userguide | Knowledge Base | Search
Honored supporter of the phpBB Group!
"If I have seen a little further it is by standing on the shoulders of Giants." - Isaac Newton
User avatar
AdamR
Former Team Member
 
Posts: 9710
Joined: Tue Mar 02, 2004 5:40 pm
Location: Tampa, Florida
Name: Adam Reyher

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Tritonforum.com » Sat Nov 28, 2009 1:58 pm

This got me somewhere! I got back into the board, but now I'm getting this when posting a new topic:

Parse error: syntax error, unexpected '}' in /home3/tritonfo/public_html/forum/cache/tpl_xand_viewtopic_body.html.php on line 338
Tritonforum.com
Registered User
 
Posts: 17
Joined: Tue Dec 11, 2007 2:30 am

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Tritonforum.com » Sat Nov 28, 2009 2:13 pm

OK, I think I got it! I went into the file that was giving me an error in the cache, and deleted

"<?php }} ?>"

which was after some html I added to the forum (adsense ad), and it seems to work OK. The question is, why did this code get added, and what can I do to prevent it from hapenning on the next cache dump?
Tritonforum.com
Registered User
 
Posts: 17
Joined: Tue Dec 11, 2007 2:30 am

Re: Template.php error after upgrade to 3.0.6 from 3.0.2

Postby Brf » Sat Nov 28, 2009 2:36 pm

You should not be editing those cache files. They will be rebuilt from the html template files.

You need to correct your error in your xand viewtopic_body.html
User avatar
Brf
Support Team Member
Support Team Member
 
Posts: 46836
Joined: Tue May 10, 2005 7:47 pm
Location: {postrow.POSTER_FROM}


Return to 3.0.x Support Forum

Who is online

Users browsing this forum: Bing [Bot], manzoor, Noxwizard, Oyabun1 and 83 guests