Středník místo ampersandu jako oddělovač parametrů v URL

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
hjr
Člen | 24
+
0
-

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 | 8216
+
0
-

Jak by se takové parametry parsovaly? Jak by jim rozuměl třeba Google?

morousej
Člen | 18
+
0
-

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
+
0
-

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 | 8216
+
0
-

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
+
0
-

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 | 8216
+
0
-

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.

hjr
Člen | 24
+
0
-

Díky. Já se později podělím o zkušenosti, jestli a jaké problémy použití středníku přináší.

Tomik
Nette Evangelist | 485
+
0
-

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
+
0
-

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 | 8216
+
0
-

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
+
0
-

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])));
 				}
David Grudl
Nette Core | 8216
+
0
-

Víš, že s těma středníkama mám problém, ještě že tam není ůůů ;)