导入的 Twig 宏不显示任何内容,即不工作

问题描述 投票:0回答:2

我正在尝试实现某种宏自动加载。

这个想法是定义一堆宏并在所有接下来的模板文件中使用它们。

我正在尝试这样做:

<?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 %}

我可能做错了什么?

我是否误解了什么或错误地应用了它?

php macros twig
2个回答
0
投票

TL;博士:

Twig 要求您将宏加载到将使用它们的文件中。
只需创建自定义函数即可完成您想要的操作。


Twig(至少 v1.30)没有实现宏继承。
这要求您加载要在每个文件上使用的每个单个宏。

做到这一点的唯一方法是使用完全用 PHP 编写的函数。

这就是我已经解决的问题:

  • index.php:

    <?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/'
        ));
    
        // ~ magic happens here ~
        foreach(include(LAYOUT_DIR . 'fn.php') as $k => $fn)
        {
            $twig->addFunction(new Twig_SimpleFunction("fn_$k", $fn));
        }
    
        $twig->display('index.twig', array());
    
  • fn.php:

    <?php
        return array(
            'clearfix' => function($index, $columns){
                $html = '';
    
                if(!($index % $columns))
                {
                    $html .= '<div class="clearfix visible-md-block visible-lg-block"></div>';
                }
    
                if(!($index & 1))
                {
                    $html .= '<div class="clearfix visible-sm-block"></div>';
                }
    
                return $html;
            }
        );
    
  • index.twig:

    {{ fn_clearfix(index=2, columns=6) }}
    

这样,您的所有代码都会被整齐地索引,新函数会自动创建,并且很容易根据您的喜好进行扩展。

这可能是最糟糕的主意,但它确实有效。


0
投票

从 Twig 2.0 开始,文件中导入的宏在子模板中不再可用(例如通过包含调用)。您需要在使用宏的每个文件中显式导入宏。

来自 https://twig.symfony.com/doc/1.x/deprecated.html

© www.soinside.com 2019 - 2024. All rights reserved.