Joomla

ID #1368 Joomla: Parameter-Probleme mit " (")

Problem:

Wenn man einen Parameter mit Anführungsstrichen übergibt, so hat man ein Problem bei weiterführenden Links wie z.B. der Pagination.

Beispiel:
Ich musste eine Suchfunktion schreiben (kein Search-Plugin, sondern wirklich eine eigene von Joomla losgelöste Suche).
Dabei dürfen Anführungszeichen (Singelquote <code>'code> und Doublequote <code>"code>) übergeben werden.
Die Ergebnisliste wurde dann mit <code>JPaginationcode> auf mehrere Seiten verteilt.
Bei den Klick auf die Seiten-Nummern ist der Suchtext aber plötzlich verschwunden.

Lösung:

Nach langem Suchen quer durch den ganzen Code, von <code>JApplicationcode> zu <code>JRoutercode>, weiter zu <code>JRouterSitecode> und <code>JApplicationSitecode> bin ich letztendlich bei <code>JURIcode> gelandet. Denn hier in <code>JURI->parsecode> wird der Query-String in ein Array verwandelt.
Das eigentliche Problem ist, dass irgendwann vorher die Anführungsstriche im Query-String in <code>&quot;code> verwandelt wird. Dabei entsteht ein <code>&code>-Zeichen, welches später von <code>parse_strcode> als Trennzeichen aufgefasst wird.
Das zweite Problem ist dann später ein interner <code>addslashescode> innerhalb von <code>parse_strcode>.

Der Code in <code>/libraries/joomla/environment/uri.phpcode> ist für eine passende Lösung wie folgt zu erweitert:

function parse($uri)
{
	//Initialize variables
	$retval = false;

	// Set the original URI to fall back on
	$this->_uri = $uri;

	/*
	 * Parse the URI and populate the object fields.  If URI is parsed properly,
	 * set method return value to true.
	 */
	if ($_parts = $this->_parseURL($uri)) {
		$retval = true;
	}

	//We need to replace &amp; with & for parse_str to work right...
	if(isset ($_parts['query']) && strpos($_parts['query'], '&amp;')) {
		$_parts['query'] = str_replace('&amp;', '&', $_parts['query']);
	}
//&quot; in Anführungsstriche verwandeln:
	if(isset ($_parts['query']) && strpos($_parts['query'], '&quot;')) {
		$_parts['query'] = str_replace('&quot;', '"', $_parts['query']);
	}

	$this->_scheme = isset ($_parts['scheme']) ? $_parts['scheme'] : null;
	$this->_user = isset ($_parts['user']) ? $_parts['user'] : null;
	$this->_pass = isset ($_parts['pass']) ? $_parts['pass'] : null;
	$this->_host = isset ($_parts['host']) ? $_parts['host'] : null;
	$this->_port = isset ($_parts['port']) ? $_parts['port'] : null;
	$this->_path = isset ($_parts['path']) ? $_parts['path'] : null;
	$this->_query = isset ($_parts['query'])? $_parts['query'] : null;
	$this->_fragment = isset ($_parts['fragment']) ? $_parts['fragment'] : null;

	//parse the query

//	if(isset ($_parts['query'])) parse_str($_parts['query'], $this->_vars);
	if(isset ($_parts['query'])) {
		parse_str($_parts['query'], $this->_vars);
//Dummerweise sind die Anführungsstriche nun mit einem Backslash versehen
		foreach ($this->_vars as $key => $val) {
			$this->_vars[$key] = stripslashes($val);
		}
	}
	return $retval;
}

Achtung:
Natürlich ist dieser Code nicht update-sicher!
Er muss also mit jedem Update von Joomla neu eingespielt werden.

 

sozial Bookmarking
Bookmarken bei YIGG Bookmarken bei Mister-Wong Bookmarken bei Icio Bookmarken bei del.icio.us Bookmarken bei Technorati Bookmarken bei Furl Bookmarken bei Spurl Bookmarken bei Yahoo Bookmarken bei Google

vom 2009-09-09 10:56, zuletzt 2009-09-09 11:05     Artikel ausdrucken Artikel weiterempfehlen Als PDF-Datei anzeigen

Dieser Inhalt ist unter der Creative-Commons Lizenz lizensiert.

Probleme bitte im Server-Support-Forum diskutieren.

überflüssig 1 2 3 4 5 wertvoll  
Durchschnittliche Bewertung:   0 von 5 (0 Bewertungen)

Artikel kommentieren