Vlastní Latte filtr

Jak si vytvořit vlastní filtr (helper) do Latte šablon v Nette Frameworku.

4 minuty

Při používání šablonovacího systému Latte si jde práci usnadnit používáním filtrů (dříve se jim říkalo helpery). Jedná se o příkazy zapisující se za | (tento znak se na české klávesnici zapíše zkratkou Pravý Alt + W).

Spoustu filtrů je přímo zabudovaných:

Příklad elegantního formátování kalendářního data přímo v *.latte šabloně vypadá následovně:

{$article->last_modification|date:'j. n. Y'}

Jednoduchý vlastní filtr

Vlastní filtry se registrují v presenteru (typicky soubory NecoPresenter.php ve složce presenters). Pro použití v rámci celé aplikace (modulu) se je hodí zaregistrovat v BasePresenter.php v metodě beforeRender.

Filtr je potom obyčejná funkce, které se předají parametry, a ona vrátí požadovaným způsobem upravený výstup.

protected function beforeRender()
{
  $this->template->addFilter('tucne', function ($obsah) {
    return "<b>" . $obsah . "</b>";
  });
}

Použití v šabloně je následující:

{!$article->last_modification|date:'j. n. Y'|tucne}

Jak je vidět:

  1. Filtry je možné řetězit (použít více filtrů pro jednu proměnnou).
  2. Před proměnnou je vykřičník, aby se vypsaly HTML značky.

Více vlastních filtrů

Používat filtry výše uvedeným způsobem příliš nepomáhá přenositelnosti kódu. Lepší bude si pro filtry vytvořit vlastní třídu nebo dokonce více tříd.

Filters.php

<?php
class Filters
{
    public static function common($filter, $value)
    {
        if (method_exists(__CLASS__, $filter)) {
            $args = func_get_args();
            array_shift($args);
            return call_user_func_array(array(__CLASS__, $filter), $args);
        }
    }

    public static function tucne($obsah)
    {
        return "<b>" . $obsah . "</b>";
    }
}

BasePresenter.php

Přidá se metoda createTemplate:

protected function createTemplate($class = NULL)
{
    $template = parent::createTemplate($class);
    $template->addFilter(NULL, 'Filters::common');
    return $template;
}

Metoda common ve třídě Filters zajistí to, že půjde v šablonách všechny filtry ze třídy používat prostřednictvím názvu funkce.

Filtry z nějaké třídy jde přiřazovat i jednotlivě:

$template->addFilter("tucne", 'Filters::tucne');

Třída jako filtr

Byla-li by celá třída jeden filtr, mělo by jít použít __invoke:

class TucneFilter
{
    public function __invoke($obsah)
    {
        return "<b>" . $obsah . "</b>";
    }
}

A následně připojit filtr v BasePresenteru jako:

$template->addFilter('tucne', new TucneFilter);

Více informací:

Užitečné vlastní filtry

Hodně populární je filtr pro výpis data v podobě „před X minutami“:

Filtr se hodí i pro přidání formátování nástrojem Texy!, ale to ještě budu muset vymyslet, jak se dělá.

Starší způsob

Dříve se vlastní helpery registrovaly přes registerHelperLoader:

$template->registerHelperLoader('Helpers::loader');

Deprecated helperLoader

To už je deprecated a hlásí to chybu:

Nette\Bridges\ApplicationLatte\Template::registerHelperLoader() is deprecated, use dynamic getLatte()->addFilter()

Co si myslíte o tomto článku?

Diskuse

Související články

Generátor náhodných čísel online

Online generátor náhodných čísel z libovolného rozsahu. Náhodné číslo jedním kliknutím + kód pro JavaScript, PHP, Python a další jazyky.

14 minut

JSON – formát a online nástroje

Co je JSON a jak s ním pracovat. Online formátovač, validátor a diff.

13 minut

Převod písmen na VELKÁ a malá

Převedení textu na velká nebo malá písmena.

12 minut

Výpis náhodného textu

Jak na stránce náhodně vypsat obrázek, odkaz, reklamu, text nebo cokoliv jiného.

5 minut

Novinky e-mailem

Když budu mít něco opravdu zajímavého, můžu vám to poslat e-mailem

Přidej se k 500+ čtenářům
Jen kvalitní obsah
Žádný spam

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků · Témata · Zkratky
2013–2026