在 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=]
我一直在尝试通过使用 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=]