Presenter bez šablony a řešení komponent
- zarubik
- Člen | 31
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)
- Mikulas Dite
- Člen | 756
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
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
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
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 | 1661
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
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)
- Rampa
- Člen | 65
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
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)