Completed
Push — master ( e92aa8...ae2fd3 )
by Vuong
01:18
created

ViewRenderer   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 96.97%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 7
dl 0
loc 88
ccs 32
cts 33
cp 0.9697
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A bootstrap() 0 7 1
A render() 0 15 2
A beforeRender() 0 13 2
A endPage() 0 16 2
1
<?php
2
/**
3
 * @link https://github.com/vuongxuongminh/yii2-js-params
4
 * @copyright Copyright (c) 2019 Vuong Xuong Minh
5
 * @license [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
6
 */
7
8
namespace vxm\jsParams;
9
10
use Yii;
11
12
use yii\base\BootstrapInterface;
13
use yii\base\Event;
14
use yii\base\ViewRenderer as BaseViewRenderer;
15
use yii\di\Instance;
16
use yii\helpers\ArrayHelper;
17
use yii\helpers\Json;
18
use yii\web\View;
19
20
/**
21
 * Class ViewRenderer support render view file with passed data to javascript.
22
 *
23
 * @author Vuong Minh <[email protected]>
24
 * @since 1.0.0
25
 */
26
class ViewRenderer extends BaseViewRenderer implements BootstrapInterface
27
{
28
29
    /**
30
     * @var array store renderer of views with key is hash id of view values is an array store renderer of view ext.
31
     */
32
    protected static $renderers = [];
33
34
    /**
35
     * @var array store params need to passed to javascript.
36
     */
37
    protected static $jsParams = [];
38
39
    /**
40
     * @inheritDoc
41
     */
42 4
    public function bootstrap($app)
43
    {
44 4
        Event::off(View::class, View::EVENT_BEFORE_RENDER, [static::class, 'beforeRender']);
45 4
        Event::off(View::class, View::EVENT_END_PAGE, [static::class, 'endPage']);
46 4
        Event::on(View::class, View::EVENT_BEFORE_RENDER, [static::class, 'beforeRender']);
47 4
        Event::on(View::class, View::EVENT_END_PAGE, [static::class, 'endPage']);
48 4
    }
49
50
    /**
51
     * @inheritDoc
52
     * @throws \Exception
53
     * @throws \Throwable
54
     */
55 4
    public function render($view, $file, $params)
56
    {
57 4
        $viewId = spl_object_hash($view);
58 4
        $ext = pathinfo($file, PATHINFO_EXTENSION);
59
        /** @var BaseViewRenderer $renderer */
60 4
        $renderer = $view->renderers[$ext] = static::$renderers[$viewId][$ext] ?? null;
61 4
        $jsParams = ArrayHelper::remove($params, 'jsParams', []);
62 4
        static::$jsParams[$viewId] = array_merge(static::$jsParams[$viewId] ?? [], $jsParams);
63
64 4
        if ($renderer) {
65 2
            return $renderer->render($view, $file, $params);
66
        } else {
67 2
            return $view->renderPhpFile($file, $params);
68
        }
69
    }
70
71
    /**
72
     * Event trigger for make this class is the renderer of view file.
73
     *
74
     * @param Event|\yii\base\ViewEvent $event triggered.
75
     * @throws \yii\base\InvalidConfigException
76
     */
77 4
    public static function beforeRender(Event $event): void
78
    {
79
        /** @var View $view */
80 4
        $view = $event->sender;
81 4
        $viewId = spl_object_hash($view);
82 4
        $ext = pathinfo($event->viewFile, PATHINFO_EXTENSION);
83
84 4
        if (isset($view->renderers[$ext])) {
85 2
            static::$renderers[$viewId][$ext] = Instance::ensure($view->renderers[$ext], BaseViewRenderer::class);
86
        }
87
88 4
        $view->renderers[$ext] = new static;
89 4
    }
90
91
    /**
92
     * Event trigger for register js params to [[VIEW::POS_HEAD]].
93
     *
94
     * @param Event $event triggered.
95
     */
96 4
    public static function endPage(Event $event): void
97
    {
98
        /** @var View $view */
99 4
        $view = $event->sender;
100 4
        $viewId = spl_object_hash($view);
101 4
        $globalParams = $view->params['jsParams'] ?? [];
102
103 4
        if (is_callable($globalParams)) {
104
            $globalParams = call_user_func($globalParams, $view);
105
        }
106
107 4
        $jsParams = ArrayHelper::remove(static::$jsParams, $viewId, []);
108 4
        $jsParams = array_merge($globalParams, $jsParams);
109
110 4
        $view->registerJs('window.serverParams = ' . Json::htmlEncode($jsParams), VIEW::POS_HEAD);
111 4
    }
112
113
}
114