Šablony a data ve views
Každá šablona tématu dostává bohatou, předem poskládanou sadu proměnných — obsah, nastavení webu, navigaci, média a SEO data. Tento článek je referencí těchto dat a pravidel, kterých by se šablony měly držet.
Jak se šablona vybírá
Pro obsah typu page na webu se šablonou mytheme Laravix vykreslí themes.mytheme::page.show.
Tento namespace se hledá nejdřív ve vaší šabloně a teprve pak ve výchozí, takže pohled „existuje", pokud ho poskytne kterákoli z nich. Teprve když ho nemá ani jedna — třeba u neznámého typu obsahu — spadne Laravix na themes.mytheme::default, který se hledá stejným způsobem. Stejná konvence platí pro každý typ obsahu včetně pluginových.
Prakticky: chcete-li změnit vzhled příspěvků, přidejte do své šablony post/show.blade.php. Chcete-li je nechat být, nepřidávejte nic. Viz Struktura šablony.
Dostupné proměnné
Skládá je Laravix\Cms\Services\PageDataBuilder a CMS controller:
| Proměnná | Typ | Obsah |
|---|---|---|
$content |
Content |
Vykreslovaný obsah s načtenými fields a taxonomies |
$site |
Site |
Aktuální web |
$seo |
array |
title, description, og_image_url, noindex, canonical — fallbacky obsah → nastavení už aplikované |
$settings |
Collection |
Všechna nastavení webu jako klíč ⇒ hodnota |
$navigations |
array |
Položky menu hlavičky/patičky, už lokalizované pro aktuální jazyk |
$navDesign |
array |
Hodnoty designu ze záložek Design u navigace |
$logoMedia, $faviconMedia |
?Media |
Logo a favicon z nastavení, vyřešené na modely |
$mediaMap |
Collection |
Mapa id ⇒ Media všech médií, na která se stránka odkazuje |
$navPages |
Collection |
Publikované stránky/archivy aktuálního jazyka (id, title, slug, is_homepage) — pro stavbu jednoduchých menu |
$archivePosts |
?Collection |
Jen u obsahu typu archive: publikované příspěvky od nejnovějšího |
$grapesjsHtml |
?string |
HTML z vizuálního builderu, už hydratované (naplněné výpisy příspěvků, aplikované pluginové hydratory) |
$defaultLocale, $currentLocale |
string |
Kódy jazyků |
$alternates |
Collection |
locale ⇒ absolutní URL publikovaných překladů (pro hreflang) |
$systemFieldKeys |
array |
Klíče polí registrovaných v kódu — hodí se k oddělení od ad-hoc polí |
$appearance |
Collection |
Přepisy vzhledu pro danou stránku. Aktuálně vždy prázdné — výchozí layout z něj čte barvu pozadí, barvu textu a vlastní CSS třídu, takže šablona, která ho používá, musí snést prázdné hodnoty |
$bgMedia |
?Media |
Obrázek na pozadí stránky. Aktuálně vždy null, výchozí layout ho čte spolu s $appearance |
Práce s médii
Modely médií nabízejí $media->url (originál) a $media->variantUrl(ImageVariant::LARGE) pro zmenšené varianty (THUMBNAIL, MEDIUM, LARGE, OG, FAVICON, FULL — viz Laravix\Cms\Enums\ImageVariant). Vždy vykreslete nejmenší variantu, která na dané místo stačí.
Práce s fieldy
@php $fields = $content->fields->pluck('value', 'key'); @endphp
{{ $fields->get('excerpt') }}
Assety šablony
Ze souboru udělají URL dva helpery, oba na Laravix\Cms\Laravix:
{{-- Stylesheet dodávaný s jádrem, z public/vendor/laravix/ --}}
<link rel="stylesheet" href="{{ \Laravix\Cms\Laravix::asset('app.css') }}">
{{-- Soubor, který si vaše šablona sestavila do themes/{theme}/dist/ --}}
@if ($themeStylesheet = \Laravix\Cms\Laravix::themeAsset('app.css', $site->theme))
<link rel="stylesheet" href="{{ $themeStylesheet }}">
@endif
themeAsset() bere název souboru a klíč šablony a vrací null, když soubor v dist/ dané šablony není — vždy ho tedy ošetřete jako výše, místo abyste ho vypisovali rovnou do atributu. Vrácená URL končí značkou ?v= odvozenou z času poslední změny souboru, což zneplatní cache prohlížeče při každém přebuildování.
Oba helpery ukazují na skutečné soubory pod public/, což u šablon znamená symlink public/themes/{theme} vytvořený příkazem php artisan laravix:theme:link. Když se stylesheet šablony tiše nenačítá, zkontrolujte nejdřív tenhle odkaz.
Vykreslení obsahu z builderu
Obsah navržený ve vizuálním builderu přichází jako $grapesjsHtml. Obsah postavený z klasických bloků přichází jako pole $content->blocks. Jádro dodává partial, který zvládá obojí, včetně JavaScriptu pro slidery, záložky, odpočty a bloky s vlastním kódem:
@include('laravix::cms.builder-content')
page/show.blade.php výchozí šablony dělá přesně tohle, když builder obsah existuje, a jinak spadne na prosté rozložení s titulkem a poli. Pokud bloky vykreslujete sami, každá položka $content->blocks je ['type' => ..., 'data' => [...]] a mapuje se na view šablony blocks/{type}.blade.php, které dostane data bloku plus $mediaMap.
URL a jazyky
Odkazy na jiný obsah stavějte přes $content->path($defaultLocale) — vyřeší úvodní stránku, route prefixy i jazykové prefixy. V layoutu vypisujte alternates:
@foreach ($alternates as $altLocale => $altUrl)
<link rel="alternate" hreflang="{{ $altLocale }}" href="{{ $altUrl }}">
@endforeach
SEO kontrakt
Layouty by měly ctít pole $seo: $seo['title'] do <title>, vypsat popis a canonical odkaz, při $seo['noindex'] vydat robots meta noindex,nofollow a $seo['og_image_url'] použít pro Open Graph. layouts/app.blade.php výchozí šablony je kompletní referenční implementace včetně Open Graphu, Twitter karet a JSON-LD.
Související články
- Struktura tématu
- Příkazy CLI —
laravix:theme:link - Vlastní bloky
- Obsahový model