Seite 1 von 1

Aktuelle Url bestimmen / Sprache umschalten

Verfasst: 31.03.2008 11:44
von Helmut
Hallo,

ich suche schon eine ganze Weile, finde aber irgendwie keine Lösung dafür.

Ich möchte gerne raus bekommen, auf welcher Seite ich mich aktuell befinde. In der Browserzeile steht z.B. "http://www.phpbb.de/viewforum.php?f=6" drinnen, aber wie kann ich es in phpbb3 abfragen?

Gruß Helmut

Verfasst: 31.03.2008 12:44
von Dr.Death
Hallo,

schau mal in die "viewonline.php"

Dort der Bereich ab:

Code: Alles auswählen

// Get user list
Erst wird ausgelesen, welche User online sind und dann welche session_page gerade aktiv ist.

Weiter unten wird ein

Code: Alles auswählen

	switch ($on_page[1])
abgefragt.

Dort wird ermittelt welche Seite der User gerade betrachtet.

Verfasst: 31.03.2008 12:57
von Helmut
Hallo Dr.Death,

danke für deine Antwort, aber das bringt mich jetzt nicht wirklich weiter. So wie ich gesehen habe, geht das nur für die Seiten, welche sich in der Liste (z.B. case 'index':) befinden.

Ich bräuchte das für meine Homepage, da ich das für die Umschaltung der Sprache nutzen will und so auf der aktuellen Seite bleibe. Ich habe mehrere hundert Seiten eingebunden, die müsste ich dann theoretisch alle dort eintragen was schon eine Menge Arbeit ist. Daher suche ich nach einer einfacheren Lösung bzw. könnte man das nicht auch so machen, dass bei case '': alle Angaben aus der Datenbank kommen?

Gruß Helmut

Verfasst: 31.03.2008 13:25
von tas2580
Wie währe es damit?

Code: Alles auswählen

$_SERVER['SCRIPT_FILENAME']
$_SERVER['REQUEST_URI']
$_SERVER['PHP_SELF'] 
$_SERVER['QUERY_STRING'] 
http://de3.php.net/reserved.variables

Verfasst: 31.03.2008 16:25
von Helmut
Hallo Tobi,

danke dir für den Tipp, hätte da eigentlich selber drauf kommen müssen. :oops:

Ich habe es jetzt testweise so gemacht, wobei das immer noch nicht die Lösung ist. Für die Themenseiten geht es ganz gut, aber sobald eine $sid angehängt ist, geht es nichtmehr, da lang=* in der Url zwischen drinnen steckt.

funktions.php

Code: Alles auswählen

	//SVI language switch	
	$user_lang = request_var('lang', $user->lang_name);

	$sql = 'SELECT lang_id, lang_iso, lang_local_name
		FROM ' . LANG_TABLE . "
		ORDER BY lang_id";	
	$result = $db->sql_query($sql);
	
	while ($lang_row = $db->sql_fetchrow($result))
	{
		$iso = $lang_row['lang_iso'];
		$lang_name = $lang_row['lang_local_name'];

		$template->assign_block_vars('langswitch', array(	
			'LANGSWITCH'		=> $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "?lang=" . $iso,						
			'FLAGSWITCH'		=> append_sid("{$phpbb_root_path}styles/" . $user->theme['theme_path'] . '/theme' . "/images/flags/" . $iso .".png"),
			'ALTSWITCH'		=> $lang_name,
		));			
	}
	$db->sql_freeresult($result);
	//-------------------------

overall_header.html

Code: Alles auswählen

				<!-- Language -->				
				<div>
				<!-- BEGIN langswitch -->
				<a href="http://{langswitch.LANGSWITCH}"><img src="{langswitch.FLAGSWITCH}" alt="Flagge {langswitch.ALTSWITCH}"  /></a>&nbsp;
				<!-- END langswitch -->								
				</div>
				<br />
				<!-- Language -->

@Dr.Death
Aber trotzdem würde mich es interessieren, wie ich meine ganzen Seiten am einfachsten in die viewonline.php bringe. Das wäre für eine Statistik z.B. "Wer war wo online" interessant.


