Presenter bez šablony a řešení komponent

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

Ahoj,
chtěl jsem se zeptat jak řešít stránku bez použití template (presenter ji načítá automaticky)…
Dělám dialogové okna pro editaci, přidávání a podobně. Výsledkem má být, že v presenteru si vytvořím v továrničce formulář, ten předám komponentě a ta ho vykreslí. Obsahem stránky bude tedy pouze formulář a nadpis ze sablony pripojene ke komponente.
Muzete poradit jak resit jinak? Tady vam poslu funkcni reseni, ktere se mi moc nelibi. Nevím jak bych to pak třeba předělával, kdybych chtěl dialogy vypnout… nejspis jenom presunout „$this->terminate();“ do komponenty.
Dál jsem hledal na foru jak předat komponente nejakou promenou, zda se mi ze ste to moc nedoresili, nebo jste to resili nakonec s tim kontruktorem?

S Nette začínám většinou jsem všechno dohledal, pojmenování tam dobré nejsou… řeším funkčnost.
Ještě ten nadpis by byl upravovatelnej z presenteru a další úpravy, jde mi fakt o tento základ bez toho abych vytvořil sablonu Edit.phtml a v ni volal komponentu a formular.

Díky

Presenter

<?php
class Page_DefaultPresenter extends SecuredPresenter
{
	[...]
	protected function createComponentEditForm()
	{
		$form = new AppForm;
		[...]
		return $form;
	}

	function renderEdit(){

		$komp = new DialogEdit();
		$komp->form = $this->getComponent('editForm');
		$komp->render();

		$this->terminate();
	}
	[...]
}
?>

Komponenta

<?php
class DialogEdit extends Control
{

	public $dialogedit;
	public $form;
	[...]
	public function render()
	{
		$dialogedit = $this->getDialogEdit();
		$this->template->form = $this->form;
		$this->template->setFile(dirname(__FILE__) . '/template.phtml');
		$this->template->render();
	}
	[...]
}
?>

Template.phtml

<h2>Upravit</h2>
{$form}

Editoval zarubik (18. 4. 2010 9:43)

despiq
Člen | 320
+
0
-

moc tomu nerozumim
predani promenne komponente {widget komponenta $promenna} to by melo urcite fungovat

Editoval despiq (18. 4. 2010 23:19)

Mikulas Dite
Člen | 756
+
0
-

despiq napsal(a):

predani promenne komponente {widget komponenta $promenna} to by melo urcite fungovat

Tohle právě asi nefunguje, viz. parametry makra widget.

zarubik
Člen | 31
+
0
-

Nene nefunguje.

Ale ja spis hledam reseni pro pouzi v presenteru, ne v sablonach.

<?php
	$komp = new DialogEdit();
	$komp->form = $this->getComponent('editForm');
	$komp->render();
?>

Nebo jestli jde nejak jinak cele resit.
Delam neco jako je v Gridito, kdyz kliknete na upravit nebo pridat, ze se objevi dialog s formularem. Jenom abych to nemel propojeny s tabulkou a fungovalo to po kliknuti na odkaz s tridou ajax-dialog.

To cele mi funguje jenom nevím jestli to neresim spatne, nebo se to neda resit lip. S Nette zacinam a nechci se ucit blbosti.

despiq
Člen | 320
+
0
-

bezne pouzivam

<?php
{widget icon 'edit'}
?>

v komponente pak

<?php
public function render()
{
 $args = func_get_args();
}
?>

tak me matete co na tom nefunguje a vubec, je to prece napsany v dokumentaci
https://doc.nette.org/…late-filters#…

Editoval despiq (18. 4. 2010 23:23)

Rampa
Člen | 65
+
0
-

Nebo jestli jde nejak jinak cele resit.
Delam neco jako je v Gridito, kdyz kliknete na upravit nebo pridat, ze se objevi dialog s formularem. Jenom abych to nemel propojeny s tabulkou a fungovalo to po kliknuti na odkaz s tridou ajax-dialog.

To cele mi funguje jenom nevím jestli to neresim spatne, nebo se to neda resit lip. S Nette zacinam a nechci se ucit blbosti.

