Zobraziť na každej podstránke

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

Zdravím,

prosím vás ako spravím aby som časť kódu mal v rámci každej podstránky ? napríklad navigačné menu atď, aby sa iba includovalo ? Nemôžem to nájsť. Ďakujem

Etch
Člen | 403
+
0
-

{extends} / {layout} / {include}

Podle toho co přesně potřebuješ.

account23
Člen | 36
+
0
-

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
+
0
-

@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)

account23
Člen | 36
+
0
-

ako dostanem do toho menu.latte tie dádata(items) ?

Editoval account23 (7. 1. 2015 13:42)

Etch
Člen | 403
+
0
-

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
+
0
-

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
+
0
-

Čeho vlastně chceš dosáhnout?

  1. 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}
  1. 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
+
0
-

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
+
0
-

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.