[EDIT]
so, ich habe es jetzt auch für die Foren hinbekommen, aber eine Sache gefällt mit noch nicht dabei. Ich verwende dabei preg_replace(, aber da habe ich noch ein kleines Problem damit, so sieht es jetzt aus:

Code: Alles auswählen

	//SVI language switch	
	$user_lang = request_var('lang', $user->lang_name);

	$url_lang = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	
	$sql = 'SELECT lang_id, lang_iso, lang_local_name
		FROM ' . LANG_TABLE . "
		ORDER BY lang_id";	
	$result = $db->sql_query($sql);
	
	while ($lang_row = $db->sql_fetchrow($result))
	{
		$iso = $lang_row['lang_iso'];
		$lang_name = $lang_row['lang_local_name'];

		$lang_in[1] = '/=en/';
		$lang_in[2] = '/=de/';
		$lang_out = '='.$iso;

		$url_lang = preg_replace($lang_in, $lang_out, $url_lang);

		$template->assign_block_vars('langswitch', array(	
			'LANGSWITCH'		=> $url_lang,						
			'FLAGSWITCH'		=> append_sid("{$phpbb_root_path}styles/" . $user->theme['theme_path'] . '/theme' . "/images/flags/" . $iso .".png"),
			'ALTSWITCH'		=> $lang_name,
		));			
	}
	$db->sql_freeresult($result);
	//-------------------------

Ich möchte ganz gerne die Ersetzung für $lang_in[1] = '/=en/'; für die Sprache (de, en, ....) die Variable $user_lang dafür verwenden, dort steht die aktuelle Usersprache drinnen. Wie bekomme ich die in die $lang_in rein, ohne dass ich eine Fehlermeldung bekomme?


[EDIT2]
So, ich habs rausbekommen, es muss so aussehen: $lang_in = "~=$user_lang~i";

[EDIT3]
Hier noch ein kleiner Nachtrag. Wenn keine lang=* angegeben war, dann konnte man auch keine Sprache wählen. Der Teil kommt noch dazu, um die lang=* anzuhängen.

Code: Alles auswählen

	// Wenn keine lang= angegeben wurde	
	$lang_in = "~=$user_lang~i";
	if (preg_match($lang_in, $url_lang)) 
	{
		$url_lang;
	} 
	else 
	{
		$url_lang = $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "?lang=" . $user_lang . '&' . $_SERVER['QUERY_STRING'];
	}

Gruß Helmut

Verfasst: 13.09.2008 14:25
von Helmut
Hallo,

so, ich muss das Thema doch nochmal aufgreifen. Also die Sache mit der Sprachumschaltung sowohl für Gäste als auch für eingeloggte User funktioniert einwandfrei, aber ich habe einen kleinen Schönheitsfehler entdeckt. Manchmal wird mehrfach &lang=de in den Link eingefügt, kommt aber nicht immer vor, das sieht dann so aus:

Code: Alles auswählen

http://localhost/phpBB3/viewforum.php?lang=de&lang=de&lang=de&f=1
Der Code dazu in der functions.php sieht so aus:

Code: Alles auswählen

	//SVI language switch	
	$user_lang = request_var('lang', $user->lang_name);

	$url_lang = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	
	// Wenn keine lang= angegeben wurde	
	$lang_in = "~=$user_lang~i";
	if (preg_match($lang_in, $url_lang)) 
	{
		$url_lang;
	} 
	else 
	{
		$url_lang = $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "?lang=" . $user_lang . '&' . $_SERVER['QUERY_STRING'];
	}

	//Umschalten von lang=
	$sql = 'SELECT lang_id, lang_iso, lang_local_name
		FROM ' . LANG_TABLE . "
		ORDER BY lang_id";	
	$result = $db->sql_query($sql);
	
	while ($lang_row = $db->sql_fetchrow($result))
	{
		$iso = $lang_row['lang_iso'];
		$lang_name = $lang_row['lang_local_name'];
		
		$lang_in = "~=$user_lang~i";			
		$lang_out = '='.$iso;

		$url_lang_2 = preg_replace($lang_in, $lang_out, $url_lang);

		$template->assign_block_vars('langswitch', array(	
			'LANGSWITCH'		=> $url_lang_2,						
			'FLAGSWITCH'		=> append_sid("{$phpbb_root_path}styles/" . $user->theme['theme_path'] . '/theme' . "/images/flags/" . $iso .".png"),
			'ALTSWITCH'		=> $lang_name,
		));			
	}
	$db->sql_freeresult($result);
	//-------------------------
Vermutlich hängt es mit dem ersten Teil für die Erkennung ob "&lang=de" schon in den Link eingefügt ist oder nicht, zusammen. Ich komme leider nicht dahinter, warum das manchmal mehrfach drinnen steht, funktionieren tut es trotzdem. Vielleicht kann mir jemand da weiterhelfen, die Ursache für dieses Verhalten zu finden.

Gruß Helmut :wink:

Re: Aktuelle Url bestimmen / Sprache umschalten

Verfasst: 08.02.2009 12:45
von Helmut
Hallo,

ich möchte das Thema nochmal aufgreifen, da mich eviL<3 auf ein mögliches Sicherheitsproblem aufmerksam gemacht hatte.

Ich verwende für meinen neuen Mod Quickly language change 0.0.1 (Vorabversion) unter anderem $_SERVER['QUERY_STRING'] und dazu meinte eviL<3, dass sich da HTML injizieren lässt (sogenanntes XSS - cross site scripting). Er schlägt mir vor, parse_str() zu verwenden, aber ich komme damit nicht so richtig klar.

Wäre nett, wenn mir jemand ein Beispiel nennen würde, wie ich parse_str() genau anwenden muss. :wink:

[EDIT]
Ich habe es jetzt mit parse_url() gelöst, das sollte eine mögliche Sicherheitslücke schließen.

Gruß Helmut