já tyhle dialogy řeším přes snippet.
V tý šabloně, kde jsou data si vytvořím snippet s classem display:none a obsahem toho controlu (control musí zajistit i prazdný výstup, pokud se jedná o první zobrazení stránky, tedy nejdená se o editaci, ale zobrazení tabulky dat), no a při editaci ho ajaxem naplním a zobrazím.
No a pak nemusíš řešit nějaký termináty, stačí invalidovat snippet.
Je to jednoduchý a myslím, že elegantní řešení. :)

Editoval Rampa (19. 4. 2010 9:36)

Honza Kuchař
Člen | 1662
+
0
-

Na dialogová okna doporučuji používat jiný @layout. Poté můžeš používat normálně šablony a je to krásně přehledné. ;-) (buť extends přímo v šabloně nebo $presenter->setLayout())

zarubik
Člen | 31
+
0
-

despiq
nene to tady neřeším :)

Rampa
Jo to máš pravdu, přes snippet to je lepší řešení. Jen jsem se chtěl od začátku vyhnout zásahu do sablony pro vypis dat.. abych nemichal editaci, pridavani a vypis dat dohromady.
Hlavne jak jsi popisoval ten tvuj zpusob by asi nefungovalo to, ze nebudes moct volat dialogy z jinych stranek. Ve výpisu stránek, si treba nebudes moct vyvolat dialog z fotografii apod. Nebo to mas nejak vyresene?

Tak zatím to jsem to vyresil podobne. Jeste to budu vyladovat, ale treba nekoho napadne taky lepsi reseni.

do @layout.phtml jsem přidal snippet na dialogy

{snippet dialog}
	<h2 n:ifset="$dialog['name']">{$dialog['name']}</h2>
	{ifset $dialog['content']}
		{$dialog['content']}
	{/if}
{/snippet}

a pak v presenteru se obsah dialogu zapise takto

<?php
	function actionEdit(){
		$this->view = 'default';
		$this->template->dialog = Array();
		$this->template->dialog['nazev'] = 'Editace';
		$this->template->dialog['content'] = $this['editForm'];
		$this->invalidateControl('dialog');
	}
?>

Jeste asi presunu nadefinovani dialogu do basepresenteru s prazdnymi hodnotami a pak odstranim ifset.

A pak se mi nelibi „$this->view = ‚default‘;“, to tam mam abych nemusel mit Edit.phtml. To bylo taky hlavním tématem.

Editoval zarubik (19. 4. 2010 11:29)

redhead
Člen | 1313
+
0
-

Jinak co se týče toho widget/control makra. Tak to parametry přejímá (aspoň v mé verzi 0.9.3 ano)

{widget mojeKomponenta 'ahoj'}
//MojeKomponenta
public function render($s)
{
	//$s == 'ahoj'
}

Žádné func_get_args() není potřeba!

Rampa
Člen | 65
+
0
-

Rampa
Jo to máš pravdu, přes snippet to je lepší řešení. Jen jsem se chtěl od začátku vyhnout zásahu do sablony pro vypis dat.. abych nemichal editaci, pridavani a vypis dat dohromady.
Hlavne jak jsi popisoval ten tvuj zpusob by asi nefungovalo to, ze nebudes moct volat dialogy z jinych stranek. Ve výpisu stránek, si treba nebudes moct vyvolat dialog z fotografii apod. Nebo to mas nejak vyresene?

No, pokud dáš snippet do layoutu, což jsi udělal, tak ho pak můžeš invalidovat z jakýkoliv stánky, která daný layout používá a je už jen na presenteru, čím ho naplníš. Takže můžeš dostat univerzální snippet nazvaný třeba dialog a v něm pak zobrazovat formůláře na insert, update, confirm delete apod… To už se dá oštřit v daných presenterech.

Jednou jsem to dokonce řešil tak (nekamenujte mě, vím že to není košer :) ), že jsem měl snippet, který obsahoval widget „dialog“ a v handlerech v presenteru jsem měl továrničky, které vytvářely rozdílné kontroly, ale registrovaly je vždy pod jmenem „dialog“, takže se pak zobrazovaly rozdílné věci :)

zarubik
Člen | 31
+
0
-

No je to peklo to vymyslet nějak dobře, aby to bylo použitelný.
Teď to mám tak, že veškerej content co se načíta v layoutu, lze načíst do dialogu. Je to dobrý, že se nechá stránka načíst i bez něj. Ale uvídí se jestli to nakonec zase celý nepřekopu :D

Editoval zarubik (20. 4. 2010 22:26)