1

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

警告:call_user_func_array() 期望参数 1 是一个有效的回调,在第 268 行的 /var/www/html/wp-content/plugins/timber-library/lib/Twig.php 中找不到类“ThemeHelpers”。

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

4

3 回答 3

1

据我所知,您不能直接从您的 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 类。

于 2017-05-22T14:07:01.573 回答
0

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

{{ function( [ 'Theme\Helpers', 'get_template_name' ] ) }}
于 2017-09-16T22:11:38.183 回答
0

感谢您的回答。

我试过你的方法 - 它有效。但是使用过滤器感觉有点笨拙,尤其是当没有传递任何值时。为什么不以与过滤器相同的方式创建木材功能?将自己的函数从普通的 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 Timber\PostQuery( $args, 'OnepagePost' );
Timber::render('onepager.twig', $context);

在 Twig 模板中,我可以很容易地获得我的自定义属性(以我的模板方式):

{% for post in posts %}

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

{% endfor %}
于 2017-05-27T21:35:11.550 回答