first commit
This commit is contained in:
@@ -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": {
|
||||
"FcfVendor\\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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View;
|
||||
|
||||
use FcfVendor\WPDesk\View\Renderer\SimplePhpRenderer;
|
||||
use FcfVendor\WPDesk\View\Resolver\ChainResolver;
|
||||
use FcfVendor\WPDesk\View\Resolver\DirResolver;
|
||||
use FcfVendor\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 \FcfVendor\WPDesk\View\Resolver\ChainResolver();
|
||||
$resolver->appendResolver(new \FcfVendor\WPDesk\View\Resolver\WPThemeResolver(\basename($this->plugin_dir)));
|
||||
foreach ($this->template_dirs as $dir) {
|
||||
$dir = \trailingslashit($this->plugin_dir) . \trailingslashit($dir);
|
||||
$resolver->appendResolver(new \FcfVendor\WPDesk\View\Resolver\DirResolver($dir));
|
||||
}
|
||||
return new \FcfVendor\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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Renderer;
|
||||
|
||||
use FcfVendor\WPDesk\View\Resolver\Resolver;
|
||||
/**
|
||||
* Can render templates
|
||||
*/
|
||||
class LoadTemplatePlugin implements \FcfVendor\WPDesk\View\Renderer\Renderer
|
||||
{
|
||||
private $plugin;
|
||||
private $path;
|
||||
public function __construct($plugin, $path = '')
|
||||
{
|
||||
$this->plugin = $plugin;
|
||||
$this->path = $path;
|
||||
}
|
||||
public function set_resolver(\FcfVendor\WPDesk\View\Resolver\Resolver $resolver)
|
||||
{
|
||||
}
|
||||
public function render($template, array $params = null)
|
||||
{
|
||||
return $this->plugin->load_template($template, $this->path, $params);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Renderer;
|
||||
|
||||
use FcfVendor\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(\FcfVendor\WPDesk\View\Resolver\Resolver $resolver);
|
||||
/**
|
||||
* @param string $template
|
||||
* @param array $params
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render($template, array $params = null);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Renderer;
|
||||
|
||||
use FcfVendor\WPDesk\View\Resolver\Resolver;
|
||||
/**
|
||||
* Can render templates
|
||||
*/
|
||||
class SimplePhpRenderer implements \FcfVendor\WPDesk\View\Renderer\Renderer
|
||||
{
|
||||
/** @var Resolver */
|
||||
private $resolver;
|
||||
public function __construct(\FcfVendor\WPDesk\View\Resolver\Resolver $resolver)
|
||||
{
|
||||
$this->set_resolver($resolver);
|
||||
}
|
||||
/**
|
||||
* @param Resolver $resolver
|
||||
*
|
||||
* @return void|Resolver
|
||||
*/
|
||||
public function set_resolver(\FcfVendor\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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver;
|
||||
|
||||
use FcfVendor\WPDesk\View\Renderer\Renderer;
|
||||
use FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
|
||||
/**
|
||||
* Provide resolvers and this class can try them one after another
|
||||
*
|
||||
* @package WPDesk\View\Resolver
|
||||
*/
|
||||
class ChainResolver implements \FcfVendor\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, \FcfVendor\WPDesk\View\Renderer\Renderer $renderer = null)
|
||||
{
|
||||
foreach ($this->resolvers as $resolver) {
|
||||
try {
|
||||
return $resolver->resolve($name);
|
||||
} catch (\FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve $e) {
|
||||
// not interested
|
||||
}
|
||||
}
|
||||
throw new \FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver;
|
||||
|
||||
use FcfVendor\WPDesk\View\Renderer\Renderer;
|
||||
use FcfVendor\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 \FcfVendor\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, \FcfVendor\WPDesk\View\Renderer\Renderer $renderer = null)
|
||||
{
|
||||
$dir = \rtrim($this->dir, '/');
|
||||
$fullName = $dir . '/' . $name;
|
||||
if (\file_exists($fullName)) {
|
||||
return $fullName;
|
||||
}
|
||||
throw new \FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver\Exception;
|
||||
|
||||
class CanNotResolve extends \RuntimeException
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver;
|
||||
|
||||
use FcfVendor\WPDesk\View\Renderer\Renderer;
|
||||
use FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
|
||||
/**
|
||||
* This resolver never finds the file
|
||||
*
|
||||
* @package WPDesk\View\Resolver
|
||||
*/
|
||||
class NullResolver implements \FcfVendor\WPDesk\View\Resolver\Resolver
|
||||
{
|
||||
public function resolve($name, \FcfVendor\WPDesk\View\Renderer\Renderer $renderer = null)
|
||||
{
|
||||
throw new \FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Null Cannot resolve");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver;
|
||||
|
||||
use FcfVendor\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, \FcfVendor\WPDesk\View\Renderer\Renderer $renderer = null);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace FcfVendor\WPDesk\View\Resolver;
|
||||
|
||||
use FcfVendor\WPDesk\View\Renderer\Renderer;
|
||||
use FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve;
|
||||
/**
|
||||
* Class should resolve name by standard wp theme resolve
|
||||
*
|
||||
* @package WPDesk\View\Resolver
|
||||
*/
|
||||
class WPThemeResolver implements \FcfVendor\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, \FcfVendor\WPDesk\View\Renderer\Renderer $renderer = null)
|
||||
{
|
||||
$templateFile = \locate_template([\trailingslashit($this->template_base_path) . $name]);
|
||||
if (!$templateFile) {
|
||||
throw new \FcfVendor\WPDesk\View\Resolver\Exception\CanNotResolve("Cannot resolve {$name}");
|
||||
}
|
||||
return $templateFile;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user