ViewRenderer::endPage()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 10
cts 10
cp 1
rs 9.7333
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 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 = 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
            $view->renderers[$ext] = $renderer;
66
67 2
            return $renderer->render($view, $file, $params);
68
        } else {
69 2
            unset($view->renderers[$ext]);
70
71 2
            return $view->renderPhpFile($file, $params);
72
        }
73
    }
74
75
    /**
76
     * Event trigger for make this class is the renderer of view file.
77
     *
78
     * @param Event|\yii\base\ViewEvent $event triggered.
79
     * @throws \yii\base\InvalidConfigException
80
     */
81 4
    public static function beforeRender(Event $event): void
82
    {
83
        /** @var View $view */
84 4
        $view = $event->sender;
85 4
        $viewId = spl_object_hash($view);
86 4
        $ext = pathinfo($event->viewFile, PATHINFO_EXTENSION);
87
88 4
        if (isset($view->renderers[$ext])) {
89 2
            static::$renderers[$viewId][$ext] = Instance::ensure($view->renderers[$ext], BaseViewRenderer::class);
90
        }
91
92 4
        $view->renderers[$ext] = new static;
93 4
    }
94
95
    /**
96
     * Event trigger for register js params to [[VIEW::POS_HEAD]].
97
     *
98
     * @param Event $event triggered.
99
     */
100 4
    public static function endPage(Event $event): void
101
    {
102
        /** @var View $view */
103 4
        $view = $event->sender;
104 4
        $viewId = spl_object_hash($view);
105 4
        $globalParams = $view->params['jsParams'] ?? [];
106
107 4
        if (is_callable($globalParams)) {
108 1
            $globalParams = call_user_func($globalParams, $view);
109
        }
110
111 4
        $jsParams = ArrayHelper::remove(static::$jsParams, $viewId, []);
112 4
        $jsParams = array_merge($globalParams, $jsParams);
113
114 4
        $view->registerJs('window.serverParams = ' . Json::htmlEncode($jsParams), VIEW::POS_HEAD);
115 4
    }
116
117
}
118