Passed
Push — master ( ec067d...f9a666 )
by Justin
03:58
created

Renderer::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 8
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Vssl\Render;
4
5
use League\Plates\Engine;
6
7
class Renderer
8
{
9
    /**
10
     * Renderer configuration.
11
     *
12
     * @var array
13
     */
14
    protected $config;
15
16
    /**
17
     * Page data to render.
18
     *
19
     * @var array
20
     */
21
    protected $data;
22
23
    /**
24
     * Cache adapter.
25
     *
26
     * @var \Journey\Cache\CacheAdapterIterface
27
     */
28
    protected $cache;
29
30
    /**
31
     * String data to output.
32
     *
33
     * @var string
34
     */
35
    protected $output;
36
37
    /**
38
     * Template engine.
39
     *
40
     * @var \League\Plates\Engine
41
     */
42
    protected $engine;
43
44
    /**
45
     * Fields that are required in order to render.
46
     *
47
     * @var array
48
     */
49
    protected $required;
50
51
    /**
52
     * Name of the current theme.
53
     *
54
     * @var array
55
     */
56
    protected $theme;
57
58
    /**
59
     * Initialize our new renderer.
60
     */
61 9
    public function __construct(array $config, array $data)
62
    {
63 9
        $this->config = $config;
64 9
        $this->required = array_filter($config['required_fields']);
65 9
        $this->setData($data);
66 9
        $this->engine = new Engine(__DIR__ . "/../templates");
67 9
        $this->registerFunctions();
68 9
        if (isset($config['templates'])) {
69 1
            $this->registerTheme('default', $config['templates']);
70 1
        }
71 9
    }
72
73
    /**
74
     * Register custom theme functions particular function.
75
     *
76
     * @return $this
77
     */
78 9
    public function registerFunctions()
79
    {
80 9
        $this->engine->registerFunction('wrapperClasses', [$this, 'wrapperClasses']);
81 9
        $this->engine->registerFunction('image', [$this, 'image']);
82 9
    }
83
84
    /**
85
     * Add a single directory to the template engine.
86
     *
87
     * @param  string $directories directory of templates
0 ignored issues
show
Bug introduced by
There is no parameter named $directories. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
88
     * @return $this
89
     */
90 3
    public function registerTheme($theme, $directory)
91
    {
92 3
        if (!is_dir($directory)) {
93 1
            throw new RendererException('The specified theme directory does not exist: ' . $directory);
94
        }
95 2
        $this->theme = $theme;
96 2
        $this->engine->addFolder($theme, $directory, true);
97 2
        return $this;
98
    }
99
100
    /**
101
     * Returns the template rendering engine.
102
     *
103
     * @return League\Plates\Engine
104
     */
105 1
    public function getEngine()
106
    {
107 1
        return $this->engine;
108
    }
109
110
    /**
111
     * Get the page data that will be rendered.
112
     *
113
     * @return array
114
     */
115 2
    public function getData()
116
    {
117 2
        return $this->data;
118
    }
119
120
    /**
121
     * Replace the page data
122
     *
123
     * @param array $data
124
     */
125 9
    public function setData(array $data)
126
    {
127 9
        $this->validateData($data);
128 9
        $this->data = $data;
129 9
        return $this;
130
    }
131
132
    /**
133
     * Validate that the page data is complete enough to render.
134
     *
135
     * Note: Throws an exception if the page data is incomplete.
136
     *
137
     * @param  array  $data array
138
     * @return boolean
139
     */
140 9
    public function validateData(array $data)
141
    {
142 9
        if (!count(array_diff_key(array_flip($this->required), $data))) {
143 9
            return true;
144
        }
145 1
        throw new RendererException('Invalid or incomplete page data');
146
    }
147
148
    /**
149
     * Generate wrapper classes for stripes
150
     *
151
     * @return string
152
     */
153 3
    public function wrapperClasses($string)
154
    {
155 3
        $type = str_replace("stripe-", "", $string);
156 3
        return 'vssl-stripe vssl-stripe--' . $type;
157
    }
158
159
    /**
160
     * Returns the image url on the vssl server.
161
     *
162
     * @param  string $imageName hash.extension
0 ignored issues
show
Bug introduced by
There is no parameter named $imageName. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
163
     * @param  string $style     image style name
164
     * @return string
165
     */
166 2
    public function image($name, $style = false)
167
    {
168 2
        return ltrim($this->config['base_uri'], '/') . "/images" . ($style ? '/' . $style : '') . "/" . $name;
169
    }
170
171
    /**
172
     * Process data before its output. This is the last chance to make changes
173
     * to data before being passed to the actual template files.
174
     *
175
     * @return array
176
     */
177 3
    public function processData($data)
178
    {
179 3
        $data['themePrefix'] = $this->theme ? $this->theme . "::" : "";
180 3
        if (isset($data['stripes'])) {
181 3
            $data['stripes'] = array_filter($data['stripes'], function ($stripe) use ($data) {
182 3
                return $this->engine->exists($data['themePrefix'] . 'stripes/' . $stripe['type']);
183 3
            });
184 3
        }
185 3
        return $data;
186
    }
187
188
    /**
189
     * Render the current data.
190
     *
191
     * @return string
192
     */
193 3
    public function render()
194
    {
195 3
        return $this->engine->render('page', $this->processData($this->data));
196
    }
197
198
    /**
199
     * Return the rendered page.
200
     *
201
     * @return string
202
     */
203 3
    public function __toString()
204
    {
205
        try {
206 3
            return $this->render();
207
        } catch (\Exception $e) {
208
            return "Error rendering page: " . $e->getMessage();
209
        }
210
    }
211
}
212