[3.2.1] Catchable fatal error

Fragen rund um die Installation, Administration und Benutzung von phpBB 3.1.x und höher und die Konvertierung zu phpBB 3.2.x.
Forumsregeln
Bitte im Thementitel den Präfix deiner phpBB-Version [3.1.x] oder [3.2.x] angeben.
DerNordBerliner
Mitglied
Beiträge: 87
Registriert: 17.12.2009 10:41

Re: [3.2.1] Catchable fatal error

Beitragvon DerNordBerliner » 18.07.2017 14:00

Code: Alles auswählen

<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbb\template\twig;

class lexer extends \Twig_Lexer
{
   public function set_environment(\Twig_Environment $env)
   {
      $this->env = $env;
   }

   public function tokenize($code, $filename = null)
   {
      // Handle \Twig_Source format input
      if ($code instanceof \Twig_Source)
      {
         $source = $code;
         $code = $source->getCode();
         $filename = $source->getName();
      }

      // Our phpBB tags
      // Commented out tokens are handled separately from the main replace
      $phpbb_tags = array(
         /*'BEGIN',
         'BEGINELSE',
         'END',
         'IF',
         'ELSE',
         'ELSEIF',
         'ENDIF',
         'DEFINE',
         'UNDEFINE',*/
         'ENDDEFINE',
         'INCLUDE',
         'INCLUDEPHP',
         'INCLUDEJS',
         'INCLUDECSS',
         'PHP',
         'ENDPHP',
         'EVENT',
      );

      // Twig tag masks
      $twig_tags = array(
         'autoescape',
         'endautoescape',
         'if',
         'elseif',
         'else',
         'endif',
         'block',
         'endblock',
         'use',
         'extends',
         'embed',
         'filter',
         'endfilter',
         'flush',
         'for',
         'endfor',
         'macro',
         'endmacro',
         'import',
         'from',
         'sandbox',
         'endsandbox',
         'set',
         'endset',
         'spaceless',
         'endspaceless',
         'verbatim',
         'endverbatim',
      );

      // Fix tokens that may have inline variables (e.g. <!-- DEFINE $TEST = '{FOO}')
      $code = $this->strip_surrounding_quotes(array(
         'INCLUDE',
         'INCLUDEPHP',
         'INCLUDEJS',
         'INCLUDECSS',
      ), $code);
      $code = $this->fix_inline_variable_tokens(array(
         'DEFINE \$[a-zA-Z0-9_]+ =',
         'INCLUDE',
         'INCLUDEPHP',
         'INCLUDEJS',
         'INCLUDECSS',
      ), $code);
      $code = $this->add_surrounding_quotes(array(
         'INCLUDE',
         'INCLUDEPHP',
         'INCLUDEJS',
         'INCLUDECSS',
      ), $code);

      // Fix our BEGIN statements
      $code = $this->fix_begin_tokens($code);

      // Fix our IF tokens
      $code = $this->fix_if_tokens($code);

      // Fix our DEFINE tokens
      $code = $this->fix_define_tokens($code);

      // Replace all of our starting tokens, <!-- TOKEN --> with Twig style, {% TOKEN %}
      // This also strips outer parenthesis, <!-- IF (blah) --> becomes <!-- IF blah -->
      $code = preg_replace('#<!-- (' . implode('|', $phpbb_tags) . ')(?: (.*?) ?)?-->#', '{% $1 $2 %}', $code);

      // Replace all of our twig masks with Twig code (e.g. <!-- BLOCK .+ --> with {% block $1 %})
      $code = $this->replace_twig_tag_masks($code, $twig_tags);

      // Replace all of our language variables, {L_VARNAME}, with Twig style, {{ lang('NAME') }}
      // Appends any filters after lang()
      $code = preg_replace('#{L_([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ lang(\'$1\')$2 }}', $code);

      // Replace all of our escaped language variables, {LA_VARNAME}, with Twig style, {{ lang('NAME')|escape('js') }}
      // Appends any filters after lang(), but before escape('js')
      $code = preg_replace('#{LA_([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ lang(\'$1\')$2|escape(\'js\') }}', $code);

      // Replace all of our variables, {VARNAME}, with Twig style, {{ VARNAME }}
      // Appends any filters
      $code = preg_replace('#{([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ $1$2 }}', $code);

      // Tokenize \Twig_Source instance
      return parent::tokenize(new \Twig_Source($code, $filename));
   }

