2017-04-25 22:50:19 +00:00
|
|
|
<?php
|
2019-10-03 19:24:12 +00:00
|
|
|
|
2017-04-25 22:50:19 +00:00
|
|
|
/**
|
|
|
|
* ViewFactory class.
|
|
|
|
*/
|
2017-04-25 22:52:05 +00:00
|
|
|
|
2020-10-20 21:29:50 +00:00
|
|
|
namespace Alltube\Factory;
|
2017-04-25 22:50:19 +00:00
|
|
|
|
2020-10-20 21:29:50 +00:00
|
|
|
use Alltube\LocaleManager;
|
2021-02-06 23:03:37 +00:00
|
|
|
use Junker\DebugBar\Bridge\SmartyCollector;
|
2017-04-25 23:08:42 +00:00
|
|
|
use Psr\Container\ContainerInterface;
|
2017-04-25 22:50:19 +00:00
|
|
|
use Slim\Http\Request;
|
2020-10-19 20:24:59 +00:00
|
|
|
use Slim\Http\Uri;
|
2017-04-25 22:50:19 +00:00
|
|
|
use Slim\Views\Smarty;
|
|
|
|
use Slim\Views\SmartyPlugins;
|
2020-05-13 19:18:32 +00:00
|
|
|
use SmartyException;
|
2017-04-25 22:50:19 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create Smarty view object.
|
|
|
|
*/
|
|
|
|
class ViewFactory
|
|
|
|
{
|
2020-10-21 22:45:09 +00:00
|
|
|
|
2022-02-20 12:28:57 +00:00
|
|
|
/**
|
|
|
|
* @param Uri $uri
|
|
|
|
* @return Uri
|
|
|
|
*/
|
|
|
|
private static function cleanBasePath(Uri $uri): Uri
|
|
|
|
{
|
|
|
|
$basePath = $uri->getBasePath();
|
|
|
|
if (str_ends_with($basePath, 'index.php')) {
|
2022-02-20 13:06:59 +00:00
|
|
|
$basePath = dirname($basePath);
|
|
|
|
if ($basePath == '/') {
|
|
|
|
/*
|
|
|
|
* Calling withBasePath('/') does nothing,
|
|
|
|
* we have to use an empty string instead.
|
|
|
|
*/
|
|
|
|
$basePath = '';
|
|
|
|
}
|
|
|
|
|
2022-02-20 12:28:57 +00:00
|
|
|
/*
|
|
|
|
* When the base path ends with index.php,
|
|
|
|
* routing works correctly, but it breaks the URL of static assets using {base_url}.
|
|
|
|
* So we alter the base path but only in the URI used by SmartyPlugins.
|
|
|
|
*/
|
2022-02-20 13:06:59 +00:00
|
|
|
$uri = $uri->withBasePath($basePath);
|
2022-02-20 12:28:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $uri;
|
|
|
|
}
|
|
|
|
|
2017-04-25 22:50:19 +00:00
|
|
|
/**
|
2022-02-20 12:55:44 +00:00
|
|
|
* Create a URI suitable for templates.
|
2017-04-25 22:50:19 +00:00
|
|
|
*
|
2022-02-20 12:55:44 +00:00
|
|
|
* @param Request $request
|
|
|
|
* @return Uri
|
2017-04-25 22:50:19 +00:00
|
|
|
*/
|
2022-02-20 12:55:44 +00:00
|
|
|
public static function prepareUri(Request $request): Uri
|
2017-04-25 22:50:19 +00:00
|
|
|
{
|
2020-10-19 20:24:59 +00:00
|
|
|
/** @var Uri $uri */
|
2020-10-19 20:18:03 +00:00
|
|
|
$uri = $request->getUri();
|
2017-05-14 19:53:57 +00:00
|
|
|
if (in_array('https', $request->getHeader('X-Forwarded-Proto'))) {
|
2020-10-19 20:18:03 +00:00
|
|
|
$uri = $uri->withScheme('https')->withPort(443);
|
|
|
|
}
|
|
|
|
|
|
|
|
// set values from X-Forwarded-* headers
|
2020-10-19 20:24:59 +00:00
|
|
|
if ($host = current($request->getHeader('X-Forwarded-Host'))) {
|
2020-10-19 20:18:03 +00:00
|
|
|
$uri = $uri->withHost($host);
|
|
|
|
}
|
|
|
|
|
2020-10-19 20:24:59 +00:00
|
|
|
if ($port = current($request->getHeader('X-Forwarded-Port'))) {
|
2020-10-19 20:18:03 +00:00
|
|
|
$uri = $uri->withPort(intVal($port));
|
|
|
|
}
|
|
|
|
|
2020-10-19 20:24:59 +00:00
|
|
|
if ($path = current($request->getHeader('X-Forwarded-Path'))) {
|
2020-10-19 20:18:03 +00:00
|
|
|
$uri = $uri->withBasePath($path);
|
2017-05-14 19:53:57 +00:00
|
|
|
}
|
2017-04-25 22:50:19 +00:00
|
|
|
|
2022-02-20 12:55:44 +00:00
|
|
|
return self::cleanBasePath($uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create Smarty view object.
|
|
|
|
*
|
|
|
|
* @param ContainerInterface $container Slim dependency container
|
|
|
|
* @param Request|null $request PSR-7 request
|
|
|
|
*
|
|
|
|
* @return Smarty
|
|
|
|
* @throws SmartyException
|
|
|
|
*/
|
|
|
|
public static function create(ContainerInterface $container, Request $request = null): Smarty
|
|
|
|
{
|
|
|
|
if (!isset($request)) {
|
|
|
|
$request = $container->get('request');
|
|
|
|
}
|
|
|
|
|
|
|
|
$view = new Smarty($container->get('root_path') . '/templates/');
|
|
|
|
|
|
|
|
$uri = self::prepareUri($request);
|
|
|
|
|
2020-05-13 20:28:05 +00:00
|
|
|
/** @var LocaleManager $localeManager */
|
|
|
|
$localeManager = $container->get('locale');
|
2019-11-27 22:15:49 +00:00
|
|
|
|
2020-10-19 20:24:59 +00:00
|
|
|
$smartyPlugins = new SmartyPlugins($container->get('router'), $uri->withUserInfo(''));
|
2017-04-25 22:50:19 +00:00
|
|
|
$view->registerPlugin('function', 'path_for', [$smartyPlugins, 'pathFor']);
|
|
|
|
$view->registerPlugin('function', 'base_url', [$smartyPlugins, 'baseUrl']);
|
2019-11-27 22:15:49 +00:00
|
|
|
$view->registerPlugin('block', 't', [$localeManager, 'smartyTranslate']);
|
2017-04-25 22:50:19 +00:00
|
|
|
|
2020-11-21 13:20:01 +00:00
|
|
|
$view->offsetSet('locale', $container->get('locale'));
|
2020-10-21 22:45:09 +00:00
|
|
|
$view->offsetSet('config', $container->get('config'));
|
2020-10-22 19:40:20 +00:00
|
|
|
$view->offsetSet('domain', $uri->withBasePath('')->getBaseUrl());
|
2020-10-21 22:45:09 +00:00
|
|
|
|
2021-02-06 14:00:26 +00:00
|
|
|
if ($container->has('debugbar')) {
|
2021-02-06 23:03:37 +00:00
|
|
|
$debugBar = $container->get('debugbar');
|
2022-01-26 23:15:05 +00:00
|
|
|
$collector = new SmartyCollector($view->getSmarty());
|
|
|
|
$collector->useHtmlVarDumper();
|
|
|
|
$debugBar->addCollector($collector);
|
2021-02-06 23:03:37 +00:00
|
|
|
|
2021-02-06 14:00:26 +00:00
|
|
|
$view->offsetSet(
|
|
|
|
'debug_render',
|
2021-02-06 23:03:37 +00:00
|
|
|
$debugBar->getJavascriptRenderer(
|
|
|
|
$uri->getBaseUrl() . '/vendor/maximebf/debugbar/src/DebugBar/Resources/'
|
|
|
|
)
|
2021-02-06 14:00:26 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2017-04-25 22:50:19 +00:00
|
|
|
return $view;
|
|
|
|
}
|
|
|
|
}
|