Středník místo ampersandu jako oddělovač parametrů v URL
- hjr
- Člen | 24
Zdravím, rád bych používal jako separator na výstupu středník místo ampersandu. Bohužel Nette pro tohle nenabízí žádnou volbu, natvrdo používá v Route.php (revize 319, řádek 349):
$query = http_build_query($params, '', '&');
Podědění třídy nepřipadá v úvahu, musel bych opsat celou metodu constructUrl() a změnit jeden řádek. Nejlepší by dle mého názoru byla nějaka konfigurační volba.
- David Grudl
- Nette Core | 8228
Jak by se takové parametry parsovaly? Jak by jim rozuměl třeba Google?
- morousej
- Člen | 18
David Grudl napsal(a):
Jak by se takové parametry parsovaly? Jak by jim rozuměl třeba Google?
Parsovaly by se teoreticky pomocí
explode(';', $string)
(středník by se musel escapovat pomocí %
sekvencí, ale každý je svého štěstí strůjcem, že) a když jim Google
neporozumí, to nejspíš nevadí (viz: Google bere
nettephp
jako jedno slovo. Ať si bere :-) v http://latrine.dgx.cz/…ybral-domenu).
- hjr
- Člen | 24
Parsují se na úrovni CGI a středník se nemusí escapovat jako
&
.
Google jim evidentně již rozumí: http://www.google.cz/search?…
V php.ini si též můžete nastavit, co má být separator na vstupu a
výstupu (arg_separator.input
, arg_separator.output
) a
přišlo by mi hezké mít tu možnost i v Nette.
- David Grudl
- Nette Core | 8228
Tohle je věc odporující HTTP protokolu, takže to určitě implementovat nebudu. Půjde to ale řešeit úpravou/vytvořením vlastního HttpRequest a Route nebo SimpleRouter.
Google samozřejmě vyhledá stránky obsahující středník. Má poznámka nesouvisí se SEO (tedy jestli to bere jako jedno slovo), ale jestli to chápe jako parametry. Což předpokládám že nikoliv.
- hjr
- Člen | 24
Proč by to mělo odporovat HTTP protokolu? Naopak je to doporučení W3C:
http://www.w3.org/…x/notes.html#…
V příslušném RFC, které upravuje tvar URI ( http://www.ietf.org/rfc/rfc2396.txt ) je v sekci 3.4 na stránce 14 středník v query component zařazen do stejné třídy rezervovaných znaků, jako ampersand.
Edit: opraveny překlepy.
Editoval hjr (15. 6. 2009 17:35)
- David Grudl
- Nette Core | 8228
Omlouvám se, nevěděl jsem, že středník lze použít jako oddělovač.
Podporu jsem přidal, stačí nastavit PHP direktivu
arg_separator.input
. Bude se používat první uvedený
separátor.
- Tomik
- Nette Evangelist | 485
Mohu se ze svého zcela laického pohledu (ty specifikace jsem si sice prohlížel, ale to mě nedělá odborníkem, že) zeptat, co to člověku dá oproti zavedenému funkčnímu řešení?
Nepolemizuju nad tím, zda to má smysl implementovat, jestliže je to podle specifikací ok, je fajn, že to Nette umí, jen nevím, co to, kromě potenciální problémů, může přinést.
- hjr
- Člen | 24
Středník se nemusí escapovat. Dost jsem se natrápil s &
vs &
v odkazech v HTML mailech, některé webmaily si
s korektně escapovaným ampersandem nedokázaly poradit (kvůli obalení
odkazu redirect skriptem).
V praxi jsem středník ještě nepoužil, leč na pár webech již viděl, takže to chci víceméně také vyzkoušet.
- David Grudl
- Nette Core | 8228
hjr napsal(a):
Středník se nemusí escapovat. Dost jsem se natrápil s
&
vs&
v odkazech v HTML mailech, některé webmaily si s korektně escapovaným ampersandem nedokázaly poradit (kvůli obalení odkazu redirect skriptem).
U webmailů je vůbec nejlepší posílat krátká URL bez parametrů a všechno lowercase.
- hjr
- Člen | 24
Ještě v Forms/Renderers/ConventionalRenderer.php (revize 491) utekl jeden pevný výskyt ampersandu:
Řádek 247:
foreach (explode('&', $uri[1]) as $param) {
nahradit takovým ošklivým, nepěkným:
$sep = ini_get('arg_separator.input');
foreach (explode($sep ? $sep[0] : '&', $uri[1]) as $param) {
Patch:
Index: /Nette/Forms/Renderers/ConventionalRenderer.php
===================================================================
--- /Nette/Forms/Renderers/ConventionalRenderer.php (revision 492)
+++ /Nette/Forms/Renderers/ConventionalRenderer.php (working copy)
@@ -244,7 +244,8 @@
$el->action = $uri[0];
$s = '';
if (isset($uri[1])) {
- foreach (explode('&', $uri[1]) as $param) {
+ $sep = ini_get('arg_separator.input');
+ foreach (explode($sep ? $sep[0] : '&', $uri[1]) as $param) {
$parts = explode('=', $param, 2);
$s .= Html::el('input', array('type' => 'hidden', 'name' => urldecode($parts[0]), 'value' => urldecode($parts[1])));
}