在 Timber 中使用自定义函数

Using custom functions with Timber

我一直在尝试通过使用 Timber 入门主题中的示例并遵循 Timber docs 中的说明来使自定义函数正常工作,但我终究无法做到这一点正在工作。

我的functions.php是这样的:

class StarterSite extends TimberSite {

    ...

    function my_function() {
        return "Foo";
    }
    function add_to_twig( $twig ) {
        /* this is where you can add your own functions to twig */
        $twig->addExtension( new Twig_Extension_StringLoader() );
        $twig->addFilter('my_function', new Twig_SimpleFilter('my_function', array($this, 'my_function')));
        return $twig;
    }
}

然后是我的 Twig 文件:

{{ my_function }}

这个returns

Twig_Error_Syntax: Unknown "my_function" function

所以我试过我的 Twig 就像

{{ function (my_function)  }}

还有那个returns

Warning: call_user_func_array() expects parameter 1 to be a valid callback, no array or string given

我也试过像这样使用我的 functions.php 代码:

function add_to_twig( $twig ) {
    /* this is where you can add your own functions to twig */
    $twig->addExtension( new Twig_Extension_StringLoader() );
    $twig->addFunction( new Timber\Twig_Function( 'my_function', 'my_function' ) );
    return $twig;
}

还有那个returns

Error: Call to a member function addFunction() on null

显然我在某处遗漏了一个核心概念,但我不知道从哪里开始。 None 我围绕此进行的搜索似乎适用于我的情况。

谁能指出我正确的方向?

向 Twig 添加功能时,您必须使用 timber/twig 过滤器。如果您只在 class 中定义一个 add_to_twig 方法,则什么也不会发生。

所以你需要像下面这样的东西

class StarterSite extends Timber\Site {
    public function __construct() {
        parent::__construct();

        add_filter( 'timber/twig', array( $this, 'add_to_twig' ) );
    }

    …
}

在 Twig 中提供一个函数

现在让我们看看您的 add_to_twig 方法。当你想 add a function 时,你需要使用 addFunction 而不是 addFilter。所以在你的情况下,它可能应该是

$twig->addFunction( new Timber\Twig_Function(
    'my_function',
    array( $this, 'my_function' )
) );

当您使用 {{ my_function }} 时,Twig 可能会在上下文中查找值 my_function。我会像函数一样明确地调用它:{{ my_function() }}.

通过function()

调用函数

当想通过{{ function(my_function) }}直接调用函数时,需要将函数名作为字符串传递:

{{ function('my_function') }}

但是,因为您将 my_function 定义为 StarterSite class 的方法,您需要告诉 Twig 在哪里可以找到该函数:

{{ function(['StarterSite', 'my_function']) }}

但是!当您像那样从 Twig 调用 class 方法时,该方法需要是静态的。所以你必须在 class:

中这样定义 my_function
class StarterSite extends Timber\Site {
    …

    public static function my_function() {
        return "Foo";
    }

    …
}

timber/twig 在全局上下文中过滤

如果您将 add_to_twig(与 timber/twig 过滤器一起)添加到您的 functions.php,它也可以工作,但是您还需要调用 my_function 作为 StarterSite class 的方法。同样,您可以使用数组符号来做到这一点:

function add_to_twig( $twig ) {
    $twig->addFunction( new Timber\Twig_Function(
        array( 'StarterSite', 'my_function' ),
        array( $this, 'my_function' )
    ) );

    return $twig;
}

我希望这能解决问题。在 Twig 中有很多调用函数的可能性,最简单的总是在全局上下文中定义要调用的函数(例如直接在 functions.php 中)然后通过 function('my_function').[= 调用它37=]