Jak přidat interaktivní menu do layout.latte?

Allconius
Člen | 313
+
0
-

Ahoj, mám v default.latte na každé stránce menu:

<?php
<div class="topnav" id="myTopnav">
    <a href="{link Homepage:}" title="Odkaz na úvodní stránku">Úvod</a>
    <a href="{link Profil:}" title="Odkaz na profil zadavatele">Profil zadavatele</a>
    <a href="{link Archiv: 1, 1}" title="Odkaz na archiv">Archiv</a>
    <a href="{link Informace: 1, 1}" title="Odkaz na zakázky malého rozsahu">Zakázky malého&nbsp;rozsahu</a>
    <a href="{link Zakazky:}" title="Odkaz na zakázky do 50 tis. Kč">Zakázky do&nbsp;50&nbsp;tis.&nbsp;Kč</a>
    <a href="{link Hledani:}" title="Odkaz na vyhledávání">Vyhledávání</a>
    <a href="{link Predpisy:}" class="active" title="Odkaz na předpisy">Předpisy</a>
    <a href="javascript:void(0);" class="icon" onclick="myFunction()" title="Odkaz na menu">
        <i class="fa fa-bars"></i>
    </a>
</div>
?>

je všude stejné jen s tím rozdílem, že pro danou stránku měním class=„active“ atribut. Nedá se dát menu do layout.latte s tím, že bych pak jen do šablony posílal nějaký parametr, pokud se tedy dá z presenteru poslat něco přímo do té hlavní šablony @layout.latte ? Nějak takto:

<?php
<div class="topnav" id="myTopnav">
    <a href="{link Homepage:}" class="{m1}" title="Odkaz na úvodní stránku">Úvod</a>
    <a href="{link Profil:}" class="{m2}" title="Odkaz na profil zadavatele">Profil zadavatele</a>
    <a href="{link Archiv: 1, 1}" class="{m3}" title="Odkaz na archiv">Archiv</a>
    <a href="{link Informace: 1, 1}" class="{m4}" title="Odkaz na zakázky malého rozsahu">Zakázky malého&nbsp;rozsahu</a>
    <a href="{link Zakazky:}" class="{m5}" title="Odkaz na zakázky do 50 tis. Kč">Zakázky do&nbsp;50&nbsp;tis.&nbsp;Kč</a>
    <a href="{link Hledani:}" class="{m6}" title="Odkaz na vyhledávání">Vyhledávání</a>
    <a href="{link Predpisy:}" class="{m7}" title="Odkaz na předpisy">Předpisy</a>
    <a href="javascript:void(0);" class="icon" onclick="myFunction()" title="Odkaz na menu">
        <i class="fa fa-bars"></i>
    </a>
</div>
?>

a jen si nastavovat ty hodnoty m1-m7 na active ?

stepos2
Člen | 51
+
+2
-
<a n:href="Homepage:" n:class="$presenter->isLinkCurrent('Homepage:') ? active">Úvod</a>
Allconius
Člen | 313
+
0
-

wow tak to super funguje :-) Díky moc

CZechBoY
Člen | 3608
+
0
-

Abych odpověděl doplňující otázku tak ano dá se poslat parametr do šablony (i @layout.latte nebo jakékoliv jiné):

class MujPresenter extends Presenter
{
	public function renderDefault(): void
	{
		$this->template->m2 = true;
	}
}

samozřejmě většinou se tohle (v beforeRender metodě!) dělá v BasePresenteru, který potom dědí všechny ty MujPresenter, TvujPresenter atd.

Editoval CZechBoY (23. 9. 2020 22:28)

Allconius
Člen | 313
+
0
-

CZechBoY napsal(a):

Abych odpověděl doplňující otázku tak ano dá se poslat parametr do šablony (i @layout.latte nebo jakékoliv jiné):

class MujPresenter extends Presenter
{
	public function renderDefault(): void
	{
		$this->template->m2 = true;
	}
}

samozřejmě většinou se tohle (v beforeRender metodě!) dělá v BasePresenteru, který potom dědí všechny ty MujPresenter, TvujPresenter atd.

Ahoj, a jak udělám aby se to poslalo do té šablony @layout.latte a ne do default.latte ? A ještě dotaz ohledně tisku, mám šablonu tisk.latte určenou pro tisk do PDF. Ale pokud přesunu to menu do @layout.latte tak se mi samozřejmě pak zobrazuje i v tom PDF, dá se nějak udělat aby ta šablona tisk.latte to @layout.latte ignorovala, nebo nastavit jiné @layout.latte jen pro ten tisk.latte ?

Allconius
Člen | 313
+
0
-

nebo to mám nějak nastavit přes CSS a v té tisk.latte jen nastavit skrytí menu ?

Roman Halaxa
Člen | 60
+
+1
-

Allconius napsal(a):

nebo to mám nějak nastavit přes CSS a v té tisk.latte jen nastavit skrytí menu ?

Dá se to udělat pomocí css.

Příklad:

