Completed
Push — master ( 878ab0...159d20 )
by Dmitry
02:31
created

AssetManager::removeAllCss()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
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
        if (!in_array($assetName, $this->js)) {
107
            $this->js[] = $assetName;
108
        }
109
    }
110
111
    /**
112
     * Использовать CSS Asset
113
     * @param string $assetName - Имя ассета
114
     */
115
    public function useCss($assetName)
116
    {
117
        if (!in_array($assetName, $this->css)) {
118
            $this->css[] = $assetName;
119
        }
120
    }
121
    
122
    /**
123
     * Использовать удаленный css.
124
     * Ссылка просто оборачивается в тег link
125
     * @param string $cssUrl Ссылка на css файл
126
     */
127
    public function useRemoteCss($cssUrl)
128
    {
129
        $this->remoteCss[] = $cssUrl;
130
    }
131
    
132
    /**
133
     * Использовать удаленный js.
134
     * Ссылка просто оборачивается в тег script
135
     * @param string $jsUrl Ссылка на js файл
136
     */
137
    public function useRemoteJs($jsUrl)
138
    {
139
        $this->remoteJs[] = $jsUrl;
140
    }
141
    
142
    /**
143
     * Добавить inline css код
144
     * @param string $css
145
     */
146
    public function addInlineCss($css)
147
    {
148
        $this->inlineCss[] = $css;
149
    }
150
    
151
    /**
152
     * Добавить inline JavaScript код
153
     * @param string $js
154
     */
155
    public function addInlineJs($js)
156
    {
157
        $this->inlineJs[] = $js;
158
    }
159
160
    /**
161
     * Получить html теги script с используемыми JavaScript asset`ами
162
     * @param array $attributes Массив атрибутов тега
163
     * ['Имя атрибута' => 'значение']
164
     * ['type' => 'text/javascript']
165
     * ['атрибут']
166
     * ['async', 'defer']
167
     * @return string
168
     */
169
    public function renderJs(array $attributes = [])
170
    {
171
        $jsUrls = $this->remoteJs;
172
        
173
        foreach ($this->js as $assetName) {
174
            $jsUrls[] = $this->getAssetUrl($assetName);
175
        }
176
        
177
        $jsTags = '';
178
        foreach ($jsUrls as $jsUrl) {
179
            $jsTags .= $this->wrapJsLink($jsUrl, $attributes);
180
        }
181
182
        return $jsTags;
183
    }
184
185
    /**
186
     * Получить html теги link с используемыми CSS asset`ами
187
     * @return string
188
     */
189
    public function renderCss()
190
    {
191
        $cssUrls = $this->remoteCss;
192
        
193
        foreach ($this->css as $assetName) {
194
            $cssUrls[] = $this->getAssetUrl($assetName);
195
        }
196
        
197
        $cssTags = '';
198
        foreach ($cssUrls as $cssUrl) {
199
            $cssTags .= $this->wrapCssLink($cssUrl);
200
        }
201
202
        return $cssTags;
203
    }
204
    
205
    /**
206
     * Получить теги script с inline js или пустую строку если их нет
207
     * @return string
208
     */
209
    public function renderInlineJs()
210
    {
211
        $jsCode = join(";\n", $this->inlineJs);
212
        
213
        return $jsCode ? "<script>{$jsCode}</script>" : '';
214
    }
215
    
216
    /**
217
     * Получить теги style с inline css или пустую строку если их нет
218
     * @return string
219
     */
220
    public function renderInlineCss()
221
    {
222
        $cssCode = join("\n", $this->inlineCss);
223
        
224
        return $cssCode ? "<style>{$cssCode}</style>" : '';
225
    }
226
    
227
    /**
228
     * Получить используемые css ассеты
229
     * @return array
230
     */
231
    public function getUsedCss()
232
    {
233
        return $this->css;
234
    }
235
    
236
    /**
237
     * Получить используемые js asset`ы
238
     * @return array
239
     */
240
    public function getUsedJs()
241
    {
242
        return $this->js;
243
    }
244
    
245
    /**
246
     * Удалить используемый css asset по его имени
247
     * @param string $cssAssetName
248
     */
249
    public function removeCss($cssAssetName)
250
    {
251
        foreach ($this->css as $index => $assetName) {
252
            if ($assetName == $cssAssetName) {
253
                unset($this->css[$index]);
254
            }
255
        }
256
    }
257
    
258
    /**
259
     * Удалить используемый js asset по его имени
260
     * @param string $jsAssetName
261
     */
262
    public function removeJs($jsAssetName)
263
    {
264
        foreach ($this->js as $index => $assetName) {
265
            if ($assetName == $jsAssetName) {
266
                unset($this->js[$index]);
267
            }
268
        }
269
    }
270
    
271
    /**
272
     * Удалить все используемые css asset`ы
273
     */
274
    public function removeAllCss()
275
    {
276
        $this->css = [];
277
    }
278
    
279
    /**
280
     * Удалить все используемые js asset`ы
281
     */
282
    public function removeAllJs()
283
    {
284
        $this->js = [];
285
    }
286
287
    /**
288
     * Получить ссылку на asset по его имени
289
     * @param string $assetName название asset`а
290
     * @return string
291
     */
292
    protected function getAssetUrl($assetName)
293
    {
294
        if ($this->isDevelopmentModeEnabled()) {
295
            $assetUrl = "{$this->developmentHost}?asset=$assetName";
296
        } else {
297
            $assetUrl = $this->map->getAssetPath($assetName);
298
        }
299
        
300
        return $assetUrl;
301
    }
302
    
303
    /**
304
     * Обернуть ссылку на JS файл в тег script
305
     * @param string $pathToJsFile
306
     * @param array $attributes Массив атрибутов тега
307
     * ['Имя атрибута' => 'значение']
308
     * ['type' => 'text/javascript']
309
     * ['атрибут']
310
     * ['async', 'defer']
311
     * @return string
312
     */
313
    protected function wrapJsLink($pathToJsFile, array $attributes = [])
314
    {
315
        
316
        $attrs = [];
317
        foreach ($attributes as $arrtibute => $value) {
318
            if (is_numeric($arrtibute)) {
319
                $attrs[] = $value;
320
            } else {
321
                $attrs[] = "{$arrtibute}='{$value}'";
322
            }
323
        }
324
        
325
        $attributesString = join(' ', $attrs);
326
        return "<script src='{$pathToJsFile}' {$attributesString}></script>";
327
    }
328
    
329
    /**
330
     * Обернуть ссылку на Css файл в тег script
331
     * @param string $pathToCssFile
332
     * @return string
333
     */
334
    protected function wrapCssLink($pathToCssFile)
335
    {
336
        return "<link rel='stylesheet' type='text/css' href='{$pathToCssFile}' />";
337
    }
338
}
339