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>"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 & 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.