Twig中的呼叫辅助功能(木材)

时间:2017-05-14 19:42:29

标签: twig timber

我尝试在Twig(Timber)中调用静态帮助器方法。 {{ function('Theme\Helpers::get_template_name') }}

  

警告:call_user_func_array()期望参数1有效   回调,类'ThemeHelpers'未找到   /var/www/html/wp-content/plugins/timber-library/lib/Twig.php上线   268。

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

3 个答案:

答案 0 :(得分:1)

据我所知,您无法直接从twig模板调用PHP类。 您可以做的是设置一个与您的班级进行通信的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 }}

因为它是一个过滤函数,所以它需要一个值&#34;来过滤&#34;,所以至少传递一个空字符串。

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

答案 1 :(得分:0)

感谢您的回答。

我试过你的方法 - 它有效。但是使用过滤器会感觉有点hacky,特别是在没有值传递时。为什么不像过滤器一样创建木材功能? 将自己的功能从普通的PHP桥接到树枝并不是很好,但我也没有看到另一个解决方案。

在玩了一下之后,我想出了一个不同的方法。我现在通过自定义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 Timber\PostQuery( $args, 'OnepagePost' );
Timber::render('onepager.twig', $context);

在Twig模板内部我能够非常轻松地获取我的自定义属性(以我的方式模板):

{% for post in posts %}

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

{% endfor %}

答案 2 :(得分:0)

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

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