Issues (138)

src/Renderer/AbstractRenderer.php (2 issues)

1
<?php
2
3
namespace Nip\Form\Renderer;
4
5
use Nip\Form\Elements\AbstractElement;
6
use Nip\Form\Renderer\Elements\AbstractElementRenderer as AbstractElementRenderer;
7
use Nip\Form\Renderer\Traits\ClassesDictionary;
8
use Nip\Form\Renderer\Traits\HasButtonRendererTrait;
9
use Nip\Form\Renderer\Traits\HasElementsTrait;
10
use Nip\Form\Renderer\Traits\HasFormTrait;
11
use Nip\Helpers\View\Errors as ErrorsHelper;
12
use Nip\Helpers\View\Messages as MessagesHelper;
13
14
/**
15
 * Class AbstractRenderer
16
 * @package Nip\Form\Renderer
17
 */
18
abstract class AbstractRenderer
19
{
20
    use HasButtonRendererTrait;
21
    use ClassesDictionary;
22
    use HasElementsTrait;
23
    use HasFormTrait;
24
25
    protected $elementsRenderer;
26
27
    /**
28
     * AbstractRenderer constructor.
29
     */
30 11
    public function __construct()
31
    {
32 11
    }
33
34
    /**
35
     * @return string
36
     */
37
    public function render()
38
    {
39
        $return = $this->openTag();
40
        $return .= $this->renderHidden();
41
42
        $renderErrors = $this->getForm()->getOption('render_messages');
43
        if ($renderErrors !== false) {
44
            $return .= $this->renderMessages();
45
        }
46
        $return .= $this->renderGroups();
47
        $return .= $this->renderElements();
48
        $return .= $this->renderButtons();
49
50
        $return .= $this->closeTag();
51
52
        return $return;
53
    }
54
55
    /**
56
     * @return string
57
     */
58
    public function openTag()
59
    {
60
        $return = '<form ';
61
        $atributes = $this->getForm()->getAttribs();
62
        foreach ($atributes as $name => $value) {
63
            $return .= $name . '="' . $value . '" ';
64
        }
65
        $return .= '>';
66
67
        return $return;
68
    }
69
70
    /**
71
     * @return string
72
     */
73
    public function renderHidden()
74
    {
75
        $hiddenElements = $this->getForm()->findElements(['type' => 'hidden']);
0 ignored issues
show
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

75
        $hiddenElements = $this->getForm()->findElements(/** @scrutinizer ignore-type */ ['type' => 'hidden']);
Loading history...
76
        $return = '';
77
        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...
78
            foreach ($hiddenElements as $element) {
79
                $return .= $this->renderElement($element);
80
            }
81
        }
82
83
        return $return;
84
    }
85
86
    /**
87
     * @param AbstractElement $element
88
     * @return mixed
89
     */
90 1
    public function renderElement(AbstractElement $element)
91
    {
92 1
        return $element->renderElement();
93
    }
94
95
    /**
96
     * The errors are rendered using the Errors View Helper
97
     * @return string
98
     */
99
    public function renderMessages()
100
    {
101
        $return = '';
102
        $messages = $this->getForm()->getMessages();
103
        foreach ($messages as $type => $lines) {
104
            if ($type == "error") {
105
                $return .= ErrorsHelper::render($lines);
106
            } else {
107
                $return .= MessagesHelper::render($lines, $type);
108
            }
109
        }
110
111
        return $return;
112
    }
113
114
    /**
115
     * @return string
116
     */
117
    public function renderGroups()
118
    {
119
        $groups = $this->getForm()->getDisplayGroups();
120
        $return = '';
121
        foreach ($groups as $group) {
122
            $return .= $group->render();
123
        }
124
125
        return $return;
126
    }
127
128
    /**
129
     * @return string
130
     */
131
    abstract public function renderElements();
132
133
    /**
134
     * @return string
135
     */
136
    public function closeTag()
137
    {
138
        return '</form>';
139
    }
140
141
    /**
142
     * @param AbstractElement $element
143
     * @return mixed
144
     */
145
    public function renderElementLabel(AbstractElement $element)
146
    {
147
        $extraClasses = $this->getLabelClassesForElement($element);
148
        return $element->renderLabel($extraClasses);
149
    }
150
151
    /**
152
     * @param string|AbstractElement $label
153
     * @param bool $required
154
     * @param bool $error
155
     * @return string
156
     * @deprecated Use renderElementLabel()
157
     */
158
    public function renderLabel($label, $required = false, $error = false)
159
    {
160
        if (is_object($label)) {
161
            return $this->renderElementLabel($label);
162
        }
163
164
        $return = '<label class="col-sm-3 ' . ($error ? ' error' : '') . '">';
165
        $return .= $label . ':';
166
167
        if ($required) {
168
            $return .= '<span class="required">*</span>';
169
        }
170
171
        $return .= "</label>";
172
173
        return $return;
174
    }
175
176
    /**
177
     * @param string|AbstractElement $element
178
     * @return array
179
     */
180
    protected function getLabelClassesForElement($element)
181
    {
182
        $classes = [];
183
        if (is_object($element) && $element->isError()) {
184
            $classes[] = 'error';
185
        }
186
        return $classes;
187
    }
188
189
    /**
190
     * @param AbstractElement $element
191
     * @return mixed
192
     */
193 6
    public function getElementRenderer(AbstractElement $element)
194
    {
195 6
        $name = $element->getUniqueId();
196 6
        if (!isset($this->elementsRenderer[$name])) {
197 6
            $this->elementsRenderer[$name] = $this->getNewElementRenderer($element);
198
        }
199
200 6
        return $this->elementsRenderer[$name];
201
    }
202
203
    /**
204
     * @param AbstractElement $element
205
     * @return mixed
206
     */
207 6
    protected function getNewElementRenderer(AbstractElement $element)
208
    {
209 6
        $type = $element->getType();
210 6
        $name = 'Nip_Form_Renderer_Elements_' . ucfirst($type);
211
        /** @var AbstractElementRenderer $renderer */
212 6
        $renderer = new $name();
213 6
        $renderer->setRenderer($this);
214 6
        $renderer->setElement($element);
215
216 6
        return $renderer;
217
    }
218
}
219