Multiplier a generované ID

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

Pomocí Multiplier si vkládám do stránky datagridy které se liší jazykem:

V šabloně takto:

{foreach $systemData->languages as $language}
	{control articlesPostsGrid-$language->code}
{/foreach}

pak v presenteru:

protected function createComponentArticlesPostsGrid()
{
	// Prepare data for multiplier
	$factory = $this->postsDataGridControlFactory;

	// Create multiplier
	return new \Nette\Application\UI\Multiplier(function ($language) use($factory) {
		// Init datagrid
		return $factory->setLanguage($language)->create();
	});
}

Vše funguje ok až na to generované id které se v šabloně datagridové komponenty vloží takto:

<div id="{$control->name}" class="dataGrid" style="display: none;">

a problém je ten že to IDčko mám podle toho předného parametru přes multiplier a tedy „cs“, „sk“, atd. což je problém, mě by bodlo tam něco generovat třeba v té továrničce co ten datagrid vytvoří něco ve tvaru např. articlesPostsCs abych s tím mohl dále počítat (generování v ajax requestu, zpracování přes js atd.)

Nette mám 2.1-dev php 5.3ka

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Omlouvám se, můžeš ještě trochu vysvětlit tvůj záměr? Nějak to z toho příspěvku nejsem sto pochopit.

akadlec
Člen | 1326
+
0
-

No to name co má vygenerované ta komponenta má jen tu hodnotu co je předána v konstruktoru toho multiplieru.

Takhle, ten datagrid je dělaný přes komponentu NiftyGrid a v šabloně té komponenty je udělána obálka celého gridu:

<div id="{$control->name}" class="dataGrid" style="display: none;">
	// ... zbytek gridu, tabulka, buttony, atd
</div>

a problém je v tom atributu ID té obálky. V té proměnné {$control->name} mám prostě ten jazyk pro který je ten grid vytvořený (cs, sk, en, atd.) a nemůžu přijít na to kde se to name vytvoří. V konstruktoru té komponenty kde je volán parent construcotr (UI\Control) který má volitelné parametry presenter a name to klidně nastavím a dám mu nějaké name, ale prostě někde dále se to přebije na ten parametr :(

Jen pro doplnění:
prošel sem celou classu toho niftygridu a nenašel sem tam nikde nastavení name jen její používání, takže to tam bouchne asi samotné nette

Editoval akadlec (10. 3. 2013 22:05)

Tabetha
Člen | 140
+
0
-

a nemôžeš si ručne nastavovať ID toho prvku?

akadlec
Člen | 1326
+
0
-

@Tabetha: no to by bylo ideál ale jak? Jako můžu tam udělat další proměnnou kde budu házet co chcu aby tam bylo ale ono se to name využívá napříč tím datagridem :(

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Pokud bys chtěl name té komponenty zcela unikátní v rámci celé stránky, tak ho získáš takto:

{$control->lookupPath('Nette\Application\UI\Presenter')}

Pokud by ti stačil například jen název toho multiplieru + jazyk:

{$control->parent->name . '-' . $control->name}
akadlec
Člen | 1326
+
0
-

Supr tohle jede, takže ono si to do name hodí ten child parametr se kterým se to volá? Dá se nějak nad tím převzít kontrolu? Nebo to řešit vlastními parametry?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Name je prostě name, musí být pro každou komponentu (každou instanci) unikátní, za unikátní se bere ten kompletní název včetně rodičů. Trik s multiplierem je ten, že ty využíváš právě toho skládání jména komponenty k jejímu dynamickému vytváření. Ty sám volíš, že v name bude v tvém případě ten jazykový kód, poněvadž s ním skládáš v šabloně ten název. A on se ti pak předá do té Multiplierové továrničky.

Úplně stále nechápu, co přesně řešíš, takže nedokážu poradit, jak to máš řešit :). Nicméně ukaž kód té tvojí komponenty, zajímal by mě ten konstruktor… A pokud máš ještě trpělivost, zkus mi více vysvětlit, čeho přesně se snažíš docílit, nebo co je tvým problémem, který řešíš.

akadlec
Člen | 1326
+
0
-

Díky za vyčerpávající odpověď. Pro můj případ je asi postačující.

No co přesně řeším je to že jeden presenter vykreslí do stránky datagridy článků dělené např. podle jazyka. V druhém presenteru se vypíšou další datagridy tentokráte pro kategorie, no a když v tom jednom datagridu provedu nějakou akci tak jsem si chtěl v tom ajaxovém requestu předat info že ta akce má dopad taky na html element s ID xxyy, tedy bych normálně ručně předal třeba text articlesPosts-cs a javascript by věděl že má přistoupit k elementu s daným ID a zavolat třeba refresh. Toto vše je v situaci kdy se na stránce zobrazují presentery v „záložkách“, tzn. mám menu kde když kliknu na položku se přidá do stránky nová záložka s obsahem daného presenteru…nicméně zvažuji že tuto funkcionalitu asi nebudu přenášet z původního systému ;)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jasný, jestli tedy jde především o to pohodlně vybírat elementy v javascriptu, je určitě nejlepší použít třeba CSS třídy nebo něco takového, a nespoléhat moc na vygenerovaná name.

akadlec
Člen | 1326
+
0
-

No jasně CSS třídy jdou ale jak bys pomocí nich chtěl hledat daný element? stejnak si to info musíš někde předat a pokud to generované name bude „statické“ tak se to dá použít pro tu detekci ID.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Obecně není dobré spoléhat na generované názvy. Co když se v další verzi Nette způsob generování změní?

akadlec
Člen | 1326
+
0
-

no a právě proto jsem hledal možnost si to name ošéfovat podle sebe ;) ale asi to nebudu zatím řešit.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jako do toho atributu ID si dej cokoliv :). Jen nespoléhej na generované name, a též se určitě nesnaž měnit name podle sebe (nějak zpětně).

akadlec
Člen | 1326
+
0
-

Jasně že tam můžu bouchnout cokoliv ;) jen jsem chtěl využít identifikátory co jsou již k dispozici než tam cpát další. Jako ono se dá spolehnout i na to co to generuje teď že, jen je potřeba počítat s tím že když se v nette změní ten princip generování tak to bude mít dopad na zbytek kodu ;)