Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何处理复杂ACF灵活内容字段的上下文?_Php_Wordpress_Twig_Timber - Fatal编程技术网

Php 如何处理复杂ACF灵活内容字段的上下文?

Php 如何处理复杂ACF灵活内容字段的上下文?,php,wordpress,twig,timber,Php,Wordpress,Twig,Timber,例如,我可能有一个灵活的内容字段,让您可以选择从帖子类型中自动提取内容或手动定义内容 假设一个滑块,它会询问您是否要在帖子类型中显示帖子的标题和缩略图,或者使用转发器手动为每张幻灯片定义标题和图像 幻灯片的上下文将根据所选选项进行更改。一方面,您必须获取帖子并显示想要的信息,另一方面,您只需使用手动定义的内容 到目前为止,我的文件(基本上)是这样的: index.php $context = Timber::get_context(); $context['post'] = ( is_fron

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

假设一个滑块,它会询问您是否要在帖子类型中显示帖子的标题和缩略图,或者使用转发器手动为每张幻灯片定义标题和图像

幻灯片的上下文将根据所选选项进行更改。一方面,您必须获取帖子并显示想要的信息,另一方面,您只需使用手动定义的内容


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

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 %}
因此,每个灵活布局的细枝文件都会自动包含在内,我可以很好地访问这些字段。然而,在我的滑块示例中,幻灯片的上下文会根据所选的选项而变化,并且我正试图尽可能多地保留小树枝文件的逻辑



在twig模板中获取帖子和设置变量看起来很混乱,这与最初使用twig的目标背道而驰。有更好的方法来处理此问题吗?

解决此任务的一种常见方法是使用扩展
Timber\Post
的自定义类。有关这方面的更多信息,请参阅

在您的情况下,该类可以如下所示:

class PostFlexible extends Timber\Post {
    public function dynamic_context( $args ) {
        return $something;
    }
}
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;
    }
}
然后,不要在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 );
在您的细枝模板中,您可以调用执行以下操作的方法:

{{ post.dynamic_context }}
问题是,你到底想做什么?您可以在该方法中呈现或编译另一个细枝模板。您可以在PHP的新方法中获取该模板所需的数据,然后将这些数据传递给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 dynamic_context( $args ) {
        return $something;
    }
}
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\u fc\u layout
)。这样,您仍然可以在PHP中定义大部分逻辑,而在Twig中,您将只显示数据。

解决此任务的常见方法是使用扩展
Timber\Post
的自定义类。有关这方面的更多信息,请参阅

在您的情况下,该类可以如下所示:

class PostFlexible extends Timber\Post {
    public function dynamic_context( $args ) {
        return $something;
    }
}
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;
    }
}
然后,不要在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 );
在您的细枝模板中,您可以调用执行以下操作的方法:

{{ post.dynamic_context }}
问题是,你到底想做什么?您可以在该方法中呈现或编译另一个细枝模板。您可以在PHP的新方法中获取该模板所需的数据,然后将这些数据传递给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 dynamic_context( $args ) {
        return $something;
    }
}
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\u fc\u layout
)。这样,您仍然可以在PHP中定义大部分逻辑,而在Twig中,您将只显示数据