Passed
Push — master ( b8e171...9e4d7b )
by Gabriel
04:14 queued 12s
created

AbstractRenderer::renderElements()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
dl 0
loc 3
ccs 0
cts 2
cp 0
rs 10
c 1
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
namespace Nip\Form\Renderer;
4
5
use AbstractElement as AbstractElementRenderer;
0 ignored issues
show
Bug introduced by
The type AbstractElement was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
6
use Nip\Form\AbstractForm;
7
use Nip\Form\Elements\AbstractElement;
8
use Nip\Form\Renderer\Traits\HasButtonRendererTrait;
9
use Nip\Helpers\View\Errors as ErrorsHelper;
10
use Nip\Helpers\View\Messages as MessagesHelper;
11
12
/**
13
 * Class AbstractRenderer
14
 * @package Nip\Form\Renderer
15
 */
16
abstract class AbstractRenderer
17
{
18
    use HasButtonRendererTrait;
19
20
    protected $form;
21
22
    protected $elements;
23
    protected $elementsRenderer;
24
25
    /**
26
     * AbstractRenderer constructor.
27
     */
28 9
    public function __construct()
29
    {
30 9
    }
31
32
    /**
33
     * @return array
34
     */
35
    public function getElements()
36
    {
37
        if (!$this->elements) {
38
            $this->elements = $this->getForm()->getElements();
39
        }
40
41
        return $this->elements;
42
    }
43
44
    /**
45
     * @param $elements
46
     */
47
    public function setElements($elements)
48
    {
49
        $this->elements = $elements;
50
    }
51
52
    /**
53
     * @return AbstractForm
54
     */
55 1
    public function getForm()
56
    {
57 1
        return $this->form;
58
    }
59
60
    /**
61
     * @param AbstractForm $form
62
     * @return $this
63
     */
64 9
    public function setForm(AbstractForm $form)
65
    {
66 9
        $this->form = $form;
67
68 9
        return $this;
69
    }
70
71
    /**
72
     * @return string
73
     */
74
    public function render()
75
    {
76
        $return = $this->openTag();
77
        $return .= $this->renderHidden();
78
79
        $renderErrors = $this->getForm()->getOption('render_messages');
80
        if ($renderErrors !== false) {
81
            $return .= $this->renderMessages();
82
        }
83
        $return .= $this->renderGroups();
84
        $return .= $this->renderElements();
85
        $return .= $this->renderButtons();
86
87
        $return .= $this->closeTag();
88
89
        return $return;
90
    }
91
92
    /**
93
     * @return string
94
     */
95
    public function openTag()
96
    {
97
        $return = '<form ';
98
        $atributes = $this->getForm()->getAttribs();
99
        foreach ($atributes as $name => $value) {
100
            $return .= $name . '="' . $value . '" ';
101
        }
102
        $return .= '>';
103
104
        return $return;
105
    }
106
107
    /**
108
     * @return string
109
     */
110
    public function renderHidden()
111
    {
112
        $hiddenElements = $this->getForm()->findElements(['type' => 'hidden']);
0 ignored issues
show
Bug introduced by
array('type' => 'hidden') of type array<string,string> is incompatible with the type boolean expected by parameter $params of Nip\Form\AbstractForm::findElements(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

112
        $hiddenElements = $this->getForm()->findElements(/** @scrutinizer ignore-type */ ['type' => 'hidden']);
Loading history...
113
        $return = '';
114
        if ($hiddenElements) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $hiddenElements of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
115
            foreach ($hiddenElements as $element) {
116
                $return .= $this->renderElement($element);
117
            }
118
        }
119
120
        return $return;
121
    }
122
123
    /**
124
     * @param AbstractElement $element
125
     * @return mixed
126
     */
127 1
    public function renderElement(AbstractElement $element)
128
    {
129 1
        return $element->render();
130
    }
131
132
    /**
133
     * The errors are rendered using the Errors View Helper
134
     * @return string
135
     */
136
    public function renderMessages()
137
    {
138
        $return = '';
139
        $messages = $this->getForm()->getMessages();
140
        foreach ($messages as $type => $lines) {
141
            if ($type == "error") {
142
                $return .= ErrorsHelper::render($lines);
143
            } else {
144
                $return .= MessagesHelper::render($lines, $type);
145
            }
146
        }
147
148
        return $return;
149
    }
150
151
    /**
152
     * @return string
153
     */
154
    public function renderGroups()
155
    {
156
        $groups = $this->getForm()->getDisplayGroups();
157
        $return = '';
158
        foreach ($groups as $group) {
159
            $return .= $group->render();
160
        }
161
162
        return $return;
163
    }
164
165
    /**
166
     * @return string
167
     */
168
    abstract public function renderElements();
169
170
    /**
171
     * @return string
172
     */
173
    public function closeTag()
174
    {
175
        return '</form>';
176
    }
177
178
    /**
179
     * @param AbstractElement $element
180
     * @return mixed
181
     */
182 1
    public function renderElementLabel(AbstractElement $element)
183
    {
184 1
        $extraClasses = $this->getLabelClassesForElement($element);
185 1
        return $element->renderLabel($extraClasses);
186
    }
187
188
    /**
189
     * @param string|AbstractElement $label
190
     * @param bool $required
191
     * @param bool $error
192
     * @return string
193
     * @deprecated Use renderElementLabel()
194
     */
195
    public function renderLabel($label, $required = false, $error = false)
196
    {
197
        if (is_object($label)) {
198
            return $this->renderElementLabel($label);
199
        }
200
201
        $return = '<label class="col-sm-3 ' . ($error ? ' error' : '') . '">';
202
        $return .= $label . ':';
203
204
        if ($required) {
205
            $return .= '<span class="required">*</span>';
206
        }
207
208
        $return .= "</label>";
209
210
        return $return;
211
    }
212
213
    /**
214
     * @param string|AbstractElement $element
215
     * @return array
216
     */
217 1
    protected function getLabelClassesForElement($element)
218
    {
219 1
        $classes = [];
220 1
        if (is_object($element) && $element->isError()) {
221
            $classes[] = 'error';
222
        }
223 1
        return $classes;
224
    }
225
226
    /**
227
     * @param AbstractElement $element
228
     * @return mixed
229
     */
230 6
    public function getElementRenderer(AbstractElement $element)
231
    {
232 6
        $name = $element->getUniqueId();
233 6
        if (!isset($this->elementsRenderer[$name])) {
234 6
            $this->elementsRenderer[$name] = $this->getNewElementRenderer($element);
235
        }
236
237 6
        return $this->elementsRenderer[$name];
238
    }
239
240
    /**
241
     * @param AbstractElement $element
242
     * @return mixed
243
     */
244 6
    protected function getNewElementRenderer(AbstractElement $element)
245
    {
246 6
        $type = $element->getType();
247 6
        $name = 'Nip_Form_Renderer_Elements_' . ucfirst($type);
248
        /** @var AbstractElementRenderer $renderer */
249 6
        $renderer = new $name();
250 6
        $renderer->setRenderer($this);
251 6
        $renderer->setElement($element);
252
253 6
        return $renderer;
254
    }
255
}
256