Action name is not alphanumeric string

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

v url mam tento string test-50-test na pozici <action> v route. Routa to zaregistruje (je zelena v debbug baru) avsak pozadavek vypada pak takhle: Front:MyPresenter:test-50Test

kdyz je string `test50-test tak je vse v poradku

da se to nejak napravit, aby to bralo test-50-test? diky

Majkl578
Moderator | 1364
+
0
-

A jak bys to napsal v PHP? public function actionTest50-test? Nesmysl, oprav si to u sebe.

simPod
Člen | 383
+
0
-

prosim jeste trosku o nakopnuti. co si mam opravit?

Ascaria
Člen | 187
+
0
-

simPod napsal(a):

prosim jeste trosku o nakopnuti. co si mam opravit?

Mohl bys začít tím, že nám ukážeš kód routy, linku a actionu najednou.

simPod
Člen | 383
+
0
-

to nesouvisi s mym kodem, dela to i sandbox kdyz zadas adresu treba /Homepage/test-50-test

Tam jde o to, ze by to pak volalo function actionTest-50Test, ale ja potrebuju treba function actionTest50Test protoze function actionTest-50Test je blbost. Takze ted je otazka, jak vyresit tohle

Ascaria
Člen | 187
+
0
-

Upravit routu tak, aby neblbla, proto je potřeba vidět jak jsou mnou výše zmíněné věci zapsané.

Editoval Ascaria (11. 6. 2012 9:32)

simPod
Člen | 383
+
0
-

no, routa a vse ostatni je stejne jako v sandboxu

$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

jen v prezenteru mam v metode startup() $this->setView('default'); a v renderDefault() ziskavam obsah <action> z routy pomoci $this->getAction()

petr.pavel
Člen | 535
+
0
-

Standardní routování (to, co's poslal) způsobí, že se do action dosadí část url (test-50-test) a z toho se vyrobí název metody presenteru (čekal bych actionTest-50-test, ale sám vidíš, na co se to překládá).

Jestli ti to nevyhovuje (potřebuješ vyházet pomlčky), tak si budeš muset napsat vlastní routovací překladač/filtr

Teď, když vidíš, kolik práce by to bylo, tak možná radši změníš ta url :-) (přestaneš používat pomlčky v url a nahradíš je lomítky, které jdou pomocí std routovacích pravidel snadno převést na parametry akce/renderu).

P.S. Poprosil bych diskutující o větší přívětivost. Možná jste to tak nemysleli, ale vaši stručnost a volbu slov lze pochopit jako aroganci.

Jan Tvrdík
Nette guru | 2595
+
0
-

petr.pavel wrote:

Standardní routování (to, co's poslal) způsobí, že se do action dosadí část url (test-50-test) a z toho se vyrobí název metody presenteru.

Píšeš nesmysly, takhle se to vůbec nechová. Parametr action je standardně filtrován.

Ascaria
Člen | 187
+
0
-

Už asi vím čím to je: URL string aa-bb-cc se mění na aaBbCc, zkrátka pomlčka + písmeno se změní na velké písmeno (a opačně) tak, aby se pomlčka nemohla vyskytnout v názvu akce (kde ani nemůže být). Jenže číslo to nepozná, a tak tam pomlčku nenahradí a tudíž vznikne tebou popisovaná chyba. Máš tedy čtyři možnosti:

  1. upravit filtr tak, aby pobral i číslo (jenže to nejde měnit na velké a malé číslo, tak nebude vědět jestli má pomlčku nazpátek dosadit)
  2. upravit nazev akce, aby za každou pomlčkou následovalo alespoň 1 písmeno (test-i50-test)
  3. nepoužívat čísla v akcích (osobně jsem za dobu co používám Nette nepotřeboval číslo v action)
  4. napsat vlastní definici routy, která bude problém řešit a například rozdělí „test-50-test“ na oddělené části „test“ a „50“ a „test“ a action pak bude například jen „test“ a ostatní dvě části budou další parametry

Editoval Ascaria (11. 6. 2012 12:49)

Filip Procházka
Moderator | 4668
+
0
-

Možnost 3. je správně.

simPod
Člen | 383
+
0
-

aha chapu. ja delal chybu ze jsem k predavani parametru pouzival <action>. Nastavil jsem tedy <action> na 'default' a misto <action> jsem do url dal <slug>

diky

Michal Majer
Člen | 8
+
0
-

Právě jsem narazil na stejný problém. V administraci používám pro tvorbu stringu do url funkci Strings::webalize() a pokud např. klient přidal stránku s názvem „Turnaj Krumlov 2012“, nastaly potíže.

Vyřešil jsem to tak, že jsem před konec funkce Strings::Webalize() přidal tento kód:

for($i=0;$i<10;$i++) {
	$s = str_replace('-'.$i, '-i'.$i, $s);
}
Filip Procházka
Moderator | 4668
+
0
-

Když uděláš to co @simPod, tak s tím nebudeš mít problém :)