Multiplier a generované ID
- akadlec
- Člen | 1326
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
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
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)
- Vojtěch Dobeš
- Gold Partner | 1316
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}
- Vojtěch Dobeš
- Gold Partner | 1316
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
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
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
.
- Vojtěch Dobeš
- Gold Partner | 1316
Obecně není dobré spoléhat na generované názvy. Co když se v další verzi Nette způsob generování změní?
- Vojtěch Dobeš
- Gold Partner | 1316
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
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 ;)