volání view komponenty uvnitř šablony komponenty

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

Zkouším napsat komponentu pro komentáře a trochu jsem se zamotal.
Mám komponentu comments, kde mám dvě view – klasický render, který vypíše seznam příspěvků a renderAddForm, který vykreslí formulář pro vložení nového příspěvku.

Pokud je chci volat seprátně, tak funguje:

{control comments}
{control comments:addForm}

Chtěl bych se ale zbavit druhého volání a dát ho dovnitř komponenty samotné.
Lze zavolat jiné view této komponenty přímo uvnitř defaultní šablony komponenty? Tedy komponentu vytvořím jako {control comments}, ale namísto {control comments:addForm} použiji v šabloně komponenty comments něco jako:

<h2>Komentáře</h2>
{* vypis komentaru *}
{foreach $list as $c}...{/foreach}

{* zavolani jinoho view teto komponenty *}
{control this:addForm}

Díky.

mkoubik
Člen | 728
+
0
-

Nebylo by lepší ten formulář řešit jako podkomponentu (createComponentAddForm() v komponentě)? Pak bys použil {control addForm}.

Filip111
Člen | 244
+
0
-

To mě napadlo – zkoušel jsem a to funguje a v případě komentářů je to nejspíš i rozumný řešení.

Přeci jen si ale říkám, co když nebudu chtít vypisovat nejen formulář, co když tam budu chtít mít víc prvků, nebo nějaký dynamický text z DB, nebo rovnou dva formuláře místo jednoho. Potom se mi hodí mít nový pohled.

Navíc jsem se v tom vrtal asi hodinu a zajímá mě jestli to opravdu jde nebo vymýšlím blbost.

mkoubik
Člen | 728
+
0
-

Tak jak jsi to myslel to nejspíš nepůjde, protože {control xy} hledá komponentu $this['xy'], která neexistuje. Místo formuláře můžeš použít jakoukoliv jnou komponentu s vlastní šablonou, ale to už nebude tak přehledný.

voda
Člen | 561
+
0
-

Mohlo by fungovat {control $control:addForm}. Nebo si přepiš metodu Nette\Application\UI\Control::getWidget() a přidej si tam zkratku na this.

Filip111
Člen | 244
+
0
-

@voda: Tohle opravdu funguje, díky.
Zvážím ale jestli to začnu používat, nepřijde mi to jako standardní řešení.

voda
Člen | 561
+
0
-

Můžeš to udělat podobně jako to je v Nette\Forms\Rendering\DefaultFormRenderer::render(). Pokud zavoláš render {widget comments} bez parametrů, tak se ti vykreslí komentáře a formulář nebo si budeš volat jen jednotlivé časti {widget comments comments} {widget comments form}….