2014-12-31 2 views
3

Используя пример из http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension: в моей основной Slim файл, который создает вид:Как добавить настраиваемый фильтр в мои шаблоны Twig внутри Slim?

$filter = new Twig_SimpleFilter('stripslashes', function ($string) { 
    return stripslashes($string); 
}); 

$loader = new \Twig_Loader_String(); 
$twig = new Twig_Environment($loader); 
$twig->addFilter($filter); 

$app->view($twig); 

$app->view()->setData(array(
    'nav' => $nav, 
    'sidenav' => $sidenav, 
)); 

Результаты в: Call to undefined method Twig_Environment::appendData().

Пробовал различными способами, например, как это:

$app->view(new \Slim\Views\Twig()); 
$app->view->parserExtensions = array(
    new \Slim\Views\TwigExtension(), 
); 

$app->view->addFilter($filter); 

, но я просто не понимая, как это должно работать.

ответ

4

Ах. Просто нужны были эти два подкладки:

$twig = $app->view->getInstance(); 
$twig->addFilter($filter); 
+1

Wow. Ты просто спас мне жизнь. – Moss

8

Для Slim 3 все изменилось. Это может быть сделано в одной строке:

$view->getEnvironment()->addFilter($filter); 

Но это не особенно полезно без контекста, поэтому здесь полный образец, на основе примера, приведенного на Слим Framework Сайт: http://www.slimframework.com/docs/features/templates.html

Этот код иллюстрирует добавление фильтра для кодирования текста с rot13

<?php 
// Create app 
$app = new \Slim\App(); 

// Get container 
$container = $app->getContainer(); 

// Register component on container 
$container['view'] = function ($container) { 
    $view = new \Slim\Views\Twig('path/to/templates', [ 
     'cache' => 'path/to/cache' 
    ]); 
    $view->addExtension(new \Slim\Views\TwigExtension(
     $container['router'], 
     $container['request']->getUri() 
    )); 

    $filter = new Twig_SimpleFilter('rot13', function ($string) { 
     return str_rot13($string); 
    }); 

    $view->getEnvironment()->addFilter($filter); 

    return $view; 
}; 

// Render Twig template in route 
$app->get('/rot13/{text}', function ($request, $response, $args) { 
    return $this->view->render($response, 'rot13.html', [ 
     'name' => $args['text'] 
    ]); 
})->setName('rot13'); 

// Run app 
$app->run(); 

И HTML-файл rot13.html содержит:

{{text|rot13}} 

Укажите ваш браузер на имя_сервера/rot13/ананас, и вы должны увидеть

cvarnccyr 
Смежные вопросы