použití stejné komponenty (gridito) vícekrát na stejné stránce
- colek
- Člen | 59
ahoj,
měl bych dotaz jak obecně vkládat vícekrát stejnou komponentu do stránky. V diskusích jsem našel buď různá pseudo řešení, nebo dokonce že to jde velmi těžko – všechno jsou to ale starší příspěvky a nevím jak na tom je Nette teď.
Konkrétně potřebuji vyřešit následující problém. V DB mám data, jejichž jedním z atributů je skupina. (dále pak např jméno a id – celkem třeba 200 entit, různě rozdělených do 5 skupin).
Aktuálně (v aplikaci bez nette) řeším vykreselní výběrem z databáze, seřazením podle skupiny a když v cyklu při výpisu dojde ke změně skupiny, uzavřu tabulku, odřádkuji atd. a pro další skupinu začnu vykreslovat další tabulku. Cílem je tedy vykreslit pět tabulek pod sebou, kdy každá tabulka je nějaká skupina.
Teď by mě zajímalo, jak to mám udělat když použiji Nette a nějaký datagrid – studuji gridito, ale v zásadě mi jde hlavně o obecný postup, platný třeba i pro formuláře. Nějak totiž nechápu jak se z mětody createComponent dostanu k nějakému cyklu v šabloně, který dostane všechny (jak je vytvořím?) datagridy…
díky moc
- Filip Procházka
- Moderator | 4668
{control nazevKomponenty $parametr}
se přeloží jako
$control->getWidget('nazevKomponenty')->render($parametr);
Kde $control
je aktuální presenter, nebo komponenta, ale to je
víceméně nepodstatné.
Čili ty, pokud to chceš mít v komponentě, si vytvoříš šablonu pro tu komponentu, nastavíš si ji v metodě render a daty naplníš šablonu a v ní si uděláš svoje cykly a vykreslování. Doporučuju se podívat na LookoutControl
Co se týče Gridita, mělo by to jít nějak pomocí vlastního renderování gridu, ale ještě jsem si s tím nehrál, tak nevím.
- Tharos
- Člen | 1030
Opravte mě, jestli jsem úplně mimo a nechápu zadání :), ale kde je ona složitost?
Osobně pokud někde potřebuji vykreslit víckrát na stránce stejný druh komponenty, jen s jinými daty, postupuji následovně: úplně se vykašlu na továrničky a komponenty si do presenteru připojím ručně. Vytvořím si jich kolik jen chci, jen pochopitelně musí být každá jinak pojmenovaná. Po vykreslení v šabloně jsou všechny navzájem nezávislé, korektně si každá přijímá své signály… je to ono?
Ukážu to například na VisualPaginatoru. V presenteru mějme kód:
public function actionDefault()
{
$this['vp'] = new VisualPaginator();
$paginator = $this['vp']->getPaginator();
$paginator->itemsPerPage = 1; // hodnoty jsou demonstrativní
$paginator->itemCount = 10;
$this['vp2'] = new VisualPaginator();
$paginator = $this['vp2']->getPaginator();
$paginator->itemsPerPage = 1;
$paginator->itemCount = 10;
}
a v šabloně mějme:
{control vp}
{control vp2}
Bez problému se vykreslí dvoje stránkování, u kterých lze s každým
nezávisle pracovat. Jinak šlo by to celé řešit i úpravou metody
Nette\ComponentContainer::createComponent()
.
Editoval Tharos (18. 1. 2011 21:08)
- Filip Procházka
- Moderator | 4668
trochu ti to vylepším, chceš? :)
public function actionDefault()
{
$vp = $this->createComponentVp('vp');
$vp2 = $this->createComponentVp('vp2');
}
protected function createComponentVp($name)
{
$this[$name] = $vp = new VisualPaginator();
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 1;
$paginator->itemCount = 10;
return $vp;
}
- Tharos
- Člen | 1030
Pane jo, tak eleganci ještě dopiluju ;). Do toho chybí už jen zaintegrovat stejný algoritmus ve Whitespaces. :)
Ha, objevil jsem Texy! bug. Kolik jsem vyhrál :)? S tímhle odkazem si
neporadí:
https://en.wikipedia.org/wiki/Whitespace_(programming_language)
Editoval Tharos (18. 1. 2011 22:27)
- Tharos
- Člen | 1030
colek napsal(a):
bude to silně ošlivý kód a chtěl jsem vědět jak se to dělá hezky :)
To jsi ještě neviděl opravdu ošklivý kód ;). Ba ne, vážně – na tom přístupu není nic nečistého. Abych pravdu řekl, já bych to ve svém projektu (v duchu KISS) vyřešil prostě takhle:
public function actionDefault()
{
foreach (range(1, 10) as $id) { // zde by v reálu byla kolekce těch požadovaných datagridů
$this["grid$id"] = new DataGridControl();
// Zde by byla jejich případná inicializace. Pak by šlo použít o řádek výš sexy
// syntaxi ... = $grid = new ... a při inicializaci pracovat s proměnnou $grid.
}
}
Továrničku bych vůbec nepoužil z jednoho důvodu – její význam vidím primárně v možnosti líné inicializace komponent, což se tady stejně moc neděje.
Editoval Tharos (19. 1. 2011 1:05)
- norbe
- Backer | 405
Rozhodně bych nebral továrničku pouze jako prostředek k líné inicializaci, osobně hlavní výhodu spatřuju v přehlednosti (nezaplácávám action/render metody něčím, co by mělo víceméně fungovat samo o sobě).
Další věc je, že si také můžeš vzpomenout, že by se ti hodilo mít tyhle komponenty v jiném pohledu a musíš zbytečně zasahovat do kódu presenteru (takže Tharosův postup bych určitě nedoporučil).
- bojovyletoun
- Člen | 667
Bylo to na fóru ale nepovedlo se to najít: (PS, jak funguje
hledání na tomto fóru- vlastní – lucene, sfinx,..?)
nalezeno:Zde je návod:
takhle to nějak vypadá – idea
šablona
{foreach $presenter['gridy']->components as $component}
{control $component}
{/f}
/*presenter: startup- action - nebo createcomponentfgridy */
/* ještě se musí zajistit this[gridy]=new CompoContainer;*/
$array=model::selectIDs();
foreach($array as $b){
$grid= new Datagrid;
$grid->parametr=$b;
/*nebo (nástřel)*/
$grid->model=dibi::datasource('table')->where('kategorie=',$b);
this['gridy']->addcomponent($grid); // + nějaké jméno
}
Editoval bojovyletoun (19. 1. 2011 18:24)