Latte – vložení bloku z komponenty do nadřazené šablony

MikeLacroix
Člen | 60
+
+2
-

Ahojte, mám komponentu na vykreslení detailu článku. V této komponentě bych chtěl vytvořit obsah blocku, který se vkládá v layoutu. Srozumitelněji přes úryvky kódu:

// @layout.latte
<html>
	<head>
		...
		{block openGraph}{/block}
		...
	</head>
	<body>
		...
		{control articleDetail-$article->id}
		...
	</body>
</html>

// šablona komponenty articleDetail:
{block openGraph}
  <meta property="og:url" content="{link //this}" />
  <meta property="og:type" content="article" />
  <meta property="og:title" content="{$article->name}" />
  <meta property="og:description" content="{$article->perex}" />
  <meta property="og:image" content="{$baseUrl}{$article->picture->fullSize}"  n:if="$article->picture" />
{/block}

<h1>{$article->name}</h1>
...

Ovšem do hlavičky stránky se žádný open graph kód nevloží… jak to vyřešit?

David Matějka
Moderator | 6445
+
+1
-

nijak snadno to nevyřešíš, šablona komponenty je od šablony presenteru oddělená

Šaman
Člen | 2635
+
0
-

Problém bude nejspíš v tom, že šablona komponenty nedědí layout, takže mezi těmi šablonami není žádná přímá vazba.
Myslím, že místo {block openGraph}{/block} budeš muset zavolat onu komponentu a nad ní nějakou metodu renderOpenGraph(). Šlo to i jako pohled komponenty {control articleDetail:openGraph}, ale tam byly problémy při ajaxu, takže už to nepoužívám a nevím tedy, jestli to stále funguje a jak.

Marek Bartoš
Nette Blogger | 1171
+
+1
-

Ty meta značky jsou specifické pro akci presenteru, ne pro komponentu (mohl bys mít víc komponent na jedné stránce, pro které og atributy mají smysl), takže takto to ani řešit nechceš.

Je tedy ideální nastavit og atributy v presenteru. Buď si do layoutu poslat data pro dané značky nebo mít nějakou abstrakci a data přidávat v presenteru přes ni

Editoval Mabar (5. 9. 2019 15:11)

janturon
Člen | 5
+
-1
-

Nette toto propojení nemá implementováno, systémově to ve verzi 2.9 řešit nelze. Obejít to lze předáním informací presenteru, ve kterém je komponenta volána, který pak nahradí blok.

V komponentě

    private function createMetaTag($property, $content)
    {
        return "<meta property=\"$property\" content=\"$content\"/>";
    }

    public function setHeadData()
    {
        return
            $this->createMetaTag("og:url", "url").
            $this->createMetaTag("og:type", "type").
            $this->createMetaTag("og:title", "title").
            $this->createMetaTag("og:description", "description").
            $this->createMetaTag("og:image", "image");
    }

V presenteru

    public function renderDefault()
    {
        $article = $this->articleFactory->create();
        $this->template->head = $article->setHeadData();
        // případně jiné nastavení head obsahu v závislosti na stavu presenteru
        // pokud je stav znám v době tvorby komponenty, může být vhodné
        // přesunout volání setHeadData() do tovární metody
    }

V šabloně presenteru

{block openGraph}
    {include parent}
    {($head??'')|noescape}
{/block}

Šablona pak doplní uvedená data do openGraph bloku v @layout.latte

Editoval janturon (30. 9. 2021 13:59)