   /**
   * Strip surrounding quotes
   *
   * First step to fix tokens that may have inline variables
   * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE {TEST}.html
   *
   * @param array $tokens array of tokens to search for (imploded to a regular expression)
   * @param string $code
   * @return string
   */
   protected function strip_surrounding_quotes($tokens, $code)
   {
      // Remove matching quotes at the beginning/end if a statement;
      // E.g. 'asdf'"' -> asdf'"
      // E.g. "asdf'"" -> asdf'"
      // E.g. 'asdf'" -> 'asdf'"
      return preg_replace('#<!-- (' . implode('|', $tokens) . ') (([\'"])?(.*?)\1) -->#', '<!-- $1 $2 -->', $code);
   }

   /**
   * Fix tokens that may have inline variables
   *
   * Second step to fix tokens that may have inline variables
   * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE ' ~ {TEST} ~ '.html
   *
   * @param array $tokens array of tokens to search for (imploded to a regular expression)
   * @param string $code
   * @return string
   */
   protected function fix_inline_variable_tokens($tokens, $code)
   {
      $callback = function($matches)
      {
         // Replace template variables with start/end to parse variables (' ~ TEST ~ '.html)
         $matches[2] = preg_replace('#{([a-zA-Z0-9_\.$]+)}#', "'~ \$1 ~'", $matches[2]);

         return "<!-- {$matches[1]} {$matches[2]} -->";
      };

      return preg_replace_callback('#<!-- (' . implode('|', $tokens) . ') (.+?) -->#', $callback, $code);
   }

   /**
   * Add surrounding quotes
   *
   * Last step to fix tokens that may have inline variables
   * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE '' ~ {TEST} ~ '.html'
   *
   * @param array $tokens array of tokens to search for (imploded to a regular expression)
   * @param string $code
   * @return string
   */
   protected function add_surrounding_quotes($tokens, $code)
   {
      return preg_replace('#<!-- (' . implode('|', $tokens) . ') (.+?) -->#', '<!-- $1 \'$2\' -->', $code);
   }

   /**
   * Fix begin tokens (convert our BEGIN to Twig for)
   *
   * Not meant to be used outside of this context, public because the anonymous function calls this
   *
   * @param string $code
   * @param array $parent_nodes (used in recursion)
   * @return string
   */
   public function fix_begin_tokens($code, $parent_nodes = array())
   {
      // PHP 5.3 cannot use $this in an anonymous function, so use this as a work-around
      $parent_class = $this;
      $callback = function ($matches) use ($parent_class, $parent_nodes)
      {
         $hard_parents = explode('.', $matches[1]);
         array_pop($hard_parents); // ends with .
         if ($hard_parents)
         {
            $parent_nodes = array_merge($hard_parents, $parent_nodes);
         }

         $name = $matches[2];
         $subset = trim(substr($matches[3], 1, -1)); // Remove parenthesis
         $body = $matches[4];

         // Replace <!-- BEGINELSE -->
         $body = str_replace('<!-- BEGINELSE -->', '{% else %}', $body);

         // Is the designer wanting to call another loop in a loop?
         // <!-- BEGIN loop -->
         // <!-- BEGIN !loop2 -->
         // <!-- END !loop2 -->
         // <!-- END loop -->
         // 'loop2' is actually on the same nesting level as 'loop' you assign
         // variables to it with template->assign_block_vars('loop2', array(...))
         if (strpos($name, '!') === 0)
         {
            // Count the number if ! occurrences
            $count = substr_count($name, '!');
            for ($i = 0; $i < $count; $i++)
            {
               array_pop($parent_nodes);
               $name = substr($name, 1);
            }
         }

         // Remove all parent nodes, e.g. foo, bar from foo.bar.foobar.VAR
         foreach ($parent_nodes as $node)
         {
            $body = preg_replace('#([^a-zA-Z0-9_])' . $node . '\.([a-zA-Z0-9_]+)\.#', '$1$2.', $body);
         }

         // Add current node to list of parent nodes for child nodes
         $parent_nodes[] = $name;

         // Recursive...fix any child nodes
         $body = $parent_class->fix_begin_tokens($body, $parent_nodes);

         // Need the parent variable name
         array_pop($parent_nodes);
         $parent = (!empty($parent_nodes)) ? end($parent_nodes) . '.' : '';

         if ($subset !== '')
         {
            $subset = '|subset(' . $subset . ')';
         }

         $parent = ($parent) ?: 'loops.';
         // Turn into a Twig for loop
         return "{% for {$name} in {$parent}{$name}{$subset} %}{$body}{% endfor %}";
      };

      return preg_replace_callback('#<!-- BEGIN ((?:[a-zA-Z0-9_]+\.)*)([!a-zA-Z0-9_]+)(\([0-9,\-]+\))? -->(.+?)<!-- END \1\2 -->#s', $callback, $code);
   }

