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 ' und Doublequote ") übergeben werden.
Die Ergebnisliste wurde dann mit JPagination 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 JApplication zu JRouter, weiter zu JRouterSite und JApplicationSite bin ich letztendlich bei JURI gelandet. Denn hier in JURI->parse wird der Query-String in ein Array verwandelt.
Das eigentliche Problem ist, dass irgendwann vorher die Anführungsstriche im Query-String in " verwandelt wird. Dabei entsteht ein &-Zeichen, welches später von parse_str als Trennzeichen aufgefasst wird.
Das zweite Problem ist dann später ein interner addslashes innerhalb von parse_str.

Der Code in /libraries/joomla/environment/uri.php 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 & with & for parse_str to work right...
	if(isset ($_parts['query']) && strpos($_parts['query'], '&')) {
		$_parts['query'] = str_replace('&', '&', $_parts['query']);
	}
//" in Anführungsstriche verwandeln:
	if(isset ($_parts['query']) && strpos($_parts['query'], '"')) {
		$_parts['query'] = str_replace('"', '"', $_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.

Kategorien:

Stichwörter:

joomla · parameter · anführungszeichen · quot · query · suche · plugin ·