2014-11-07 12 views
6

Tôi muốn tạo bộ lọc của riêng mình cho Latte templating engine. Có một ví dụ trong tài liệu của họ nhưng nó không mô tả cách đăng ký nó bên trong người trình bày.Làm thế nào để đăng ký bộ lọc (trước đây là người giúp việc) trong Latte?

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

Tôi đặt cược sẽ có cách đơn giản để lấy dụ của Latte \ Engine bên trong người trình bày nhưng tôi không chắc chắn như thế nào.

Trả lời

6

Bộ lọc có thể được đăng ký thông qua config.neon quá.

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

    - App\Latte\AbsFilter 

lớp lọc có thể trông như thế này:

namespace App\Latte; 

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

đẹp nhất! cảm ơn bạn. tôi không biết về tùy chọn này. đánh dấu là giải pháp – Northys

3

Trong người dẫn chương trình, có thể hiện của Latte\Engine sẵn trong $this->template để mọi thứ bạn phải làm là đăng ký lọc như thế này:

<?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); 
      }); 
     } 

    } 
?> 

tôi postend một ví dụ sử dụng BasePresenter đó là mẹ của tất cả các diễn giả khác nhưng bạn có thể đăng ký nó chỉ trong trình bày bạn muốn và tăng tốc độ ứng dụng của bạn.

+0

Nhưng đã không làm việc:/ –

+1

Bạn có nhận được bất kỳ ngoại lệ hoặc một cái gì đó? Hãy cho tôi biết và tôi sẽ giúp bạn. Ngoài ra tôi sẽ tự mình thử nó tối nay, có lẽ đã có sự thay đổi trong Latte. – Northys

+0

Tôi muốn vô hiệu hóa các bộ lọc tự động mặc định 'escape', nó đã phân phối mã html thành mã, vì vậy tôi thấy rằng có bộ lọc' noescape' để nó hoạt động ngay bây giờ. cảm ơn –

1

Ngoài câu trả lời @Nortys.

Đôi khi nó là hữu ích để tiêm một số dữ liệu từ Presenter vào chức năng ẩn danh:

<?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); 
     }); 
    } 
} 
?> 
Các vấn đề liên quan