2014-11-07 17 views
6

Chciałbym stworzyć własny filtr dla Latte templating engine. W ich dokumentacji znajduje się przykład, ale nie opisano sposobu rejestracji wewnątrz prezentera.Jak zarejestrować filtry (dawniej pomocnicy) w Latte?

<?php 
    $latte = new Latte\Engine; 
    $latte->addFilter('myFilter', function ($s) { 
     return someMagic($s) 
    }); 
?> 

Założę się, że będzie prosty sposób na uzyskanie instancji Latte \ Engine wewnątrz prezentera, ale nie jestem pewien jak.

Odpowiedz

6

Filtry mogą być rejestrowane przez config.neon też.

services: 
    nette.latteFactory: 
     setup: 
      - addFilter(abs, @App\Latte\AbsFilter) 

    - App\Latte\AbsFilter 

Klasa filtra może wyglądać następująco:

namespace App\Latte; 

class AbsFilter extends \Nette\Object 
{ 
    /** 
    * @param int $number 
    * @return int 
    */ 
    public function __invoke($number) 
    { 
     return abs($number); 
    } 
} 
+0

ładny! Dziękuję Ci. nie wiedziałem o tej opcji. oznaczony jako rozwiązanie – Northys

3

W prezenter istnieje instancja Latte\Engine dostępny w $this->template więc wszystko co musisz zrobić to zarejestrować filtr tak:

<?php 
    abstract class BasePresenter extends Nette\Application\UI\Presenter 
    { 
     public function beforeRender() 
     { 
      // register filters 
      $this->template->addFilter('myFilter', function ($s) { 
       // don't forget to set your own magic 
       return someMagic($s); 
      }); 
     } 

    } 
?> 

I postend przykład używając BasePresenter który jest przodkiem wszystkich innych prezenterów ale można zarejestruj go tylko w prezencie, który chcesz i przyspieszyć aplikację.

+0

Ale nie działa:/ –

+1

Dostałeś żadnego wyjątku czy coś? Daj mi znać, a ja ci pomogę. Też spróbuję sam tego wieczoru, może coś zmieniło się w Latte. – Northys

+0

Chciałem wyłączyć domyślne filtry automatyczne 'escape', które rozpowszechniały kod HTML jako kod, więc odkryłem, że istnieje filtr' noescape', więc teraz działa. dzięki –

1

Oprócz odpowiedzi @Nortys.

Czasami jest to przydatne do wstrzykiwania niektóre dane z rzutnika do funkcji anonimowej:

<?php 
abstract class BasePresenter extends Nette\Application\UI\Presenter 
{ 
    public function beforeRender() 
    { 
     $locale = 'en'; 

     // register filters 
     $this->template->addFilter('myFilter', function ($s) use ($locale) { 
      // don't forget to set your own magic 
      return someMagic($s, $locale); 
     }); 
    } 
} 
?> 
Powiązane problemy