From c4d9b51b5e1fc0a5aad614ea83c5969db6382c4c Mon Sep 17 00:00:00 2001 From: Bart Jaskulski <bjaskulski@protonmail.com> Date: Wed, 12 Jun 2024 07:50:31 +0200 Subject: [PATCH] feat: add WooTemplateResolver Signed-off-by: Bart Jaskulski <bjaskulski@protonmail.com> --- CHANGELOG.md | 7 +++++- src/Resolver/WooTemplateResolver.php | 35 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/Resolver/WooTemplateResolver.php diff --git a/CHANGELOG.md b/CHANGELOG.md index aa84bdd..b7e4934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ +## Unreleased +### Added +- Introduced `WooTemplateResolver` for template paths and overrides in WooCommerce spirit. + ## [2.0.0] - 2021-10-01 ### Added - Add output_render method to Renderer interface + ## [1.1.0] - 2019-09-23 ### Added -- PluginViewBuilder to facilitate building and rendering views for plugins \ No newline at end of file +- PluginViewBuilder to facilitate building and rendering views for plugins diff --git a/src/Resolver/WooTemplateResolver.php b/src/Resolver/WooTemplateResolver.php new file mode 100644 index 0000000..e9ba35d --- /dev/null +++ b/src/Resolver/WooTemplateResolver.php @@ -0,0 +1,35 @@ +<?php + +declare(strict_types=1); + +namespace WPDesk\View\Resolver; + +use WPDesk\View\Renderer\Renderer; +use WPDesk\View\Resolver\Exception\CanNotResolve; + +/** + * Locate templates, respecting WooCommerce template load order, prepending custom path to seek for templates. This supports user's template overrides by default. + */ +class WooTemplateResolver implements Resolver { + + /** @var string */ + private $base_path; + + public function __construct( string $base_path ) { + if ( ! function_exists( 'wc_locate_template' ) ) { + throw new \RuntimeException( sprintf( 'The "%s" resolver needs the WooCommerce plugin. Make sure it is installed and active.', __CLASS__ ) ); + } + + $this->base_path = $base_path; + } + + public function resolve( $name, Renderer $renderer = null ): string { + $template = wc_locate_template( $name, '', $this->base_path ); + + if ( $template === '' ) { + throw new CanNotResolve( "Cannot resolve template {$name}" ); + } + + return $template; + } +} -- GitLab