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