我尝试在Twig(Timber(中调用静态辅助方法。 {{ function('ThemeHelpers::get_template_name') }}
警告:call_user_func_array(( 期望参数 1 有效 回调,类"主题助手"未在 中找到 /var/www/html/wp-content/plugins/timber-library/lib/Twig.php on online 268.
有谁知道如何在 Twig 中调用不同类的方法?
据我所知,你不能直接从你的树枝模板调用PHP类。你可以做的是设置一个与你的班级通信的Twig过滤器并返回所需的值。
您将在负责加载 twig 模板的 php 控制器文件中拥有以下内容:
<?php
function twg_get_template_name() {
# edit this according to the implementation of your class:
return Helpers::get_template_name();
}
function add_to_twig($twig) {
/* this is where you can add your own fuctions to twig */
$twig->addExtension(new Twig_Extension_StringLoader());
$twig->addFilter('twg_get_template_name', new Twig_Filter_Function('twg_get_template_name'));
return $twig;
}
add_filter('get_twig', 'add_to_twig');
在您的 Twig 模板中,您可以像这样调用过滤器:
{{ ''|twg_get_template_name }}
因为它是一个过滤器函数,所以它需要一个值"过滤",所以至少传递一个空字符串。
如果我处于那种情况下,我可能会在您的模板中确定模板的名称控制器并将值直接发送到您的 Twig 模板,而不是调用 php 类通过过滤功能。
您可以使用数组表示法从 Timber 中的 Twig 文件中调用静态函数,其中第一项是类的名称,第二项是要调用的静态方法的名称:
{{ function( [ 'ThemeHelpers', 'get_template_name' ] ) }}
感谢您的回答。
我尝试了您的方法 - 它有效。但是使用过滤器感觉有点笨拙,尤其是在没有传递任何值时。为什么不以与过滤器相同的方式创建木材函数?将自己的函数从普通 php 桥接到 twig 并不是很好,但我也没有看到其他解决方案。
玩了一会儿后,我想出了一个不同的方法。现在,我通过自定义 Timber 对象并向 post 变量添加模板属性来解决我的需求。
看起来像这样:
class OnepagePost extends TimberPost {
var $_template;
// Add template property to Twig Object
public function template() {
return Helpers::get_template_name( $this->custom['_wp_page_template'] );
}
}
然后在调用 Twig View 的.php文件中,我像这样调用自定义对象:
$context['posts'] = new TimberPostQuery( $args, 'OnepagePost' );
Timber::render('onepager.twig', $context);
在 Twig 模板中,我能够非常轻松地获得我的自定义属性(以我的方式模板(:
{% for post in posts %}
{% include ["section/section-#{post.template}.twig"] %}
{% endfor %}