.topbar, .left-sidebar, .footer, .breadcrumb{
display: none;
}

a potom říct že ten styl chceš použít na tisk

<link media=„print“ href=„{$basePath}/css/print.css“ rel=„stylesheet“ type=„text/css“/>

Roman Halaxa
Člen | 60
+
+2
-

Allconius napsal(a):

CZechBoY napsal(a):

Abych odpověděl doplňující otázku tak ano dá se poslat parametr do šablony (i @layout.latte nebo jakékoliv jiné):

class MujPresenter extends Presenter
{
	public function renderDefault(): void
	{
		$this->template->m2 = true;
	}
}

samozřejmě většinou se tohle (v beforeRender metodě!) dělá v BasePresenteru, který potom dědí všechny ty MujPresenter, TvujPresenter atd.

Ahoj, a jak udělám aby se to poslalo do té šablony @layout.latte a ne do default.latte ? A ještě dotaz ohledně tisku, mám šablonu tisk.latte určenou pro tisk do PDF. Ale pokud přesunu to menu do @layout.latte tak se mi samozřejmě pak zobrazuje i v tom PDF, dá se nějak udělat aby ta šablona tisk.latte to @layout.latte ignorovala, nebo nastavit jiné @layout.latte jen pro ten tisk.latte ?

Když si v base presenteru v beforeRender() předáš parametr příklad

public function beforeRender()
{
	$this->template->mujParametr = 1;
}

budeš ho mít i v layoutu

CZechBoY
Člen | 3608
+
0
-

Jde o to, že tu proměnnou nedáváš do jednoho souboru, ale do celýho šablonovacího procesu, tzn. kdyby includnul nějakou další šablonu tak tam tu proměnnou budeš mít taky.

Allconius
Člen | 313
+
0
-

Roman Halaxa napsal(a):

Allconius napsal(a):

nebo to mám nějak nastavit přes CSS a v té tisk.latte jen nastavit skrytí menu ?

Dá se to udělat pomocí css.

Příklad:

.topbar, .left-sidebar, .footer, .breadcrumb{
display: none;
}

a potom říct že ten styl chceš použít na tisk

<link media=„print“ href=„{$basePath}/css/print.css“ rel=„stylesheet“ type=„text/css“/>

Super díky, vyzkouším to :-)

MajklNajt
Člen | 470
+
+2
-

Ak v PDF vôbec nepotrebuješ layout.latte, tak stačí v šablóne tisk.latte použiť makro {layout none}

Allconius
Člen | 313
+
0
-

CZechBoY napsal(a):

Jde o to, že tu proměnnou nedáváš do jednoho souboru, ale do celýho šablonovacího procesu, tzn. kdyby includnul nějakou další šablonu tak tam tu proměnnou budeš mít taky.

Bezva, díky moc, hodně se mi tím ta apka zjednoduší :-)

Allconius
Člen | 313
+
0
-

MajklNajt napsal(a):

Ak v PDF vôbec nepotrebuješ layout.latte, tak stačí v šablóne tisk.latte použiť makro {layout none}

ok, to je taky dobrý, zkusím díky

Allconius
Člen | 313
+
0
-

Allconius napsal(a):

MajklNajt napsal(a):

Ak v PDF vôbec nepotrebuješ layout.latte, tak stačí v šablóne tisk.latte použiť makro {layout none}

ok, to je taky dobrý, zkusím díky

Funguje to super, hlavně jsi mi tím vyřešil problém s generováním PDF, já jsem tam totiž posílal celý ten layout.latte včetně všech JS a generovalo se mi to asi minutu a asi rok jsem nemohl pořád přijít na to proč a ti chudáci co to vyplňovali tak u toho usínali :-)) Bez té šablony to trvá asi 2 sec.

Šaman
Člen | 2632
+
+1
-

Šablony fungují tak, že se konkrétní šablona (třeba page.latte) vloží do šablony layoutu (defaultně @layout.latte).
Jaký layout se použije (a jestli vůbec) můžeš ovlivnit buď v šabloně tím makrem {layout xxx}, nebo v presenteru $this->setLayout().
To, že se použije @layout.latte je jen defaultně přednastavená hodnota v Nette.

Takže i pro tisk bys mohl používat layout (jiný, tiskový, který načítá css pro tisk a třeba nastavuje rozměry stránky apod.). A pak mít v šabloně {layout @print.latte}. Anebo layout vypnout úplně, to se taky používá často pro šablony emailů.

Mimochodem, vnoření může být i vícenásobné, takže i v šabloně layoutu můžeš mít další {layout @baseLayout.latte}. Já to použivám třeb pro přihlašovací obrazovku. Zakladní layout obsahuje metainformace o webu a vlastně většinu věcí v head. Ale pak jsou jiné layouty pro přihlašovací obrazovku a jiné pro běžnou stránku s menu apod. Takže konkrétní šablony si řeší content, layouty řeší rozložení společných prvků (menu) a baseLayout metainformace a načítání společných css a js.

Editoval Šaman (25. 9. 2020 11:44)