Seite 1 von 1

bug in class.template.php

Verfasst: Do 1. Jun 2006, 18:36
von emergence
hmm...

der gefällt mir
folgenden code in ein output modul setzen (layout tuts auch) und speichern

Code: Alles auswählen

<?php 

echo mi18n("test");
echo mi18n('test');

?>
ergebniss nach dem speichern

Code: Alles auswählen

<?php 

echo mi18n("test");
echo mtest;

?>
es wird zwar noch in dem moment in der db richtig gespeichert, aber nach einem nochmaligen speichern ist es falsch in der db drinnen...

vermutlich ab version ab 4.5.3/4 aufwärts reproduzierbar...

lösungsvorschläge ? ( nicht -> nur mi18n("") verwenden )

Verfasst: Do 1. Jun 2006, 19:06
von HerrB
Ha, jetzt weiss ich, woher bei einem Modul mNachname herkommt.

Ich hätte jetzt ganz trivial das vorgeschlagen, was Du ausgeschlossen hast ... :wink: Gerade so auf die Schnelle: Nö...

Gruß
HerrB

Verfasst: Fr 2. Jun 2006, 09:51
von emergence
HerrB hat geschrieben:Ha, jetzt weiss ich, woher bei einem Modul mNachname herkommt.
toll, nicht ?

Verfasst: Fr 9. Jun 2006, 12:30
von emergence
ähm...
das ist wirklich seltsam gemacht worden in der klasse...
besonders das ersetzen der i18n trans string pro durchlauf ????


Code: Alles auswählen

		//if content has dynamic blocks
		if (preg_match("/^.*".preg_quote($this->tags['start'], "/").".*?".preg_quote($this->tags['end'], "/").".*$/s", $content))
		{
			//split everything into an array
			preg_match_all("/^(.*)".preg_quote($this->tags['start'], "/")."(.*?)".preg_quote($this->tags['end'], "/")."(.*)$/s", $content, $pieces);
			//safe memory
			array_shift($pieces);
			$content = "";
			//now combine pieces together

			//start block
			$pieces[0][0] = str_replace($this->needles, $this->replacements, $pieces[0][0]);
			$this->replacei18n($pieces[0][0], "i18n");
			$this->replacei18n($pieces[0][0], "trans");
			$content .= $pieces[0][0];
			unset ($pieces[0][0]);

			//generate dynamic blocks
			for ($a = 0; $a < $this->dyn_cnt; $a ++)
			{
				$temp = str_replace($this->Dyn_needles[$a], $this->Dyn_replacements[$a], $pieces[1][0]);
				$this->replacei18n($temp, "i18n");
				$this->replacei18n($temp, "trans");
				$content .= $temp;
			}
			unset ($temp);

			//end block
			$pieces[2][0] = str_replace($this->needles, $this->replacements, $pieces[2][0]);
			$this->replacei18n($pieces[2][0], "i18n");
			$this->replacei18n($pieces[2][0], "trans");
			$content .= $pieces[2][0];
			unset ($pieces[2][0]);
		} else
		{
			$content = str_replace($this->needles, $this->replacements, $content);
			$this->replacei18n($content, "i18n");
			$this->replacei18n($content, "trans");
		}
ersetzen durch

Code: Alles auswählen

		// replace i18n strings before replacing other placeholders
		$this->replacei18n($content, "i18n");
		$this->replacei18n($content, "trans");

		//if content has dynamic blocks
		if (preg_match("/^.*".preg_quote($this->tags['start'], "/").".*?".preg_quote($this->tags['end'], "/").".*$/s", $content)) {
			//split everything into an array
			preg_match_all("/^(.*)".preg_quote($this->tags['start'], "/")."(.*?)".preg_quote($this->tags['end'], "/")."(.*)$/s", $content, $pieces);
			//safe memory
			array_shift($pieces);
			$content = "";
			//now combine pieces together

			//start block
			$content .= str_replace($this->needles, $this->replacements, $pieces[0][0]);
			unset ($pieces[0][0]);

			//generate dynamic blocks
			for ($a = 0; $a < $this->dyn_cnt; $a ++) {
				$content .= str_replace($this->Dyn_needles[$a], $this->Dyn_replacements[$a], $pieces[1][0]);
			}
			unset ($pieces[1][0]);

			//end block
			$content .= str_replace($this->needles, $this->replacements, $pieces[2][0]);
			unset ($pieces[2][0]);

		} else {
			$content = str_replace($this->needles, $this->replacements, $content);
		}
