O webu
Vlastní Latte filtr

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