Completed
Push — master ( a66667...64ed1a )
by Justin
02:20
created

Renderer::setData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Vessel\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
    }
82
83
    /**
84
     * Add a single directory to the template engine.
85
     *
86
     * @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...
87
     * @return $this
88
     */
89 3
    public function registerTheme($theme, $directory)
90
    {
91 3
        if (!is_dir($directory)) {
92 1
            throw new RendererException('The specified theme directory does not exist: ' . $directory);
93
        }
94 2
        $this->theme = $theme;
95 2
        $this->engine->addFolder($theme, $directory, true);
96 2
        return $this;
97
    }
98
99
    /**
100
     * Returns the template rendering engine.
101
     *
102
     * @return League\Plates\Engine
103
     */
104 1
    public function getEngine()
105
    {
106 1
        return $this->engine;
107
    }
108
109
    /**
110
     * Get the page data that will be rendered.
111
     *
112
     * @return array
113
     */
114 2
    public function getData()
115
    {
116 2
        return $this->data;
117
    }
118
119
    /**
120
     * Replace the page data
121
     *
122
     * @param array $data
123
     */
124 9
    public function setData(array $data)
125
    {
126 9
        $this->validateData($data);
127 9
        $this->data = $data;
128 9
        return $this;
129
    }
130
131
    /**
132
     * Validate that the page data is complete enough to render.
133
     *
134
     * Note: Throws an exception if the page data is incomplete.
135
     *
136
     * @param  array  $data array
137
     * @return boolean
138
     */
139 9
    public function validateData(array $data)
140
    {
141 9
        if (!count(array_diff_key(array_flip($this->required), $data))) {
142 9
            return true;
143
        }
144 1
        throw new RendererException('Invalid or incomplete page data');
145
    }
146
147
    /**
148
     * Generate wrapper classes for stripes
149
     *
150
     * @return string
151
     */
152 3
    public function wrapperClasses($string)
153
    {
154 3
        $type = str_replace("stripe-", "", $string);
155 3
        return 'ws-stripe--' . $type;
156
    }
157
158
    /**
159
     * Process data before its output. This is the last chance to make changes
160
     * to data before being passed to the actual template files.
161
     *
162
     * @return array
163
     */
164 3
    public function processData($data)
165
    {
166 3
        $data['themePrefix'] = $this->theme ? $this->theme . "::" : "";
167 3
        if (isset($data['stripes'])) {
168 3
            $data['stripes'] = array_filter($data['stripes'], function ($stripe) use ($data) {
169 3
                return $this->engine->exists($data['themePrefix'] . 'stripes/' . $stripe['type']);
170 3
            });
171 3
        }
172 3
        return $data;
173
    }
174
175
    /**
176
     * Render the current data.
177
     *
178
     * @return string
179
     */
180 3
    public function render()
181
    {
182 3
        return $this->engine->render('page', $this->processData($this->data));
183
    }
184
185
    /**
186
     * Return the rendered page.
187
     *
188
     * @return string
189
     */
190 3
    public function __toString()
191
    {
192
        try {
193 3
            return $this->render();
194
        } catch (\Exception $e) {
195
            return "Error rendering page: " . $e->getMessage();
196
        }
197
    }
198
}
199