Completed
Push — master ( 159d20...dbc6fd )
by Dmitry
02:25
created

AssetManager::getUrls()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 3
eloc 8
nc 3
nop 1
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
     * Список inline JS
20
     * @var array
21
     */
22
    protected $inlineJs = [];
23
    
24
    /**
25
     * Список используемых Css asset`ов
26
     * @var string[]
27
     */
28
    protected $css = [];
29
        
30
    /**
31
     * Список inline Css
32
     * @var array
33
     */
34
    protected $inlineCss = [];
35
36
    /**
37
     * Карта asset`ов
38
     * @var Component\AssetMap
39
     */
40
    protected $map;
41
42
    /**
43
     * Режим разработки
44
     * @var bool
45
     */
46
    protected $developmentMode;
47
    
48
    /**
49
     * Host на котором висит dev сервер
50
     * @var string
51
     */
52
    protected $developmentHost = 'http://127.0.0.1:8652/';
53
54
    /**
55
     * @param \Dmitrynaum\SAM\Component\AssetMap $map - Карта asset`ов
56
     */
57
    public function __construct(Component\AssetMap $map)
58
    {
59
        $this->map             = $map;
60
        $this->developmentMode = false;
61
    }
62
    
63
    /**
64
     * Включить режим разработки
65
     */
66
    public function enableDevelopmentMode()
67
    {
68
        $this->developmentMode = true;
69
    }
70
    
71
    /**
72
     * Выключить режим разработки
73
     */
74
    public function disableDevelopmentMode()
75
    {
76
        $this->developmentMode = false;
77
    }
78
    
79
    /**
80
     * Включен ли режим разработки
81
     * @return bool
82
     */
83
    public function isDevelopmentModeEnabled()
84
    {
85
        return $this->developmentMode;
86
    }
87
88
    /**
89
     * Использовать JavaScript по названию asset`а или url
90
     * @param string $assetNameOrUrl - имя ассета
91
     */
92
    public function useJs($assetNameOrUrl)
93
    {
94
        if (!in_array($assetNameOrUrl, $this->js)) {
95
            $this->js[] = $assetNameOrUrl;
96
        }
97
    }
98
99
    /**
100
     * Использовать CSS по названию asset`а или url
101
     * @param string $assetNameOrUrl - Имя ассета
102
     */
103
    public function useCss($assetNameOrUrl)
104
    {
105
        if (!in_array($assetNameOrUrl, $this->css)) {
106
            $this->css[] = $assetNameOrUrl;
107
        }
108
    }
109
    
110
    /**
111
     * Добавить inline css код
112
     * @param string $css
113
     */
114
    public function addInlineCss($css)
115
    {
116
        $this->inlineCss[] = $css;
117
    }
118
    
119
    /**
120
     * Добавить inline JavaScript код
121
     * @param string $js
122
     */
123
    public function addInlineJs($js)
124
    {
125
        $this->inlineJs[] = $js;
126
    }
127
128
    /**
129
     * Получить html теги script с используемыми JavaScript asset`ами
130
     * @param array $attributes Массив атрибутов тега
131
     * ['type' => 'text/javascript']
132
     * ['async', 'defer']
133
     * @return string
134
     */
135
    public function renderJs(array $attributes = [])
136
    {
137
        $jsUrls = $this->getUrls($this->js);
138
        
139
        $jsTags = '';
140
        foreach ($jsUrls as $jsUrl) {
141
            $jsTags .= $this->wrapJsLink($jsUrl, $attributes);
142
        }
143
144
        return $jsTags;
145
    }
146
147
    /**
148
     * Получить html теги link с используемыми CSS asset`ами
149
     * @return string
150
     */
151
    public function renderCss()
152
    {
153
        $cssUrls = $this->getUrls($this->css);
154
        
155
        $cssTags = '';
156
        foreach ($cssUrls as $cssUrl) {
157
            $cssTags .= $this->wrapCssLink($cssUrl);
158
        }
159
160
        return $cssTags;
161
    }
162
    
163
    /**
164
     * Получить теги script с inline js или пустую строку если их нет
165
     * @return string
166
     */
167
    public function renderInlineJs()
168
    {
169
        $jsCode = join(";\n", $this->inlineJs);
170
        
171
        return $jsCode ? "<script>{$jsCode}</script>" : '';
172
    }
173
    
