如何使用Twig

时间:2017-08-16 22:37:54

标签: php twig

我在Ubuntu 17.04上运行apache和php 我正在使用树枝。我像这样安装了Twig。

cd /var/www/html/my-new-website
composer install twig/twig
composer require twig/twig

此时我使用Twig的方式是:首先我创建一个php文件并做一些事情,创建一个数组并使用数组数据渲染模板。接下来,我将页面的各个部分分开并将它们放在模板中。

这是一个示例index.php,它创建一个目录数组,然后使用位于模板目录中的files.html.twig呈现它。

<?php
require_once 'vendor/autoload.php';
$loader = new Twig_Loader_Filesystem('templates');
$twig = new Twig_Environment($loader, array(
    'cache' => 'cache',
));

$dir = "path/to/dir";
$exclude = array( ".","..",".*","index.php" );
$files = array_diff(scandir($dir), $exclude);

/*
echo ''; print_r($files);
*/

$template = $twig->loadTemplate('files.html.twig');
echo $template->render(['files' => $files]);
?>

这里是files.html.twig,它扩展了“base.html.twig”

{% extends "base.html.twig" %}

{% block title %}
My Directory Listing
{% endblock %}

{% block content %}
    {% for file in files %}
      <li><a href="{{ file | url_encode }}">{{ file }}</a></li>
    {% endfor %}
{% endblock %}

并且base.html.twig包含带有导航栏和页脚的主包装器。这一切都按预期工作。

现在我的base.html.twig中有导航栏,它只是html,我必须编辑项目。

我已经制作了一个php函数来获取在模板中工作的navbar数组(navbar.html.twig),但问题是我必须在我创建的每个页面中放置或包含此php函数。我希望我的navbar.html.twig模板直接从php功能中获取数组。

我相信我需要创建一个twig扩展(php函数)并注册它。我已经阅读过这方面的文档(所有这些似乎都是为了完整的symfony安装,我只使用twig)。

我认为这篇文章是在正确的道路上,但没有提供我需要了解的信息Call PHP function from Twig template

我没有得到

  1. 在哪里放我的php功能?我可以创建一个名为extensions的文件夹,并在其中放置一个navbar-list-funtion.php文件吗?
  2. 在哪里注册函数,以便可以从模板中调用它?一些文档说要在app / config / services.yml中注册(我没有这个文件或目录)
  3. 在我将php函数放在一个可识别的位置后,然后正确注册,...我将如何在模板navbar.html.twig中调用返回的数组?

1 个答案:

答案 0 :(得分:1)

来自评论

如果您没有使用像symfony这样的框架,那么根据您处理这种情况的方式有点不同。我,我自己,我在我的项目中使用命名空间来启用使用composer进行自动加载。我的树结构就在我的命名空间之后My/Project/Twig/Extensions

&#34; best&#34;扩展Twig的方法是使用Twig_Extension类 只需在您使用适当名称创建的文件夹中放置一个新文件

即可

注意:关闭Twig 2.X,函数getName()不再是强制执行者

我/项目/枝条/扩展/ ProjectTwigExtension.twig

namespace My/Project/Twig/Extensions

class ProjectTwigExtension extends Twig_Extension {

    public function getFunctions() {
        return array(
            new Twig_SimpleFunction('twig_function_name', array($this, 'getTwigFunctionName')),
            new Twig_SimpleFunction('twig_function_foo', array($this, 'getTwigFunctionFoo')),
            //and so on....,            
        );  
    }

    public function getFilters() {
        return array(
            new Twig_SimpleFilter('twig_filter_name' , array($this, 'getTwigFilterName')),
            new Twig_SimpleFilter('twig_filter_foo' , array($this, 'getTwigFilterFoo')),
            //and so on....,
        );
    }

    public function getName() {
        return 'ProjectTwigExtension'; //this is mandatory for twig < 2.0
    }        
}

通过使用扩展类,您可以轻松地对所有函数/ filters / nodes / globals / ...进行分组。创建此类之后,您只需在Twig内注册该类。由于我不知道您需要在项目中查看具体细节

$twig = new Twig_Environment($loader);

要注册课程,请使用以下行

$twig->addExtension(new ProjectTwigExtension());

正如您所能,扩展类具有函数getFunctions,您可以在这里定义所需的所有函数。

new Twig_SimpleFunction('twig_function_name', $callable)

第一个参数定义了如何在twig模板中调用函数,第二个参数是callable

  • new Twig_SimpleFunction('twig_function_name', array($this, 'method'))
    将调用当前扩展类
  • 中的函数method
  • new Twig_SimpleFunction('twig_function_name', 'trim')
    将调用全局函数trim
  • new Twig_SimpleFunction('twig_function_name', array($obj, 'method'))
    将调用实例method
  • 的函数$obj
  • new Twig_SimpleFunction('twig_function_name', array('MyClass', 'method'))
    将从method
  • 调用静态函数MyClass
  • new Twig_SimpleFunction('twig_function_name', function($arg1, $arg2) { // ...; })
    将执行关闭