Completed
Push — master ( b87073...878ab0 )
by Dmitry
02:24
created

AssetManager::renderInlineCss()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 2
eloc 3
nc 2
nop 0
1
<?php
2
3
namespace Dmitrynaum\SAM;
4
5
/**
6
 * Менеджер для работы с asset`ами
7
 *
8
 * @author Naumov Dmitry <[email protected]>
9
 */
10
class AssetManager
11
{
12
    /**
13
     * Список используемых JavaScript asset`ов
14
     * @var string[]
15
     */
16
    protected $js = [];
17
    
18
    /**
19
     * Список ссылок на удаленные JavaScript файлы
20
     * @var string[]
21
     */
22
    protected $remoteJs = [];
23
24
    /**
25
     * Список inline JS
26
     * @var array
27
     */
28
    protected $inlineJs = [];
29
    
30
    /**
31
     * Список используемых Css asset`ов
32
     * @var string[]
33
     */
34
    protected $css = [];
35
    
36
    /**
37
     * Список ссылок на удаленные css файлы
38
     * @var string[]
39
     */
40
    protected $remoteCss = [];
41
    
42
    /**
43
     * Список inline Css
44
     * @var array
45
     */
46
    protected $inlineCss = [];
47
48
    /**
49
     * Карта asset`ов
50
     * @var Component\AssetMap
51
     */
52
    protected $map;
53
54
    /**
55
     * Режим разработки
56
     * @var bool
57
     */
58
    protected $developmentMode;
59
    
60
    /**
61
     * Host на котором висит dev сервер
62
     * @var string
63
     */
64
    protected $developmentHost = 'http://127.0.0.1:8652/';
65
66
    /**
67
     * @param \Dmitrynaum\SAM\Component\AssetMap $map - Карта asset`ов
68
     */
69
    public function __construct(Component\AssetMap $map)
70
    {
71
        $this->map             = $map;
72
        $this->developmentMode = false;
73
    }
74
    
75
    /**
76
     * Включить режим разработки
77
     */
78
    public function enableDevelopmentMode()
79
    {
80
        $this->developmentMode = true;
81
    }
82
    
83
    /**
84
     * Выключить режим разработки
85
     */
86
    public function disableDevelopmentMode()
87
    {
88
        $this->developmentMode = false;
89
    }
90
    
91
    /**
92
     * Включен ли режим разработки
93
     * @return bool
94
     */
95
    public function isDevelopmentModeEnabled()
96
    {
97
        return $this->developmentMode;
98
    }
99
100
    /**
101
     * Использовать JavaScript Asset
102
     * @param string $assetName - имя ассета
103
     */
104
    public function useJs($assetName)
105
    {
106
        $this->js[] = $assetName;
107
    }
108
109
    /**
110
     * Использовать CSS Asset
111
     * @param string $assetName - Имя ассета
112
     */
113
    public function useCss($assetName)
114
    {
115
        $this->css[] = $assetName;
116
    }
117
    
118
    /**
119
     * Использовать удаленный css.
120
     * Ссылка просто оборачивается в тег link
121
     * @param string $cssUrl Ссылка на css файл
122
     */
123
    public function useRemoteCss($cssUrl)
124
    {
125
        $this->remoteCss[] = $cssUrl;
126
    }
127
    
128
    /**
129
     * Использовать удаленный js.
130
     * Ссылка просто оборачивается в тег script
131
     * @param string $jsUrl Ссылка на js файл
132
     */
133
    public function useRemoteJs($jsUrl)
134
    {
135
        $this->remoteJs[] = $jsUrl;
136
    }
137
    
138
    /**
139
     * Добавить inline css код
140
     * @param string $css
141
     */
142
    public function addInlineCss($css)
143
    {
144
        $this->inlineCss[] = $css;
145
    }
146
    
147
    /**
148
     * Добавить inline JavaScript код
149
     * @param string $js
150
     */
151
    public function addInlineJs($js)
152
    {
153
        $this->inlineJs[] = $js;
154
    }
155
156
    /**
157
     * Получить html теги script с используемыми JavaScript asset`ами
158
     * @param array $attributes Массив атрибутов тега
159
     * ['Имя атрибута' => 'значение']
160
     * ['type' => 'text/javascript']
161
     * ['атрибут']
162
     * ['async', 'defer']
163
     * @return string
164
     */
165
    public function renderJs(array $attributes = [])
166
    {
167
        $jsUrls = $this->remoteJs;
168
        
169
        foreach ($this->js as $assetName) {
170
            $jsUrls[] = $this->getAssetUrl($assetName);
171
        }
172
        
173
        $jsTags = '';
174
        foreach ($jsUrls as $jsUrl) {
175
            $jsTags .= $this->wrapJsLink($jsUrl, $attributes);
176
        }
177
178
        return $jsTags;
179
    }
180
181
    /**
182
     * Получить html теги link с используемыми CSS asset`ами
183
     * @return string
184
     */
185
    public function renderCss()
186
    {
187
        $cssUrls = $this->remoteCss;
188
        
189
        foreach ($this->css as $assetName) {
190
            $cssUrls[] = $this->getAssetUrl($assetName);
191
        }
192
        
193
        $cssTags = '';
194
        foreach ($cssUrls as $cssUrl) {
195
            $cssTags .= $this->wrapCssLink($cssUrl);
196
        }
197
198
        return $cssTags;
199
    }
200
    
201
    /**
202
     * Получить теги script с inline js или пустую строку если их нет
203
     * @return string
204
     */
205
    public function renderInlineJs()
206
    {
207
        $jsCode = join(";\n", $this->inlineJs);
208
        
209
        return $jsCode ? "<script>{$jsCode}</script>" : '';
210
    }
211
    
212
    /**
213
     * Получить теги style с inline css или пустую строку если их нет
214
     * @return string
215
     */
216
    public function renderInlineCss()
217
    {
218
        $cssCode = join("\n", $this->inlineCss);
219
        
220
        return $cssCode ? "<style>{$cssCode}</style>" : '';
221
    }
222
        
223
    /**
224
     * Получить ссылку на asset по его имени
225
     * @param string $assetName название asset`а
226
     * @return string
227
     */
228
    protected function getAssetUrl($assetName)
229
    {
230
        if ($this->isDevelopmentModeEnabled()) {
231
            $assetUrl = "{$this->developmentHost}?asset=$assetName";
232
        } else {
233
            $assetUrl = $this->map->getAssetPath($assetName);
234
        }
235
        
236
        return $assetUrl;
237
    }
238
    
239
    /**
240
     * Обернуть ссылку на JS файл в тег script
241
     * @param string $pathToJsFile
242
     * @param array $attributes Массив атрибутов тега
243
     * ['Имя атрибута' => 'значение']
244
     * ['type' => 'text/javascript']
245
     * ['атрибут']
246
     * ['async', 'defer']
247
     * @return string
248
     */
249
    protected function wrapJsLink($pathToJsFile, array $attributes = [])
250
    {
251
        
252
        $attrs = [];
253
        foreach ($attributes as $arrtibute => $value) {
254
            if (is_numeric($arrtibute)) {
255
                $attrs[] = $value;
256
            } else {
257
                $attrs[] = "{$arrtibute}='{$value}'";
258
            }
259
        }
260
        
261
        $attributesString = join(' ', $attrs);
262
        return "<script src='{$pathToJsFile}' {$attributesString}></script>";
263
    }
264
    
265
    /**
266
     * Обернуть ссылку на Css файл в тег script
267
     * @param string $pathToCssFile
268
     * @return string
269
     */
270
    protected function wrapCssLink($pathToCssFile)
271
    {
272
        return "<link rel='stylesheet' type='text/css' href='{$pathToCssFile}' />";
273
    }
274
}
275