Page 1 sur 2

erreur dans template.php phpwiki

Posté : 02 mai 2007, 11:58
par kerfam
Bonjour à tous,
J'ai installé PHPWIKI et à chaque page il me marque un méssage d'erreur :

Parse error: parse error, unexpected '}' in C:\wamp\www\lib\Template.php(146) : eval()'d code on line 40

ou est l'erreur ligne 146 ou ligne 40 ? et il n'y a pas de '}' en trop !

Merci par avance pour vos réponses

Re: erreur dans template.php phpwiki

Posté : 02 mai 2007, 13:16
par sadeq
...
Parse error: parse error, unexpected '}' in C:\wamp\www\lib\Template.php(146) : eval()'d code on line 40

ou est l'erreur ligne 146 ou ligne 40 ? et il n'y a pas de '}' en trop !

...
Il est apparent que la ligne 146 de Templete.php pointe sur l'instruction eval() et c'est en exécutant le code de eval() que le parser trouve une erreur à la ligne 40 de ce sous-code.

NB, que eval() permet d'exécuter du code php généré à la volée.

Posté : 02 mai 2007, 14:14
par kerfam
Voici le code

Code : Tout sélectionner

function Template ($name, &$request, $args = false) { global $WikiTheme; $this->_request =& $request; $this->_basepage = $request->getArg('pagename'); if (strstr($name, "/")) { $oldname = $WikiTheme->_name; $oldtheme = $WikiTheme->_theme; list($themename, $name) = explode("/", $name); $WikiTheme->_theme = "themes/$themename"; } $this->_name = $name; $file = $WikiTheme->findTemplate($name); if (!$file) { trigger_error("no template for $name found.", E_USER_WARNING); return; } if (isset($oldname)) { $WikiTheme->_name = $oldname; $WikiTheme->_theme = $oldtheme; } $fp = fopen($file, "rb"); if (!$fp) { trigger_error("$file not found", E_USER_WARNING); return; } <-------- ligne 40 $request->_TemplatesProcessed[$name] = 1; $this->_tmpl = fread($fp, filesize($file)); fclose($fp); //$userid = $request->_user->_userid; if (is_array($args)) $this->_locals = $args; elseif ($args) $this->_locals = array('CONTENT' => $args); else $this->_locals = array(); }

Code : Tout sélectionner

function printExpansion ($defaults = false) { if (!is_array($defaults)) // HTML object or template object $defaults = array('CONTENT' => $defaults); $this->_vars = array_merge($defaults, $this->_locals); extract($this->_vars); global $request; if (!isset($user)) $user = $request->getUser(); if (!isset($page)) $page = $request->getPage(); // Speedup. I checked all templates if (!isset($revision)) $revision = false; global $WikiTheme, $RCS_IDS, $charset; //$this->_dump_template(); $SEP = $WikiTheme->getButtonSeparator(); global $ErrorManager; $ErrorManager->pushErrorHandler(new WikiMethodCb($this, '_errorHandler')); eval('?>' . $this->_munge_input($this->_tmpl)); <---- ligne 146 $ErrorManager->popErrorHandler(); }

Posté : 02 mai 2007, 14:50
par Ryle
Euh... je doute que l'on puisse commencer un eval() par la fermeture d'une balise php, mais j'avoue que je n'ai jamais essayé... ceci dit, je ne vois quand même pas l'intérêt d'utiliser la fonction eval si c'est pour lui passer du html.... :)

Posté : 02 mai 2007, 15:04
par kerfam
Avez vous une solution svp ?

Posté : 02 mai 2007, 16:13
par sadeq
Ce que j'ai demandé c'est le code à la ligne 40 dans le code exécuté par eval()
C'est à dire: la méthode $this->_munge_input(...)
avec une explication sur le contenu du paramètre $this->_tmpl

Posté : 03 mai 2007, 08:44
par kerfam
le code tu l'as plus haut

Posté : 03 mai 2007, 09:24
par sadeq
Je crains qu'on se comprend pas là.
Vu l'instruction
eval('?>' . $this->_munge_input($this->_tmpl));
Cette dernière appelle la méthode $this->_munge_input() de la classe en cours où l'erreur est signalée à la line 40.

Le code que tu nous a donné ne correspond pas à la méthode $this->_munge_input() OK :!:

Posté : 03 mai 2007, 09:47
par kerfam
Ce n'est pas moi qui fait le code ! ! ! !

ligne 40 : }
ligne 146 : eval('?>' . $this->_munge_input($this->_tmpl));

tu veux quoi de plus !

Posté : 03 mai 2007, 10:35
par jojolapine
le codes des méthodes suivantes:
  • _munge_input()
    _tmpl()
et au passage, si ce n'est pas toi qui a fait le code, la meilleur solution , c'est de demander des comptes à celui qui l'a fait!

Posté : 03 mai 2007, 10:53
par kerfam
voici le code de _munge_input :

Code : Tout sélectionner

function _munge_input($template) { // Convert < ?plugin expr ? > to < ?php $this->_printPluginPI("expr"); ? > $orig[] = '/<\?plugin.*?\?>/se'; $repl[] = "\$this->_mungePlugin('\\0')"; // Convert < ?= expr ? > to < ?php $this->_print(expr); ? > $orig[] = '/<\?=(.*?)\?>/s'; $repl[] = '<?php $this->_print(\1);?>'; return preg_replace($orig, $repl, $template); }
Voila ce qu'il y a après la ligne 40 :

Code : Tout sélectionner

$request->_TemplatesProcessed[$name] = 1; $this->_tmpl = fread($fp, filesize($file)); fclose($fp);

Posté : 03 mai 2007, 12:45
par sadeq
Ok, Je pense qu'il faut échapper le $ dans le code contenu dans $repl, c'est à dire ajouter un anti-slash avant le $ dans cette ligne:

Code : Tout sélectionner

$repl[] = '<?php \$this->_print(\\1);?>';

Posté : 04 mai 2007, 10:27
par kerfam
Bonjour
J'ai rajouter l'anti-slash après $this->_print(\1);?>';
mais ça ne marche toujours pas

Posté : 04 mai 2007, 11:31
par sadeq
pas après, avant le $.

Désolé, dans ma dernière réponse l'anti-slash n'a pas été affiché.
Je reposte la modif à faire:
$repl[] = '<?php \$this->_print(\\1);?>';

Posté : 04 mai 2007, 11:54
par kerfam
Désolé, tout à l'heure je voulais dire avant
J'ai fait un copier-coller du code, relancer apache, mais toujours le même problème