例如,我可能有一个灵活的内容字段,可让您选择从帖子类型自动提取内容还是手动定义内容。
说一个滑块,它会询问您是否要以帖子类型显示帖子的标题和缩略图,还是手动为每个带有中继器的幻灯片定义标题和图像。
幻灯片的上下文根据所选选项而变化。一方面,您必须获取帖子并显示所需的信息,另一方面,您只需使用手动定义的内容即可。
这是到目前为止我的文件(基本上)的样子:
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 %}
因此,每个灵活布局的树枝文件都会自动包含在内,我可以很好地访问这些字段。但是,在我的滑块示例中,幻灯片的上下文根据所选选项而变化,并且我试图将尽可能多的逻辑保留在树枝文件中。
在树枝模板中获取帖子并设置变量似乎很杂乱,这与首先使用树枝的目标背道而驰。有更好的方法来解决这个问题吗?
答案 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中,您只会显示数据。