Moderní tvorba webových aplikací

O webu

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()

Související články

Výpis náhodného textu

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

5 minut

Instalace Apache, PHP a MySQL za 30 vteřin

Jak si ve Windows spustit vlastní Apache, PHP a MySQL na svém PC za půl minuty.

7 minut

MySQL přes PDO

PDO je PHP rozhraní pro pohodlnější práci s SQL databásí. Jaké přináší výhody a jak ho používat.

7 minut

Upload obrovských souborů v JS/PHP

Jak umožnit návštěvníkům nahrát soubory jako videa v řádech MB/GB s progress barem.

7 minut

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků
2013–2025