Filtry v šablonách
|app
Vytváří URL odkaz na aplikaci.
{{ 'contact'|app }} <!-- /contact -->
{{ 'products/detail'|app }} <!-- /products/detail -->
S parametry
{{ 'product'|app({'id': 123}) }} <!-- /product?id=123 -->
{{ 'search'|app({'q': 'laptop'}) }} <!-- /search?q=laptop -->
|page
Vytváří URL odkaz na CMS stránku.
{{ 'about'|page }} <!-- /about -->
{{ 'blog/post'|page }} <!-- /blog/post -->
S parametry stránky
{{ 'blog-post'|page({'slug': 'my-article'}) }} <!-- /blog/my-article -->
{{ 'product'|page({'id': 456}) }} <!-- /product/456 -->
|theme
Vytváří URL odkaz na asset v aktuální šabloně.
{{ 'assets/css/style.css'|theme }} <!-- /themes/mytheme/assets/css/style.css -->
{{ 'assets/js/app.js'|theme }} <!-- /themes/mytheme/assets/js/app.js -->
{{ 'assets/images/logo.png'|theme }} <!-- /themes/mytheme/assets/images/logo.png -->
V HTML
<link rel="stylesheet" href="{{ 'assets/css/style.css'|theme }}">
<script src="{{ 'assets/js/app.js'|theme }}"></script>
<img src="{{ 'assets/images/logo.png'|theme }}" alt="Logo">
|media
Vytváří URL odkaz na soubor v media library.
{{ 'uploads/image.jpg'|media }} <!-- /storage/app/media/uploads/image.jpg -->
{{ 'documents/manual.pdf'|media }} <!-- /storage/app/media/documents/manual.pdf -->
Podmíněné zobrazení
{% if product.image %}
<img src="{{ product.image|media }}" alt="{{ product.name }}">
{% endif %}
|resize
Změní velikost obrázku a vytvoří URL na upravenou verzi.
{{ 'uploads/photo.jpg'|media|resize(300, 200) }} <!-- Přesná velikost -->
{{ 'uploads/photo.jpg'|media|resize(300) }} <!-- Šířka 300px, proporcionální výška -->
S možnostmi
{{ image|media|resize(800, 600, {mode: 'crop'}) }} <!-- Oříznutí -->
{{ image|media|resize(400, 300, {mode: 'stretch'}) }} <!-- Roztažení -->
{{ image|media|resize(500, 400, {quality: 90}) }} <!-- Kvalita 90% -->
Responzivní obrázky
<picture>
<source media="(min-width: 1200px)" srcset="{{ image|media|resize(1200, 800) }}">
<source media="(min-width: 768px)" srcset="{{ image|media|resize(800, 600) }}">
<img src="{{ image|media|resize(400, 300) }}" alt="{{ alt }}">
</picture>
|default
Poskytuje výchozí hodnotu, pokud je proměnná prázdná.
{{ user.name|default('Anonymní uživatel') }}
{{ product.description|default('Popis není dostupný') }}
{{ settings.title|default('Výchozí název') }}
S HTML
<h1>{{ page.title|default('Bez názvu') }}</h1>
<p>{{ page.description|default('Popis stránky nebyl zadán.') }}</p>
|raw
Zobrazuje obsah bez HTML escapování.
{{ content|raw }} <!-- HTML obsah bude vykreslen -->
{{ '<strong>Text</strong>'|raw }} <!-- Zobrazí tučný text -->
Používejte |raw pouze pro obsah, kterému důvěřujete. Může způsobit XSS útoky.
Bezpečné použití
{{ article.content|raw }} <!-- Obsah z editoru -->
{{ settings.footer_html|raw }} <!-- HTML z administrace -->
|md
Zpracovává Markdown text a převádí ho na HTML.
{{ '**Tučný text**'|md }} <!-- <strong>Tučný text</strong> -->
{{ '*Kurzíva*'|md }} <!-- <em>Kurzíva</em> -->
Komplexní Markdown
{% set markdownText %}
# Nadpis
Tohle je **tučný text** a tohle *kurzíva*.
- První položka
- Druhá položka
[Odkaz](http://example.com)
{% endset %}
{{ markdownText|md }}
|_
Lokalizační filtr pro překlad textů.
{{ 'Vítejte'|_ }} <!-- Přeložený text podle aktuálního jazyka -->
{{ 'Přihlásit se'|_ }} <!-- Login/Se connecter/etc. -->
S parametry
{{ 'Zbývá :amount'|_({'amount': price}) }}
{{ 'Vytvořeno :date'|_({'date': created_at}) }}
V podmínkách
<button>
{% if user.isLoggedIn %}
{{ 'Odhlásit se'|_ }}
{% else %}
{{ 'Přihlásit se'|_ }}
{% endif %}
</button>
Standardní Twig filtry
October CMS podporuje také všechny standardní Twig filtry.
|upper, |lower, |title
{{ 'hello world'|upper }} <!-- HELLO WORLD -->
{{ 'HELLO WORLD'|lower }} <!-- hello world -->
{{ 'hello world'|title }} <!-- Hello World -->
|length
{{ products|length }} <!-- Počet produktů -->
{{ user.name|length }} <!-- Délka jména -->
|slice
{{ products|slice(0, 5) }} <!-- Prvních 5 produktů -->
{{ text|slice(0, 100) }} <!-- Prvních 100 znaků -->
|join
{{ tags|join(', ') }} <!-- tag1, tag2, tag3 -->
{{ categories|join(' | ') }} <!-- cat1 | cat2 | cat3 -->
|date
{{ 'now'|date('d.m.Y') }} <!-- 15.03.2024 -->
{{ created_at|date('H:i') }} <!-- 14:30 -->
{{ event.date|date('j. n. Y') }} <!-- 15. 3. 2024 -->
|number_format
{{ 1234.567|number_format(2, ',', ' ') }} <!-- 1 234,57 -->
{{ price|number_format(0, ',', ' ') }} <!-- 1 500 -->
Kombinování filtrů
Filtry lze řetězit pro složitější transformace.
{{ product.name|upper|slice(0, 20)|default('Bez názvu') }}
{{ image|media|resize(400, 300)|default('assets/images/placeholder.jpg'|theme) }}
{{ content|striptags|slice(0, 150)|raw ~ '...' }}
Praktické příklady
Responzivní galerie
<div class="gallery">
{% for image in gallery %}
<div class="gallery-item">
<picture>
<source media="(min-width: 768px)"
srcset="{{ image.path|media|resize(800, 600) }}">
<img src="{{ image.path|media|resize(400, 300) }}"
alt="{{ image.alt|default('Obrázek ' ~ loop.index) }}">
</picture>
</div>
{% endfor %}
</div>
Lokalizovaná navigace
<nav class="main-navigation">
<a href="{{ 'home'|page }}">{{ 'Domů'|_ }}</a>
<a href="{{ 'about'|page }}">{{ 'O nás'|_ }}</a>
<a href="{{ 'products'|page }}">{{ 'Produkty'|_ }}</a>
<a href="{{ 'contact'|page }}">{{ 'Kontakt'|_ }}</a>
</nav>
Článek s náhledem
<article class="blog-post">
<header>
<h1>{{ post.title|default('Bez názvu') }}</h1>
<time datetime="{{ post.created_at|date('c') }}">
{{ post.created_at|date('j. n. Y v H:i') }}
</time>
</header>
{% if post.featured_image %}
<img src="{{ post.featured_image|media|resize(800, 400) }}"
alt="{{ post.title }}">
{% endif %}
<div class="content">
{% if showFullContent %}
{{ post.content|md }}
{% else %}
{{ post.excerpt|default(post.content|striptags|slice(0, 200) ~ '...')|md }}
<a href="{{ post.slug|page }}">{{ 'Číst více'|_ }}</a>
{% endif %}
</div>
</article>
Produktová karta
<div class="product-card">
<div class="product-image">
{% if product.image %}
<img src="{{ product.image|media|resize(300, 200) }}"
alt="{{ product.name }}">
{% else %}
<img src="{{ 'assets/images/no-product.jpg'|theme }}"
alt="{{ 'Bez obrázku'|_ }}">
{% endif %}
</div>
<div class="product-info">
<h3>{{ product.name|slice(0, 50) }}</h3>
<p class="price">{{ product.price|number_format(0, ',', ' ') }} {{ 'Kč'|_ }}</p>
{% if product.description %}
<p class="description">
{{ product.description|striptags|slice(0, 100) }}...
</p>
{% endif %}
<a href="{{ 'product'|page({'slug': product.slug}) }}" class="btn btn-primary">
{{ 'Zobrazit detail'|_ }}
</a>
</div>
</div>
Obsah
- Filtry v šablonách
- |app
- S parametry
- |page
- S parametry stránky
- |theme
- V HTML
- |media
- Podmíněné zobrazení
- |resize
- S možnostmi
- Responzivní obrázky
- |default
- S HTML
- |raw
- Bezpečné použití
- |md
- Komplexní Markdown
- S parametry
- V podmínkách
- Standardní Twig filtry
- |upper, |lower, |title
- |length
- |slice
- |join
- |date
- |number_format
- Kombinování filtrů
- Praktické příklady
- Responzivní galerie
- Lokalizovaná navigace
- Článek s náhledem
- Produktová karta