Komponenta – nastavení obsahu v Latte a z jeho bloku

Kcko
Člen | 465
+
0
-

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

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

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

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.

Kcko
Člen | 465
+
0
-

Nebo můžeme řešit i jinou cestou. Rating je multiplier, na kterém místě nadefinovat titulek / titulky pro podstránku, kde je použito x kontrolek Ratingu.

Napadá mě nějaký config nebo neon (a kontrolka si hrábne do Neonu pro parametry), ale to je takové fousaté.

Martk
Člen | 652
+
0
-

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

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.