sollte auch schneller sein...

der bug ist dann bei mir nicht mehr reproduzierbar...

Verfasst: Fr 9. Jun 2006, 14:39
von knb
das war in classes/class.template.php
ach ja steht ja in überschrift

Verfasst: Mo 12. Jun 2006, 09:45
von HerrB
emergence, Du hattest mir von einem möglichen Problem im Zusammenhang mit PHP-Code in der Übersetzung berichtet, kannst Du das nochmal hier reinschreiben?

Danke.

Gruß
HerrB

Verfasst: Mo 12. Jun 2006, 09:50
von emergence
wenn du zb ein template hast das php code enthält und dort kommt etwas wie

Code: Alles auswählen

<?php echo mi18n("TEST"); ?>
vor wird das sicher ersetzt...

die replacei18n müsste nur darauf rücksicht nehmen nichts innerhalb von php code zu ersetzen...

Verfasst: Mo 12. Jun 2006, 09:52
von HerrB
Die Lösung verhindert übrigens nur, dass mTest entsteht, zur Übersetzung wird aber mi18n('Test'); trotzdem nicht erkannt.

Gruß
HerrB

Verfasst: Mo 12. Jun 2006, 09:56
von emergence
das ist schon richtig... php code sollte unter allen umständen unverändert bleiben ;-)

ich verwende templates zeitweise um php code zu erzeugen, den ich dann evaluiere... und da möcht ich keinenfalls das mir die template klasse einen möglichen php fehler reinbaut...

Verfasst: Mo 12. Jun 2006, 20:29
von HerrB
Kannst Du für diesen Fall mal ein Beispiel konstruieren, ich habe etliche Varianten ausprobiert und irgendwie noch keinen Fehler gefunden (teilweise wurde auch nichts ausgegeben)? Ich möchte nur sicher gehen, dass ich 4fb erklären kann, wo ein Problkem schlummern könnte.

Danke.

Gruß
HerrB

Verfasst: Di 13. Jun 2006, 11:26
von emergence
ähm ein beispiel ?
fällt mir jetzt momentan nicht ein...

anders ich liefere eine geänderte version der replacei18n die php code beschützt... falls welcher vorhanden ist...

Verfasst: Di 13. Jun 2006, 12:01
von emergence
funktion mit php schutz...

Code: Alles auswählen

	/**
	 * replacei18n()
	 *
	 * Replaces a named function with the translated variant
	 *
	 * @param $template string Contents of the template to translate (it is reference to save memory!!!)
	 * @param $functionName string Name of the translation function (e.g. i18n)
	 */
	function replacei18n(& $template, $functionName) {

		//be sure that php code stays unchanged
		if (preg_match_all('/<\?(php)?((.)|(\s))*?\?>/i', $template, $php_matches)) {
			$x = 0;
			foreach ($php_matches[0] as $php_match) {
				$x++;
				$template = str_replace ($php_match , "{PHP#".$x."#PHP}", $template);
				$container[$x] = $php_match;
			}
		}

		//if template contains functionName + parameter store all matches
		preg_match_all("/".preg_quote($functionName, "/")."\\(([\\\"\\'])(.*?)\\1\\)/s", $template, $matches);

		$matches = array_values(array_unique($matches[2]));
		for ($a = 0; $a < count($matches); $a ++) {
			$template = preg_replace("/".preg_quote($functionName, "/")."\\([\\\"\\']".preg_quote($matches[$a], "/")."[\\\"\\']\\)/s", i18n($matches[$a]), $template);
		}

		//change back php placeholder
		if (is_array($container)) {
			foreach ($container as $x => $php_match) {
				$template = str_replace ("{PHP#".$x."#PHP}" , $php_match, $template);
			}
		}

	}

Verfasst: Di 13. Jun 2006, 13:04
von HerrB
Danke, drin, geschlossen.

Gruß
HerrB