   /**
   * Fix IF statements
   *
   * @param string $code
   * @return string
   */
   protected function fix_if_tokens($code)
   {
      // Replace ELSE IF with ELSEIF
      $code = preg_replace('#<!-- ELSE IF (.+?) -->#', '<!-- ELSEIF $1 -->', $code);

      // Replace our "div by" with Twig's divisibleby (Twig does not like test names with spaces)
      $code = preg_replace('# div by ([0-9]+)#', ' divisibleby($1)', $code);

      $callback = function($matches)
      {
         $inner = $matches[2];
         // Replace $TEST with definition.TEST
         $inner = preg_replace('#(\s\(*!?)\$([a-zA-Z_0-9]+)#', '$1definition.$2', $inner);

         // Replace .foo with loops.foo|length
         $inner = preg_replace('#(\s\(*!?)\.([a-zA-Z_0-9]+)([^a-zA-Z_0-9\.])#', '$1loops.$2|length$3', $inner);

         // Replace .foo.bar with foo.bar|length
         $inner = preg_replace('#(\s\(*!?)\.([a-zA-Z_0-9\.]+)([^a-zA-Z_0-9\.])#', '$1$2|length$3', $inner);

         return "<!-- {$matches[1]}IF{$inner}-->";
      };

      return preg_replace_callback('#<!-- (ELSE)?IF((.*?) (?:\(*!?[\$|\.]([^\s]+)(.*?))?)-->#', $callback, $code);
   }

   /**
   * Fix DEFINE statements and {$VARNAME} variables
   *
   * @param string $code
   * @return string
   */
   protected function fix_define_tokens($code)
   {
      /**
      * Changing $VARNAME to definition.varname because set is only local
      * context (e.g. DEFINE $TEST will only make $TEST available in current
      * template and any child templates, but not any parent templates).
      *
      * DEFINE handles setting it properly to definition in its node, but the
      * variables reading FROM it need to be altered to definition.VARNAME
      *
      * Setting up definition as a class in the array passed to Twig
      * ($context) makes set definition.TEST available in the global context
      */

      // Replace <!-- DEFINE $NAME with {% DEFINE definition.NAME
      $code = preg_replace('#<!-- DEFINE \$(.*?) -->#', '{% DEFINE $1 %}', $code);

      // Changing UNDEFINE NAME to DEFINE NAME = null to save from creating an extra token parser/node
      $code = preg_replace('#<!-- UNDEFINE \$(.*?)-->#', '{% DEFINE $1= null %}', $code);

      // Replace all of our variables, {$VARNAME}, with Twig style, {{ definition.VARNAME }}
      $code = preg_replace('#{\$([a-zA-Z0-9_\.]+)}#', '{{ definition.$1 }}', $code);

      // Replace all of our variables, ~ $VARNAME ~, with Twig style, ~ definition.VARNAME ~
      $code = preg_replace('#~ \$([a-zA-Z0-9_\.]+) ~#', '~ definition.$1 ~', $code);

      return $code;
   }

   /**
   * Replace Twig tag masks with Twig tag calls
   *
   * E.g. <!-- BLOCK foo --> with {% block foo %}
   *
   * @param string $code
   * @param array $twig_tags All tags we want to create a mask for
   * @return string
   */
   protected function replace_twig_tag_masks($code, $twig_tags)
   {
      $callback = function ($matches)
      {
         $matches[1] = strtolower($matches[1]);

         return "{% {$matches[1]}{$matches[2]}%}";
      };

      foreach ($twig_tags as &$tag)
      {
         $tag = strtoupper($tag);
      }

      // twig_tags is an array of the twig tags, which are all lowercase, but we use all uppercase tags
      $code = preg_replace_callback('#<!-- (' . implode('|', $twig_tags) . ')(.*?)-->#',$callback, $code);

      return $code;
   }
}

Benutzeravatar
Crizzo
Administrator
Administrator
Beiträge: 9359
Registriert: 19.05.2005 21:45
Kontaktdaten:

Re: [3.2.1] Catchable fatal error

