Passed
Push — main ( 04e35b...6957a7 )
by Moises
07:58
created

View::data()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
namespace DevPontes\View;
4
5
use DevPontes\View\Exception\ErrorRender;
6
7
/**
8
 * Class DevPontes View
9
 *
10
 * @author Moises Pontes <[email protected]>
11
 * @package DevPontes\View
12
 */
13
class View
14
{
15
    /** @var array */
16
    private $data;
17
18
    /** @var Assets */
19
    public $assets;
20
21
    /** @var string */
22
    private $head;
23
24
    /** @var string */
25
    private $header;
26
27
    /** @var string */
28
    private $aside;
29
30
    /** @var string */
31
    private $footer;
32
33
    /** @var string */
34
    private $viewPath;
35
36
    /** @var string */
37
    private $extension;
38
39
    /**
40
     * View constructor.
41
     *
42
     * @param string $viewPath ex: src/views
43
     * @param string $extension php or html or other
44
     */
45
    public function __construct(string $viewPath, string $extension)
46
    {
47
        $this->viewPath = $viewPath;
48
        $this->extension = $extension;
49
    }
50
51
    public function __get($name)
52
    {
53
        return $this->data[$name];
54
    }
55
56
    public function __isset($name)
57
    {
58
        return isset($this->data[$name]);
59
    }
60
61
    /**
62
     * View data
63
     *
64
     * @return object
65
     */
66
    public function data(): object
67
    {
68
        return (object) $this->data;
69
    }
70
71
    /**
72
     * Define head view
73
     *
74
     * @param string|null $head
75
     * @return View
76
     */
77
    public function setHead(?string $head): View
78
    {
79
        $this->head = $head;
80
        return $this;
81
    }
82
83
    /**
84
     * Define header view
85
     *
86
     * @param string|null $header
87
     * @return View
88
     */
89
    public function setHeader(?string $header): View
90
    {
91
        $this->header = $header;
92
        return $this;
93
    }
94
95
    /**
96
     * Define aside view
97
     *
98
     * @param string|null $aside
99
     * @return View
100
     */
101
    public function setAside(?string $aside): View
102
    {
103
        $this->aside = $aside;
104
        return $this;
105
    }
106
107
    /**
108
     * Define footer view
109
     *
110
     * @param string|null $footer
111
     * @return View
112
     */
113
    public function setFooter(?string $footer): View
114
    {
115
        $this->footer = $footer;
116
        return $this;
117
    }
118
119
    /**
120
     * Render the View
121
     * Data array will be converted to stdClass object
122
     *
123
     * @param string $view
124
     * @param array $data
125
     * @return void
126
     * @example - $v->render('home', array('data' => [...]));
127
     */
128
    public function render(string $view, array $data = []): void
129
    {
130
        $this->data = $data;
131
132
        extract($this->data);
133
134
        if ($this->head) {
135
            include $this->head . "." . $this->extension;
136
        }
137
138
        if ($this->header) {
139
            include $this->header . "." . $this->extension;
140
        }
141
142
        if ($this->aside) {
143
            include $this->aside . "." . $this->extension;
144
        }
145
146
        include $this->resolvePath($view);
147
148
        if ($this->footer) {
149
            include $this->footer . "." . $this->extension;
150
        }
151
    }
152
153
    /**
154
     * Insert View
155
     *
156
     * @param string $view
157
     * @param string $extension
158
     * @return void
159
     */
160
    public function insert(string $view, string $extension = ''): void
161
    {
162
        extract($this->data);
163
164
        $this->extension = $extension ? $extension : $this->extension;
165
166
        include $this->resolvePath($view);
167
    }
168
169
    /**
170
     * @param string $view
171
     * @return string
172
     */
173
    private function resolvePath(string $view): string
174
    {
175
        $file = $this->viewPath . '/' . $view . '.' . $this->extension;
176
177
        if (!file_exists($file)) {
178
            throw new ErrorRender("Error loading view...");
179
        }
180
181
        return $file;
182
    }
183
184
    /**
185
     * Assets class injection
186
     *
187
     * @param Assets $assets
188
     * @return View
189
     */
190
    public function addAssets(Assets $assets): View
191
    {
192
        $this->assets = $assets;
193
        return $this;
194
    }
195
}
196