Pořadí komponent, nebo přidání inputu později po vytvoření formuláře

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

Ahoj,
nevím co bych potřeboval a co je možné. Jde o to, že mám komponentu, která se stará o přepínání jazyků na základě hodnoty za hash tagem. Mám další komponentu, která obsahuje formulář, kde je select. Ten select je závislej na jazyku, který se nastaví v první komponentě až se provede AJAX post dotaz. Potřeboval bych teda.

  1. Buď zajistit, že se provede jedna komponenta a po ní druhá,
  2. nastavit array u selectu později nebo
  3. přidat celý select až později, třeba při plnění daty.

Je něco takovýho možné? nebo na to jdu uplně blbě a měl bych na to jít jinak? Díky

PirateJack
Člen | 9
+
0
-

Ahoj, řekl bych že bys na to měl jít jinak…
Ajax je asynchronní, pokud potřebuješ provádět tyhle závislosti, tak to není asynchronní.

V podstatě můžeš
reagovat na změnu jazyku v always callbacku jquery…
nedělat tyhle závislosti ajaxem, ale klasickým request/response

Kdyžtak zkus více popsat problém, používáš příliš vágní popis, takže ti nikdo nemůže přesně poradit…

Editoval PirateJack (2. 9. 2013 15:27)

wallkysek
Člen | 52
+
0
-

nevím jestli to je to co hledáš, ale koukal ses někam sem?
https://doc.nette.org/cs/forms#…

Pokud si dobře vzpomínám někde v dokumentaci jsem našel něco co se týkalo dvoujazyčných selectů

Oli
Člen | 1215
+
0
-

Jasně, díky.

Jde o to, že mám administrační rozhraní. Je potřeba přepínat mezi jazyky, ve kterých se bude publikovat na frontendu. Čili administrační rozhraní je samo o sobě celé v jednom jazyce. Všechno to je v pohodě a funguje dobře, jediný problém je u selectu. Kod vypadá zhruba takhle:

// komponenta, která vykresluje jazyky, mezi kterými je možno přepínat a zajišťuje předání jazyku do presenteru
{control languageSwitch}
{snippet form}
	// komponenta, která vykresluje formulář
	{control editPage}
{/snippet}

Problém je ten, že se pravděpodobně vytvoří komponenta s formulářem a až pak dojde ke změně jazyku, takže se vykreslí selectbox vždy s jazykem jakoby o krok pozdě. Kritický řádek je tento v editPage (formulář):

//editForm component
public function createComponentForm()
{
	...
	$parentId = $this->pagesModel->getParents($presenter->getLang())->fetchPairs('id', 'title');
	...
}

To $presenter->getLang() je tahaný z presenteru, ale evidentně je to tahaný moc brzo a načte to starý data.

Je to takhle jasnější? :-)

saimons
Člen | 293
+
0
-

Mam trochu bordel v tom co delas pres ajax a co ne. Ale ja tohle resim mimo ajax, preklereslenim tak, ze mam pro admina persistentni parametr langAdmin a v nem mam nakou defaultni hodnotu, kterou popripade prepisu odeslanim formulare na zmenu jazyka. Urcite by to slo a dalo se efektivne resit i pres session.

Oli
Člen | 1215
+
0
-

ajaxove se meni jazyk a hodnoty ve formuláři. Zatím to není asi ideální, časem bych to chtěl napojit na rozšíření history pro ajax.nette.js. Zatím to mám přes jquery ba-bbq.

Myšlenka je taková, že v některých projektech je potřeba multijazyčnost a v některých ne. Je to teda potřeba vypnout a zároveň aby presenter v podstatě jen držel jazyk a o změnu se starala komponenta. V té komponentě se právě přepisuje session a to si myslím, že je problém. Že se vykreslí formulář a potom se přepíše session, takže se formulář vykreslí se starou session. URL adresu mám ve tvaru

neconeco.cz/stranky/edit/1#lang=cs
neconeco.cz/stranky/edit/1#lang=en
...

No a tohle se zpracuje a ajaxem překreslí podle jazyku, ktery je v url.

var url = $.param.fragment();
if (url != "")
{
	var params = $.deparam.fragment();
	if (params.lang != undefined)
	{
		$.ajax({
			type: "POST",
			url: {link languageChange!},
			data: { lang: params.lang }
		});
	} else
	{
		alert('Snažíte se přistoupit na stránku, která neexistuje');
	}
}

Jak říkám, tohle funguje bez problému, tak jak potřebuju. Problém je jen, pokud select obsahuje pro každý jazyk jiná data. To se potom vždy o jedno opozdí: přepnu
z cs na en → vykreslí select s cs daty
z en na de → vykreslí select s en daty
z de na cs → vykreslí select s de daty

Tak a otázka zní, jde to nějak jednoduše vyřešit? :-)