Twig 调用细枝(木材)内的辅助函数

Twig 调用细枝(木材)内的辅助函数,twig,timber,Twig,Timber,我尝试在细枝(木材)内部调用一个静态助手方法。 {{function('Theme\Helpers::get_template_name')} 警告:call\u user\u func\u array()要求参数1是有效的 在中找不到回调类“ThemeHelpers” /var/www/html/wp content/plugins/timber library/lib/Twig.php在线 268 有人知道如何在Twig中调用不同类的方法吗?据我所知,您不能直接从Twig模板调用PHP类。

我尝试在细枝(木材)内部调用一个静态助手方法。
{{function('Theme\Helpers::get_template_name')}

警告:call\u user\u func\u array()要求参数1是有效的 在中找不到回调类“ThemeHelpers” /var/www/html/wp content/plugins/timber library/lib/Twig.php在线 268


有人知道如何在Twig中调用不同类的方法吗?

据我所知,您不能直接从Twig模板调用PHP类。 你可以做的是设置一个与你的类通信的细枝过滤器 并返回所需的值

在负责加载细枝模板的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');
{% for post in posts %}

    {% include ["section/section-#{post.template}.twig"] %}

{% endfor %}
因为它是一个过滤器函数,所以需要一个值“to filter”,所以至少要传递一个空字符串

如果我是在这种情况下,我可能会确定模板的名称在您的 控制器,并直接将值发送到您的细枝模板,而不是调用php类
通过过滤功能。

谢谢您的回答

我试过你的方法-它有效。但是使用过滤器感觉有点不舒服,尤其是当没有传递值时。为什么不以与过滤器相同的方式创建木材函数? 将自己的函数从普通php桥接到twig并不好,但我也没有看到其他解决方案

在玩了一会儿之后,我想出了一个不同的方法。现在,我通过自定义木材对象并向post变量添加一个模板属性来修复我的需要

看起来像这样:

{{ ''|twg_get_template_name }}
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'] );

    }

}
$context['posts'] = new Timber\PostQuery( $args, 'OnepagePost' );
Timber::render('onepager.twig', $context);
然后在调用Twig视图的.php文件中,我调用了自定义对象,如下所示:

{{ ''|twg_get_template_name }}
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'] );

    }

}
$context['posts'] = new Timber\PostQuery( $args, 'OnepagePost' );
Timber::render('onepager.twig', $context);
在Twig模板中,我能够非常轻松地获得我的自定义属性(以我的方式,模板):


可以使用数组表示法从Timber中的细枝文件调用静态函数,其中第一项是类的名称,第二项是要调用的静态方法的名称:

{{ function( [ 'Theme\Helpers', 'get_template_name' ] ) }}