我在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
我没有得到
答案 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) { // ...; })