174
    /**
175
     * Получить теги style с inline css или пустую строку если их нет
176
     * @return string
177
     */
178
    public function renderInlineCss()
179
    {
180
        $cssCode = join("\n", $this->inlineCss);
181
        
182
        return $cssCode ? "<style>{$cssCode}</style>" : '';
183
    }
184
    
185
    /**
186
     * Получить используемые css ассеты и url
187
     * @return array
188
     */
189
    public function getUsedCss()
190
    {
191
        return $this->css;
192
    }
193
    
194
    /**
195
     * Получить используемые js asset`ы и url
196
     * @return array
197
     */
198
    public function getUsedJs()
199
    {
200
        return $this->js;
201
    }
202
    
203
    /**
204
     * Удалить используемый css по названию asset`а или url
205
     * @param string $cssAssetNameOrUrl
206
     */
207
    public function removeCss($cssAssetNameOrUrl)
208
    {
209
        foreach ($this->css as $index => $assetName) {
210
            if ($assetName == $cssAssetNameOrUrl) {
211
                unset($this->css[$index]);
212
            }
213
        }
214
    }
215
    
216
    /**
217
     * Удалить используемый js по названию asset`а или url
218
     * @param string $jsAssetNameOrUrl
219
     */
220
    public function removeJs($jsAssetNameOrUrl)
221
    {
222
        foreach ($this->js as $index => $assetName) {
223
            if ($assetName == $jsAssetNameOrUrl) {
224
                unset($this->js[$index]);
225
            }
226
        }
227
    }
228
    
229
    /**
230
     * Удалить все используемые css asset`ы
231
     */
232
    public function removeAllCss()
233
    {
234
        $this->css = [];
235
    }
236
    
237
    /**
238
     * Удалить все используемые js asset`ы
239
     */
240
    public function removeAllJs()
241
    {
242
        $this->js = [];
243
    }
244
245
    /**
246
     * Получить ссылку на asset по его имени
247
     * @param string $assetName название asset`а
248
     * @return string
249
     */
250
    protected function getAssetUrl($assetName)
251
    {
252
        if ($this->isDevelopmentModeEnabled()) {
253
            $assetUrl = "{$this->developmentHost}?asset=$assetName";
254
        } else {
255
            $assetUrl = $this->map->getAssetPath($assetName);
256
        }
257
        
258
        return $assetUrl;
259
    }
260
    
261
    /**
262
     * Обернуть ссылку на JS файл в тег script
263
     * @param string $pathToJs
264
     * @param array $attributes Массив атрибутов тега
265
     * ['Имя атрибута' => 'значение']
266
     * ['атрибут']
267
     * @return string
268
     */
269
    protected function wrapJsLink($pathToJs, array $attributes = [])
270
    {
271
        
272
        $attrs = [];
273
        foreach ($attributes as $arrtibute => $value) {
274
            if (is_numeric($arrtibute)) {
275
                $attrs[] = $value;
276
            } else {
277
                $attrs[] = "{$arrtibute}='{$value}'";
278
            }
279
        }
280
        
281
        $attributesString = join(' ', $attrs);
282
        return "<script src='{$pathToJs}' {$attributesString}></script>";
283
    }
284
    
285
    /**
286
     * Обернуть ссылку на Css файл в тег script
287
     * @param string $pathToCss
288
     * @return string
289
     */
290
    protected function wrapCssLink($pathToCss)
291
    {
292
        return "<link rel='stylesheet' type='text/css' href='{$pathToCss}' />";
293
    }
294
    
295
    /**
296
     * Проверяет является ли ссылка URL
297
     * @param string $string
298
     * @return bool
299
     */
300
    protected function isUrl($string)
301
    {
302
        if (strpos($string, '//') === 0) {
303
            $string = "http:{$string}";
304
        }
305
        
306
        return filter_var($string, FILTER_VALIDATE_URL) !== false;
307
    }
308
    
309
    /**
310
     * Получить ссылки
311
     * @param array $array
312
     */
313
    protected function getUrls($array)
314
    {
315
        $urls = [];
316
        foreach ($array as $assetNameOrUrl) {
317
            if ($this->isUrl($assetNameOrUrl)) {
318
                $urls[] = $assetNameOrUrl;
319
            } else {
320
                $urls[] = $this->getAssetUrl($assetNameOrUrl);
321
            }
322
        }
323
        
324
        return $urls;
325
    }
326
}
327