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>