您如何使用Timber处理复杂的ACF灵活内容字段的上下文?

时间:2018-12-13 18:30:53

标签: php wordpress twig timber

例如,我可能有一个灵活的内容字段,可让您选择从帖子类型自动提取内容还是手动定义内容。

说一个滑块,它会询问您是否要以帖子类型显示帖子的标题和缩略图,还是手动为每个带有中继器的幻灯片定义标题和图像。

幻灯片的上下文根据所选选项而变化。一方面,您必须获取帖子并显示所需的信息,另一方面,您只需使用手动定义的内容即可。


这是到目前为止我的文件(基本上)的样子:

index.php

$context = Timber::get_context();
$context['post'] = ( is_front_page() ) ? new Timber\Post( get_option( 'page_on_front' ) ) : new Timber\Post();

Timber::render( 'page.twig', $context );

page.twig

{% extends 'base.twig' %}

{% block content %}

    {% for bloc in post.meta('blocs') %}

        {% include 'blocs/' ~ bloc.acf_fc_layout ~ '.twig' ignore missing %}

    {% endfor %}

{% endblock %}

因此,每个灵活布局的树枝文件都会自动包含在内,我可以很好地访问这些字段。但是,在我的滑块示例中,幻灯片的上下文根据所选选项而变化,并且我试图将尽可能多的逻辑保留在树枝文件中。


在树枝模板中获取帖子并设置变量似乎很杂乱,这与首先使用树枝的目标背道而驰。有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

解决此任务的常用方法是使用扩展Timber\Post的自定义类。您可以在Extending Timber Guide中了解有关此内容的更多信息。

在您的情况下,该类可能看起来像这样:

class PostFlexible extends Timber\Post {
    public function dynamic_context( $args ) {
        return $something;
    }
}

然后,您将使用新类,而不是在PHP模板中使用Timber\Post()

$context = Timber::get_context();
$context['post'] = ( is_front_page() )
    ? new PostFlexible( get_option( 'page_on_front' ) )
    : new PostFlexible();

Timber::render( 'page.twig', $context );

在Twig模板中,您可以调用执行某些操作的方法:

{{ post.dynamic_context }}

问题是,您到底想做什么?您可以在该方法内部渲染或编译另一个Twig模板。您可以在PHP的新方法中获取该模板所需的数据,然后将其传递给Twig模板。这是一种方法。

另一种方法是使用此方法遍历灵活字段并扩展Twig模板中所需的数据:

{% for bloc in post.blocks %}
    {% include 'blocs/' ~ bloc.acf_fc_layout ~ '.twig' ignore missing %}
{% endfor %}

现在,您可以像这样定义post.blocks

class PostFlexible extends Timber\Post {
    public function blocks() {
        $blocks = array();

        foreach ( $this->meta( 'bloc' ) as $block ) {
            switch ( $block['acf_fc_layout'] ) {
                case 'slider':
                    // Fetch the data you need for each slider.
                    $block['my_slider_data'] = 'something';
                    break;
            }

            $blocks[ $block ];
        }

        return $blocks;
    }
}

该方法将获取元数据,在灵活的字段中循环并根据布局名称(acf_fc_layout)添加所需的数据。这样,您仍然可以在PHP中定义大多数逻辑,而在Twig中,您只会显示数据。