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.