Completed
Push — master ( a522f9...c3ce9e )
by Park Jong-Hun
09:57 queued 07:36
created

TwigView::initCustomFunction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 6
rs 9.4285
1
<?php
2
3
namespace App\ViewEngine;
4
5
use Core\View\ViewEngineInterface;
6
use Core\Application;
7
use \Twig_Loader_Filesystem;
8
use \Twig_Environment;
9
use \Twig_SimpleFunction;
10
11
class TwigView implements ViewEngineInterface
12
{
13
    /**
14
     * @var Twig_Environment
15
     */
16
    protected $twig;
17
18
    /**
19
     * Twig template file
20
     *
21
     * @var string
22
     */
23
    private $templateFilename = '';
24
25
    /**
26
     * @var array engine setting
27
     */
28
    private $settings = [];
29
30
    /**
31
     * rendering template variables
32
     * @var array
33
     */
34
    private $var = [];
35
36
    public function __construct($settings = [])
37
    {
38
        $loader = new Twig_Loader_Filesystem($settings['path']);
39
        $this->twig = new Twig_Environment($loader, $settings['settings']);
40
41
        $this->settings = $settings;
42
43
        $this->initCustomFunction();
44
    }
45
46
    public function set($key, $value)
47
    {
48
        $this->var[$key] = $value;
49
    }
50
51
    public function getVariables()
52
    {
53
        return $this->var;
54
    }
55
56
    public function file($fileName)
57
    {
58
        $this->templateFilename = $fileName . $this->settings['postfix'];
59
    }
60
61
    public function getFile()
62
    {
63
        return $this->templateFilename;
64
    }
65
66
    public function render()
67
    {
68
        return $this->twig->render($this->templateFilename, $this->var);
69
    }
70
71
    private function initCustomFunction() {
72
        $this->addCssFunction();
73
        $this->addAssetFunction();
74
        $this->addUrlFunction();
75
        $this->addFileFunction();
76
    }
77
78
    private function addCssFunction()
79
    {
80
        $this->twig->addFunction(new Twig_SimpleFunction(
81
            'css',
82
            [$this, 'cssFunction'],
83
            ['is_safe' => ['html']]
84
        ));
85
    }
86
87
    private function addAssetFunction()
88
    {
89
        $this->twig->addFunction(new Twig_SimpleFunction(
90
            'asset',
91
            [$this, 'assetFunction']
92
        ));
93
    }
94
95
    private function addUrlFunction()
96
    {
97
        $this->twig->addFunction(new Twig_SimpleFunction(
98
            'url',
99
            [$this, 'urlFunction']
100
        ));
101
    }
102
103
    private function addFileFunction()
104
    {
105
        $this->twig->addFunction(new Twig_SimpleFunction(
106
            'file',
107
            [$this, 'fileFunction']
108
        ));
109
    }
110
111
    public function cssFunction($url)
112
    {
113
        return sprintf('<link rel="stylesheet" type="text/css" href="%s">', $url);
114
    }
115
116
    public function assetFunction($file)
117
    {
118
        return Application::getPublicUrl($file);
119
    }
120
121
    public function urlFunction($url = '')
122
    {
123
        return Application::getUrl($url);
124
    }
125
126
    public function fileFunction($file)
127
    {
128
        $pos = strrpos($this->getFile(), '/');
129
130
        if($pos === false) {
131
            return $file . $this->settings['postfix'];
132
        }
133
134
        return substr($this->getFile(), 0, $pos) . '/' . $file . $this->settings['postfix'];
135
    }
136
}
137