Komponenta – nastavení obsahu v Latte a z jeho bloku
- Kcko
- Člen | 468
Ahoj,
jen se v rychlosti zeptám, jestli někoho nenapadne jak to řešit.
Je sablona.latte
V ní se nastaví titulek k webu
{block title}
Podstránka | Jupiter
{/block}
Součástí šablony je nějaké komponenta, a já do ní potřebuju ten
titulek dostat.
Zatím to řeším nějak takto, což jednak není pěkné a navíc při
ajaxovém překreslení si ten titulek v rámci komponenty přeposílám jako
persistentní parametr, aby se mi neztratil v oné komponentě.
{block content}
{$presenter['rating']['1']->setTitle('Podstránka | 1 Jupiter')}
{$presenter['rating']['2']->setTitle('Podstránka | 2 Jupiter')}
{* Někde více dole *}
{* Hodnoceni *}
{control rating-1}
{control rating-2}
{/block}
Rating.php (nechávám jen podstatné věci)
class Rating extends Nette\Application\UI\Control
{
/**
* @var string
* @persistent
*
*/
public $title;
public function setTitle($title)
{
$this->title = $title;
}
public function handleRate($score, $title = null)
{
if ($score >= 1 && $score <= 5 && $this->rating->canVote($this->page)) {
$this->rating->saveRating([
'score' => $score,
'page' => $this->page
]);
$this->title = $title;
}
$this->redrawControl();
}
}
Moje otázka zní, dá se to nějak lépe řešit? Nemůžu nastavit titulek komponentě v presenteru (protože si klient upravuje šablony a do presenteru, nechci aby zasahoval).
Lze vidět blok šablony z komponenty v daném presenteru nebo lze to prostě řešit lépe?
Díky.
Editoval Kcko (22. 6. 2021 16:22)
- Martk
- Člen | 661
Asi bych šel cestou embed (i když to, že si klient upravuje šablony není moc dobré), předpokládám, že ten titulek slouží jako hlavička nějakého boxu
{embed box.latte}
{block title}Podstránka | 1 Jupiter{/block}
{block content}{control rating-1}{/block}
{/embed}
nebo předání argumentu do render metody
{control rating-1 'Podstránka | 1 Jupiter'}
Editoval Martk (22. 6. 2021 22:20)
- Kamil Valenta
- Člen | 815
Martk napsal(a):
{control rating-1 'Podstránka | 1 Jupiter'}
U komponent je ale velké „riziko“, že budou překresleny – a pak by o ten titulek přišel.
- Kcko
- Člen | 468
Ahoj,
strčením titulku do render metody, je to samé jako můj setter, také o něj při AJAX-ovém překreslení přijdu (proto to řeším tak jak jsem popsal výše), to mi moc nepomůže.
S embed tagem nemám zkušenosti, ale na každé stránce / podstránce jsou různé kontrolky (1 – N) a jsou umístěny na různých místech v obsahu, takže se mi zdá, že to taky nepůjde, navíc je to starší Nette 2.4 a embed se přidával tuším do novějšího Latte.
- Martk
- Člen | 661
A potřebuješ překreslovat i ten titulek? Jak jsem pochopil, tak se při ajaxu nemění, tak stačí udělat jen toto:
{control rating-1 'Podstránka | 1 Jupiter'}
public function render(?string $title = null) {
$template = $this->getTemplate();
$template->title = $title;
$template->render();
}
{$title}
{snippet}
<a n:href="plus!" class="ajax">Plus</a>
<a n:href="plus!" class="ajax">Minus</a>
{/snippet}
Při nějhorším překreslíš dva snippety
{snippet beforeTitle}{/snippet}
{$title}
{snippet afterTitle}{/snippet}
Sice bude při ajaxu $title null, ale klientovi se neodešle, ale to tě vlastně nezajímá.
- Kcko
- Člen | 468
Jako nepotřebuji. Ono součástí této kontrolky je výstup pro microdata (LD-JSON) a to robot uvidí a nehlasuje, takže mi to je fuk, spíš mě zajímal nějaký mnohem lepší systém než mám já ve stavu, kdy si klient potřebuje editovat titulky přímo v šabloně a rozmísťovat hodnocení po šabloně sám a k ničemu lepšímu jsem nedošel ;-)
Každopádně díky za utrzení, že to o moc líp nejde a ještě na to
případně juknu (na tento způsob).
Ten můj způsob funguje i po AJAX překreslení, jen tam musím ten titulek
dodat v persistentním parametru.