Latte – vložení bloku z komponenty do nadřazené šablony
- MikeLacroix
- Člen | 60
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
nijak snadno to nevyřešíš, šablona komponenty je od šablony presenteru oddělená
- Šaman
- Člen | 2667
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 | 1280
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
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)