first commit

This commit is contained in:
2024-07-15 11:28:08 +02:00
commit f52d538ea5
21891 changed files with 6161164 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
{
"name": "wpdesk\/wp-view",
"authors": [
{
"name": "Krzysiek",
"email": "krzysiek@wpdesk.pl"
}
],
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit\/phpunit": "<7",
"wp-coding-standards\/wpcs": "^0.14.1",
"squizlabs\/php_codesniffer": "^3.0.2",
"mockery\/mockery": "*",
"10up\/wp_mock": "*",
"wimg\/php-compatibility": "^8"
},
"autoload": {
"psr-4": {
"FSVendor\\WPDesk\\View\\": "src\/"
}
},
"autoload-dev": {},
"scripts": {
"phpcs": "phpcs",
"phpunit-unit": "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never",
"phpunit-unit-fast": "phpunit --configuration phpunit-unit.xml --no-coverage",
"phpunit-integration": "phpunit --configuration phpunit-integration.xml --coverage-text --colors=never",
"phpunit-integration-fast": "phpunit --configuration phpunit-integration.xml --no-coverage"
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace FSVendor\WPDesk\View;
use FSVendor\WPDesk\View\Renderer\SimplePhpRenderer;
use FSVendor\WPDesk\View\Resolver\ChainResolver;
use FSVendor\WPDesk\View\Resolver\DirResolver;
use FSVendor\WPDesk\View\Resolver\WPThemeResolver;
/**
* Facilitates building of the default plugin renderer.
*
* @package WPDesk\View
*/
class PluginViewBuilder
{
/** @var string */
private $plugin_dir;
/** @var string[] */
private $template_dirs;
/**
* @param string $plugin_dir Plugin directory path(absolute path)
* @param string|string[] $template_dir Directory or list of directories with templates to render
*/
public function __construct($plugin_dir, $template_dir = 'templates')
{
$this->plugin_dir = $plugin_dir;
if (!\is_array($template_dir)) {
$this->template_dirs = [$template_dir];
} else {
$this->template_dirs = $template_dir;
}
}
/**
* Creates simple renderer that search for the templates in plugin dir and in theme/child dir.
*
* For example if your plugin dir is /plugin, template dir is /templates, theme is /theme, and a child theme is /child
* the templates will be loaded from(order is important):
* - /child/plugin/*.php
* - /theme/plugin/*.php
* - /plugin/templates/*.php
*
* @return SimplePhpRenderer
*/
public function createSimpleRenderer()
{
$resolver = new \FSVendor\WPDesk\View\Resolver\ChainResolver();
$resolver->appendResolver(new \FSVendor\WPDesk\View\Resolver\WPThemeResolver(\basename($this->plugin_dir)));
foreach ($this->template_dirs as $dir) {
$dir = \trailingslashit($this->plugin_dir) . \trailingslashit($dir);
$resolver->appendResolver(new \FSVendor\WPDesk\View\Resolver\DirResolver($dir));
}
return new \FSVendor\WPDesk\View\Renderer\SimplePhpRenderer($resolver);
}
/**
* Load templates using simple renderer.
*
* @param string $name Name of the template
* @param string $path Additional path of the template ie. for path "path" the templates would be loaded from /plugin/templates/path/*.php
* @param array $args Arguments for templates to use
*
* @return string Rendered template.
*/
public function loadTemplate($name, $path = '.', $args = array())
{
$renderer = $this->createSimpleRenderer();
return $renderer->render(\trailingslashit($path) . $name, $args);
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace FSVendor\WPDesk\View\Renderer;
use FSVendor\WPDesk\View\Resolver\Resolver;
/**
* Can render templates
*/
class LoadTemplatePlugin implements \FSVendor\WPDesk\View\Renderer\Renderer
{
private $plugin;
private $path;
public function __construct($plugin, $path = '')
{
$this->plugin = $plugin;
$this->path = $path;
}
public function set_resolver(\FSVendor\WPDesk\View\Resolver\Resolver $resolver)
{
}
public function render($template, array $params = null)
{
return $this->plugin->load_template($template, $this->path, $params);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace FSVendor\WPDesk\View\Renderer;
use FSVendor\WPDesk\View\Resolver\Resolver;
/**
* Can render templates
*/
interface Renderer
{
/**
* Set the resolver used to map a template name to a resource the renderer may consume.
*
* @param Resolver $resolver
*/
public function set_resolver(\FSVendor\WPDesk\View\Resolver\Resolver $resolver);
/**
* @param string $template
* @param array $params
*
* @return string
*/
public function render($template, array $params = null);
}

View File

@@ -0,0 +1,41 @@
<?php
namespace FSVendor\WPDesk\View\Renderer;
use FSVendor\WPDesk\View\Resolver\Resolver;
/**
* Can render templates
*/
class SimplePhpRenderer implements \FSVendor\WPDesk\View\Renderer\Renderer
{
/** @var Resolver */
private $resolver;
public function __construct(\FSVendor\WPDesk\View\Resolver\Resolver $resolver)
{
$this->set_resolver($resolver);
}
/**
* @param Resolver $resolver
*
* @return void|Resolver
*/
public function set_resolver(\FSVendor\WPDesk\View\Resolver\Resolver $resolver)
{
$this->resolver = $resolver;
}
/**
* @param string $template
* @param array|null $params
*
* @return string
*/
public function render($template, array $params = null)
{
if ($params !== null) {
\extract($params, \EXTR_SKIP);
}
\ob_start();
include $this->resolver->resolve($template . '.php');
return \ob_get_clean();
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace FSVendor\WPDesk\View\Resolver;
use FSVendor\WPDesk\View\Renderer\Renderer;
use FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
/**
* Provide resolvers and this class can try them one after another
*
* @package WPDesk\View\Resolver
*/
class ChainResolver implements \FSVendor\WPDesk\View\Resolver\Resolver
{
/** @var Resolver[] */
private $resolvers;
/**
* Warning: function with variadic input. Input should be list of Resolver instances.
*/
public function __construct()
{
$args = \func_get_args();
foreach ($args as $resolver) {
$this->appendResolver($resolver);
}
}
/**
* Append resolver to the end of the list
*
* @param Resolver $resolver
*/
public function appendResolver($resolver)
{
$this->resolvers[] = $resolver;
}
/**
* Resolve name to full path
*
* @param string $name
* @param Renderer|null $renderer
*
* @return string
*/
public function resolve($name, \FSVendor\WPDesk\View\Renderer\Renderer $renderer = null)
{
foreach ($this->resolvers as $resolver) {
try {
return $resolver->resolve($name);
} catch (\FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve $e) {
// not interested
}
}
throw new \FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace FSVendor\WPDesk\View\Resolver;
use FSVendor\WPDesk\View\Renderer\Renderer;
use FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
/**
* Class should resolve name by serching in provided dir. If empty then current dir
*
* @package WPDesk\View\Resolver
*/
class DirResolver implements \FSVendor\WPDesk\View\Resolver\Resolver
{
/** @var string */
private $dir;
/**
* Base path for templates ie. subdir
*
* @param $dir
*/
public function __construct($dir)
{
$this->dir = $dir;
}
/**
* Resolve name to full path
*
* @param string $name
* @param Renderer|null $renderer
*
* @return string
*/
public function resolve($name, \FSVendor\WPDesk\View\Renderer\Renderer $renderer = null)
{
$dir = \rtrim($this->dir, '/');
$fullName = $dir . '/' . $name;
if (\file_exists($fullName)) {
return $fullName;
}
throw new \FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
}
}

View File

@@ -0,0 +1,7 @@
<?php
namespace FSVendor\WPDesk\View\Resolver\Exception;
class CanNotResolve extends \RuntimeException
{
}

View File

@@ -0,0 +1,18 @@
<?php
namespace FSVendor\WPDesk\View\Resolver;
use FSVendor\WPDesk\View\Renderer\Renderer;
use FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
/**
* This resolver never finds the file
*
* @package WPDesk\View\Resolver
*/
class NullResolver implements \FSVendor\WPDesk\View\Resolver\Resolver
{
public function resolve($name, \FSVendor\WPDesk\View\Renderer\Renderer $renderer = null)
{
throw new \FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Null Cannot resolve");
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace FSVendor\WPDesk\View\Resolver;
use FSVendor\WPDesk\View\Renderer\Renderer;
/**
* Can resolve template name to a file
*/
interface Resolver
{
/**
* Resolve a template/pattern name to a resource the renderer can consume
*
* @param string $name
* @param null|Resolver $renderer
*
* @return string
*/
public function resolve($name, \FSVendor\WPDesk\View\Renderer\Renderer $renderer = null);
}

View File

@@ -0,0 +1,41 @@
<?php
namespace FSVendor\WPDesk\View\Resolver;
use FSVendor\WPDesk\View\Renderer\Renderer;
use FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
/**
* Class should resolve name by standard wp theme resolve
*
* @package WPDesk\View\Resolver
*/
class WPThemeResolver implements \FSVendor\WPDesk\View\Resolver\Resolver
{
/** @var string */
private $template_base_path;
/**
* Base path for templates ie. subdir
*
* @param $template_base_path
*/
public function __construct($template_base_path)
{
$this->template_base_path = $template_base_path;
}
/**
* Resolve name to full path
*
* @param string $name
* @param Renderer|null $renderer
*
* @return string
*/
public function resolve($name, \FSVendor\WPDesk\View\Renderer\Renderer $renderer = null)
{
$templateFile = \locate_template([\trailingslashit($this->template_base_path) . $name]);
if (!$templateFile) {
throw new \FSVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
}
return $templateFile;
}
}