Completed
Pull Request — master (#132)
by
unknown
14:56 queued 13:25
created

Template::cleanOutputBuffer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
3
namespace League\Plates\Template;
4
5
use League\Plates\Engine;
6
use LogicException;
7
8
/**
9
 * Container which holds template data and provides access to template functions.
10
 */
11
class Template
12
{
13
    /**
14
     * Instance of the template engine.
15
     * @var Engine
16
     */
17
    protected $engine;
18
19
    /**
20
     * The name of the template.
21
     * @var Name
22
     */
23
    protected $name;
24
25
    /**
26
     * The data assigned to the template.
27
     * @var array
28
     */
29
    protected $data = array();
30
31
    /**
32
     * An array of section content.
33
     * @var array
34
     */
35
    protected $sections = array();
36
37
    /**
38
     * The name of the template layout.
39
     * @var string
40
     */
41
    protected $layoutName;
42
43
    /**
44
     * The data assigned to the template layout.
45
     * @var array
46
     */
47
    protected $layoutData;
48
49
    /**
50
     * Create new Template instance.
51
     * @param Engine $engine
52
     * @param string $name
53
     */
54 80
    public function __construct(Engine $engine, $name)
55
    {
56 80
        $this->engine = $engine;
57 80
        $this->name = new Name($engine, $name);
58
59 80
        $this->data($this->engine->getData($name));
60 80
    }
61
62
    /**
63
     * Magic method used to call extension functions.
64
     * @param  string $name
65
     * @param  array  $arguments
66
     * @return mixed
67
     */
68 8
    public function __call($name, $arguments)
69
    {
70 8
        return $this->engine->getFunction($name)->call($this, $arguments);
71
    }
72
73
    /**
74
     * Assign data to template object.
75
     * @param  array $data
76
     * @return null
77
     */
78 80
    public function data(array $data)
79
    {
80 80
        $this->data = array_merge($this->data, $data);
81 80
    }
82
83
    /**
84
     * Check if the template exists.
85
     * @return boolean
86
     */
87 68
    public function exists()
88
    {
89 68
        return $this->name->doesPathExist();
90
    }
91
92
    /**
93
     * Get the template path.
94
     * @return string
95
     */
96 64
    public function path()
97
    {
98 64
        return $this->name->getPath();
99
    }
100
101
    /**
102
     * Render the template and layout.
103
     * @param  array  $data
104
     * @throws \Throwable
105
     * @throws \Exception
106 60
     * @return string
107
     */
108
    public function render(array $data = array())
109 60
    {
110
        try {
111 60
            $this->data($data);
112
113 60
            unset($data);
114
115 60
            extract($this->data);
116
117 60
            ob_start();
118
119
            if (!$this->exists()) {
120
                throw new LogicException(
121
                    'The template "' . $this->name->getName() . '" could not be found at "' . $this->path() . '".'
122
                );
123 60
            }
124
125 60
            include $this->path();
126
127 60
            $content = ob_get_clean();
128 12
129 12
            if (isset($this->layoutName)) {
130 12
                $layout = $this->engine->make($this->layoutName);
131 9
                $layout->sections = array_merge($this->sections, array('content' => $content));
132
                $content = $layout->render($this->layoutData);
133 60
            }
134
135
            return $content;
136
        } catch (\Throwable $e) {
0 ignored issues
show
Bug introduced by
The class Throwable does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
137
            $this->cleanOutputBuffer($e);
138
        } catch (\Exception $e) {
139
            $this->cleanOutputBuffer($e);
140
        }
141
    }
142
143
    /**
144
     * @param \Throwable|\Exception $e
145
     * @throws \Throwable
146
     * @throws \Exception
147
     */
148
    private function cleanOutputBuffer($e)
149 12
    {
150
        ob_end_clean();
151 12
        throw $e;
152 12
    }
153 12
154
    /**
155
     * Set the template's layout.
156
     * @param  string $name
157
     * @param  array  $data
158
     * @return null
159
     */
160 4
    protected function layout($name, array $data = array())
161
    {
162 4
        $this->layoutName = $name;
163
        $this->layoutData = $data;
164
    }
165
166
    /**
167
     * Start a new section block.
168 4
     * @param  string $name
169
     * @return null
170 4
     */
171 4
    protected function start($name)
172
    {
173
        if ($name === 'content') {
174
            throw new LogicException(
175
                'The section name "content" is reserved.'
176
            );
177 4
        }
178
179 4
        $this->sections[$name] = '';
180
181
        ob_start();
182
    }
183
184
    /**
185 4
     * Stop the current section block.
186
     * @return null
187 4
     */
188 4
    protected function stop()
189
    {
190
        if (empty($this->sections)) {
191
            throw new LogicException(
192
                'You must start a section before you can stop it.'
193
            );
194
        }
195
196 12
        end($this->sections);
197
198 12
        $this->sections[key($this->sections)] = ob_get_clean();
199 8
    }
200
201
    /**
202 4
     * Returns the content for a section block.
203
     * @param  string      $name    Section name
204
     * @param  string      $default Default section content
205
     * @return string|null
206
     */
207
    protected function section($name, $default = null)
208
    {
209
        if (!isset($this->sections[$name])) {
210
            return $default;
211 4
        }
212
213 4
        return $this->sections[$name];
214
    }
215
216
    /**
217
     * Fetch a rendered template.
218
     * @param  string $name
219
     * @param  array  $data
220
     * @return string
221
     */
222 4
    protected function fetch($name, array $data = array())
223
    {
224 4
        return $this->engine->render($name, $data);
225 4
    }
226
227
    /**
228
     * Output a rendered template.
229
     * @param  string $name
230
     * @param  array  $data
231
     * @return null
232
     */
233 8
    protected function insert($name, array $data = array())
234
    {
235 8
        echo $this->engine->render($name, $data);
236 8
    }
237 4
238 8
    /**
239 8
     * Apply multiple functions to variable.
240 6
     * @param  mixed  $var
241
     * @param  string $functions
242 2
     * @return mixed
243
     */
244
    protected function batch($var, $functions)
245 6
    {
246
        foreach (explode('|', $functions) as $function) {
247 8
            if ($this->engine->doesFunctionExist($function)) {
248
                $var = call_user_func(array($this, $function), $var);
249
            } elseif (is_callable($function)) {
250
                $var = call_user_func($function, $var);
251
            } else {
252
                throw new LogicException(
253
                    'The batch function could not find the "' . $function . '" function.'
254
                );
255
            }
256 12
        }
257
258 12
        return $var;
259
    }
260 12
261 4
    /**
262 3
     * Escape string.
263
     * @param  string      $string
264 12
     * @param  null|string $functions
265 4
     * @return string
266 3
     */
267
    protected function escape($string, $functions = null)
268 12
    {
269
        static $flags;
270
271
        if (!isset($flags)) {
272
            $flags = ENT_QUOTES | (defined('ENT_SUBSTITUTE') ? ENT_SUBSTITUTE : 0);
273
        }
274
275
        if ($functions) {
276
            $string = $this->batch($string, $functions);
277 4
        }
278
279 4
        return htmlspecialchars($string, $flags, 'UTF-8');
280
    }
281
282
    /**
283
     * Alias to escape function.
284
     * @param  string      $string
285
     * @param  null|string $functions
286
     * @return string
287
     */
288
    protected function e($string, $functions = null)
289
    {
290
        return $this->escape($string, $functions);
291
    }
292
}
293