Zobraziť na každej podstránke
- account23
- Člen | 36
neviem nejak mi to ani jedno nepríde ako to čo by som potreboval. Potrebujem aby som mal v @layout.latte {include menu} a do toho by šli dáta z nejakeho presenteru, alebo niečoho a zobrazovali by sa tam na každej podstránke.
v bežnom default.latte by som definoval iba {block content} poprípade
niečo takéto
{block right}
{include ‚menuPresenter‘}
{/block}
//edit akurát som natrafil na komponenty, asi to bude cez tie
Editoval account23 (7. 1. 2015 13:04)
- Etch
- Člen | 403
@layout.latte:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
{include 'menu.latte'}
{include #content}
</body>
</html>
menu.latte
{block content}
<ul>
<li n:foreach="$menuItems as $item">$item->text</li>
</ul>
{/block}
co ti na něčem podobném přesně nefunguje??
Editoval Etch (7. 1. 2015 13:33)
- Etch
- Člen | 403
Pokud je proměnná globální v dané šabloně kde voláš include, tak je
přístupná i uvnitř. Tedy například pokud budeš mít někde
v BasePresenteru
public function beforeRender(){
$this->template->menuItems = // nějaké data
}
tak bude proměnná $menuItems
přístupná i v šabloně
menu.latte
pokud potřebuješ předat data, které nejsou v dané šabloně globální, tak to můžeš udělat ručně
{include 'menu.latte', data => array(1,2,3)}
v tomto případě bude v šabloně menu.latte přístupná proměnná
$data
a bude obsahovat array(1,2,3)
a samozřejmě
budou přístupné i globální proměnné z „nadřazené“ šablony
- account23
- Člen | 36
ale stále to nieje to čo potrebujem :/
tie dáta čo majú ísť do menu.latte nemôžu ísť z rovnakého presenteru, ja to potrebujem ťahať z ineho presenteru, abo komponentu(kks to je jak hľadať ihlu v kope sena, neviem prísť na to ako volať kontroler v presentery/template)
poprípade takto nejak
public function beforeRender(){
$this->template->menuItems = render z komponenty / render z ineho presenteru
}
Editoval account23 (7. 1. 2015 14:29)
- Etch
- Člen | 403
Čeho vlastně chceš dosáhnout?
- Předávat vyrenderovaná data z komponenty je poněkud hloupé. To už by bylo jednodušší injectnout danou komponentu a zavolat jednoduše:
{control menu}
- Renderovat data pro menu z jiného presenteru je ještě více divné.
Osobně hlavně nechápu, proč by si do dané „šablony“ měl cpát už vyrenderovaná data pomocí nějaké proměnné. Až samotná šablona by dané data měla vyrenderovat. Presenter by si měl šáhnout na nějaký „model“ (Fasádu, Repository, …) a poslat data do šablony k vyrenderování.
Editoval Etch (7. 1. 2015 14:35)
- account23
- Člen | 36
práve som skúšal aj ten
{control menu}
ale vôbec to nefunguje
skúšam aj podľa tohto návodu https://www.youtube.com/watch?… ale tiež to na tej novéj verzii nefunguje, vyhadzuje mi to samé chyby že tú class z control vôbec nenajde
Chcem dosiahnuť to aby ,o šli dáta z databázy do templatu a tam sa vykreslili a aktuálny presenter by s tým nič nemal spoločné, proste by sa vždy ťahali z jedneho miesta..
- Etch
- Člen | 403
Takže znovu. :)
Pokud potřebuješ nějaká data ve všech presenterech, tak si vytvoř nějakého abstraktního předka od kterého budou presentery dědit. Minimálně v sandboxu je již vytvořen abstraktní BasePresenter, od kterého dědí všechny presentery.
BasePresenter:
namespace App\Presenters;
use Nette;
abstract class BasePresenter extends Nette\Application\UI\Presenter{
public function beforeRender(){
$this->template->menuItems = // vytažená data z DB
}
}
Pokud data přiřadíš v BasePresenteru budou dostupné ve všech šablonách všech presenterů, který dědí od BasePresenteru.
Komponenta je stejná písnička
namespace App\Presenters;
use Nette;
abstract class BasePresenter extends Nette\Application\UI\Presenter{
/** @var \MenuFactory @inject */
public $menuFactory;
public function createComponentMenu(){
return $this->menuFactory->create();
}
}
a pak již lze zavolat
{control menu}
Neuvádím zde kód interfacu MenuFactory
lze se o tom dočíst
například zde
A pokud jde o vyhazování chyb, tak by bylo možná dobré je sem napsat.
Ovšem pravděpodobně ti bude chybět něco v use
.