diff options
author | Igor Scheller <igor.scheller@igorshp.de> | 2018-09-10 14:40:33 +0200 |
---|---|---|
committer | Igor Scheller <igor.scheller@igorshp.de> | 2018-09-10 14:40:33 +0200 |
commit | 4bf3a68f43e4fcea34fe0a16cb3e1eecb97d332a (patch) | |
tree | 736cdc6a8df17b12d9f18312eaf09637298caabf | |
parent | 222c9fed7d4ca2b3b44c05907fbb7080c1efd342 (diff) |
Fixed assets rendering
-rw-r--r-- | src/Renderer/Twig/Extensions/Assets.php | 42 | ||||
-rw-r--r-- | src/Renderer/TwigServiceProvider.php | 2 | ||||
-rw-r--r-- | templates/layouts/app.twig | 27 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/AssetsTest.php | 47 |
4 files changed, 98 insertions, 20 deletions
diff --git a/src/Renderer/Twig/Extensions/Assets.php b/src/Renderer/Twig/Extensions/Assets.php new file mode 100644 index 00000000..2cdfb0fd --- /dev/null +++ b/src/Renderer/Twig/Extensions/Assets.php @@ -0,0 +1,42 @@ +<?php + +namespace Engelsystem\Renderer\Twig\Extensions; + +use Engelsystem\Http\UrlGenerator; +use Twig_Extension as TwigExtension; +use Twig_Function as TwigFunction; + +class Assets extends TwigExtension +{ + /** @var UrlGenerator */ + protected $urlGenerator; + + /** + * @param UrlGenerator $urlGenerator + */ + public function __construct(UrlGenerator $urlGenerator) + { + $this->urlGenerator = $urlGenerator; + } + + /** + * @return TwigFunction[] + */ + public function getFunctions() + { + return [ + new TwigFunction('asset', [$this, 'getAsset']), + ]; + } + + /** + * @param string $path + * @return UrlGenerator|string + */ + public function getAsset($path) + { + $path = ltrim($path, '/'); + + return $this->urlGenerator->to('/' . $path); + } +} diff --git a/src/Renderer/TwigServiceProvider.php b/src/Renderer/TwigServiceProvider.php index 0f453989..c70fb303 100644 --- a/src/Renderer/TwigServiceProvider.php +++ b/src/Renderer/TwigServiceProvider.php @@ -3,6 +3,7 @@ namespace Engelsystem\Renderer; use Engelsystem\Container\ServiceProvider; +use Engelsystem\Renderer\Twig\Extensions\Assets; use Engelsystem\Renderer\Twig\Extensions\Config; use Engelsystem\Renderer\Twig\Extensions\Globals; use Engelsystem\Renderer\Twig\Extensions\Session; @@ -15,6 +16,7 @@ class TwigServiceProvider extends ServiceProvider { /** @var array */ protected $extensions = [ + 'assets' => Assets::class, 'config' => Config::class, 'globals' => Globals::class, 'session' => Session::class, diff --git a/templates/layouts/app.twig b/templates/layouts/app.twig index 42d5610c..aa45484d 100644 --- a/templates/layouts/app.twig +++ b/templates/layouts/app.twig @@ -1,19 +1,20 @@ {% set theme = user.color|default(config('theme')) %} <!DOCTYPE html> -<html> +<html lang="{{ session_get('locale')|split('_')[0]|escape('html_attr') }}"> <head> {% block head %} <title>{% block title %}{{ title }}{% endblock %} - Engelsystem</title> + <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="stylesheet" type="text/css" href="css/theme{{ theme }}.css"/> - <link rel="stylesheet" type="text/css" href="vendor/icomoon/style.css"/> - <link rel="stylesheet" type="text/css" href="vendor/bootstrap-datepicker-1.7.1/css/bootstrap-datepicker3.min.css"/> - <script type="text/javascript" src="vendor/jquery-2.1.1.min.js"></script> - <script type="text/javascript" src="vendor/jquery-ui.min.js"></script> + + <link rel="stylesheet" type="text/css" href="{{ asset('assets/theme' ~ theme ~ '.css') }}"/> + <script type="text/javascript" src="{{ asset('assets/vendor.js') }}"></script> + {% if atom_feed -%} <link href="{{ url('atom', atom_feed) }}" type="application/atom+xml" rel="alternate" title="Atom Feed"> {% endif %} + {% endblock %} </head> <body> @@ -67,20 +68,6 @@ {% endblock %} </div> </div> - - <script type="text/javascript" src="vendor/bootstrap/js/bootstrap.min.js"></script> - <script type="text/javascript" src="vendor/bootstrap-datepicker-1.7.1/js/bootstrap-datepicker.min.js"></script> - <script type="text/javascript" src="vendor/bootstrap-datepicker-1.7.1/locales/bootstrap-datepicker.de.min.js"></script> - <script type="text/javascript" src="vendor/Chart.min.js"></script> - <script type="text/javascript" src="js/forms.js"></script> - <script type="text/javascript" src="vendor/moment-with-locales.min.js"></script> - <script type="text/javascript"> - $(function () { - moment.locale("{{ session_get('locale')|escape('js') }}"); - }); - </script> - <script type="text/javascript" src="js/moment-countdown.js"></script> - <script type="text/javascript" src="js/sticky-headers.js"></script> {% endblock %} </body> diff --git a/tests/Unit/Renderer/Twig/Extensions/AssetsTest.php b/tests/Unit/Renderer/Twig/Extensions/AssetsTest.php new file mode 100644 index 00000000..2d7ba6cd --- /dev/null +++ b/tests/Unit/Renderer/Twig/Extensions/AssetsTest.php @@ -0,0 +1,47 @@ +<?php + +namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions; + +use Engelsystem\Http\UrlGenerator; +use Engelsystem\Renderer\Twig\Extensions\Assets; +use PHPUnit\Framework\MockObject\MockObject; + +class AssetsTest extends ExtensionTest +{ + /** + * @covers \Engelsystem\Renderer\Twig\Extensions\Assets::__construct + * @covers \Engelsystem\Renderer\Twig\Extensions\Assets::getFunctions + */ + public function testGetGlobals() + { + /** @var UrlGenerator|MockObject $urlGenerator */ + $urlGenerator = $this->createMock(UrlGenerator::class); + + $extension = new Assets($urlGenerator); + $functions = $extension->getFunctions(); + + $this->assertExtensionExists('asset', [$extension, 'getAsset'], $functions); + } + + /** + * @covers \Engelsystem\Renderer\Twig\Extensions\Assets::getAsset + */ + public function testGetAsset() + { + /** @var UrlGenerator|MockObject $urlGenerator */ + $urlGenerator = $this->createMock(UrlGenerator::class); + + $urlGenerator->expects($this->exactly(2)) + ->method('to') + ->with('/assets/foo.css') + ->willReturn('https://foo.bar/project/assets/foo.css'); + + $extension = new Assets($urlGenerator); + + $return = $extension->getAsset('assets/foo.css'); + $this->assertEquals('https://foo.bar/project/assets/foo.css', $return); + + $return = $extension->getAsset('/assets/foo.css'); + $this->assertEquals('https://foo.bar/project/assets/foo.css', $return); + } +} |