unprefix / template-loader
WordPress的一个简单的可挂钩模板加载器。允许您从子主题到插件以链式方式加载模板。
Requires (Dev)
- brain/monkey: ^1.4
- pheromone/phpcs-security-audit: ^2.0
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: 3.*
This package is auto-updated.
Last update: 2024-08-29 04:31:20 UTC
README
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
。
避免不必要的文件系统访问,我们知道这是缓慢的。