unprefix/template-loader

WordPress的一个简单的可挂钩模板加载器。允许您从子主题到插件以链式方式加载模板。

4.1.0 2018-12-01 19:27 UTC

This package is auto-updated.

Last update: 2024-08-29 04:31:20 UTC


README

Build Status codecov

WordPress 模板加载器

WordPress的一个简单的可挂钩模板加载器。允许您从子主题到插件以链式方式加载模板。

这不是用于“name-slug.php”形式带有回退到name.php的WordPress模板。实际上,这是一个用于构建基本数据注入(模板)的加载器。

要求

Php >= 5.6.x

示例

TemplateLoader\Loader 类使用 Fluent 接口,因此可以将调用连接起来,要求实例执行操作。

$loader = new TemplateLoader\Loader('template_slug', new TemplateLoader\DataStorage());

$loader->withData(new ModelInterface())
       ->usingTemplate('/relative/file/path.php')
       ->render()

该类使用WordPress函数 locate_template 在子主题和父主题中定位模板文件。

如果您在插件中使用库,可以定义一个回退模板部分文件路径。正如名称 fallback 所说的,该文件只有在之前的位置没有找到任何内容时才会加载。

$loader = new TemplateLoader\Loader('template_slug', new TemplateLoader\DataStorage());

$loader->withData(new ModelInterface())
       ->usingTemplate('/relative/file/path.php')
       ->butFallbackToTemplate('/plugin/relative/file/path.php')
       ->render();

由于WordPress函数 locate_template 允许传递一个字符串数组,我们可以通过将模板路径数组传递给 usingTemplate 方法来实现相同的功能。

数据类型

用于将值注入模板的数据类型是名为 TemplateLoader\ModelInterface 的类。ModelInterface 没有声明任何方法。它只是确保正确类型的数据被传递到模板加载器中。

通过这种方式,我们可以扩展该接口,根据特定的视图创建自己的契约。

钩子

render 方法执行一些过滤器,允许第三方代码在模板文件加载之前挂钩到数据和模板进行修改。

有两个过滤器:通用的 tmploader_template_engine_data,它传递 $data 值和 slug 属性。

add_filter('tmploader_template_engine_data', function(TemplateLoader\ModelInterface $data, string $slug) {

    switch($slug) {
        case 'my_slug':
            // Do something
        break;

        default:
        break;
    }

    return $data;

});

第二个过滤器类似,但过滤器名称包含模板的slug:"tmploader_template_engine_data_{$this->slug}"。在这种情况下,您可能不需要或不需要编写条件语句来知道正在处理的当前模板。

add_filter('tmploader_template_engine_data_my_template', function(TemplateLoader\ModelInterface $data) {
    return new DataTemplate(); // An new instance of a class implementing TemplateLoader\ModelInterface.
});

性能

由于通常需要在同一页面的不同部分调用相同的视图,因此在同一HTTP请求中,为了避免多次访问文件系统以了解模板文件的位置,我们定义了一个内部集合,可以用来存储模板文件路径。

第二次尝试请求同一模板时,我们不会执行任何额外的文件系统访问来加载模板文件。这提高了多次调用的速度。此外,由于我们没有在模板和数据注入之间创建严格的关系,我们可以每次传递不同的数据值。

因此,为了澄清,以示例来说明,在同一个调用中,我们可以实例化加载器一次,然后请求多次使用不同的数据值加载同一模板。

$loader = new TemplateLoader\Loader('template_slug', new TemplateLoader\DataStorage());

$loader->withData(new ModelInterface())
       ->usingTemplate('/relative/file/path.php')
       ->butFallbackToTemplate('/plugin/relative/file/path.php')
       ->render();

// Some code ... and then ...

$loader->withData(new ModelInterface())
       ->render();

第二次调用 render 方法时,我们只更改了模板中使用的数据,因为我们已经存储了与模板 slug 相关的模板路径。在这种情况下,是 template_slug

避免不必要的文件系统访问,我们知道这是缓慢的。