Beitragvon Crizzo » 18.07.2017 14:06

Die Datei ist wohl auf Stand 3.2.1.

Was hast du jetzt beim 2. Updateversuch alles ausgewählt?

Crizzo hat geschrieben:Und was hast du bei Schritt 2 ausgewählt?
phpBB Translations & International Support Teams Manager

DerNordBerliner
Mitglied
Beiträge: 87
Registriert: 17.12.2009 10:41

Re: [3.2.1] Catchable fatal error

Beitragvon DerNordBerliner » 18.07.2017 14:17

Bis Schritt drei alles genau nach deinen Bildern gemacht, nur kam nichts zum Download also Update weiter ausgeführt.

Benutzeravatar
Crizzo
Administrator
Administrator
Beiträge: 9359
Registriert: 19.05.2005 21:45
Kontaktdaten:

Re: [3.2.1] Catchable fatal error

Beitragvon Crizzo » 18.07.2017 14:18

Was kam stattdessen? Das kann nämlich irgendwie nicht so richtig sein. :-?
phpBB Translations & International Support Teams Manager

DerNordBerliner
Mitglied
Beiträge: 87
Registriert: 17.12.2009 10:41

Re: [3.2.1] Catchable fatal error

Beitragvon DerNordBerliner » 18.07.2017 14:21

Ich kann es dir wirklich nicht genau sagen. Zum Schluss kam jedenfalls eine Meldung, dass das Update erfolgreich durchgeführt wurde.
Ich kann alles noch einmal machen und dann Schritt für Schritt festhalten, kein Problem.

Benutzeravatar
Crizzo
Administrator
Administrator
Beiträge: 9359
Registriert: 19.05.2005 21:45
Kontaktdaten:

Re: [3.2.1] Catchable fatal error

Beitragvon Crizzo » 18.07.2017 14:22

Wäre nett, wenn du das mit einer parallel Installation nochmal probieren würdest und mal ein paar Screenshots machst (wie ich vorhin) was du wo für Meldungen erhälst und wie eingestellt hast.

Danke.
phpBB Translations & International Support Teams Manager

DerNordBerliner
Mitglied
Beiträge: 87
Registriert: 17.12.2009 10:41

Re: [3.2.1] Catchable fatal error

Beitragvon DerNordBerliner » 18.07.2017 14:25

Werde ich nachher mal machen. Muss jetzt weg. Bis später.

DerNordBerliner
Mitglied
Beiträge: 87
Registriert: 17.12.2009 10:41

Re: [3.2.1] Catchable fatal error

Beitragvon DerNordBerliner » 19.07.2017 12:21

Leider will es nicht mehr funktionieren, da es sich von der neuen Version nicht mehr abbringen läßt.
Egal ob ich die Daten vor dem Update einspiele incl. Datenbank oder nicht.
Gruß Markus

Benutzeravatar
Crizzo
Administrator
Administrator
Beiträge: 9359
Registriert: 19.05.2005 21:45
Kontaktdaten:

Re: [3.2.1] Catchable fatal error

Beitragvon Crizzo » 19.07.2017 12:26

Du sollst das auch nicht mit deinem Live-Board machen. :wink: Sondern mit einer Kopie oder einem anderen, frischen phpBB-Board.
phpBB Translations & International Support Teams Manager

Benutzeravatar
Mahony
Ehemaliger
Beiträge: 11009
Registriert: 17.11.2005 22:33
Wohnort: Esslingen (Neckar)
Kontaktdaten:

Re: [3.2.1] Catchable fatal error

Beitragvon Mahony » 19.07.2017 12:40

Hallo
DerNordBerliner hat geschrieben:....Egal ob ich die Daten vor dem Update einspiele incl. Datenbank oder nicht.

Lösche bitte ALLE Tabellen in der Datenbank, bevor du das Datenbank-Backup einspielst und lade dann die alten Dateien (vom Backup) wieder auf den Server (vorher natürlich auch wieder ALLE Dateien vom Server löschen).
Im Anschluss daran solltest du dann natürlich auch wieder die Rechte (Stichwort CHMOD) der Dateien und Ordner auf dem Server prüfen.

siehe dazu auch Rechteverteilung (CHMOD) für phpBB3 und Was ist ein CHMOD?

Grüße: Mahony
Taekwondo in Berlin
Wer fragt, ist ein Narr für fünf Minuten, wer nicht fragt, ist ein Narr für immer.


Zurück zu „Support-Forum“