我试图实现某种宏自动加载。
这个想法是定义一堆宏并在所有下一个模板文件上使用它们。
以下是我尝试做的事情:
<?php
define('ROOT_FRONT', '/path/to/files/');
define('LAYOUT_DIR', ROOT_FRONT . 'layout/');
include(ROOT_FRONT . 'lib/Twig/Autoloader.php');
Twig_Autoloader::register();
$twig_loader = new Twig_Loader_Filesystem(array(LAYOUT_DIR, ROOT_FRONT));
$twig = new Twig_Environment($twig_loader, array(
'charset' => 'ISO-8859-15',
'debug' => !!preg_match('@\.int$@', $_SERVER['SERVER_NAME']),
'cache' => $_SERVER['DOCUMENT_ROOT'] . '/cache/twig/'
));
$macro_code = '';
foreach(array_filter(
array_diff(
scandir(LAYOUT_DIR . 'macros/'),
array('..','.')
),
function($file)
{
return strtolower(pathinfo($file, PATHINFO_EXTENSION)) == 'twig'
&& is_file(LAYOUT_DIR . 'macros/' . $file);
}
) as $file)
{
$info = pathinfo($file);
$macro_code .= '{% import \'macros/' . $info['basename'] . '\' as macros_' . $info['filename'] . ' %}';
}
$twig
->createTemplate($macro_code)
->render(array());
$twig->display('index.twig', array());
如果我有一个文件,比如macro/clearfix.twig
,它会在$macro_code
内生成此模板代码:
{% import 'macros/clearfix' as macros_clearfix %}
macro/clearfix.twig
内的代码是这样的:
{% macro clearfix(index, columns) %}
{% if index is divisible by(columns) %}
<div class="clearfix visible-md-block visible-lg-block"></div>
{% endif %}
{% if index is even %}
<div class="clearfix visible-sm-block"></div>
{% endif %}
{% endmacro %}
然后,在index.twig
内,我有这个:
{{ macros_clearfix.clearfix(index=2, columns=6) }}
但没有显示任何内容。
但是,以下代码有效:
{% set index = 2 %}
{% set columns = 6 %}
{% if index is divisible by(columns) %}
<div class="clearfix visible-md-block visible-lg-block"></div>
{% endif %}
{% if index is even %}
<div class="clearfix visible-sm-block"></div>
{% endif %}
我可能做错了什么?
我是误解了某些内容还是错误地应用了这个内容?
答案 0 :(得分:0)
<强> TL; DR:强>
Twig 需要您将文件加载到将要使用它们的文件中 只需创建自定义函数即可完成所需。
Twig(至少v1.30)没有实现宏继承 这需要您在每个文件上加载要使用的每个单个宏。
唯一的方法是使用PHP编写的函数。
这是我已经解决的问题:
的index.php:
pi@raspberrypi:~/azure-sdk-for-python
fn.php:
onSaveInstanceState(Bundle outState)
index.twig:
PersistableBundle outPersistentState
这样,您的所有代码都被整齐地编入索引,自动创建新函数,并且很容易根据自己的喜好进行扩展。
这可能是最糟糕的想法,但它确实起到了作用。
答案 1 :(得分:0)
宏
从Twig 2.0开始,导入到文件中的宏在子模板中不再可用(例如,通过include调用)。您需要在使用宏的每个文件中显式导入宏。