použití stejné komponenty (gridito) vícekrát na stejné stránce

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

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
+
0
-
{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
+
0
-

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
+
0
-

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
+
0
-

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)

colek
Člen | 59
+
0
-

ad Tharos: takhle nějak mě to napadlo, jenže když budu mít neznámý počet komponent, bude to silně ošlivý kód a chtěl jsem vědět jak se to dělá hezky :)

ad HosipLan: klaním se a dlužím pivo :)

Tharos
Člen | 1030
+
0
-

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
+
0
-

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
+
0
-

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)