Návrh aplikace – Presenter, jak na to?

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

Ahoj,
snažím se udělat svojí první aplikaci v nette. Quickstart jsem pročetl a začal si upravovat příklad s todolistem. Měl bych tady dva začátečnické dotazy

1)
TodoListPresenter je zde k obsluze todo. Ale co kdybych chtěl zároveň zobrazovat todo a zároven položky menu (které bych tahal z datábáze)? Jak jsem pochopil MVP, k načtení menu z databáze potřebuju nový Presenter. Ale pak je hloupust aby byly aktivní dvě akce ruzných Presenterů zároveň, ne? Nebo by se o menu měl starat stejný presenter? Jak na to? :)

2)
Když jsem chtěl přidat něco jako „změnit úkol“, udělalal jsem si signál, který redirectem odkazoval na akci Change (odesílal parametr id)

<?php
<a href="{link change!, $todo->id}">změnit</a>
?>
<?php
public function handleChange($id)
{
    $this->redirect('TodoList:change',array('p_id' => $id)); //produkt id
}
?>

Toto rešení mi přišlo jako fuj – a tak jsem se chtěl zeptat, jesli jde nějak předat parametr id (aby bylo jasné jaký todo chci změnit) rovnou na akci Change?
V akci Change uz normálně přes widget zobrazuju formulář na změnu údajů.

Nejsem zběhlej v terminologii, takže kdybych kecal blbosti, budu rád za objasnění:)
Díky moc!

redhead
Člen | 1313
+
0
-
  1. na to jsou přesně stvořené komponenty (jeden presenter může mít více komponent a ty zobrazovat ve svých šablonách (akcích) a může je používat napříč akcemi a stejnou komponentu může zase používat více presenterů, atd.)
  2. v čem je tady problém?
{link TodoList:change $todo->id}

Editoval redhead (29. 7. 2010 21:34)

Ani
Člen | 226
+
0
-
  1. O položky databáze by se měl starat presenter a vzhledem k faktu, že menu je společné pro více presenterů, bude nejlepší, když to bude nějaký z kterého ostatní dědí (v tom QS se jmenuje BasePrasenter). e: případně ta varianta jak píše redhead, ale to je o něco složitější.
  2. Tak neodkazuj na signal, ale rovnou na ten pohled.

Editoval Ani (29. 7. 2010 21:37)

Bublafus
Člen | 9
+
0
-

redhead napsal(a):

  1. na to jsou přesně stvořené komponenty (jeden presenter může mít více komponent a ty zobrazovat ve svých šablonách (akcích) a může je používat napříč akcemi a stejnou komponentu může zase používat více presenterů, atd.)

Teď moc nevím, co myslíš těma komponentama? Nějakej nápad, kde bych to mohl okoukat? :)

  1. v čem je tady problém?
{link TodoList:change $todo->id}

Aha, ale musím mít založenou metodu renderChange($p_id), at už třeba prázdnou.
(Teď bych ten formulář mohl vykreslovat v těle tý metody renderChange??)
Jinak, proč tam nejde použít $id? Me ten parametr pak nejde přečíst

redhead
Člen | 1313
+
0
-
  1. dokumentace?
  2. metodu mít nemusíš, hlavně tam musí být šablona change.phtml. Formulář vykresluj až v tý šabloně (přes makro widget – stejně jako formulář pro vkládání. Btw formulář je taky komponenta – tvořená v metodě createComponent*() )
Bublafus
Člen | 9
+
0
-

redhead napsal(a):

  1. dokumentace?
  2. metodu mít nemusíš, hlavně tam musí být šablona change.phtml. Formulář vykresluj až v tý šabloně (přes makro widget – stejně jako formulář pro vkládání. Btw formulář je taky komponenta – tvořená v metodě createComponent*() )
  1. Jo, už to trochu začínám chápat. Jsem našel i ve složce distribuce Nette/examples/modules-usage, tam je to docela přehledné.
  2. Odkaz v šabloně mám jak si psal, šablonu change.phtml mám (i ve správné složce), (vykresluju přes ten widget). Ale pokud tam nemám metodu renderChange($p_id) tak ten odkaz zčervená a odkazuje to na error:%20Extra%20parameter%20for%20'Produkt:change'. Čím to?
redhead
Člen | 1313
+
0
-

A jó, sorry. Pokud máš nějaký parametr tak tu metodu musíš mít definovanou (kdyby by render neměla žádný parametr, mohla by se vypustit).

Bublafus
Člen | 9
+
0
-

Aha.
Supr, díky oběma! :)