diff --git a/CHANGELOG.md b/CHANGELOG.md index aa84bdd3cf72f38f106f7af33c6c605043722f00..b7e49348c1a9e9f8fee2ff19fe03c48ab8746084 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 0000000000000000000000000000000000000000..e9ba35d6be7be88ceab32edc73623702142aed81 --- /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; + } +}