Completed
Push — master ( 34d02e...659999 )
by Darío
02:25
created

View   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 209
Duplicated Lines 0 %

Test Coverage

Coverage 19.7%

Importance

Changes 0
Metric Value
eloc 57
dl 0
loc 209
ccs 13
cts 66
cp 0.197
rs 10
c 0
b 0
f 0
wmc 19

10 Methods

Rating   Name   Duplication   Size   Complexity  
B render() 0 54 6
A __construct() 0 4 1
A getName() 0 3 1
A setName() 0 3 1
A getContents() 0 12 3
A getPath() 0 3 1
A setPath() 0 3 1
A setCache() 0 3 1
A getCache() 0 3 1
A getFile() 0 10 3
1
<?php
2
/**
3
 * DronePHP (http://www.dronephp.com)
4
 *
5
 * @link      http://github.com/Pleets/DronePHP
6
 * @copyright Copyright (c) 2016-2018 Pleets. (http://www.pleets.org)
7
 * @license   http://www.dronephp.com/license
8
 * @author    Darío Rivera <[email protected]>
9
 */
10
11
namespace Drone\Mvc;
12
13
/**
14
 * View class
15
 *
16
 * This class manages views and parameters
17
 */
18
class View
19
{
20
    use \Drone\Util\ParamTrait;
21
22
    /**
23
     * Regex for identifiers
24
     *
25
     * @var string
26
     */
27
    const IDENTIFIER_REGEX = '[_a-zA-Z][_a-zA-Z0-9]*[.]?[_a-zA-Z0-9]+';
28
29
    /**
30
     * View name
31
     *
32
     * @var string
33
     */
34
    protected $name;
35
36
    /**
37
     * The path where views are located.
38
     *
39
     * @var string
40
     */
41
    protected $path;
42
43
    /**
44
     * The path rendered views are located
45
     *
46
     * @var string
47
     */
48
    protected $cache;
49
50
    /**
51
     * Returns the view name
52
     *
53
     * @return string
54
     */
55
    public function getName()
56
    {
57
        return $this->name;
58
    }
59
60
    /**
61
     * Returns the path
62
     *
63
     * @return string
64
     */
65
    public function getPath()
66
    {
67
        return $this->path;
68
    }
69
70
    /**
71
     * Returns the cache path
72
     *
73
     * @return string
74
     */
75
    public function getCache()
76
    {
77
        return $this->cache;
78
    }
79
80
    /**
81
     * Sets the view name
82
     *
83
     * @param string
84
     *
85
     * @return null
86
     */
87
    public function setName($name)
88
    {
89
        $this->name = $name;
90
    }
91
92
    /**
93
     * Sets the path
94
     *
95
     * @param string
96
     *
97
     * @return string
98
     */
99 1
    public function setPath($path)
100
    {
101 1
        $this->path = $path;
102 1
    }
103
104
    /**
105
     * Sets the cache path
106
     *
107
     * @param string
108
     *
109
     * @return string
110
     */
111
    public function setCache($cache)
112
    {
113
        $this->cache = $cache;
114
    }
115
116
    /**
117
     * Constructor
118
     *
119
     * @param string $name
120
     * @param array  $parameters
121
     */
122 1
    public function __construct($name, Array $parameters = [])
123
    {
124 1
        $this->name  = $name;
125 1
        $this->setParams($parameters);
126 1
    }
127
128
    /**
129
     * Gets the contents of view
130
     *
131
     * @throws Exception\ViewNotFoundException
132
     *
133
     * @return  string
134
     */
135 1
    public function getContents($file = null)
136
    {
137 1
        $_view = $this->path . DIRECTORY_SEPARATOR .
138 1
            str_replace('.', DIRECTORY_SEPARATOR, !is_null($file) ? $file : $this->name) . '.phtml';
139
140 1
        $contents = file_get_contents($_view);
141
142 1
        if ($contents === false) {
143
            throw new Exception\ViewGetContentsErrorException("The view '" .$this->name. "' does not exists");
144
        }
145
146 1
        return $contents;
147
    }
148
149
    /**
150
     * Loads the view
151
     *
152
     * @return  null
153
     */
154
    public function render()
155
    {
156
        if (count($this->getParams())) {
157
            extract($this->getParams(), EXTR_SKIP);
158
        }
159
160
        $viewFile = $this->getFile();
161
        $view = file_get_contents($viewFile);
162
163
        if (preg_match("/@extends\('(" .self::IDENTIFIER_REGEX. ")'\)/", $view, $matches) === 1) {
164
            $extendsStm = array_shift($matches);
165
            $viewIdentifier = array_shift($matches);
166
167
            $view = str_replace($extendsStm, file_get_contents($this->getFile($viewIdentifier)), $view);
168
169
            while (preg_match("/@section\('(" .self::IDENTIFIER_REGEX. ")'\)/", $view, $sectionOpening) === 1) {
170
                $sectionStm = array_shift($sectionOpening);
171
                $sectionIdentifier = array_shift($sectionOpening);
172
                $sectionFirstIndex = strpos($view, $sectionStm);
173
174
                if (preg_match("/@endsection\('(" . $sectionIdentifier . ")'\)/", $view, $sectionEnding) !== 1) {
175
                    // no ending statment
176
                    $view = str_replace($sectionStm, '', $view);
177
                    continue;
178
                }
179
180
                $endsectionStm        = array_shift($sectionEnding);
181
                $endsectionIdentifier = array_shift($sectionEnding);
182
                $endsectionFirstIndex = strpos($view, $endsectionStm);
183
184
                $sectionContent = substr(
185
                    $view,
186
                    $sectionFirstIndex,
187
                    $endsectionFirstIndex - $sectionFirstIndex + strlen($endsectionStm)
188
                );
189
190
                $sectionContentTrimmed = str_replace($sectionStm, '', $sectionContent);
191
                $sectionContentTrimmed = str_replace($endsectionStm, '', $sectionContentTrimmed);
192
193
                $view = str_replace($sectionContent, '', $view);
194
                $view = str_replace("@yield('$sectionIdentifier')", $sectionContentTrimmed, $view);
195
            }
196
        }
197
198
        // replace no match yields
199
        while (preg_match("/@yield\('(" .self::IDENTIFIER_REGEX. ")'\)/", $view, $matches) === 1) {
200
            $view = preg_replace("/@yield\('(" .self::IDENTIFIER_REGEX. ")'\)/", '', $view);
201
        }
202
203
        $uid = uniqid() . time();
204
205
        file_put_contents($this->cache . DIRECTORY_SEPARATOR . $uid, $view);
206
        include $this->cache . DIRECTORY_SEPARATOR . $uid;
207
        unlink($this->cache . DIRECTORY_SEPARATOR . $uid);
208
    }
209
210
    /**
211
     * Gets the file path
212
     *
213
     * @param string $file
214
     *
215
     * @return  string
216
     */
217
    private function getFile($file = null)
218
    {
219
        $_view = $this->path . DIRECTORY_SEPARATOR .
220
            str_replace('.', DIRECTORY_SEPARATOR, !is_null($file) ? $file : $this->name) . '.phtml';
221
222
        if (!file_exists($_view)) {
223
            throw new Exception\ViewNotFoundException("The view '" .$this->name. "' does not exists");
224
        }
225
226
        return $_view;
227
    }
228
}
229