Zobrazení bloku přes více presenterů

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

Čaute,
chtěl jsem se zeptat, jakým způsobem by se dalo udělat vykreslení odkazu na přihlášení, aby bylo viditelné ve vybraných šablonách různých presenterů.
Snad jsem se vyjádřil dost jasně. Mohl bych to udělat tak, že to napíšu přímo do té šablony, ale když mám to samé na dvou místech, snažím se to udělat nějak elegantněji.
Díky za rady ;)

mm-marek
Člen | 61
+
0
-

do šablony dáš jenom třeba {widget loginform}

v presenteru pak vytvoříš formulář

protected function createComponentLoginform($name)
    {
        $form = new AppForm;
	....
        return $form;
    }
baki
Člen | 21
+
0
-

Jasně, ale ten widget (používám control) lze udělat jen pod tím daným presenterem, ne?

a dále řeším jakým elegantním způsobem zapsat do nějaké metody něco aby byl výsledek takovýto:

<a href="{link homepage:add}">Přidat článek</a> | <a href="{link sign:out}">Odhlásit se</a>

Editoval baki (29. 11. 2010 13:50)

Aurielle
Člen | 1281
+
0
-

Pokud dáš továrničku do BasePresenteru, můžeš ji použít v kterémkoliv presenteru, který od BasePresenteru dědí.

Ty odkazy strč přímo do šablony :)

baki
Člen | 21
+
0
-

Jasně, to mě s basepresenterem nenapadlo o:-) Ale mě se právě jedná o to, aby to (ty linky) ta metoda vykreslila :). Je to blbost, ale chci to na tom pochopit :).

mkoubik
Člen | 728
+
0
-
  • pokud chceš použít control ve více presenterech, dej tovvárničku (createComponentXyz) do společného předka těch presenterů (případně do BasePresenteru).
  • to by šlo vyřešit opět komponentou ve společném předkovi s vlastní šablonou (zbytečně složité), nebo předat šabloně objekt Nette\Html, ale musel bys to celé obalit např <p> (inline prvky stejně musí být uvnitř nějakého blokového).
$add = Html::el('a')->href($this->link('Homepage:add'))->setText('Přidat článek');
$signout = Html::el('a')->href($this->link('Sign:out'))->setText('Odhlásit se');
$html = Html::el('p');
$html->add($add);
$html->add(Html::el('span')->setText(' | '));
$html->add($signout);

A $html pak předat BasePresenter::beforeRender() do šablony, ale nevim, jestli to není overkill.

Editoval mkoubik (29. 11. 2010 14:21)

baki
Člen | 21
+
0
-

Něco takového jsem si myslel, ale doufal jsem, že to html půjde zapsat jednodušejším způsobem.
A nestačilo by prostě dát pak echo $html?

Tharos
Člen | 1030
+
0
-

No a proč nenapsat v požadovaných šablonách jednoduše {include '../@login.latte'}?

Editoval Tharos (29. 11. 2010 15:08)

baki
Člen | 21
+
0
-

protože to myslím nejde? … ono to bude hledat ten login v daných presenterech, ne?

Tharos
Člen | 1030
+
0
-

Nee, nebude. Tohle je prostě řešení čistě na úrovni šablon. Jedná-li se pouze o sdílení útržku HTML kódu, tak je IMHO zbytečné řešit to na úrovni Presenteru, na to přece stačí samotné šablony.

V templates/@login.latte můžeš mít například:

<p><a href="{plink ...}">Přihlásit se</a></p>

V šabloně umístěné v templates/Default/default.latte můžeš pak snadno zapsat:

{include '../@login.latte`}

To samé platí analogicky pro jakoukoliv šablonu view. Dej vědět – je to řešením Tvého problému, anebo jsem špatně pochopil zadání?

EDIT: V tom vkládaném kusu šablony můžeš snadno použít i makro plink s destination včetně modulu, takže se ten odkaz korektně vygeneruje prakticky odevšud, kam to vložíš.

Editoval Tharos (29. 11. 2010 15:21)

baki
Člen | 21
+
0
-

Super, díky. Tohle jsem hledal :)
Jen jsem tu šablonu měl uloženou v nějakém presenteru a zkoušel se k ní dostat pomocí {include "../homepage/login.latte"}, ale to nešlo.
Díky moc ještě jednou ;)

Editoval baki (30. 11. 2010 9:12)