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.